WIP
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 6967303..b2e4aac 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -23,6 +23,7 @@
 #include <qpid/dispatch/bitmask.h>
 
 typedef struct qdr_core_t qdr_core_t;
+typedef struct qdr_connection_t qdr_connection_t;
 typedef struct qdr_link_t qdr_link_t;
 typedef struct qdr_delivery_t qdr_delivery_t;
 
@@ -34,51 +35,113 @@
 /**
  * Stop and deallocate an instance of the router core.
  */
-void qdr_core_free(qdr_core_t *rt);
+void qdr_core_free(qdr_core_t *core);
 
 /**
+ ******************************************************************************
  * Route table maintenance functions
- */
-void qdr_core_add_router(qdr_core_t *rt, const char *address, int router_maskbit);
-void qdr_core_del_router(qdr_core_t *rt, int router_maskbit);
-void qdr_core_set_link(qdr_core_t *rt, int router_maskbit, int link_maskbit);
-void qdr_core_remove_link(qdr_core_t *rt, int router_maskbit);
-void qdr_core_set_next_hop(qdr_core_t *rt, int router_maskbit, int nh_router_maskbit);
-void qdr_core_remove_next_hop(qdr_core_t *rt, int router_maskbit);
-void qdr_core_set_valid_origins(qdr_core_t *rt, const qd_bitmask_t *routers);
-void qdr_core_map_destination(qdr_core_t *rt, int router_maskbit, const char *address, char phase);
-void qdr_core_unmap_destination(qdr_core_t *rt, int router_maskbit, const char *address, char phase);
-
-typedef void (*qdr_mobile_added_t)   (void *context, qd_field_iterator_t *address);
-typedef void (*qdr_mobile_removed_t) (void *context, qd_field_iterator_t *address);
-typedef void (*qdr_link_lost_t)      (void *context, int link_maskbit);
-
-void qdr_core_route_table_handlers(void                 *context,
-                                   qdr_mobile_added_t    mobile_added,
-                                   qdr_mobile_removed_t  mobile_removed,
-                                   qdr_link_lost_t       link_lost);
-
-/**
- * Link functions
- */
-qdr_link_t *qdr_link(qdr_core_t *rt, qd_direction_t dir, bool dynamic, const char *address);
-void qdr_link_detach(qdr_link_t *link, qd_link_t *link);
-
-/**
- * Delivery functions
- */
-void qdr_core_delivery(qdr_core_t *rt, qd_link_t *in_link, pn_delivery_t *delivery, qd_message_t *msg,
-                       qd_field_iterator_t *effective_address);
-
-
-/**
- * Management instrumentation functions
+ ******************************************************************************
  */
 typedef enum {
-    QD_ROUTER_ADDRESS,
-    QD_ROUTER_LINK
+    QD_WAYPOINT_SOURCE,
+    QD_WAYPOINT_SINK,
+    QD_WAYPOINT_THROUGH,
+    QD_WAYPOINT_BYPASS,
+    QD_WAYPOINT_TAP
+} qd_waypoint_style_t;
+
+void qdr_core_add_router(qdr_core_t *core, const char *address, int router_maskbit);
+void qdr_core_del_router(qdr_core_t *core, int router_maskbit);
+void qdr_core_set_link(qdr_core_t *core, int router_maskbit, int link_maskbit);
+void qdr_core_remove_link(qdr_core_t *core, int router_maskbit);
+void qdr_core_set_next_hop(qdr_core_t *core, int router_maskbit, int nh_router_maskbit);
+void qdr_core_remove_next_hop(qdr_core_t *core, int router_maskbit);
+void qdr_core_set_valid_origins(qdr_core_t *core, const qd_bitmask_t *routers);
+void qdr_core_map_destination(qdr_core_t *core, int router_maskbit, const char *address, char phase);
+void qdr_core_unmap_destination(qdr_core_t *core, int router_maskbit, const char *address, char phase);
+
+void qdr_core_add_link_route(qdr_core_t *core, qd_field_iterator_t *conn_label, qd_field_iterator_t *prefix);
+void qdr_core_del_link_route(qdr_core_t *core, qd_field_iterator_t *conn_label, qd_field_iterator_t *prefix);
+
+void qdr_core_add_waypoint(qdr_core_t *core, qd_field_iterator_t *conn_label, qd_field_iterator_t *address, qd_waypoint_style_t style, char in_phase, char out_phase);
+
+//
+// The following callbacks shall be invoked on a connection thread from the server thread pool.
+//
+typedef void (*qdr_mobile_added_t)        (void *context, qd_field_iterator_t *address);
+typedef void (*qdr_mobile_removed_t)      (void *context, qd_field_iterator_t *address);
+typedef void (*qdr_link_lost_t)           (void *context, int link_maskbit);
+typedef void (*qdr_connection_activate_t) (void *context, const qdr_connection_t *connection);
+typedef void (*qdr_receive_t)             (void *context, qd_message_t *msg, int link_maskbit);
+
+void qdr_core_route_table_handlers(void                      *context,
+                                   qdr_mobile_added_t         mobile_added,
+                                   qdr_mobile_removed_t       mobile_removed,
+                                   qdr_link_lost_t            link_lost,
+                                   qdr_connection_activate_t  connection_activate);
+
+void qdr_core_subscribe(qdr_core_t *core, const char *address, bool local, bool mobile, qdr_receive_t on_message, void *context);
+
+
+/**
+ ******************************************************************************
+ * Connection functions
+ ******************************************************************************
+ */
+typedef enum {
+    QDR_WORK_FIRST_ATTACH,  // Core is initiating a first-attach
+    QDR_WORK_SECOND_ATTACH, // Core is sending a second-attach
+    QDR_WORK_DETACH,        // Core is sending a detach
+    QDR_WORK_DELIVERY       // Core is updating a delivery for in-thread processing
+} qdr_work_type_t;
+
+typedef struct {
+    qdr_work_type_t  work_type;
+    pn_terminus_t   *source;   // For FIRST_ATTACH
+    pn_terminus_t   *target;   // For FIRST_ATTACH
+    qdr_link_t      *link;     // For SECOND_ATTACH, DETACH
+    qdr_delivery_t  *delivery; // For DELIVERY
+} qdr_work_t;
+
+qdr_connection_t *qdr_connection_opened(qdr_core_t *core, qd_field_iterator_t *label);
+void qdr_connection_closed(qdr_connection_t *conn);
+void qdr_connection_set_context(qdr_connection_t *conn, void *context);
+void *qdr_connection_get_context(qdr_connection_t *conn);
+qdr_work_t *qdr_connection_work(qdr_connection_t *conn);
+
+/**
+ ******************************************************************************
+ * Link functions
+ ******************************************************************************
+ */
+qdr_link_t *qdr_link_first_attach(qdr_connection_t *conn, qd_direction_t dir, pn_terminus_t *source, pn_terminus_t *target);
+void qdr_link_second_attach(qdr_link_t *link, pn_terminus_t *source, pn_terminus_t *target);
+void qdr_link_detach(qdr_link_t *link, pn_condition_t *condition);
+
+qdr_delivery_t *qdr_link_deliver(qdr_link_t *link, pn_delivery_t *delivery, qd_message_t *msg);
+qdr_delivery_t *qdr_link_deliver_to(qdr_link_t *link, pn_delivery_t *delivery, qd_message_t *msg, qd_field_iterator_t *addr);
+
+
+/**
+ ******************************************************************************
+ * Delivery functions
+ ******************************************************************************
+ */
+void qdr_delivery_update_disposition(qdr_delivery_t *delivery);
+void qdr_delivery_update_flow(qdr_delivery_t *delivery);
+void qdr_delivery_process(qdr_delivery_t *delivery);
+
+/**
+ ******************************************************************************
+ * Management instrumentation functions
+ ******************************************************************************
+ */
+typedef enum {
+    QD_ROUTER_CONNECTION,
+    QD_ROUTER_LINK,
+    QD_ROUTER_ADDRESS
 } qd_router_entity_type_t;
 
-void qdr_core_query(qdr_core_t *rt, qd_router_entity_type_t type, const char *filter, void *context);
+void qdr_core_query(qdr_core_t *core, qd_router_entity_type_t type, const char *filter, void *context);
 
 #endif