diff --git a/api/glue/device.c b/api/glue/device.c
index 81b4d3955d019e95a825b9ef8918d1c1a4760f02..50d1430a070496c2c791f240bc6bb3710aa88ba4 100644
--- a/api/glue/device.c
+++ b/api/glue/device.c
@@ -107,10 +107,17 @@ eb_status_t eb_device_open(eb_socket_t socketp, const char* address, eb_width_t
   if (eb_transports[transport->link_type].mtu == 0)
     attempts = 1;
   
-  /* Try to determine port width */
   if (attempts == 0) {
-    device->widths = EB_DATAX|EB_ADDRX;
+    /* Only ok if the proposed widths are distinct */
+    if (!eb_width_refined(proposed_widths)) {
+      eb_device_close(devicep);
+      *result = EB_NULL;
+      return EB_WIDTH;
+    }
+    
+    device->widths = proposed_widths;
   } else {
+    /* Try to determine port width */
     device->widths = 0;
     do {
       uint8_t buf[8] = { 0x4E, 0x6F, 0x11, proposed_widths, 0x0, 0x0, 0x0, 0x0 };
@@ -126,23 +133,23 @@ eb_status_t eb_device_open(eb_socket_t socketp, const char* address, eb_width_t
         eb_socket_poll(socketp);
       }
     } while (device->widths == 0 && --attempts != 0);
+    
+    if (device->widths == 0) {
+      eb_device_close(devicep);
+      *result = EB_NULL;
+      return EB_TIMEOUT;
+    }
+    
+    device->widths &= proposed_widths;
+    if (eb_width_possible(device->widths) == 0) {
+      eb_device_close(devicep);
+      *result = EB_NULL;
+      return EB_WIDTH;
+    }
+    
+    device->widths = eb_width_refine(device->widths);
   }
   
-  if (device->widths == 0) {
-    eb_device_close(devicep);
-    *result = EB_NULL;
-    return EB_TIMEOUT;
-  }
-  
-  device->widths &= proposed_widths;
-  if (eb_width_possible(device->widths) == 0) {
-    eb_device_close(devicep);
-    *result = EB_NULL;
-    return EB_WIDTH;
-  }
-  
-  device->widths = eb_width_refine(device->widths);
-  
   *result = devicep;
   return EB_OK;
 }
diff --git a/api/glue/socket.c b/api/glue/socket.c
index 56642ef8a0d61b80cf332dc2edcb894eaa81daf5..88a1e15332a5004063a47c7f66a6f8b54d01c371 100644
--- a/api/glue/socket.c
+++ b/api/glue/socket.c
@@ -42,7 +42,7 @@ const char* eb_status(eb_status_t code) {
   case EB_OK:       return "success";
   case EB_FAIL:     return "system failure";
   case EB_ADDRESS:  return "invalid address";
-  case EB_WIDTH:    return "bus width mismatch";
+  case EB_WIDTH:    return "impossible bus width";
   case EB_OVERFLOW: return "cycle length overflow";
   case EB_BUSY:     return "resource busy";
   case EB_TIMEOUT:  return "timeout";