if (tap)
                {
                        tap->idcode = idcode;
-                       if( tap->expected_id ){
-                               if( tap->idcode != tap->expected_id ){
-                                       LOG_ERROR("ERROR: Tap: %s - Expected id: 0x%08x, Got: 0x%08x",
+
+                       if (tap->expected_ids_cnt > 0) {
+                               /* Loop over the expected identification codes and test for a match */
+                               u8 ii;
+                               for (ii = 0; ii < tap->expected_ids_cnt; ii++) {
+                                       if( tap->idcode == tap->expected_ids[ii] ){
+                                               break;
+                                       }
+                               }
+                       
+                               /* If none of the expected ids matched, log an error */
+                               if (ii == tap->expected_ids_cnt) {
+                                       LOG_ERROR("JTAG tap: %s             got: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
                                                          tap->dotted_name,
-                                                         tap->expected_id,
-                                                         idcode );
-                                       LOG_ERROR("ERROR: expected: mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x",
-                                                         EXTRACT_MFG( tap->expected_id ),
-                                                         EXTRACT_PART( tap->expected_id ),
-                                                         EXTRACT_VER( tap->expected_id ) );
-                                       LOG_ERROR("ERROR:      got: mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x",
+                                                         idcode,
                                                          EXTRACT_MFG( tap->idcode ),
                                                          EXTRACT_PART( tap->idcode ),
                                                          EXTRACT_VER( tap->idcode ) );
+                                       for (ii = 0; ii < tap->expected_ids_cnt; ii++) {
+                                               LOG_ERROR("JTAG tap: %s expected %hhu of %hhu: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
+                                                                 tap->dotted_name,
+                                                                 ii + 1,
+                                                                 tap->expected_ids_cnt,
+                                                                 tap->expected_ids[ii],
+                                                                 EXTRACT_MFG( tap->expected_ids[ii] ),
+                                                                 EXTRACT_PART( tap->expected_ids[ii] ),
+                                                                 EXTRACT_VER( tap->expected_ids[ii] ) );
+                                       }
+
+                                       return ERROR_JTAG_INIT_FAILED;
                                } else {
                                        LOG_INFO("JTAG Tap/device matched");
                                }
                        pTap->enabled = 0;
                        break;
                case NTAP_OPT_EXPECTED_ID:
+               {
+                       u32 *new_expected_ids;
+
                        e = Jim_GetOpt_Wide( goi, &w );
-                       pTap->expected_id = w;
+                       if( e != JIM_OK) {
+                               Jim_SetResult_sprintf(goi->interp, "option: %s bad parameter", n->name);
+                               return e;
+                       }
+
+                       new_expected_ids = malloc(sizeof(u32) * (pTap->expected_ids_cnt + 1));
+                       if (new_expected_ids == NULL) {
+                               Jim_SetResult_sprintf( goi->interp, "no memory");
+                               return JIM_ERR;
+                       }
+
+                       memcpy(new_expected_ids, pTap->expected_ids, sizeof(u32) * pTap->expected_ids_cnt);
+
+                       new_expected_ids[pTap->expected_ids_cnt] = w;
+               
+                       free(pTap->expected_ids);       
+                       pTap->expected_ids = new_expected_ids;
+                       pTap->expected_ids_cnt++;
                        break;
+               }
                case NTAP_OPT_IRLEN:
                case NTAP_OPT_IRMASK:
                case NTAP_OPT_IRCAPTURE:
                                                           pTap->dotted_name);
                // fixme: Tell user what is missing :-(
                // no memory leaks pelase
+               free(((void *)(pTap->expected_ids)));
                free(((void *)(pTap->chip)));
                free(((void *)(pTap->tapname)));
                free(((void *)(pTap->dotted_name)));
        command_print(cmd_ctx, "---|--------------------|---------|------------|------------|------|------|------|---------");
 
        while( tap ){
-               u32 expected, expected_mask, cur_instr;
+               u32 expected, expected_mask, cur_instr, ii;
                expected = buf_get_u32(tap->expected, 0, tap->ir_length);
                expected_mask = buf_get_u32(tap->expected_mask, 0, tap->ir_length);
                cur_instr = buf_get_u32(tap->cur_instr, 0, tap->ir_length);
+
                command_print(cmd_ctx,
                                          "%2d | %-18s |    %c    | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
                                          tap->abs_chain_position,
                                          tap->dotted_name,
                                          tap->enabled ? 'Y' : 'n',
                                          tap->idcode,
-                                         tap->expected_id,
+                                         (tap->expected_ids_cnt > 0 ? tap->expected_ids[0] : 0),
                                          tap->ir_length,
                                          expected,
                                          expected_mask,
                                          cur_instr);
+
+               for (ii = 1; ii < tap->expected_ids_cnt; ii++) {
+                       command_print(cmd_ctx, "   |                    |         |            | 0x%08x |      |      |      |         ",
+                                                 tap->expected_ids[ii]);
+               }
+
                tap = tap->next_tap;
        }