diff --git a/api/glue/device.c b/api/glue/device.c
index e63b5c2a474a2729fd8a2243102c8d9cb8278c95..191deadf6d5d3534c752ce1a4c9d6fc961f6baf3 100644
--- a/api/glue/device.c
+++ b/api/glue/device.c
@@ -154,6 +154,43 @@ eb_status_t eb_device_open(eb_socket_t socketp, const char* address, eb_width_t
   return EB_OK;
 }
 
+eb_link_t eb_device_new_slave(eb_socket_t socketp, eb_transport_t transportp, eb_link_t linkp) {
+  eb_device_t devicep;
+  eb_link_t new_linkp;
+  struct eb_device* device;
+  struct eb_transport* transport;
+  struct eb_socket* socket;
+  struct eb_link* link;
+  
+  devicep = eb_new_device();
+  if (devicep == EB_NULL) goto fail0;
+  
+  new_linkp = eb_new_link();
+  if (new_linkp == EB_NULL) goto fail1;
+  
+  socket = EB_SOCKET(socketp);
+  device = EB_DEVICE(devicep);
+  
+  device->socket = socketp;
+  device->passive = devicep;
+  device->unready = 0;
+  device->widths = 0;
+  device->link = linkp;
+  device->transport = transportp;
+  device->next = socket->first_device;
+  socket->first_device = devicep;
+  
+  return new_linkp;
+
+fail1:
+  eb_free_device(devicep);
+fail0:
+  transport = EB_TRANSPORT(transportp);
+  link = EB_LINK(linkp);
+  eb_transports[transport->link_type].disconnect(transport, link);
+  return linkp;
+}
+
 eb_status_t eb_device_close(eb_device_t devicep) {
   struct eb_socket* socket;
   struct eb_device* device;
diff --git a/api/glue/device.h b/api/glue/device.h
index 53ca195c33b1561c54929e6024650c619fb4f3a0..f38cb35a36bfb2138ee6aa915a893bdd44facefe 100644
--- a/api/glue/device.h
+++ b/api/glue/device.h
@@ -49,5 +49,7 @@ struct eb_device {
   eb_transport_t transport;
 };
 
+/* Create a new slave device */
+eb_link_t eb_device_new_slave(eb_socket_t socketp, eb_transport_t transportp, eb_link_t linkp);
 
 #endif
diff --git a/api/glue/socket.c b/api/glue/socket.c
index 6e6214dde5b90079f348d23436897692effbb7ae..ac2a36a9fad153aab1c4b2eb28f06977c2282035 100644
--- a/api/glue/socket.c
+++ b/api/glue/socket.c
@@ -303,8 +303,10 @@ eb_status_t eb_socket_poll(eb_socket_t socketp) {
   struct eb_transport* transport;
   struct eb_response* response;
   struct eb_cycle* cycle;
+  struct eb_link* new_link;
   eb_device_t devicep, next_devicep;
   eb_transport_t transportp, next_transportp;
+  eb_link_t new_linkp;
   eb_response_t responsep;
   eb_cycle_t cyclep;
   eb_socket_aux_t auxp;
@@ -338,16 +340,25 @@ eb_status_t eb_socket_poll(eb_socket_t socketp) {
   
   /* Step 2. Check all devices */
   
-  /* Poll all the transports */
+  /* Get some memory for accepting connections */
+  new_linkp = eb_new_link();
+  new_link = 0;
+  
+  /* Poll all the transports, potentially discovering new devices */
   aux = EB_SOCKET_AUX(auxp);
   for (transportp = aux->first_transport; transportp != EB_NULL; transportp = next_transportp) {
     transport = EB_TRANSPORT(transportp);
     next_transportp = transport->next;
     
     eb_device_slave(socketp, transportp, EB_NULL);
+    
+    /* Try to accept inbound connections */
+    if (new_linkp != EB_NULL) new_link = EB_LINK(new_linkp);
+    if ((*eb_transports[transport->link_type].accept)(transport, new_link) > 0)
+      new_linkp = eb_device_new_slave(socketp, transportp, new_linkp);
   }
   
-  /* Add all the sockets to the listen set */
+  /* Poll all the connections */
   socket = EB_SOCKET(socketp);
   for (devicep = socket->first_device; devicep != EB_NULL; devicep = next_devicep) {
     device = EB_DEVICE(devicep);