api: remove transport specific code from handlers

This does not update api client code. In other words, if the client
assumes the transport is shmem based, this patch does not change that.
Furthermore, code that checks queue size, for tail dropping, is not
updated.

Done for the following apis:
Plugins
- acl
- gtpu
- memif
- nat
- pppoe
VNET
- bfd
- bier
- tapv2
- vhost user
- dhcp
- flow
- geneve
- ip
- punt
- ipsec/ipsec-gre
- l2
- l2tp
- lisp-cp/one-cp
- lisp-gpe
- map
- mpls
- policer
- session
- span
- udp
- tap
- vxlan/vxlan-gpe
- interface
VPP
- api/api.c
OAM
- oam_api.c
Stats
- stats.c

Change-Id: I0e33ecefb2bdab0295698c0add948068a5a83345
Signed-off-by: Florin Coras <fcoras@cisco.com>
diff --git a/src/plugins/acl/acl.c b/src/plugins/acl/acl.c
index b93d3bc..2a2aaa0 100644
--- a/src/plugins/acl/acl.c
+++ b/src/plugins/acl/acl.c
@@ -138,13 +138,11 @@
   acl_main_t *am = &acl_main;
   vl_api_acl_plugin_get_version_reply_t *rmp;
   int msg_size = sizeof (*rmp);
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   rmp = vl_msg_api_alloc (msg_size);
   memset (rmp, 0, msg_size);
@@ -154,7 +152,7 @@
   rmp->major = htonl (ACL_PLUGIN_VERSION_MAJOR);
   rmp->minor = htonl (ACL_PLUGIN_VERSION_MINOR);
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
@@ -1871,7 +1869,7 @@
 }
 
 static void
-send_acl_details (acl_main_t * am, svm_queue_t * q,
+send_acl_details (acl_main_t * am, vl_api_registration_t * reg,
 		  acl_list_t * acl, u32 context)
 {
   vl_api_acl_details_t *mp;
@@ -1897,7 +1895,7 @@
     }
 
   clib_mem_set_heap (oldheap);
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 
@@ -1907,15 +1905,12 @@
   acl_main_t *am = &acl_main;
   u32 acl_index;
   acl_list_t *acl;
-
   int rv = -1;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   if (mp->acl_index == ~0)
     {
@@ -1923,7 +1918,7 @@
     /* Just dump all ACLs */
     pool_foreach (acl, am->acls,
     ({
-      send_acl_details(am, q, acl, mp->context);
+      send_acl_details(am, reg, acl, mp->context);
     }));
     /* *INDENT-ON* */
     }
@@ -1933,7 +1928,7 @@
       if (!pool_is_free_index (am->acls, acl_index))
 	{
 	  acl = pool_elt_at_index (am->acls, acl_index);
-	  send_acl_details (am, q, acl, mp->context);
+	  send_acl_details (am, reg, acl, mp->context);
 	}
     }
 
@@ -1946,7 +1941,7 @@
 
 static void
 send_acl_interface_list_details (acl_main_t * am,
-				 svm_queue_t * q,
+				 vl_api_registration_t * reg,
 				 u32 sw_if_index, u32 context)
 {
   vl_api_acl_interface_list_details_t *mp;
@@ -1987,7 +1982,7 @@
 	htonl (am->output_acl_vec_by_sw_if_index[sw_if_index][i]);
     }
   clib_mem_set_heap (oldheap);
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
@@ -1999,20 +1994,18 @@
   vnet_interface_main_t *im = &am->vnet_main->interface_main;
 
   u32 sw_if_index;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   if (mp->sw_if_index == ~0)
     {
     /* *INDENT-OFF* */
     pool_foreach (swif, im->sw_interfaces,
     ({
-      send_acl_interface_list_details(am, q, swif->sw_if_index, mp->context);
+      send_acl_interface_list_details(am, reg, swif->sw_if_index, mp->context);
     }));
     /* *INDENT-ON* */
     }
@@ -2020,7 +2013,7 @@
     {
       sw_if_index = ntohl (mp->sw_if_index);
       if (!pool_is_free_index (im->sw_interfaces, sw_if_index))
-	send_acl_interface_list_details (am, q, sw_if_index, mp->context);
+	send_acl_interface_list_details (am, reg, sw_if_index, mp->context);
     }
 }
 
@@ -2113,7 +2106,7 @@
 }
 
 static void
-send_macip_acl_details (acl_main_t * am, svm_queue_t * q,
+send_macip_acl_details (acl_main_t * am, vl_api_registration_t * reg,
 			macip_acl_list_t * acl, u32 context)
 {
   vl_api_macip_acl_details_t *mp;
@@ -2158,7 +2151,7 @@
       mp->count = 0;
     }
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 
@@ -2168,22 +2161,21 @@
   acl_main_t *am = &acl_main;
   macip_acl_list_t *acl;
 
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   if (mp->acl_index == ~0)
     {
       /* Just dump all ACLs for now, with sw_if_index = ~0 */
       pool_foreach (acl, am->macip_acls, (
 					   {
-					   send_macip_acl_details (am, q, acl,
-								   mp->
-								   context);}
+					   send_macip_acl_details (am, reg,
+								   acl,
+								   mp->context);
+					   }
 		    ));
       /* *INDENT-ON* */
     }
@@ -2193,7 +2185,7 @@
       if (!pool_is_free_index (am->macip_acls, acl_index))
 	{
 	  acl = pool_elt_at_index (am->macip_acls, acl_index);
-	  send_macip_acl_details (am, q, acl, mp->context);
+	  send_macip_acl_details (am, reg, acl, mp->context);
 	}
     }
 }
@@ -2206,14 +2198,12 @@
   vl_api_macip_acl_interface_get_reply_t *rmp;
   u32 count = vec_len (am->macip_acl_by_sw_if_index);
   int msg_size = sizeof (*rmp) + sizeof (rmp->acls[0]) * count;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   int i;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   rmp = vl_msg_api_alloc (msg_size);
   memset (rmp, 0, msg_size);
@@ -2226,12 +2216,12 @@
       rmp->acls[i] = htonl (am->macip_acl_by_sw_if_index[i]);
     }
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 send_macip_acl_interface_list_details (acl_main_t * am,
-				       svm_queue_t * q,
+				       vl_api_registration_t * reg,
 				       u32 sw_if_index,
 				       u32 acl_index, u32 context)
 {
@@ -2250,22 +2240,20 @@
   rmp->sw_if_index = htonl (sw_if_index);
   rmp->acls[0] = htonl (acl_index);
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
   vl_api_macip_acl_interface_list_dump_t_handler
   (vl_api_macip_acl_interface_list_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   acl_main_t *am = &acl_main;
   u32 sw_if_index = ntohl (mp->sw_if_index);
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   if (sw_if_index == ~0)
     {
@@ -2273,7 +2261,7 @@
       {
 	if (~0 != am->macip_acl_by_sw_if_index[sw_if_index])
 	  {
-	    send_macip_acl_interface_list_details (am, q, sw_if_index,
+	    send_macip_acl_interface_list_details (am, reg, sw_if_index,
 						   am->macip_acl_by_sw_if_index
 						   [sw_if_index],
 						   mp->context);
@@ -2284,7 +2272,7 @@
     {
       if (vec_len (am->macip_acl_by_sw_if_index) > sw_if_index)
 	{
-	  send_macip_acl_interface_list_details (am, q, sw_if_index,
+	  send_macip_acl_interface_list_details (am, reg, sw_if_index,
 						 am->macip_acl_by_sw_if_index
 						 [sw_if_index], mp->context);
 	}
diff --git a/src/plugins/gtpu/gtpu_api.c b/src/plugins/gtpu/gtpu_api.c
index 1b93578..502720d 100644
--- a/src/plugins/gtpu/gtpu_api.c
+++ b/src/plugins/gtpu/gtpu_api.c
@@ -148,7 +148,7 @@
 }
 
 static void send_gtpu_tunnel_details
-  (gtpu_tunnel_t * t, svm_queue_t * q, u32 context)
+  (gtpu_tunnel_t * t, vl_api_registration_t * reg, u32 context)
 {
   vl_api_gtpu_tunnel_details_t *rmp;
   ip4_main_t *im4 = &ip4_main;
@@ -177,22 +177,20 @@
   rmp->is_ipv6 = is_ipv6;
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_gtpu_tunnel_dump_t_handler (vl_api_gtpu_tunnel_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   gtpu_main_t *gtm = &gtpu_main;
   gtpu_tunnel_t *t;
   u32 sw_if_index;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   sw_if_index = ntohl (mp->sw_if_index);
 
@@ -201,7 +199,7 @@
       /* *INDENT-OFF* */
       pool_foreach (t, gtm->tunnels,
       ({
-        send_gtpu_tunnel_details(t, q, mp->context);
+        send_gtpu_tunnel_details(t, reg, mp->context);
       }));
       /* *INDENT-ON* */
     }
@@ -213,7 +211,7 @@
 	  return;
 	}
       t = &gtm->tunnels[gtm->tunnel_index_by_sw_if_index[sw_if_index]];
-      send_gtpu_tunnel_details (t, q, mp->context);
+      send_gtpu_tunnel_details (t, reg, mp->context);
     }
 }
 
diff --git a/src/plugins/memif/memif_api.c b/src/plugins/memif/memif_api.c
index 068fd3d..f9f74cc 100644
--- a/src/plugins/memif/memif_api.c
+++ b/src/plugins/memif/memif_api.c
@@ -219,7 +219,7 @@
 }
 
 static void
-send_memif_details (svm_queue_t * q,
+send_memif_details (vl_api_registration_t * reg,
 		    memif_if_t * mif,
 		    vnet_sw_interface_t * swif,
 		    u8 * interface_name, u32 context)
@@ -255,7 +255,7 @@
   mp->admin_up_down = (swif->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) ? 1 : 0;
   mp->link_up_down = (hwif->flags & VNET_HW_INTERFACE_FLAG_LINK_UP) ? 1 : 0;
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 /**
@@ -270,10 +270,10 @@
   vnet_sw_interface_t *swif;
   memif_if_t *mif;
   u8 *if_name = 0;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
@@ -285,7 +285,7 @@
 			format_vnet_sw_interface_name,
 			vnm, swif, 0);
 
-      send_memif_details (q, mif, swif, if_name, mp->context);
+      send_memif_details (reg, mif, swif, if_name, mp->context);
       _vec_len (if_name) = 0;
     }));
   /* *INDENT-ON* */
diff --git a/src/plugins/nat/nat_api.c b/src/plugins/nat/nat_api.c
index dc9fc5d..f3d353f 100644
--- a/src/plugins/nat/nat_api.c
+++ b/src/plugins/nat/nat_api.c
@@ -174,7 +174,8 @@
 }
 
 static void
-send_nat_worker_details (u32 worker_index, svm_queue_t * q, u32 context)
+send_nat_worker_details (u32 worker_index, vl_api_registration_t * reg,
+			 u32 context)
 {
   vl_api_nat_worker_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -189,23 +190,23 @@
   rmp->lcore_id = htonl (w->lcore_id);
   strncpy ((char *) rmp->name, (char *) w->name, ARRAY_LEN (rmp->name) - 1);
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_nat_worker_dump_t_handler (vl_api_nat_worker_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   snat_main_t *sm = &snat_main;
   u32 *worker_index;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
   vec_foreach (worker_index, sm->workers)
-    send_nat_worker_details(*worker_index, q, mp->context);
+    send_nat_worker_details(*worker_index, reg, mp->context);
   /* *INDENT-ON* */
 }
 
@@ -315,7 +316,7 @@
 
 typedef struct nat_api_walk_ctx_t_
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   u32 context;
 } nat_api_walk_ctx_t;
 
@@ -337,7 +338,7 @@
   rmp->frag_n = reass->frag_n;
   rmp->is_ip4 = 1;
 
-  vl_msg_api_send_shmem (ctx->q, (u8 *) & rmp);
+  vl_api_send_msg (ctx->reg, (u8 *) rmp);
 
   return 0;
 }
@@ -360,7 +361,7 @@
   rmp->frag_n = reass->frag_n;
   rmp->is_ip4 = 0;
 
-  vl_msg_api_send_shmem (ctx->q, (u8 *) & rmp);
+  vl_api_send_msg (ctx->reg, (u8 *) rmp);
 
   return 0;
 }
@@ -368,14 +369,14 @@
 static void
 vl_api_nat_reass_dump_t_handler (vl_api_nat_reass_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   nat_api_walk_ctx_t ctx = {
-    .q = q,
+    .reg = reg,
     .context = mp->context,
   };
 
@@ -468,7 +469,8 @@
 
 static void
 send_nat44_address_details (snat_address_t * a,
-			    svm_queue_t * q, u32 context, u8 twice_nat)
+			    vl_api_registration_t * reg, u32 context,
+			    u8 twice_nat)
 {
   vl_api_nat44_address_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -487,25 +489,25 @@
   rmp->twice_nat = twice_nat;
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_nat44_address_dump_t_handler (vl_api_nat44_address_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   snat_main_t *sm = &snat_main;
   snat_address_t *a;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
   vec_foreach (a, sm->addresses)
-    send_nat44_address_details (a, q, mp->context, 0);
+    send_nat44_address_details (a, reg, mp->context, 0);
   vec_foreach (a, sm->twice_nat_addresses)
-    send_nat44_address_details (a, q, mp->context, 1);
+    send_nat44_address_details (a, reg, mp->context, 1);
   /* *INDENT-ON* */
 }
 
@@ -554,7 +556,7 @@
 
 static void
 send_nat44_interface_details (snat_interface_t * i,
-			      svm_queue_t * q, u32 context)
+			      vl_api_registration_t * reg, u32 context)
 {
   vl_api_nat44_interface_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -568,24 +570,24 @@
     nat_interface_is_inside (i);
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_nat44_interface_dump_t_handler (vl_api_nat44_interface_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   snat_main_t *sm = &snat_main;
   snat_interface_t *i;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
   pool_foreach (i, sm->interfaces,
   ({
-    send_nat44_interface_details(i, q, mp->context);
+    send_nat44_interface_details(i, reg, mp->context);
   }));
   /* *INDENT-ON* */
 }
@@ -636,7 +638,8 @@
 
 static void
 send_nat44_interface_output_feature_details (snat_interface_t * i,
-					     svm_queue_t * q, u32 context)
+					     vl_api_registration_t * reg,
+					     u32 context)
 {
   vl_api_nat44_interface_output_feature_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -649,25 +652,25 @@
   rmp->context = context;
   rmp->is_inside = nat_interface_is_inside (i);
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
   vl_api_nat44_interface_output_feature_dump_t_handler
   (vl_api_nat44_interface_output_feature_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   snat_main_t *sm = &snat_main;
   snat_interface_t *i;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
   pool_foreach (i, sm->output_feature_interfaces,
   ({
-    send_nat44_interface_output_feature_details(i, q, mp->context);
+    send_nat44_interface_output_feature_details(i, reg, mp->context);
   }));
   /* *INDENT-ON* */
 }
@@ -742,7 +745,7 @@
 
 static void
 send_nat44_static_mapping_details (snat_static_mapping_t * m,
-				   svm_queue_t * q, u32 context)
+				   vl_api_registration_t * reg, u32 context)
 {
   vl_api_nat44_static_mapping_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -762,12 +765,13 @@
   rmp->context = context;
   rmp->twice_nat = m->twice_nat;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 send_nat44_static_map_resolve_details (snat_static_map_resolve_t * m,
-				       svm_queue_t * q, u32 context)
+				       vl_api_registration_t * reg,
+				       u32 context)
 {
   vl_api_nat44_static_mapping_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -786,28 +790,28 @@
   rmp->context = context;
   rmp->twice_nat = m->twice_nat;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_nat44_static_mapping_dump_t_handler (vl_api_nat44_static_mapping_dump_t
 					    * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   snat_main_t *sm = &snat_main;
   snat_static_mapping_t *m;
   snat_static_map_resolve_t *rp;
   int j;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
   pool_foreach (m, sm->static_mappings,
   ({
       if (!vec_len(m->locals) && (m->local_addr.as_u32 != m->external_addr.as_u32))
-        send_nat44_static_mapping_details (m, q, mp->context);
+        send_nat44_static_mapping_details (m, reg, mp->context);
   }));
   /* *INDENT-ON* */
 
@@ -815,7 +819,7 @@
     {
       rp = sm->to_resolve + j;
       if (rp->l_addr.as_u32 != 0)
-	send_nat44_static_map_resolve_details (rp, q, mp->context);
+	send_nat44_static_map_resolve_details (rp, reg, mp->context);
     }
 }
 
@@ -886,7 +890,7 @@
 
 static void
 send_nat44_identity_mapping_details (snat_static_mapping_t * m,
-				     svm_queue_t * q, u32 context)
+				     vl_api_registration_t * reg, u32 context)
 {
   vl_api_nat44_identity_mapping_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -903,12 +907,13 @@
   rmp->protocol = snat_proto_to_ip_proto (m->proto);
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 send_nat44_identity_map_resolve_details (snat_static_map_resolve_t * m,
-					 svm_queue_t * q, u32 context)
+					 vl_api_registration_t * reg,
+					 u32 context)
 {
   vl_api_nat44_identity_mapping_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -924,28 +929,28 @@
   rmp->protocol = snat_proto_to_ip_proto (m->proto);
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
   vl_api_nat44_identity_mapping_dump_t_handler
   (vl_api_nat44_identity_mapping_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   snat_main_t *sm = &snat_main;
   snat_static_mapping_t *m;
   snat_static_map_resolve_t *rp;
   int j;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
   pool_foreach (m, sm->static_mappings,
   ({
       if (!vec_len(m->locals) && (m->local_addr.as_u32 == m->external_addr.as_u32))
-        send_nat44_identity_mapping_details (m, q, mp->context);
+        send_nat44_identity_mapping_details (m, reg, mp->context);
   }));
   /* *INDENT-ON* */
 
@@ -953,7 +958,7 @@
     {
       rp = sm->to_resolve + j;
       if (rp->l_addr.as_u32 == 0)
-	send_nat44_identity_map_resolve_details (rp, q, mp->context);
+	send_nat44_identity_map_resolve_details (rp, reg, mp->context);
     }
 }
 
@@ -1001,7 +1006,8 @@
 
 static void
 send_nat44_interface_addr_details (u32 sw_if_index,
-				   svm_queue_t * q, u32 context, u8 twice_nat)
+				   vl_api_registration_t * reg, u32 context,
+				   u8 twice_nat)
 {
   vl_api_nat44_interface_addr_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -1014,26 +1020,26 @@
   rmp->twice_nat = twice_nat;
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_nat44_interface_addr_dump_t_handler (vl_api_nat44_interface_addr_dump_t
 					    * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   snat_main_t *sm = &snat_main;
   u32 *i;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
   vec_foreach (i, sm->auto_add_sw_if_indices)
-    send_nat44_interface_addr_details(*i, q, mp->context, 0);
+    send_nat44_interface_addr_details(*i, reg, mp->context, 0);
   vec_foreach (i, sm->auto_add_sw_if_indices_twice_nat)
-    send_nat44_interface_addr_details(*i, q, mp->context, 1);
+    send_nat44_interface_addr_details(*i, reg, mp->context, 1);
   /* *INDENT-ON* */
 }
 
@@ -1049,7 +1055,8 @@
 }
 
 static void
-send_nat44_user_details (snat_user_t * u, svm_queue_t * q, u32 context)
+send_nat44_user_details (snat_user_t * u, vl_api_registration_t * reg,
+			 u32 context)
 {
   vl_api_nat44_user_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -1066,25 +1073,25 @@
   rmp->nstaticsessions = ntohl (u->nstaticsessions);
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_nat44_user_dump_t_handler (vl_api_nat44_user_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   snat_main_t *sm = &snat_main;
   snat_main_per_thread_data_t *tsm;
   snat_user_t *u;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
   vec_foreach (tsm, sm->per_thread_data)
     vec_foreach (u, tsm->users)
-      send_nat44_user_details (u, q, mp->context);
+      send_nat44_user_details (u, reg, mp->context);
   /* *INDENT-ON* */
 }
 
@@ -1100,7 +1107,7 @@
 
 static void
 send_nat44_user_session_details (snat_session_t * s,
-				 svm_queue_t * q, u32 context)
+				 vl_api_registration_t * reg, u32 context)
 {
   vl_api_nat44_user_session_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -1129,14 +1136,14 @@
       rmp->protocol = ntohs (snat_proto_to_ip_proto (s->in2out.protocol));
     }
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_nat44_user_session_dump_t_handler (vl_api_nat44_user_session_dump_t *
 					  mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   snat_main_t *sm = &snat_main;
   snat_main_per_thread_data_t *tsm;
   snat_session_t *s;
@@ -1147,8 +1154,8 @@
   dlist_elt_t *head, *elt;
   ip4_header_t ip;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   clib_memcpy (&ukey.addr, mp->ip_address, 4);
@@ -1176,7 +1183,7 @@
     {
       s = pool_elt_at_index (tsm->sessions, session_index);
 
-      send_nat44_user_session_details (s, q, mp->context);
+      send_nat44_user_session_details (s, reg, mp->context);
 
       elt_index = elt->next;
       elt = pool_elt_at_index (tsm->list_pool, elt_index);
@@ -1260,7 +1267,8 @@
 
 static void
 send_nat44_lb_static_mapping_details (snat_static_mapping_t * m,
-				      svm_queue_t * q, u32 context)
+				      vl_api_registration_t * reg,
+				      u32 context)
 {
   vl_api_nat44_lb_static_mapping_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -1292,26 +1300,26 @@
     rmp->local_num++;
   }
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
   vl_api_nat44_lb_static_mapping_dump_t_handler
   (vl_api_nat44_lb_static_mapping_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   snat_main_t *sm = &snat_main;
   snat_static_mapping_t *m;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
   pool_foreach (m, sm->static_mappings,
   ({
       if (vec_len(m->locals))
-        send_nat44_lb_static_mapping_details (m, q, mp->context);
+        send_nat44_lb_static_mapping_details (m, reg, mp->context);
   }));
   /* *INDENT-ON* */
 }
@@ -1390,12 +1398,12 @@
   vl_api_nat44_forwarding_is_enabled_t_handler
   (vl_api_nat44_forwarding_is_enabled_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   snat_main_t *sm = &snat_main;
   vl_api_nat44_forwarding_is_enabled_reply_t *rmp;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
@@ -1406,7 +1414,7 @@
 
   rmp->enabled = sm->forwarding_enabled;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void *vl_api_nat44_forwarding_is_enabled_t_print
@@ -1555,7 +1563,8 @@
 }
 
 static void
-sent_nat_det_map_details (snat_det_map_t * m, svm_queue_t * q, u32 context)
+sent_nat_det_map_details (snat_det_map_t * m, vl_api_registration_t * reg,
+			  u32 context)
 {
   vl_api_nat_det_map_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -1573,23 +1582,23 @@
   rmp->ses_num = htonl (m->ses_num);
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_nat_det_map_dump_t_handler (vl_api_nat_det_map_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   snat_main_t *sm = &snat_main;
   snat_det_map_t *m;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
   vec_foreach(m, sm->det_maps)
-    sent_nat_det_map_details(m, q, mp->context);
+    sent_nat_det_map_details(m, reg, mp->context);
   /* *INDENT-ON* */
 }
 
@@ -1770,7 +1779,7 @@
 
 static void
 send_nat_det_session_details (snat_det_session_t * s,
-			      svm_queue_t * q, u32 context)
+			      vl_api_registration_t * reg, u32 context)
 {
   vl_api_nat_det_session_details_t *rmp;
   snat_main_t *sm = &snat_main;
@@ -1786,21 +1795,21 @@
   rmp->expire = ntohl (s->expire);
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_nat_det_session_dump_t_handler (vl_api_nat_det_session_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   snat_main_t *sm = &snat_main;
   ip4_address_t user_addr;
   snat_det_map_t *dm;
   snat_det_session_t *s, empty_ses;
   u16 i;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
   if (!mp->is_nat44)
     return;
@@ -1815,7 +1824,7 @@
   for (i = 0; i < SNAT_DET_SES_PER_USER; i++)
     {
       if (s->out.as_u64)
-	send_nat_det_session_details (s, q, mp->context);
+	send_nat_det_session_details (s, reg, mp->context);
       s++;
     }
 }
@@ -1888,7 +1897,7 @@
 
 typedef struct nat64_api_walk_ctx_t_
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   u32 context;
   nat64_db_t *db;
 } nat64_api_walk_ctx_t;
@@ -1915,7 +1924,7 @@
     rmp->vrf_id = ~0;
   rmp->context = ctx->context;
 
-  vl_msg_api_send_shmem (ctx->q, (u8 *) & rmp);
+  vl_api_send_msg (ctx->reg, (u8 *) rmp);
 
   return 0;
 }
@@ -1923,14 +1932,14 @@
 static void
 vl_api_nat64_pool_addr_dump_t_handler (vl_api_nat64_pool_addr_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   nat64_api_walk_ctx_t ctx = {
-    .q = q,
+    .reg = reg,
     .context = mp->context,
   };
 
@@ -1997,7 +2006,7 @@
     nat_interface_is_inside (i);
   rmp->context = ctx->context;
 
-  vl_msg_api_send_shmem (ctx->q, (u8 *) & rmp);
+  vl_api_send_msg (ctx->reg, (u8 *) rmp);
 
   return 0;
 }
@@ -2005,14 +2014,14 @@
 static void
 vl_api_nat64_interface_dump_t_handler (vl_api_nat64_interface_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   nat64_api_walk_ctx_t ctx = {
-    .q = q,
+    .reg = reg,
     .context = mp->context,
   };
 
@@ -2095,7 +2104,7 @@
   rmp->is_static = bibe->is_static;
   rmp->ses_num = ntohl (bibe->ses_num);
 
-  vl_msg_api_send_shmem (ctx->q, (u8 *) & rmp);
+  vl_api_send_msg (ctx->reg, (u8 *) rmp);
 
   return 0;
 }
@@ -2103,16 +2112,16 @@
 static void
 vl_api_nat64_bib_dump_t_handler (vl_api_nat64_bib_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   nat64_main_t *nm = &nat64_main;
   nat64_db_t *db;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   nat64_api_walk_ctx_t ctx = {
-    .q = q,
+    .reg = reg,
     .context = mp->context,
   };
 
@@ -2228,7 +2237,7 @@
   rmp->vrf_id = ntohl (fib->ft_table_id);
   rmp->proto = ste->proto;
 
-  vl_msg_api_send_shmem (ctx->q, (u8 *) & rmp);
+  vl_api_send_msg (ctx->reg, (u8 *) rmp);
 
   return 0;
 }
@@ -2236,16 +2245,16 @@
 static void
 vl_api_nat64_st_dump_t_handler (vl_api_nat64_st_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   nat64_main_t *nm = &nat64_main;
   nat64_db_t *db;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   nat64_api_walk_ctx_t ctx = {
-    .q = q,
+    .reg = reg,
     .context = mp->context,
   };
 
@@ -2312,7 +2321,7 @@
   rmp->vrf_id = ntohl (p->vrf_id);
   rmp->context = ctx->context;
 
-  vl_msg_api_send_shmem (ctx->q, (u8 *) & rmp);
+  vl_api_send_msg (ctx->reg, (u8 *) rmp);
 
   return 0;
 }
@@ -2320,14 +2329,14 @@
 static void
 vl_api_nat64_prefix_dump_t_handler (vl_api_nat64_prefix_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   nat64_api_walk_ctx_t ctx = {
-    .q = q,
+    .reg = reg,
     .context = mp->context,
   };
 
diff --git a/src/plugins/pppoe/pppoe_api.c b/src/plugins/pppoe/pppoe_api.c
index f8a0227..4c65ec4 100644
--- a/src/plugins/pppoe/pppoe_api.c
+++ b/src/plugins/pppoe/pppoe_api.c
@@ -118,7 +118,7 @@
 }
 
 static void send_pppoe_session_details
-  (pppoe_session_t * t, svm_queue_t * q, u32 context)
+  (pppoe_session_t * t, vl_api_registration_t * reg, u32 context)
 {
   vl_api_pppoe_session_details_t *rmp;
   ip4_main_t *im4 = &ip4_main;
@@ -146,22 +146,20 @@
   rmp->is_ipv6 = is_ipv6;
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_pppoe_session_dump_t_handler (vl_api_pppoe_session_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   pppoe_main_t *pem = &pppoe_main;
   pppoe_session_t *t;
   u32 sw_if_index;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   sw_if_index = ntohl (mp->sw_if_index);
 
@@ -170,7 +168,7 @@
       /* *INDENT-OFF* */
       pool_foreach (t, pem->sessions,
       ({
-        send_pppoe_session_details(t, q, mp->context);
+        send_pppoe_session_details(t, reg, mp->context);
       }));
       /* *INDENT-ON* */
     }
@@ -182,7 +180,7 @@
 	  return;
 	}
       t = &pem->sessions[pem->session_index_by_sw_if_index[sw_if_index]];
-      send_pppoe_session_details (t, q, mp->context);
+      send_pppoe_session_details (t, reg, mp->context);
     }
 }
 
diff --git a/src/vlibmemory/vlib_api.c b/src/vlibmemory/vlib_api.c
index 9465cfc..1067bf3 100644
--- a/src/vlibmemory/vlib_api.c
+++ b/src/vlibmemory/vlib_api.c
@@ -134,13 +134,13 @@
 {
   api_main_t *am = &api_main;
   vl_api_api_versions_reply_t *rmp;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   u32 nmsg = vec_len (am->api_version_list);
   int msg_size = sizeof (*rmp) + sizeof (rmp->api_versions[0]) * nmsg;
   int i;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   rmp = vl_msg_api_alloc (msg_size);
@@ -160,7 +160,7 @@
       strncpy ((char *) rmp->api_versions[i].name, vl->name, 64 - 1);
     }
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 #define foreach_vlib_api_msg                            \
diff --git a/src/vnet/bfd/bfd_api.c b/src/vnet/bfd/bfd_api.c
index 0d5d123..48fcdef 100644
--- a/src/vnet/bfd/bfd_api.c
+++ b/src/vnet/bfd/bfd_api.c
@@ -140,7 +140,7 @@
 }
 
 void
-send_bfd_udp_session_details (svm_queue_t * q, u32 context,
+send_bfd_udp_session_details (vl_api_registration_t * reg, u32 context,
 			      bfd_session_t * bs)
 {
   if (bs->transport != BFD_TRANSPORT_UDP4 &&
@@ -191,7 +191,7 @@
     clib_host_to_net_u32 (bs->config_required_min_rx_usec);
   mp->desired_min_tx = clib_host_to_net_u32 (bs->config_desired_min_tx_usec);
   mp->detect_mult = bs->local_detect_mult;
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 void
@@ -199,41 +199,40 @@
 {
   vpe_api_main_t *vam = &vpe_api_main;
   vpe_client_registration_t *reg;
-  svm_queue_t *q;
+  vl_api_registration_t *vl_reg;
   /* *INDENT-OFF* */
   pool_foreach (reg, vam->bfd_events_registrations, ({
-                  q = vl_api_client_index_to_input_queue (reg->client_index);
-                  if (q)
-                    {
-                      switch (bs->transport)
-                        {
-                        case BFD_TRANSPORT_UDP4:
-                        /* fallthrough */
-                        case BFD_TRANSPORT_UDP6:
-                          send_bfd_udp_session_details (q, 0, bs);
-                        }
-                    }
-                }));
+    vl_reg = vl_api_client_index_to_registration (reg->client_index);
+    if (vl_reg)
+      {
+	switch (bs->transport)
+	  {
+	  case BFD_TRANSPORT_UDP4:
+	  /* fallthrough */
+	  case BFD_TRANSPORT_UDP6:
+	    send_bfd_udp_session_details (vl_reg, 0, bs);
+	  }
+      }
+  }));
   /* *INDENT-ON* */
 }
 
 static void
 vl_api_bfd_udp_session_dump_t_handler (vl_api_bfd_udp_session_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   bfd_session_t *bs = NULL;
   /* *INDENT-OFF* */
   pool_foreach (bs, bfd_main.sessions, ({
-                  if (bs->transport == BFD_TRANSPORT_UDP4 ||
-                      bs->transport == BFD_TRANSPORT_UDP6)
-                    send_bfd_udp_session_details (q, mp->context, bs);
-                }));
+    if (bs->transport == BFD_TRANSPORT_UDP4 ||
+	bs->transport == BFD_TRANSPORT_UDP6)
+      send_bfd_udp_session_details (reg, mp->context, bs);
+  }));
   /* *INDENT-ON* */
 }
 
@@ -274,11 +273,10 @@
 static void
 vl_api_bfd_auth_keys_dump_t_handler (vl_api_bfd_auth_keys_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   bfd_auth_key_t *key = NULL;
@@ -286,15 +284,15 @@
 
   /* *INDENT-OFF* */
   pool_foreach (key, bfd_main.auth_keys, ({
-                  rmp = vl_msg_api_alloc (sizeof (*rmp));
-                  memset (rmp, 0, sizeof (*rmp));
-                  rmp->_vl_msg_id = ntohs (VL_API_BFD_AUTH_KEYS_DETAILS);
-                  rmp->context = mp->context;
-                  rmp->conf_key_id = clib_host_to_net_u32 (key->conf_key_id);
-                  rmp->auth_type = key->auth_type;
-                  rmp->use_count = clib_host_to_net_u32 (key->use_count);
-                  vl_msg_api_send_shmem (q, (u8 *)&rmp);
-                }));
+    rmp = vl_msg_api_alloc (sizeof (*rmp));
+    memset (rmp, 0, sizeof (*rmp));
+    rmp->_vl_msg_id = ntohs (VL_API_BFD_AUTH_KEYS_DETAILS);
+    rmp->context = mp->context;
+    rmp->conf_key_id = clib_host_to_net_u32 (key->conf_key_id);
+    rmp->auth_type = key->auth_type;
+    rmp->use_count = clib_host_to_net_u32 (key->use_count);
+    vl_api_send_msg (reg, (u8 *)&rmp);
+  }));
   /* *INDENT-ON* */
 }
 
diff --git a/src/vnet/bier/bier_api.c b/src/vnet/bier/bier_api.c
index f4d3732..840c33b 100644
--- a/src/vnet/bier/bier_api.c
+++ b/src/vnet/bier/bier_api.c
@@ -106,7 +106,7 @@
 }
 
 static void
-send_bier_table_details (svm_queue_t * q,
+send_bier_table_details (vl_api_registration_t * reg,
                          u32 context,
                          const bier_table_t *bt)
 {
@@ -124,18 +124,18 @@
     mp->bt_tbl_id.bt_sub_domain = bt->bt_id.bti_sub_domain;
     mp->bt_tbl_id.bt_hdr_len_id = bt->bt_id.bti_hdr_len;
 
-    vl_msg_api_send_shmem (q, (u8 *) & mp);
+    vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 vl_api_bier_table_dump_t_handler (vl_api_bier_table_dump_t * mp)
 {
-    svm_queue_t *q;
+    vl_api_registration_t *reg;
     bier_table_t *bt;
 
-    q = vl_api_client_index_to_input_queue (mp->client_index);
-    if (q == 0)
-        return;
+    reg = vl_api_client_index_to_registration (mp->client_index);
+    if (!reg)
+      return;
 
     pool_foreach(bt, bier_table_pool,
     ({
@@ -144,7 +144,7 @@
          */
         if (bier_table_is_main(bt))
         {
-            send_bier_table_details(q, mp->context, bt);
+            send_bier_table_details(reg, mp->context, bt);
         }
     }));
 }
@@ -252,7 +252,7 @@
 
 typedef struct bier_route_details_walk_t_
 {
-    svm_queue_t * q;
+    vl_api_registration_t * reg;
     u32 context;
 } bier_route_details_walk_t;
 
@@ -296,17 +296,17 @@
         fp++;
     }
 
-    vl_msg_api_send_shmem (ctx->q, (u8 *) & mp);
+    vl_api_send_msg (ctx->reg, (u8 *) mp);
 }
 
 static void
 vl_api_bier_route_dump_t_handler (vl_api_bier_route_dump_t * mp)
 {
-    svm_queue_t *q;
+    vl_api_registration_t *reg;
 
-    q = vl_api_client_index_to_input_queue (mp->client_index);
-    if (q == 0)
-        return;
+    reg = vl_api_client_index_to_registration (mp->client_index);
+    if (!reg)
+      return;
 
     bier_table_id_t bti = {
         .bti_set = mp->br_tbl_id.bt_set,
@@ -316,7 +316,7 @@
         .bti_ecmp = BIER_ECMP_TABLE_ID_MAIN,
     };
     bier_route_details_walk_t ctx = {
-        .q = q,
+        .reg = reg,
         .context = mp->context,
     };
     bier_table_walk(&bti, send_bier_route_details, &ctx);
@@ -371,7 +371,7 @@
 }
 
 static void
-send_bier_imp_details (svm_queue_t * q,
+send_bier_imp_details (vl_api_registration_t * reg,
                        u32 context,
                        const bier_imp_t *bi)
 {
@@ -400,22 +400,22 @@
     mp->bi_n_bytes = n_bytes;
     memcpy(mp->bi_bytes, bi->bi_bits.bits, n_bytes);
 
-    vl_msg_api_send_shmem (q, (u8 *) & mp);
+    vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 vl_api_bier_imp_dump_t_handler (vl_api_bier_imp_dump_t * mp)
 {
-    svm_queue_t *q;
+    vl_api_registration_t *reg;
     bier_imp_t *bi;
 
-    q = vl_api_client_index_to_input_queue (mp->client_index);
-    if (q == 0)
-        return;
+    reg = vl_api_client_index_to_registration (mp->client_index);
+    if (!reg)
+      return;
 
     pool_foreach(bi, bier_imp_pool,
     ({
-        send_bier_imp_details(q, mp->context, bi);
+        send_bier_imp_details(reg, mp->context, bi);
     }));
 }
 
@@ -446,7 +446,7 @@
 }
 
 static void
-send_bier_disp_table_details (svm_queue_t * q,
+send_bier_disp_table_details (vl_api_registration_t * reg,
                               u32 context,
                               const bier_disp_table_t *bdt)
 {
@@ -461,22 +461,22 @@
 
     mp->bdt_tbl_id = htonl(bdt->bdt_table_id);
 
-    vl_msg_api_send_shmem (q, (u8 *) & mp);
+    vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 vl_api_bier_disp_table_dump_t_handler (vl_api_bier_disp_table_dump_t * mp)
 {
-    svm_queue_t *q;
+    vl_api_registration_t *reg;
     bier_disp_table_t *bdt;
 
-    q = vl_api_client_index_to_input_queue (mp->client_index);
-    if (q == 0)
-        return;
+    reg = vl_api_client_index_to_registration (mp->client_index);
+    if (!reg)
+      return;
 
     pool_foreach(bdt, bier_disp_table_pool,
     ({
-        send_bier_disp_table_details(q, mp->context, bdt);
+        send_bier_disp_table_details(reg, mp->context, bdt);
     }));
 }
 
@@ -603,7 +603,7 @@
 
 typedef struct bier_disp_entry_details_walk_t_
 {
-    svm_queue_t * q;
+    vl_api_registration_t * reg;
     u32 context;
 } bier_disp_entry_details_walk_t;
 
@@ -653,7 +653,7 @@
                 fp++;
             }
 
-            vl_msg_api_send_shmem (ctx->q, (u8 *) & mp);
+            vl_api_send_msg (ctx->reg, (u8 *) mp);
         }
     }
 }
@@ -661,14 +661,14 @@
 static void
 vl_api_bier_disp_entry_dump_t_handler (vl_api_bier_disp_entry_dump_t * mp)
 {
-    svm_queue_t *q;
+    vl_api_registration_t *reg;
 
-    q = vl_api_client_index_to_input_queue (mp->client_index);
-    if (q == 0)
-        return;
+    reg = vl_api_client_index_to_registration (mp->client_index);
+    if (!reg)
+      return;
 
     bier_disp_entry_details_walk_t ctx = {
-        .q = q,
+        .reg = reg,
         .context = mp->context,
     };
     bier_disp_table_walk(ntohl(mp->bde_tbl_id),
diff --git a/src/vnet/classify/classify_api.c b/src/vnet/classify/classify_api.c
index 94340f8..1893f6e 100644
--- a/src/vnet/classify/classify_api.c
+++ b/src/vnet/classify/classify_api.c
@@ -182,7 +182,8 @@
 
 static void
 send_policer_classify_details (u32 sw_if_index,
-			       u32 table_index, svm_queue_t * q, u32 context)
+			       u32 table_index, vl_api_registration_t * reg,
+			       u32 context)
 {
   vl_api_policer_classify_details_t *mp;
 
@@ -193,19 +194,19 @@
   mp->sw_if_index = htonl (sw_if_index);
   mp->table_index = htonl (table_index);
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 vl_api_policer_classify_dump_t_handler (vl_api_policer_classify_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   policer_classify_main_t *pcm = &policer_classify_main;
   u32 *vec_tbl;
   int i;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   vec_tbl = pcm->classify_table_index_by_sw_if_index[mp->type];
@@ -217,7 +218,7 @@
 	  if (vec_elt (vec_tbl, i) == ~0)
 	    continue;
 
-	  send_policer_classify_details (i, vec_elt (vec_tbl, i), q,
+	  send_policer_classify_details (i, vec_elt (vec_tbl, i), reg,
 					 mp->context);
 	}
     }
@@ -226,10 +227,10 @@
 static void
 vl_api_classify_table_ids_t_handler (vl_api_classify_table_ids_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   vnet_classify_main_t *cm = &vnet_classify_main;
@@ -253,7 +254,7 @@
   clib_memcpy (rmp->ids, table_ids, count * sizeof (u32));
   rmp->retval = 0;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 
   vec_free (table_ids);
 }
@@ -311,10 +312,10 @@
 static void
 vl_api_classify_table_info_t_handler (vl_api_classify_table_info_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   vl_api_classify_table_info_reply_t *rmp = 0;
@@ -355,11 +356,11 @@
       rmp->retval = ntohl (VNET_API_ERROR_CLASSIFY_TABLE_NOT_FOUND);
     }
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
-send_classify_session_details (svm_queue_t * q,
+send_classify_session_details (vl_api_registration_t * reg,
 			       u32 table_id,
 			       u32 match_length,
 			       vnet_classify_entry_t * e, u32 context)
@@ -377,20 +378,20 @@
   rmp->match_length = ntohl (match_length);
   clib_memcpy (rmp->match, e->key, match_length);
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_classify_session_dump_t_handler (vl_api_classify_session_dump_t * mp)
 {
   vnet_classify_main_t *cm = &vnet_classify_main;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
   u32 table_id = ntohl (mp->table_id);
   vnet_classify_table_t *t;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
@@ -419,7 +420,7 @@
                       continue;
 
                     send_classify_session_details
-                      (q, table_id, t->match_n_vectors * sizeof (u32x4),
+                      (reg, table_id, t->match_n_vectors * sizeof (u32x4),
                        v, mp->context);
                   }
               }
@@ -455,7 +456,8 @@
 
 static void
 send_flow_classify_details (u32 sw_if_index,
-			    u32 table_index, svm_queue_t * q, u32 context)
+			    u32 table_index, vl_api_registration_t * reg,
+			    u32 context)
 {
   vl_api_flow_classify_details_t *mp;
 
@@ -466,19 +468,19 @@
   mp->sw_if_index = htonl (sw_if_index);
   mp->table_index = htonl (table_index);
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 vl_api_flow_classify_dump_t_handler (vl_api_flow_classify_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   flow_classify_main_t *pcm = &flow_classify_main;
   u32 *vec_tbl;
   int i;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   vec_tbl = pcm->classify_table_index_by_sw_if_index[mp->type];
@@ -490,7 +492,7 @@
 	  if (vec_elt (vec_tbl, i) == ~0)
 	    continue;
 
-	  send_flow_classify_details (i, vec_elt (vec_tbl, i), q,
+	  send_flow_classify_details (i, vec_elt (vec_tbl, i), reg,
 				      mp->context);
 	}
     }
diff --git a/src/vnet/devices/tap/tapv2_api.c b/src/vnet/devices/tap/tapv2_api.c
index e161ed6..9f46884 100644
--- a/src/vnet/devices/tap/tapv2_api.c
+++ b/src/vnet/devices/tap/tapv2_api.c
@@ -54,7 +54,7 @@
 {
   vlib_main_t *vm = vlib_get_main ();
   vl_api_tap_create_v2_reply_t *rmp;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   tap_create_if_args_t _a, *ap = &_a;
 
   memset (ap, 0, sizeof (*ap));
@@ -98,9 +98,9 @@
 
   tap_create_if (vm, ap);
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (!q)
-    return;
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
   rmp->_vl_msg_id = ntohs (VL_API_TAP_CREATE_V2_REPLY);
@@ -108,12 +108,13 @@
   rmp->retval = ntohl (ap->rv);
   rmp->sw_if_index = ntohl (ap->sw_if_index);
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 tap_send_sw_interface_event_deleted (vpe_api_main_t * am,
-				     svm_queue_t * q, u32 sw_if_index)
+				     vl_api_registration_t * reg,
+				     u32 sw_if_index)
 {
   vl_api_sw_interface_event_t *mp;
 
@@ -125,7 +126,7 @@
   mp->admin_up_down = 0;
   mp->link_up_down = 0;
   mp->deleted = 1;
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
@@ -135,13 +136,13 @@
   int rv;
   vpe_api_main_t *vam = &vpe_api_main;
   vl_api_tap_delete_v2_reply_t *rmp;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   u32 sw_if_index = ntohl (mp->sw_if_index);
 
   rv = tap_delete_if (vm, sw_if_index);
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
@@ -149,15 +150,15 @@
   rmp->context = mp->context;
   rmp->retval = ntohl (rv);
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 
   if (!rv)
-    tap_send_sw_interface_event_deleted (vam, q, sw_if_index);
+    tap_send_sw_interface_event_deleted (vam, reg, sw_if_index);
 }
 
 static void
 tap_send_sw_interface_details (vpe_api_main_t * am,
-			       svm_queue_t * q,
+			       vl_api_registration_t * reg,
 			       tap_interface_details_t * tap_if, u32 context)
 {
   vl_api_sw_interface_tap_v2_details_t *mp;
@@ -189,7 +190,7 @@
   mp->host_ip6_prefix_len = tap_if->host_ip6_prefix_len;
 
   mp->context = context;
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
@@ -198,12 +199,12 @@
 {
   int rv;
   vpe_api_main_t *am = &vpe_api_main;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   tap_interface_details_t *tapifs = NULL;
   tap_interface_details_t *tap_if = NULL;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   rv = tap_dump_ifs (&tapifs);
@@ -212,7 +213,7 @@
 
   vec_foreach (tap_if, tapifs)
   {
-    tap_send_sw_interface_details (am, q, tap_if, mp->context);
+    tap_send_sw_interface_details (am, reg, tap_if, mp->context);
   }
 
   vec_free (tapifs);
diff --git a/src/vnet/devices/virtio/vhost_user_api.c b/src/vnet/devices/virtio/vhost_user_api.c
index 9ddd338..442d914 100644
--- a/src/vnet/devices/virtio/vhost_user_api.c
+++ b/src/vnet/devices/virtio/vhost_user_api.c
@@ -53,7 +53,7 @@
  */
 static void
 send_sw_interface_event_deleted (vpe_api_main_t * am,
-				 svm_queue_t * q, u32 sw_if_index)
+				 vl_api_registration_t * reg, u32 sw_if_index)
 {
   vl_api_sw_interface_event_t *mp;
 
@@ -65,7 +65,7 @@
   mp->admin_up_down = 0;
   mp->link_up_down = 0;
   mp->deleted = 1;
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
@@ -127,6 +127,7 @@
   vl_api_delete_vhost_user_if_reply_t *rmp;
   vpe_api_main_t *vam = &vpe_api_main;
   u32 sw_if_index = ntohl (mp->sw_if_index);
+  vl_api_registration_t *reg;
 
   vnet_main_t *vnm = vnet_get_main ();
   vlib_main_t *vm = vlib_get_main ();
@@ -136,18 +137,18 @@
   REPLY_MACRO (VL_API_DELETE_VHOST_USER_IF_REPLY);
   if (!rv)
     {
-      svm_queue_t *q = vl_api_client_index_to_input_queue (mp->client_index);
-      if (!q)
+      reg = vl_api_client_index_to_registration (mp->client_index);
+      if (!reg)
 	return;
 
       vnet_clear_sw_interface_tag (vnm, sw_if_index);
-      send_sw_interface_event_deleted (vam, q, sw_if_index);
+      send_sw_interface_event_deleted (vam, reg, sw_if_index);
     }
 }
 
 static void
 send_sw_interface_vhost_user_details (vpe_api_main_t * am,
-				      svm_queue_t * q,
+				      vl_api_registration_t * reg,
 				      vhost_user_intf_details_t * vui,
 				      u32 context)
 {
@@ -169,7 +170,7 @@
   strncpy ((char *) mp->interface_name,
 	   (char *) vui->if_name, ARRAY_LEN (mp->interface_name) - 1);
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
@@ -182,10 +183,10 @@
   vlib_main_t *vm = vlib_get_main ();
   vhost_user_intf_details_t *ifaces = NULL;
   vhost_user_intf_details_t *vuid = NULL;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   rv = vhost_user_dump_ifs (vnm, vm, &ifaces);
@@ -194,7 +195,7 @@
 
   vec_foreach (vuid, ifaces)
   {
-    send_sw_interface_vhost_user_details (am, q, vuid, mp->context);
+    send_sw_interface_vhost_user_details (am, reg, vuid, mp->context);
   }
   vec_free (ifaces);
 }
diff --git a/src/vnet/dhcp/dhcp_api.c b/src/vnet/dhcp/dhcp_api.c
index 24411af..8e210cd 100644
--- a/src/vnet/dhcp/dhcp_api.c
+++ b/src/vnet/dhcp/dhcp_api.c
@@ -110,14 +110,14 @@
 static void
 vl_api_dhcp_proxy_dump_t_handler (vl_api_dhcp_proxy_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    return;
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;;
 
   dhcp_proxy_dump ((mp->is_ip6 == 1 ?
-		    FIB_PROTOCOL_IP6 : FIB_PROTOCOL_IP4), q, mp->context);
+		    FIB_PROTOCOL_IP6 : FIB_PROTOCOL_IP4), reg, mp->context);
 }
 
 void
@@ -125,7 +125,7 @@
 		   void *opaque, u32 context, dhcp_proxy_t * proxy)
 {
   vl_api_dhcp_proxy_details_t *mp;
-  svm_queue_t *q = opaque;
+  vl_api_registration_t *reg = opaque;
   vl_api_dhcp_server_t *v_server;
   dhcp_server_t *server;
   fib_table_t *s_fib;
@@ -200,7 +200,7 @@
       /* put the address in the first bytes */
       memcpy (mp->dhcp_src_address, &proxy->dhcp_src_address.ip4, 4);
     }
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 void
@@ -208,12 +208,12 @@
 			   u8 mask_width, u8 is_ipv6, u8 * host_address,
 			   u8 * router_address, u8 * host_mac)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   vl_api_dhcp_compl_event_t *mp;
   u32 len;
 
-  q = vl_api_client_index_to_input_queue (client_index);
-  if (!q)
+  reg = vl_api_client_index_to_registration (client_index);
+  if (!reg)
     return;
 
   mp = vl_msg_api_alloc (sizeof (*mp));
@@ -232,7 +232,7 @@
 
   mp->_vl_msg_id = ntohs (VL_API_DHCP_COMPL_EVENT);
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void vl_api_dhcp_client_config_t_handler
diff --git a/src/vnet/flow/flow_api.c b/src/vnet/flow/flow_api.c
index 4aa0253..d1eb2c0 100644
--- a/src/vnet/flow/flow_api.c
+++ b/src/vnet/flow/flow_api.c
@@ -148,14 +148,14 @@
 vl_api_ipfix_exporter_dump_t_handler (vl_api_ipfix_exporter_dump_t * mp)
 {
   flow_report_main_t *frm = &flow_report_main;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   vl_api_ipfix_exporter_details_t *rmp;
   ip4_main_t *im = &ip4_main;
   u32 vrf_id;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (!q)
-    return;
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
   memset (rmp, 0, sizeof (*rmp));
@@ -175,7 +175,7 @@
   rmp->template_interval = htonl (frm->template_interval);
   rmp->udp_checksum = (frm->udp_checksum != 0);
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
@@ -211,11 +211,11 @@
   (vl_api_ipfix_classify_stream_dump_t * mp)
 {
   flow_report_classify_main_t *fcm = &flow_report_classify_main;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   vl_api_ipfix_classify_stream_details_t *rmp;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
@@ -225,7 +225,7 @@
   rmp->domain_id = htonl (fcm->domain_id);
   rmp->src_port = htons (fcm->src_port);
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
@@ -308,7 +308,7 @@
 
 static void
 send_ipfix_classify_table_details (u32 table_index,
-				   svm_queue_t * q, u32 context)
+				   vl_api_registration_t * reg, u32 context)
 {
   flow_report_classify_main_t *fcm = &flow_report_classify_main;
   vl_api_ipfix_classify_table_details_t *mp;
@@ -323,7 +323,7 @@
   mp->ip_version = table->ip_version;
   mp->transport_protocol = table->transport_protocol;
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
@@ -331,16 +331,16 @@
   (vl_api_ipfix_classify_table_dump_t * mp)
 {
   flow_report_classify_main_t *fcm = &flow_report_classify_main;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   u32 i;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   for (i = 0; i < vec_len (fcm->tables); i++)
     if (ipfix_classify_table_index_valid (i))
-      send_ipfix_classify_table_details (i, q, mp->context);
+      send_ipfix_classify_table_details (i, reg, mp->context);
 }
 
 /*
diff --git a/src/vnet/geneve/geneve_api.c b/src/vnet/geneve/geneve_api.c
index 2708d15..9d0830c 100644
--- a/src/vnet/geneve/geneve_api.c
+++ b/src/vnet/geneve/geneve_api.c
@@ -113,7 +113,7 @@
 }
 
 static void send_geneve_tunnel_details
-  (geneve_tunnel_t * t, svm_queue_t * q, u32 context)
+  (geneve_tunnel_t * t, vl_api_registration_t * reg, u32 context)
 {
   vl_api_geneve_tunnel_details_t *rmp;
   ip4_main_t *im4 = &ip4_main;
@@ -142,22 +142,20 @@
   rmp->is_ipv6 = is_ipv6;
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void vl_api_geneve_tunnel_dump_t_handler
   (vl_api_geneve_tunnel_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   geneve_main_t *vxm = &geneve_main;
   geneve_tunnel_t *t;
   u32 sw_if_index;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   sw_if_index = ntohl (mp->sw_if_index);
 
@@ -166,7 +164,7 @@
       /* *INDENT-OFF* */
       pool_foreach (t, vxm->tunnels,
       ({
-        send_geneve_tunnel_details(t, q, mp->context);
+        send_geneve_tunnel_details(t, reg, mp->context);
       }));
       /* *INDENT-ON* */
     }
@@ -178,7 +176,7 @@
 	  return;
 	}
       t = &vxm->tunnels[vxm->tunnel_index_by_sw_if_index[sw_if_index]];
-      send_geneve_tunnel_details (t, q, mp->context);
+      send_geneve_tunnel_details (t, reg, mp->context);
     }
 }
 
diff --git a/src/vnet/gre/gre_api.c b/src/vnet/gre/gre_api.c
index baccc5f..4dad614 100644
--- a/src/vnet/gre/gre_api.c
+++ b/src/vnet/gre/gre_api.c
@@ -94,7 +94,7 @@
 }
 
 static void send_gre_tunnel_details
-  (gre_tunnel_t * t, svm_queue_t * q, u32 context)
+  (gre_tunnel_t * t, vl_api_registration_t * reg, u32 context)
 {
   vl_api_gre_tunnel_details_t *rmp;
   u8 is_ipv6 = t->tunnel_dst.fp_proto == FIB_PROTOCOL_IP6 ? 1 : 0;
@@ -122,22 +122,20 @@
   rmp->context = context;
   rmp->is_ipv6 = is_ipv6;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_gre_tunnel_dump_t_handler (vl_api_gre_tunnel_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   gre_main_t *gm = &gre_main;
   gre_tunnel_t *t;
   u32 sw_if_index;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   sw_if_index = ntohl (mp->sw_if_index);
 
@@ -146,7 +144,7 @@
       /* *INDENT-OFF* */
       pool_foreach (t, gm->tunnels,
       ({
-        send_gre_tunnel_details(t, q, mp->context);
+        send_gre_tunnel_details(t, reg, mp->context);
       }));
       /* *INDENT-ON* */
     }
@@ -158,7 +156,7 @@
 	  return;
 	}
       t = &gm->tunnels[gm->tunnel_index_by_sw_if_index[sw_if_index]];
-      send_gre_tunnel_details (t, q, mp->context);
+      send_gre_tunnel_details (t, reg, mp->context);
     }
 }
 
diff --git a/src/vnet/interface_api.c b/src/vnet/interface_api.c
index d3f170f..0541f31 100644
--- a/src/vnet/interface_api.c
+++ b/src/vnet/interface_api.c
@@ -529,7 +529,7 @@
 }
 
 static void
-send_sw_interface_get_table_reply (svm_queue_t * q,
+send_sw_interface_get_table_reply (vl_api_registration_t * reg,
 				   u32 context, int retval, u32 vrf_id)
 {
   vl_api_sw_interface_get_table_reply_t *mp;
@@ -541,13 +541,13 @@
   mp->retval = htonl (retval);
   mp->vrf_id = htonl (vrf_id);
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 vl_api_sw_interface_get_table_t_handler (vl_api_sw_interface_get_table_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   fib_table_t *fib_table = 0;
   u32 sw_if_index = ~0;
   u32 fib_index = ~0;
@@ -555,8 +555,8 @@
   fib_protocol_t fib_proto = FIB_PROTOCOL_IP4;
   int rv = 0;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   VALIDATE_SW_IF_INDEX (mp);
@@ -575,7 +575,7 @@
 
   BAD_SW_IF_INDEX_LABEL;
 
-  send_sw_interface_get_table_reply (q, mp->context, rv, table_id);
+  send_sw_interface_get_table_reply (reg, mp->context, rv, table_id);
 }
 
 static void vl_api_sw_interface_set_unnumbered_t_handler
@@ -724,7 +724,8 @@
 static void
 send_sw_interface_event (vpe_api_main_t * am,
 			 vpe_client_registration_t * reg,
-			 svm_queue_t * q, vnet_sw_interface_t * swif)
+			 vl_api_registration_t * vl_reg,
+			 vnet_sw_interface_t * swif)
 {
   vl_api_sw_interface_event_t *mp;
   vnet_main_t *vnm = am->vnet_main;
@@ -740,7 +741,7 @@
 
   mp->admin_up_down = (swif->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) ? 1 : 0;
   mp->link_up_down = (hi->flags & VNET_HW_INTERFACE_FLAG_LINK_UP) ? 1 : 0;
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (vl_reg, (u8 *) mp);
 }
 
 static uword
@@ -754,7 +755,7 @@
   vpe_client_registration_t *reg;
   int i;
   u32 prev_sw_if_index;
-  svm_queue_t *q;
+  vl_api_registration_t *vl_reg;
 
   vam->link_state_process_up = 1;
 
@@ -783,15 +784,15 @@
           /* *INDENT-OFF* */
           pool_foreach(reg, vam->interface_events_registrations,
           ({
-            q = vl_api_client_index_to_input_queue (reg->client_index);
-            if (q)
+            vl_reg = vl_api_client_index_to_registration (reg->client_index);
+            if (vl_reg)
               {
                 /* sw_interface may be deleted already */
                 if (!pool_is_free_index (vnm->interface_main.sw_interfaces,
                                          event_data[i]))
                   {
                     swif = vnet_get_sw_interface (vnm, event_data[i]);
-                    send_sw_interface_event (vam, reg, q, swif);
+                    send_sw_interface_event (vam, reg, vl_reg, swif);
                   }
               }
           }));
@@ -948,7 +949,7 @@
   uword *p;
   vnet_interface_main_t *im = &vnm->interface_main;
   u64 sup_and_sub_key;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   clib_error_t *error;
 
   VALIDATE_SW_IF_INDEX (mp);
@@ -1003,8 +1004,8 @@
   BAD_SW_IF_INDEX_LABEL;
 
 out:
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
@@ -1012,7 +1013,7 @@
   rmp->context = mp->context;
   rmp->retval = htonl (rv);
   rmp->sw_if_index = htonl (sw_if_index);
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
diff --git a/src/vnet/ip/ip_api.c b/src/vnet/ip/ip_api.c
index d0982e9..2ea1e41 100644
--- a/src/vnet/ip/ip_api.c
+++ b/src/vnet/ip/ip_api.c
@@ -107,7 +107,8 @@
 			  u8 is_ipv6,
 			  u8 is_static,
 			  u8 * mac_address,
-			  u8 * ip_address, svm_queue_t * q, u32 context)
+			  u8 * ip_address, vl_api_registration_t * reg,
+			  u32 context)
 {
   vl_api_ip_neighbor_details_t *mp;
 
@@ -121,16 +122,16 @@
   memcpy (mp->mac_address, mac_address, 6);
   memcpy (mp->ip_address, ip_address, (is_ipv6) ? 16 : 4);
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 vl_api_ip_neighbor_dump_t_handler (vl_api_ip_neighbor_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   u32 sw_if_index = ntohl (mp->sw_if_index);
@@ -148,7 +149,7 @@
 	   ((n->flags & IP6_NEIGHBOR_FLAG_STATIC) ? 1 : 0),
            (u8 *) n->link_layer_address,
            (u8 *) & (n->key.ip6_address.as_u8),
-           q, mp->context);
+           reg, mp->context);
       }
       /* *INDENT-ON* */
       vec_free (ns);
@@ -165,7 +166,7 @@
           ((n->flags & ETHERNET_ARP_IP4_ENTRY_FLAG_STATIC) ? 1 : 0),
           (u8*) n->ethernet_address,
           (u8*) & (n->ip4_address.as_u8),
-          q, mp->context);
+          reg, mp->context);
       }
       /* *INDENT-ON* */
       vec_free (ns);
@@ -201,7 +202,7 @@
 
 static void
 send_ip_fib_details (vpe_api_main_t * am,
-		     svm_queue_t * q,
+		     vl_api_registration_t * reg,
 		     const fib_table_t * table,
 		     const fib_prefix_t * pfx,
 		     fib_route_path_encode_t * api_rpaths, u32 context)
@@ -264,7 +265,7 @@
     fp++;
   }
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 typedef struct vl_api_ip_fib_dump_walk_ctx_t_
@@ -286,7 +287,7 @@
 vl_api_ip_fib_dump_t_handler (vl_api_ip_fib_dump_t * mp)
 {
   vpe_api_main_t *am = &vpe_api_main;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   ip4_main_t *im = &ip4_main;
   fib_table_t *fib_table;
   fib_node_index_t *lfeip;
@@ -297,8 +298,8 @@
     .feis = NULL,
   };
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
@@ -320,7 +321,7 @@
     fib_table = fib_table_get (fib_index, pfx.fp_proto);
     api_rpaths = NULL;
     fib_entry_encode (*lfeip, &api_rpaths);
-    send_ip_fib_details (am, q, fib_table, &pfx, api_rpaths, mp->context);
+    send_ip_fib_details (am, reg, fib_table, &pfx, api_rpaths, mp->context);
     vec_free (api_rpaths);
   }
 
@@ -329,7 +330,7 @@
 
 static void
 send_ip6_fib_details (vpe_api_main_t * am,
-		      svm_queue_t * q,
+		      vl_api_registration_t * reg,
 		      const fib_table_t * table,
 		      const fib_prefix_t * pfx,
 		      fib_route_path_encode_t * api_rpaths, u32 context)
@@ -392,7 +393,7 @@
     fp++;
   }
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 typedef struct apt_ip6_fib_show_ctx_t_
@@ -413,7 +414,7 @@
 }
 
 static void
-api_ip6_fib_table_get_all (svm_queue_t * q,
+api_ip6_fib_table_get_all (vl_api_registration_t * reg,
 			   vl_api_ip6_fib_dump_t * mp,
 			   fib_table_t * fib_table)
 {
@@ -438,7 +439,7 @@
     fib_entry_get_prefix (*fib_entry_index, &pfx);
     api_rpaths = NULL;
     fib_entry_encode (*fib_entry_index, &api_rpaths);
-    send_ip6_fib_details (am, q, fib_table, &pfx, api_rpaths, mp->context);
+    send_ip6_fib_details (am, reg, fib_table, &pfx, api_rpaths, mp->context);
     vec_free (api_rpaths);
   }
 
@@ -448,24 +449,24 @@
 static void
 vl_api_ip6_fib_dump_t_handler (vl_api_ip6_fib_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   ip6_main_t *im6 = &ip6_main;
   fib_table_t *fib_table;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
   pool_foreach (fib_table, im6->fibs,
   ({
-    api_ip6_fib_table_get_all(q, mp, fib_table);
+    api_ip6_fib_table_get_all(reg, mp, fib_table);
   }));
   /* *INDENT-ON* */
 }
 
 static void
-send_ip_mfib_details (svm_queue_t * q,
+send_ip_mfib_details (vl_api_registration_t * reg,
 		      u32 context, u32 table_id, fib_node_index_t mfei)
 {
   fib_route_path_encode_t *api_rpath, *api_rpaths = NULL;
@@ -509,7 +510,7 @@
   }
   vec_free (api_rpaths);
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 typedef struct vl_api_ip_mfib_dump_ctc_t_
@@ -530,7 +531,7 @@
 static void
 vl_api_ip_mfib_dump_t_handler (vl_api_ip_mfib_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   ip4_main_t *im = &ip4_main;
   mfib_table_t *mfib_table;
   fib_node_index_t *mfeip;
@@ -538,11 +539,10 @@
     .entries = NULL,
   };
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
-
   /* *INDENT-OFF* */
   pool_foreach (mfib_table, im->mfibs,
   ({
@@ -554,7 +554,7 @@
 
     vec_foreach (mfeip, ctx.entries)
     {
-      send_ip_mfib_details (q, mp->context,
+      send_ip_mfib_details (reg, mp->context,
                             mfib_table->mft_table_id,
                             *mfeip);
     }
@@ -568,7 +568,7 @@
 
 static void
 send_ip6_mfib_details (vpe_api_main_t * am,
-		       svm_queue_t * q,
+		       vl_api_registration_t * reg,
 		       u32 table_id,
 		       mfib_prefix_t * pfx,
 		       fib_route_path_encode_t * api_rpaths, u32 context)
@@ -605,7 +605,7 @@
     fp++;
   }
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 typedef struct vl_api_ip6_mfib_dump_ctc_t_
@@ -627,7 +627,7 @@
 vl_api_ip6_mfib_dump_t_handler (vl_api_ip6_mfib_dump_t * mp)
 {
   vpe_api_main_t *am = &vpe_api_main;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   ip6_main_t *im = &ip6_main;
   mfib_table_t *mfib_table;
   fib_node_index_t *mfeip;
@@ -637,8 +637,8 @@
     .entries = NULL,
   };
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
 
@@ -655,7 +655,7 @@
     {
       mfib_entry_get_prefix (*mfeip, &pfx);
       mfib_entry_encode (*mfeip, &api_rpaths);
-      send_ip6_mfib_details (am, q,
+      send_ip6_mfib_details (am, reg,
                              mfib_table->mft_table_id,
                              &pfx, api_rpaths,
                              mp->context);
@@ -1418,7 +1418,8 @@
 
 static void
 send_ip_details (vpe_api_main_t * am,
-		 svm_queue_t * q, u32 sw_if_index, u8 is_ipv6, u32 context)
+		 vl_api_registration_t * reg, u32 sw_if_index, u8 is_ipv6,
+		 u32 context)
 {
   vl_api_ip_details_t *mp;
 
@@ -1430,12 +1431,12 @@
   mp->is_ipv6 = is_ipv6;
   mp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 send_ip_address_details (vpe_api_main_t * am,
-			 svm_queue_t * q,
+			 vl_api_registration_t * reg,
 			 u8 * ip, u16 prefix_length,
 			 u32 sw_if_index, u8 is_ipv6, u32 context)
 {
@@ -1459,14 +1460,14 @@
   mp->sw_if_index = htonl (sw_if_index);
   mp->is_ipv6 = is_ipv6;
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 vl_api_ip_address_dump_t_handler (vl_api_ip_address_dump_t * mp)
 {
   vpe_api_main_t *am = &vpe_api_main;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   ip6_address_t *r6;
   ip4_address_t *r4;
   ip6_main_t *im6 = &ip6_main;
@@ -1481,8 +1482,8 @@
 
   sw_if_index = ntohl (mp->sw_if_index);
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   if (mp->is_ipv6)
@@ -1493,7 +1494,7 @@
       ({
         r6 = ip_interface_address_get_address (lm6, ia);
         u16 prefix_length = ia->address_length;
-        send_ip_address_details(am, q, (u8*)r6, prefix_length,
+        send_ip_address_details(am, reg, (u8*)r6, prefix_length,
 				sw_if_index, 1, mp->context);
       }));
       /* *INDENT-ON* */
@@ -1506,7 +1507,7 @@
       ({
         r4 = ip_interface_address_get_address (lm4, ia);
         u16 prefix_length = ia->address_length;
-        send_ip_address_details(am, q, (u8*)r4, prefix_length,
+        send_ip_address_details(am, reg, (u8*)r4, prefix_length,
 				sw_if_index, 0, mp->context);
       }));
       /* *INDENT-ON* */
@@ -1521,15 +1522,13 @@
   vnet_main_t *vnm = vnet_get_main ();
   vlib_main_t *vm = vlib_get_main ();
   vnet_interface_main_t *im = &vnm->interface_main;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   vnet_sw_interface_t *si, *sorted_sis;
   u32 sw_if_index = ~0;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   /* Gather interfaces. */
   sorted_sis = vec_new (vnet_sw_interface_t, pool_elts (im->sw_interfaces));
@@ -1550,7 +1549,7 @@
 	    continue;
 	  }
 	sw_if_index = si->sw_if_index;
-	send_ip_details (am, q, sw_if_index, mp->is_ipv6, mp->context);
+	send_ip_details (am, reg, sw_if_index, mp->is_ipv6, mp->context);
       }
   }
 }
@@ -1668,7 +1667,7 @@
 }
 
 static void
-send_ip6nd_proxy_details (svm_queue_t * q,
+send_ip6nd_proxy_details (vl_api_registration_t * reg,
 			  u32 context,
 			  const ip46_address_t * addr, u32 sw_if_index)
 {
@@ -1681,7 +1680,7 @@
   mp->sw_if_index = htonl (sw_if_index);
   memcpy (mp->address, addr, 16);
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 typedef struct api_ip6nd_proxy_fib_table_walk_ctx_t_
@@ -1712,13 +1711,11 @@
   };
   fib_node_index_t *feip;
   fib_prefix_t pfx;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   /* *INDENT-OFF* */
   pool_foreach (fib_table, im6->fibs,
@@ -1736,7 +1733,7 @@
   {
     fib_entry_get_prefix (*feip, &pfx);
 
-    send_ip6nd_proxy_details (q,
+    send_ip6nd_proxy_details (reg,
 			      mp->context,
 			      &pfx.fp_addr,
 			      fib_entry_get_resolving_interface (*feip));
diff --git a/src/vnet/ip/punt_api.c b/src/vnet/ip/punt_api.c
index 33fc3f9..55ab838 100644
--- a/src/vnet/ip/punt_api.c
+++ b/src/vnet/ip/punt_api.c
@@ -70,7 +70,7 @@
   vlib_main_t *vm = vlib_get_main ();
   int rv = 0;
   clib_error_t *error;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
   error = vnet_punt_socket_add (vm, ntohl (mp->header_version),
 				mp->is_ip4, mp->l4_protocol,
@@ -81,8 +81,8 @@
       clib_error_report (error);
     }
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
@@ -92,7 +92,7 @@
   char *p = vnet_punt_get_server_pathname ();
   /* Abstract pathnames start with \0 */
   memcpy ((char *) rmp->pathname, p, sizeof (rmp->pathname));
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
@@ -102,7 +102,7 @@
   vlib_main_t *vm = vlib_get_main ();
   int rv = 0;
   clib_error_t *error;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
   error = vnet_punt_socket_del (vm, mp->is_ip4, mp->l4_protocol,
 				ntohs (mp->l4_port));
@@ -112,15 +112,15 @@
       clib_error_report (error);
     }
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
   rmp->_vl_msg_id = htons (VL_API_PUNT_SOCKET_DEREGISTER_REPLY);
   rmp->context = mp->context;
   rmp->retval = htonl (rv);
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 #define vl_msg_name_crc_list
diff --git a/src/vnet/ipsec-gre/ipsec_gre_api.c b/src/vnet/ipsec-gre/ipsec_gre_api.c
index af30030..01cc6d7 100644
--- a/src/vnet/ipsec-gre/ipsec_gre_api.c
+++ b/src/vnet/ipsec-gre/ipsec_gre_api.c
@@ -83,7 +83,7 @@
 }
 
 static void send_ipsec_gre_tunnel_details
-  (ipsec_gre_tunnel_t * t, svm_queue_t * q, u32 context)
+  (ipsec_gre_tunnel_t * t, vl_api_registration_t * reg, u32 context)
 {
   vl_api_ipsec_gre_tunnel_details_t *rmp;
 
@@ -97,22 +97,20 @@
   rmp->remote_sa_id = htonl (t->remote_sa_id);
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void vl_api_ipsec_gre_tunnel_dump_t_handler
   (vl_api_ipsec_gre_tunnel_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   ipsec_gre_main_t *igm = &ipsec_gre_main;
   ipsec_gre_tunnel_t *t;
   u32 sw_if_index;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   sw_if_index = ntohl (mp->sw_if_index);
 
@@ -121,7 +119,7 @@
         /* *INDENT-OFF* */
         pool_foreach (t, igm->tunnels,
         ({
-            send_ipsec_gre_tunnel_details(t, q, mp->context);
+            send_ipsec_gre_tunnel_details(t, reg, mp->context);
         }));
         /* *INDENT-ON* */
     }
@@ -133,7 +131,7 @@
 	  return;
 	}
       t = &igm->tunnels[igm->tunnel_index_by_sw_if_index[sw_if_index]];
-      send_ipsec_gre_tunnel_details (t, q, mp->context);
+      send_ipsec_gre_tunnel_details (t, reg, mp->context);
     }
 }
 
diff --git a/src/vnet/ipsec/ipsec_api.c b/src/vnet/ipsec/ipsec_api.c
index 361bddb..da78f3d 100644
--- a/src/vnet/ipsec/ipsec_api.c
+++ b/src/vnet/ipsec/ipsec_api.c
@@ -252,7 +252,8 @@
 }
 
 static void
-send_ipsec_spd_details (ipsec_policy_t * p, svm_queue_t * q, u32 context)
+send_ipsec_spd_details (ipsec_policy_t * p, vl_api_registration_t * reg,
+			u32 context)
 {
   vl_api_ipsec_spd_details_t *mp;
 
@@ -289,21 +290,21 @@
   mp->bytes = clib_host_to_net_u64 (p->counter.bytes);
   mp->packets = clib_host_to_net_u64 (p->counter.packets);
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 vl_api_ipsec_spd_dump_t_handler (vl_api_ipsec_spd_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   ipsec_main_t *im = &ipsec_main;
   ipsec_policy_t *policy;
   ipsec_spd_t *spd;
   uword *p;
   u32 spd_index;
 #if WITH_LIBSSL > 0
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   p = hash_get (im->spd_index_by_spd_id, ntohl (mp->spd_id));
@@ -317,7 +318,7 @@
   pool_foreach (policy, spd->policies,
   ({
     if (mp->sa_id == ~(0) || ntohl (mp->sa_id) == policy->sa_id)
-      send_ipsec_spd_details (policy, q,
+      send_ipsec_spd_details (policy, reg,
                               mp->context);}
     ));
   /* *INDENT-ON* */
@@ -399,7 +400,7 @@
 }
 
 static void
-send_ipsec_sa_details (ipsec_sa_t * sa, svm_queue_t * q,
+send_ipsec_sa_details (ipsec_sa_t * sa, vl_api_registration_t * reg,
 		       u32 context, u32 sw_if_index)
 {
   vl_api_ipsec_sa_details_t *mp;
@@ -455,14 +456,14 @@
     mp->replay_window = clib_host_to_net_u64 (sa->replay_window);
   mp->total_data_size = clib_host_to_net_u64 (sa->total_data_size);
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 
 static void
 vl_api_ipsec_sa_dump_t_handler (vl_api_ipsec_sa_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   ipsec_main_t *im = &ipsec_main;
   vnet_main_t *vnm = im->vnet_main;
   ipsec_sa_t *sa;
@@ -470,8 +471,8 @@
   u32 *sa_index_to_tun_if_index = 0;
 
 #if WITH_LIBSSL > 0
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0 || pool_elts (im->sad) == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg || pool_elts (im->sad) == 0)
     return;
 
   vec_validate_init_empty (sa_index_to_tun_if_index, vec_len (im->sad) - 1,
@@ -492,7 +493,7 @@
   pool_foreach (sa, im->sad,
   ({
     if (mp->sa_id == ~(0) || ntohl (mp->sa_id) == sa->id)
-      send_ipsec_sa_details (sa, q, mp->context,
+      send_ipsec_sa_details (sa, reg, mp->context,
 			     sa_index_to_tun_if_index[sa - im->sad]);
   }));
   /* *INDENT-ON* */
diff --git a/src/vnet/l2/l2_api.c b/src/vnet/l2/l2_api.c
index 206b41f..0fe119b 100644
--- a/src/vnet/l2/l2_api.c
+++ b/src/vnet/l2/l2_api.c
@@ -72,7 +72,7 @@
 _(SW_INTERFACE_SET_VPATH, sw_interface_set_vpath)
 
 static void
-send_l2_xconnect_details (svm_queue_t * q, u32 context,
+send_l2_xconnect_details (vl_api_registration_t * reg, u32 context,
 			  u32 rx_sw_if_index, u32 tx_sw_if_index)
 {
   vl_api_l2_xconnect_details_t *mp;
@@ -84,21 +84,21 @@
   mp->rx_sw_if_index = htonl (rx_sw_if_index);
   mp->tx_sw_if_index = htonl (tx_sw_if_index);
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 vl_api_l2_xconnect_dump_t_handler (vl_api_l2_xconnect_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   vnet_main_t *vnm = vnet_get_main ();
   vnet_interface_main_t *im = &vnm->interface_main;
   l2input_main_t *l2im = &l2input_main;
   vnet_sw_interface_t *swif;
   l2_input_config_t *config;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
@@ -106,7 +106,7 @@
   ({
     config = vec_elt_at_index (l2im->configs, swif->sw_if_index);
     if (config->xconnect)
-      send_l2_xconnect_details (q, mp->context, swif->sw_if_index,
+      send_l2_xconnect_details (reg, mp->context, swif->sw_if_index,
                                 config->output_sw_if_index);
   }));
   /* *INDENT-ON* */
@@ -126,7 +126,7 @@
 
 static void
 send_l2fib_table_entry (vpe_api_main_t * am,
-			svm_queue_t * q,
+			vl_api_registration_t * reg,
 			l2fib_entry_key_t * l2fe_key,
 			l2fib_entry_result_t * l2fe_res, u32 context)
 {
@@ -146,7 +146,7 @@
   mp->bvi_mac = l2fe_res->fields.bvi;
   mp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
@@ -158,11 +158,11 @@
   l2fib_entry_result_t *l2fe_res = NULL;
   u32 ni, bd_id = ntohl (mp->bd_id);
   u32 bd_index;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   uword *p;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* see l2fib_table_dump: ~0 means "any" */
@@ -181,7 +181,7 @@
 
   vec_foreach_index (ni, l2fe_key)
   {
-    send_l2fib_table_entry (am, q, vec_elt_at_index (l2fe_key, ni),
+    send_l2fib_table_entry (am, reg, vec_elt_at_index (l2fe_key, ni),
 			    vec_elt_at_index (l2fe_res, ni), mp->context);
   }
   vec_free (l2fe_key);
@@ -439,7 +439,7 @@
 
 static void
 send_bridge_domain_details (l2input_main_t * l2im,
-			    svm_queue_t * q,
+			    vl_api_registration_t * reg,
 			    l2_bridge_domain_t * bd_config,
 			    u32 n_sw_ifs, u32 context)
 {
@@ -480,7 +480,7 @@
   }
   mp->n_sw_ifs = htonl (mp->n_sw_ifs);
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
@@ -488,16 +488,17 @@
 {
   bd_main_t *bdm = &bd_main;
   l2input_main_t *l2im = &l2input_main;
+  vl_api_registration_t *reg;
+  u32 bd_id, bd_index, end;
 
-  svm_queue_t *q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
-  u32 bd_id = ntohl (mp->bd_id);
+  bd_id = ntohl (mp->bd_id);
   if (bd_id == 0)
     return;
 
-  u32 bd_index, end;
   if (bd_id == ~0)
     bd_index = 0, end = vec_len (l2im->bd_configs);
   else
@@ -515,7 +516,7 @@
 	l2input_bd_config_from_index (l2im, bd_index);
       /* skip dummy bd_id 0 */
       if (bd_config && (bd_config->bd_id > 0))
-	send_bridge_domain_details (l2im, q, bd_config,
+	send_bridge_domain_details (l2im, reg, bd_config,
 				    vec_len (bd_config->members),
 				    mp->context);
     }
diff --git a/src/vnet/l2tp/l2tp_api.c b/src/vnet/l2tp/l2tp_api.c
index aaba2b0..3c7c19d 100644
--- a/src/vnet/l2tp/l2tp_api.c
+++ b/src/vnet/l2tp/l2tp_api.c
@@ -51,7 +51,7 @@
 
 static void
 send_sw_if_l2tpv3_tunnel_details (vpe_api_main_t * am,
-				  svm_queue_t * q,
+				  vl_api_registration_t * reg,
 				  l2t_session_t * s,
 				  l2t_main_t * lm, u32 context)
 {
@@ -81,7 +81,7 @@
   mp->l2_sublayer_present = s->l2_sublayer_present;
   mp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 
@@ -91,17 +91,17 @@
 {
   vpe_api_main_t *am = &vpe_api_main;
   l2t_main_t *lm = &l2t_main;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   l2t_session_t *session;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
   pool_foreach (session, lm->sessions,
   ({
-    send_sw_if_l2tpv3_tunnel_details (am, q, session, lm, mp->context);
+    send_sw_if_l2tpv3_tunnel_details (am, reg, session, lm, mp->context);
   }));
   /* *INDENT-ON* */
 }
diff --git a/src/vnet/lisp-cp/lisp_api.c b/src/vnet/lisp-cp/lisp_api.c
index 9946f28..cb21dd1 100644
--- a/src/vnet/lisp-cp/lisp_api.c
+++ b/src/vnet/lisp-cp/lisp_api.c
@@ -420,7 +420,6 @@
 static void
 vl_api_show_lisp_use_petr_t_handler (vl_api_show_lisp_use_petr_t * mp)
 {
-  svm_queue_t *q = NULL;
   vl_api_show_lisp_use_petr_reply_t *rmp = NULL;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   mapping_t *m;
@@ -430,12 +429,6 @@
   u8 status = 0;
   gid_address_t addr;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
-
   memset (&addr, 0, sizeof (addr));
   status = lcm->flags & LISP_FLAG_USE_PETR;
   if (status)
@@ -583,7 +576,8 @@
 
 static void
 send_lisp_locator_details (lisp_cp_main_t * lcm,
-			   locator_t * loc, svm_queue_t * q, u32 context)
+			   locator_t * loc, vl_api_registration_t * reg,
+			   u32 context)
 {
   vl_api_lisp_locator_details_t *rmp;
 
@@ -605,25 +599,23 @@
   rmp->priority = loc->priority;
   rmp->weight = loc->weight;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_lisp_locator_dump_t_handler (vl_api_lisp_locator_dump_t * mp)
 {
   u8 *ls_name = 0;
-  svm_queue_t *q = 0;
+  vl_api_registration_t *reg = 0;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   locator_set_t *lsit = 0;
   locator_t *loc = 0;
   u32 ls_index = ~0, *locit = 0;
   uword *p = 0;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   if (mp->is_index_set)
     ls_index = htonl (mp->ls_index);
@@ -647,7 +639,7 @@
   vec_foreach (locit, lsit->locator_indices)
   {
     loc = pool_elt_at_index (lcm->locator_pool, locit[0]);
-    send_lisp_locator_details (lcm, loc, q, mp->context);
+    send_lisp_locator_details (lcm, loc, reg, mp->context);
   };
 out:
   vec_free (ls_name);
@@ -656,7 +648,8 @@
 static void
 send_lisp_locator_set_details (lisp_cp_main_t * lcm,
 			       locator_set_t * lsit,
-			       svm_queue_t * q, u32 context, u32 ls_index)
+			       vl_api_registration_t * reg, u32 context,
+			       u32 ls_index)
 {
   vl_api_lisp_locator_set_details_t *rmp;
   u8 *str = 0;
@@ -680,22 +673,20 @@
       vec_free (str);
     }
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_lisp_locator_set_dump_t_handler (vl_api_lisp_locator_set_dump_t * mp)
 {
-  svm_queue_t *q = NULL;
+  vl_api_registration_t *reg;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   locator_set_t *lsit = NULL;
   u8 filter;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   filter = mp->filter;
   /* *INDENT-OFF* */
@@ -706,7 +697,7 @@
       {
         continue;
       }
-    send_lisp_locator_set_details (lcm, lsit, q, mp->context,
+    send_lisp_locator_set_details (lcm, lsit, reg, mp->context,
                                    lsit - lcm->locator_set_pool);
   }));
   /* *INDENT-ON* */
@@ -766,7 +757,8 @@
 
 static void
 send_lisp_eid_table_details (mapping_t * mapit,
-			     svm_queue_t * q, u32 context, u8 filter)
+			     vl_api_registration_t * reg, u32 context,
+			     u8 filter)
 {
   fid_address_t *fid;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
@@ -854,23 +846,21 @@
   rmp->vni = clib_host_to_net_u32 (gid_address_vni (gid));
   rmp->key_id = clib_host_to_net_u16 (mapit->key_id);
   memcpy (rmp->key, mapit->key, vec_len (mapit->key));
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_lisp_eid_table_dump_t_handler (vl_api_lisp_eid_table_dump_t * mp)
 {
   u32 mi;
-  svm_queue_t *q = NULL;
+  vl_api_registration_t *reg;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   mapping_t *mapit = NULL;
   gid_address_t _eid, *eid = &_eid;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   if (mp->eid_set)
     {
@@ -884,7 +874,7 @@
 	return;
 
       mapit = pool_elt_at_index (lcm->mapping_pool, mi);
-      send_lisp_eid_table_details (mapit, q, mp->context,
+      send_lisp_eid_table_details (mapit, reg, mp->context,
 				   0 /* ignore filter */ );
     }
   else
@@ -892,7 +882,7 @@
       /* *INDENT-OFF* */
       pool_foreach (mapit, lcm->mapping_pool,
       ({
-        send_lisp_eid_table_details(mapit, q, mp->context,
+        send_lisp_eid_table_details(mapit, reg, mp->context,
                                     mp->filter);
       }));
       /* *INDENT-ON* */
@@ -900,7 +890,8 @@
 }
 
 static void
-send_lisp_map_server_details (ip_address_t * ip, svm_queue_t * q, u32 context)
+send_lisp_map_server_details (ip_address_t * ip, vl_api_registration_t * reg,
+			      u32 context)
 {
   vl_api_lisp_map_server_details_t *rmp = NULL;
 
@@ -927,31 +918,29 @@
     }
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_lisp_map_server_dump_t_handler (vl_api_lisp_map_server_dump_t * mp)
 {
-  svm_queue_t *q = NULL;
+  vl_api_registration_t *reg;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   lisp_msmr_t *mr;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   vec_foreach (mr, lcm->map_servers)
   {
-    send_lisp_map_server_details (&mr->address, q, mp->context);
+    send_lisp_map_server_details (&mr->address, reg, mp->context);
   }
 }
 
 static void
 send_lisp_map_resolver_details (ip_address_t * ip,
-				svm_queue_t * q, u32 context)
+				vl_api_registration_t * reg, u32 context)
 {
   vl_api_lisp_map_resolver_details_t *rmp = NULL;
 
@@ -978,30 +967,29 @@
     }
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_lisp_map_resolver_dump_t_handler (vl_api_lisp_map_resolver_dump_t * mp)
 {
-  svm_queue_t *q = NULL;
+  vl_api_registration_t *reg;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   lisp_msmr_t *mr;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   vec_foreach (mr, lcm->map_resolvers)
   {
-    send_lisp_map_resolver_details (&mr->address, q, mp->context);
+    send_lisp_map_resolver_details (&mr->address, reg, mp->context);
   }
 }
 
 static void
-send_eid_table_map_pair (hash_pair_t * p, svm_queue_t * q, u32 context)
+send_eid_table_map_pair (hash_pair_t * p, vl_api_registration_t * reg,
+			 u32 context)
 {
   vl_api_lisp_eid_table_map_details_t *rmp = NULL;
 
@@ -1012,23 +1000,21 @@
   rmp->vni = clib_host_to_net_u32 (p->key);
   rmp->dp_table = clib_host_to_net_u32 (p->value[0]);
   rmp->context = context;
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_lisp_eid_table_map_dump_t_handler (vl_api_lisp_eid_table_map_dump_t *
 					  mp)
 {
-  svm_queue_t *q = NULL;
+  vl_api_registration_t *reg;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   hash_pair_t *p;
   uword *vni_table = 0;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   if (mp->is_l2)
     {
@@ -1042,13 +1028,13 @@
   /* *INDENT-OFF* */
   hash_foreach_pair (p, vni_table,
   ({
-    send_eid_table_map_pair (p, q, mp->context);
+    send_eid_table_map_pair (p, reg, mp->context);
   }));
   /* *INDENT-ON* */
 }
 
 static void
-send_eid_table_vni (u32 vni, svm_queue_t * q, u32 context)
+send_eid_table_vni (u32 vni, vl_api_registration_t * reg, u32 context)
 {
   vl_api_lisp_eid_table_vni_details_t *rmp = 0;
 
@@ -1057,7 +1043,7 @@
   rmp->_vl_msg_id = ntohs (VL_API_LISP_EID_TABLE_VNI_DETAILS);
   rmp->context = context;
   rmp->vni = clib_host_to_net_u32 (vni);
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
@@ -1161,14 +1147,12 @@
 {
   hash_pair_t *p;
   u32 *vnis = 0;
-  svm_queue_t *q = 0;
+  vl_api_registration_t *reg = 0;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   /* *INDENT-OFF* */
   hash_foreach_pair (p, lcm->table_id_by_vni,
@@ -1183,7 +1167,7 @@
 
   hash_foreach_pair (p, vnis,
   ({
-    send_eid_table_vni (p->key, q, mp->context);
+    send_eid_table_vni (p->key, reg, mp->context);
   }));
   /* *INDENT-ON* */
 
@@ -1193,16 +1177,9 @@
 static void
 vl_api_show_lisp_status_t_handler (vl_api_show_lisp_status_t * mp)
 {
-  svm_queue_t *q = NULL;
   vl_api_show_lisp_status_reply_t *rmp = NULL;
   int rv = 0;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
-
   /* *INDENT-OFF* */
   REPLY_MACRO2(VL_API_SHOW_LISP_STATUS_REPLY,
   ({
@@ -1216,19 +1193,12 @@
   vl_api_lisp_get_map_request_itr_rlocs_t_handler
   (vl_api_lisp_get_map_request_itr_rlocs_t * mp)
 {
-  svm_queue_t *q = NULL;
   vl_api_lisp_get_map_request_itr_rlocs_reply_t *rmp = NULL;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   locator_set_t *loc_set = 0;
   u8 *tmp_str = 0;
   int rv = 0;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
-
   if (~0 == lcm->mreq_itr_rlocs)
     {
       tmp_str = format (0, " ");
@@ -1254,7 +1224,6 @@
 static void
 vl_api_show_lisp_pitr_t_handler (vl_api_show_lisp_pitr_t * mp)
 {
-  svm_queue_t *q = NULL;
   vl_api_show_lisp_pitr_reply_t *rmp = NULL;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   mapping_t *m;
@@ -1262,12 +1231,6 @@
   u8 *tmp_str = 0;
   int rv = 0;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
-
   u8 is_enabled = (lcm->flags & LISP_FLAG_PITR_MODE)
     && lcm->pitr_map_index != ~0;
 
diff --git a/src/vnet/lisp-cp/one_api.c b/src/vnet/lisp-cp/one_api.c
index 7afbf7f..cc8839d 100644
--- a/src/vnet/lisp-cp/one_api.c
+++ b/src/vnet/lisp-cp/one_api.c
@@ -68,22 +68,22 @@
 
 #include <vlibapi/api_helper_macros.h>
 
-#define REPLY_DETAILS(t, body)                                  \
-do {                                                            \
-    svm_queue_t * q;                             \
-    rv = vl_msg_api_pd_handler (mp, rv);                        \
-    q = vl_api_client_index_to_input_queue (mp->client_index);  \
-    if (!q)                                                     \
-        return;                                                 \
-                                                                \
-    rmp = vl_msg_api_alloc (sizeof (*rmp));                     \
-    rmp->_vl_msg_id = ntohs((t));                               \
-    rmp->context = mp->context;                                 \
-    do {body;} while (0);                                       \
-    vl_msg_api_send_shmem (q, (u8 *)&rmp);                      \
+#define REPLY_DETAILS(t, body)                                  	\
+do {                                                            	\
+    vl_api_registration_t * reg;                             		\
+    rv = vl_msg_api_pd_handler (mp, rv);                        	\
+    reg = vl_api_client_index_to_registration (mp->client_index);	\
+    if (!reg)								\
+      return;								\
+								  \
+    rmp = vl_msg_api_alloc (sizeof (*rmp));                     	\
+    rmp->_vl_msg_id = ntohs((t));                               	\
+    rmp->context = mp->context;                                 	\
+    do {body;} while (0);                                       	\
+    vl_api_send_msg (reg, (u8 *)&rmp);                      		\
 } while(0);
 
-#define foreach_vpe_api_msg                             \
+#define foreach_vpe_api_msg                             			\
 _(ONE_ADD_DEL_LOCATOR_SET, one_add_del_locator_set)                     \
 _(ONE_ADD_DEL_LOCATOR, one_add_del_locator)                             \
 _(ONE_ADD_DEL_LOCAL_EID, one_add_del_local_eid)                         \
@@ -537,7 +537,6 @@
 static void
 vl_api_show_one_use_petr_t_handler (vl_api_show_one_use_petr_t * mp)
 {
-  svm_queue_t *q = NULL;
   vl_api_show_one_use_petr_reply_t *rmp = NULL;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   mapping_t *m;
@@ -547,12 +546,6 @@
   u8 status = 0;
   gid_address_t addr;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
-
   memset (&addr, 0, sizeof (addr));
   status = lcm->flags & LISP_FLAG_USE_PETR;
   if (status)
@@ -698,7 +691,8 @@
 
 static void
 send_one_locator_details (lisp_cp_main_t * lcm,
-			  locator_t * loc, svm_queue_t * q, u32 context)
+			  locator_t * loc, vl_api_registration_t * reg,
+			  u32 context)
 {
   vl_api_one_locator_details_t *rmp;
 
@@ -720,25 +714,23 @@
   rmp->priority = loc->priority;
   rmp->weight = loc->weight;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_one_locator_dump_t_handler (vl_api_one_locator_dump_t * mp)
 {
   u8 *ls_name = 0;
-  svm_queue_t *q = 0;
+  vl_api_registration_t *reg;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   locator_set_t *lsit = 0;
   locator_t *loc = 0;
   u32 ls_index = ~0, *locit = 0;
   uword *p = 0;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   if (mp->is_index_set)
     ls_index = htonl (mp->ls_index);
@@ -762,7 +754,7 @@
   vec_foreach (locit, lsit->locator_indices)
   {
     loc = pool_elt_at_index (lcm->locator_pool, locit[0]);
-    send_one_locator_details (lcm, loc, q, mp->context);
+    send_one_locator_details (lcm, loc, reg, mp->context);
   };
 out:
   vec_free (ls_name);
@@ -771,7 +763,8 @@
 static void
 send_one_locator_set_details (lisp_cp_main_t * lcm,
 			      locator_set_t * lsit,
-			      svm_queue_t * q, u32 context, u32 ls_index)
+			      vl_api_registration_t * reg, u32 context,
+			      u32 ls_index)
 {
   vl_api_one_locator_set_details_t *rmp;
   u8 *str = 0;
@@ -795,22 +788,20 @@
       vec_free (str);
     }
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_one_locator_set_dump_t_handler (vl_api_one_locator_set_dump_t * mp)
 {
-  svm_queue_t *q = NULL;
+  vl_api_registration_t *reg;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   locator_set_t *lsit = NULL;
   u8 filter;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   filter = mp->filter;
   /* *INDENT-OFF* */
@@ -821,7 +812,7 @@
       {
         continue;
       }
-    send_one_locator_set_details (lcm, lsit, q, mp->context,
+    send_one_locator_set_details (lcm, lsit, reg, mp->context,
                                    lsit - lcm->locator_set_pool);
   }));
   /* *INDENT-ON* */
@@ -881,7 +872,8 @@
 
 static void
 send_one_eid_table_details (mapping_t * mapit,
-			    svm_queue_t * q, u32 context, u8 filter)
+			    vl_api_registration_t * reg, u32 context,
+			    u8 filter)
 {
   fid_address_t *fid;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
@@ -975,23 +967,21 @@
   rmp->vni = clib_host_to_net_u32 (gid_address_vni (gid));
   rmp->key_id = clib_host_to_net_u16 (mapit->key_id);
   memcpy (rmp->key, mapit->key, vec_len (mapit->key));
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_one_eid_table_dump_t_handler (vl_api_one_eid_table_dump_t * mp)
 {
   u32 mi;
-  svm_queue_t *q = NULL;
+  vl_api_registration_t *reg;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   mapping_t *mapit = NULL;
   gid_address_t _eid, *eid = &_eid;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   if (mp->eid_set)
     {
@@ -1005,7 +995,7 @@
 	return;
 
       mapit = pool_elt_at_index (lcm->mapping_pool, mi);
-      send_one_eid_table_details (mapit, q, mp->context,
+      send_one_eid_table_details (mapit, reg, mp->context,
 				  0 /* ignore filter */ );
     }
   else
@@ -1013,7 +1003,7 @@
       /* *INDENT-OFF* */
       pool_foreach (mapit, lcm->mapping_pool,
       ({
-        send_one_eid_table_details(mapit, q, mp->context,
+        send_one_eid_table_details(mapit, reg, mp->context,
                                     mp->filter);
       }));
       /* *INDENT-ON* */
@@ -1021,7 +1011,8 @@
 }
 
 static void
-send_one_map_server_details (ip_address_t * ip, svm_queue_t * q, u32 context)
+send_one_map_server_details (ip_address_t * ip, vl_api_registration_t * reg,
+			     u32 context)
 {
   vl_api_one_map_server_details_t *rmp = NULL;
 
@@ -1048,31 +1039,29 @@
     }
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_one_map_server_dump_t_handler (vl_api_one_map_server_dump_t * mp)
 {
-  svm_queue_t *q = NULL;
+  vl_api_registration_t *reg;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   lisp_msmr_t *mr;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   vec_foreach (mr, lcm->map_servers)
   {
-    send_one_map_server_details (&mr->address, q, mp->context);
+    send_one_map_server_details (&mr->address, reg, mp->context);
   }
 }
 
 static void
 send_one_map_resolver_details (ip_address_t * ip,
-			       svm_queue_t * q, u32 context)
+			       vl_api_registration_t * reg, u32 context)
 {
   vl_api_one_map_resolver_details_t *rmp = NULL;
 
@@ -1099,30 +1088,29 @@
     }
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_one_map_resolver_dump_t_handler (vl_api_one_map_resolver_dump_t * mp)
 {
-  svm_queue_t *q = NULL;
+  vl_api_registration_t *reg;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   lisp_msmr_t *mr;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   vec_foreach (mr, lcm->map_resolvers)
   {
-    send_one_map_resolver_details (&mr->address, q, mp->context);
+    send_one_map_resolver_details (&mr->address, reg, mp->context);
   }
 }
 
 static void
-send_eid_table_map_pair (hash_pair_t * p, svm_queue_t * q, u32 context)
+send_eid_table_map_pair (hash_pair_t * p, vl_api_registration_t * reg,
+			 u32 context)
 {
   vl_api_one_eid_table_map_details_t *rmp = NULL;
 
@@ -1133,22 +1121,20 @@
   rmp->vni = clib_host_to_net_u32 (p->key);
   rmp->dp_table = clib_host_to_net_u32 (p->value[0]);
   rmp->context = context;
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 vl_api_one_eid_table_map_dump_t_handler (vl_api_one_eid_table_map_dump_t * mp)
 {
-  svm_queue_t *q = NULL;
+  vl_api_registration_t *reg;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   hash_pair_t *p;
   uword *vni_table = 0;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   if (mp->is_l2)
     {
@@ -1162,13 +1148,13 @@
   /* *INDENT-OFF* */
   hash_foreach_pair (p, vni_table,
   ({
-    send_eid_table_map_pair (p, q, mp->context);
+    send_eid_table_map_pair (p, reg, mp->context);
   }));
   /* *INDENT-ON* */
 }
 
 static void
-send_eid_table_vni (u32 vni, svm_queue_t * q, u32 context)
+send_eid_table_vni (u32 vni, vl_api_registration_t * reg, u32 context)
 {
   vl_api_one_eid_table_vni_details_t *rmp = 0;
 
@@ -1177,7 +1163,7 @@
   rmp->_vl_msg_id = ntohs (VL_API_ONE_EID_TABLE_VNI_DETAILS);
   rmp->context = context;
   rmp->vni = clib_host_to_net_u32 (vni);
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
@@ -1291,14 +1277,12 @@
 {
   hash_pair_t *p;
   u32 *vnis = 0;
-  svm_queue_t *q = 0;
+  vl_api_registration_t *reg;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   /* *INDENT-OFF* */
   hash_foreach_pair (p, lcm->table_id_by_vni,
@@ -1313,7 +1297,7 @@
 
   hash_foreach_pair (p, vnis,
   ({
-    send_eid_table_vni (p->key, q, mp->context);
+    send_eid_table_vni (p->key, reg, mp->context);
   }));
   /* *INDENT-ON* */
 
@@ -1370,7 +1354,6 @@
 static void
 vl_api_show_one_nsh_mapping_t_handler (vl_api_show_one_nsh_mapping_t * mp)
 {
-  svm_queue_t *q = NULL;
   vl_api_show_one_nsh_mapping_reply_t *rmp = NULL;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   mapping_t *m;
@@ -1379,12 +1362,6 @@
   u8 is_set = 0;
   int rv = 0;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
-
   if (lcm->nsh_map_index == (u32) ~ 0)
     {
       tmp_str = format (0, "N/A");
@@ -1419,7 +1396,6 @@
 static void
 vl_api_show_one_pitr_t_handler (vl_api_show_one_pitr_t * mp)
 {
-  svm_queue_t *q = NULL;
   vl_api_show_one_pitr_reply_t *rmp = NULL;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   mapping_t *m;
@@ -1427,12 +1403,6 @@
   u8 *tmp_str = 0;
   int rv = 0;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
-
   u8 is_enabled = (lcm->flags & LISP_FLAG_PITR_MODE)
     && lcm->pitr_map_index != ~0;
 
diff --git a/src/vnet/lisp-gpe/lisp_gpe_api.c b/src/vnet/lisp-gpe/lisp_gpe_api.c
index 86b2f6c..97409f5 100644
--- a/src/vnet/lisp-gpe/lisp_gpe_api.c
+++ b/src/vnet/lisp-gpe/lisp_gpe_api.c
@@ -154,13 +154,13 @@
   lisp_fwd_path_t *path;
   vl_api_gpe_fwd_entry_path_details_t *rmp = NULL;
   lisp_gpe_main_t *lgm = &lisp_gpe_main;
-  svm_queue_t *q = NULL;
+  vl_api_registration_t *reg;
   lisp_gpe_fwd_entry_t *lfe;
 
   gpe_fwd_entry_path_dump_t_net_to_host (mp);
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   if (pool_is_free_index (lgm->lisp_fwd_entry_pool, mp->fwd_entry_index))
@@ -187,7 +187,7 @@
     lisp_api_set_locator (&rmp->lcl_loc, &lgt->key->lcl, path->weight);
 
     rmp->context = mp->context;
-    vl_msg_api_send_shmem (q, (u8 *) & rmp);
+    vl_api_send_msg (reg, (u8 *) rmp);
   }
 }
 
diff --git a/src/vnet/map/map_api.c b/src/vnet/map/map_api.c
index 8ff73ec..e06dd59 100644
--- a/src/vnet/map/map_api.c
+++ b/src/vnet/map/map_api.c
@@ -110,16 +110,14 @@
   vl_api_map_domain_details_t *rmp;
   map_main_t *mm = &map_main;
   map_domain_t *d;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
   if (pool_elts (mm->domains) == 0)
     return;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   /* *INDENT-OFF* */
   pool_foreach(d, mm->domains,
@@ -141,7 +139,7 @@
     rmp->is_translation = (d->flags & MAP_DOMAIN_TRANSLATION);
     rmp->context = mp->context;
 
-    vl_msg_api_send_shmem (q, (u8 *)&rmp);
+    vl_api_send_msg (reg, (u8 *)&rmp);
   }));
   /* *INDENT-ON* */
 }
@@ -149,7 +147,7 @@
 static void
 vl_api_map_rule_dump_t_handler (vl_api_map_rule_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   u16 i;
   ip6_address_t dst;
   vl_api_map_rule_details_t *rmp;
@@ -166,11 +164,9 @@
       return;
     }
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   for (i = 0; i < (0x1 << d->psid_length); i++)
     {
@@ -185,7 +181,7 @@
       rmp->psid = htons (i);
       clib_memcpy (rmp->ip6_dst, &dst, sizeof (rmp->ip6_dst));
       rmp->context = mp->context;
-      vl_msg_api_send_shmem (q, (u8 *) & rmp);
+      vl_api_send_msg (reg, (u8 *) rmp);
     }
 }
 
@@ -199,9 +195,10 @@
   u64 total_pkts[VLIB_N_RX_TX];
   u64 total_bytes[VLIB_N_RX_TX];
   map_main_t *mm = &map_main;
-  svm_queue_t *q = vl_api_client_index_to_input_queue (mp->client_index);
+  vl_api_registration_t *reg;
 
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
@@ -252,7 +249,7 @@
 			  (ip4_map_node.index, MAP_ERROR_DECAP_SEC_CHECK));
 
 out:
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 /*
diff --git a/src/vnet/mpls/mpls_api.c b/src/vnet/mpls/mpls_api.c
index d9f4050..394a6b7 100644
--- a/src/vnet/mpls/mpls_api.c
+++ b/src/vnet/mpls/mpls_api.c
@@ -376,7 +376,7 @@
 
 typedef struct mpls_tunnel_send_walk_ctx_t_
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   u32 index;
   u32 context;
 } mpls_tunnel_send_walk_ctx_t;
@@ -427,20 +427,20 @@
   //   mt->mt_label_stack, nlabels * sizeof (u32));
 
 
-  vl_msg_api_send_shmem (ctx->q, (u8 *) & mp);
+  vl_api_send_msg (ctx->reg, (u8 *) mp);
 }
 
 static void
 vl_api_mpls_tunnel_dump_t_handler (vl_api_mpls_tunnel_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   mpls_tunnel_send_walk_ctx_t ctx = {
-    .q = q,
+    .reg = reg,
     .index = ntohl (mp->tunnel_index),
     .context = mp->context,
   };
@@ -449,7 +449,7 @@
 
 static void
 send_mpls_fib_details (vpe_api_main_t * am,
-		       svm_queue_t * q,
+		       vl_api_registration_t * reg,
 		       const fib_table_t * table,
 		       u32 label, u32 eos,
 		       fib_route_path_encode_t * api_rpaths, u32 context)
@@ -485,7 +485,7 @@
     fp++;
   }
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 typedef struct vl_api_mpls_fib_dump_table_walk_ctx_t_
@@ -507,7 +507,7 @@
 vl_api_mpls_fib_dump_t_handler (vl_api_mpls_fib_dump_t * mp)
 {
   vpe_api_main_t *am = &vpe_api_main;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   mpls_main_t *mm = &mpls_main;
   fib_table_t *fib_table;
   mpls_fib_t *mpls_fib;
@@ -519,8 +519,8 @@
     .lfeis = NULL,
   };
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
@@ -540,7 +540,7 @@
     fib_table = fib_table_get (fib_index, pfx.fp_proto);
     api_rpaths = NULL;
     fib_entry_encode (*lfeip, &api_rpaths);
-    send_mpls_fib_details (am, q,
+    send_mpls_fib_details (am, reg,
 			   fib_table, pfx.fp_label,
 			   pfx.fp_eos, api_rpaths, mp->context);
     vec_free (api_rpaths);
diff --git a/src/vnet/policer/policer_api.c b/src/vnet/policer/policer_api.c
index a658076..77efe85 100644
--- a/src/vnet/policer/policer_api.c
+++ b/src/vnet/policer/policer_api.c
@@ -96,7 +96,7 @@
 send_policer_details (u8 * name,
 		      sse2_qos_pol_cfg_params_st * config,
 		      policer_read_response_type_st * templ,
-		      svm_queue_t * q, u32 context)
+		      vl_api_registration_t * reg, u32 context)
 {
   vl_api_policer_details_t *mp;
 
@@ -130,13 +130,13 @@
 
   strncpy ((char *) mp->name, (char *) name, ARRAY_LEN (mp->name) - 1);
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 vl_api_policer_dump_t_handler (vl_api_policer_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   vnet_policer_main_t *pm = &vnet_policer_main;
   hash_pair_t *hp;
   uword *p;
@@ -146,8 +146,8 @@
   sse2_qos_pol_cfg_params_st *config;
   policer_read_response_type_st *templ;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   if (mp->match_name_valid)
@@ -164,7 +164,7 @@
 	  pool_index = p[0];
 	  config = pool_elt_at_index (pm->configs, pool_index);
 	  templ = pool_elt_at_index (pm->policer_templates, pool_index);
-	  send_policer_details (match_name, config, templ, q, mp->context);
+	  send_policer_details (match_name, config, templ, reg, mp->context);
 	}
     }
   else
@@ -176,7 +176,7 @@
         pool_index = hp->value[0];
         config = pool_elt_at_index (pm->configs, pool_index);
         templ = pool_elt_at_index (pm->policer_templates, pool_index);
-        send_policer_details(name, config, templ, q, mp->context);
+        send_policer_details(name, config, templ, reg, mp->context);
       }));
       /* *INDENT-ON* */
     }
diff --git a/src/vnet/session/session_api.c b/src/vnet/session/session_api.c
index 75bdedf..eeda839 100755
--- a/src/vnet/session/session_api.c
+++ b/src/vnet/session/session_api.c
@@ -870,7 +870,7 @@
 static void
 send_session_rule_details4 (mma_rule_16_t * rule, u8 is_local,
 			    u8 transport_proto, u32 appns_index, u8 * tag,
-			    svm_queue_t * q, u32 context)
+			    vl_api_registration_t * reg, u32 context)
 {
   vl_api_session_rules_details_t *rmp = 0;
   session_mask_or_match_4_t *match =
@@ -901,13 +901,13 @@
       rmp->tag[vec_len (tag)] = 0;
     }
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 send_session_rule_details6 (mma_rule_40_t * rule, u8 is_local,
 			    u8 transport_proto, u32 appns_index, u8 * tag,
-			    svm_queue_t * q, u32 context)
+			    vl_api_registration_t * reg, u32 context)
 {
   vl_api_session_rules_details_t *rmp = 0;
   session_mask_or_match_6_t *match =
@@ -938,13 +938,13 @@
       rmp->tag[vec_len (tag)] = 0;
     }
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
 send_session_rules_table_details (session_rules_table_t * srt, u8 fib_proto,
 				  u8 tp, u8 is_local, u32 appns_index,
-				  svm_queue_t * q, u32 context)
+				  vl_api_registration_t * reg, u32 context)
 {
   mma_rule_16_t *rule16;
   mma_rule_40_t *rule40;
@@ -961,7 +961,7 @@
 	ri = mma_rules_table_rule_index_16 (srt16, rule16);
 	tag = session_rules_table_rule_tag (srt, ri, 1);
         send_session_rule_details4 (rule16, is_local, tp, appns_index, tag,
-                                    q, context);
+                                    reg, context);
       }));
       /* *INDENT-ON* */
     }
@@ -974,7 +974,7 @@
 	ri = mma_rules_table_rule_index_40 (srt40, rule40);
 	tag = session_rules_table_rule_tag (srt, ri, 1);
         send_session_rule_details6 (rule40, is_local, tp, appns_index, tag,
-                                    q, context);
+                                    reg, context);
       }));
       /* *INDENT-ON* */
     }
@@ -983,12 +983,12 @@
 static void
 vl_api_session_rules_dump_t_handler (vl_api_one_map_server_dump_t * mp)
 {
-  svm_queue_t *q = NULL;
+  vl_api_registration_t *reg;
   session_table_t *st;
   u8 tp;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
@@ -997,7 +997,7 @@
       {
         send_session_rules_table_details (&st->session_rules[tp],
                                           st->active_fib_proto, tp,
-                                          st->is_local, st->appns_index, q,
+                                          st->is_local, st->appns_index, reg,
                                           mp->context);
       }
   }));
diff --git a/src/vnet/span/span_api.c b/src/vnet/span/span_api.c
index 40dc4f3..5df93fa 100644
--- a/src/vnet/span/span_api.c
+++ b/src/vnet/span/span_api.c
@@ -66,13 +66,13 @@
 vl_api_sw_interface_span_dump_t_handler (vl_api_sw_interface_span_dump_t * mp)
 {
 
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   span_interface_t *si;
   vl_api_sw_interface_span_details_t *rmp;
   span_main_t *sm = &span_main;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   span_feat_t sf = mp->is_l2 ? SPAN_FEAT_L2 : SPAN_FEAT_DEVICE;
@@ -98,7 +98,7 @@
           rmp->state = (u8) (clib_bitmap_get (rxm->mirror_ports, i) +
                              clib_bitmap_get (txm->mirror_ports, i) * 2);
 
-          vl_msg_api_send_shmem (q, (u8 *) & rmp);
+          vl_api_send_msg (reg, (u8 *) rmp);
         }));
       clib_bitmap_free (b);
     }
diff --git a/src/vnet/srv6/sr_api.c b/src/vnet/srv6/sr_api.c
index 8f5f4f9..d696e06 100644
--- a/src/vnet/srv6/sr_api.c
+++ b/src/vnet/srv6/sr_api.c
@@ -191,7 +191,7 @@
 }
 
 static void send_sr_localsid_details
-  (ip6_sr_localsid_t * t, svm_queue_t * q, u32 context)
+  (ip6_sr_localsid_t * t, vl_api_registration_t * reg, u32 context)
 {
   vl_api_sr_localsids_details_t *rmp;
 
@@ -206,26 +206,24 @@
   rmp->xconnect_iface_or_vrf_table = htonl (t->sw_if_index);
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void vl_api_sr_localsids_dump_t_handler
   (vl_api_sr_localsids_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   ip6_sr_main_t *sm = &sr_main;
   ip6_sr_localsid_t *t;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   /* *INDENT-OFF* */
   pool_foreach (t, sm->localsids,
   ({
-    send_sr_localsid_details(t, q, mp->context);
+    send_sr_localsid_details(t, reg, mp->context);
   }));
   /* *INDENT-ON* */
 }
diff --git a/src/vnet/udp/udp_api.c b/src/vnet/udp/udp_api.c
index dddc6f9..d643f68 100644
--- a/src/vnet/udp/udp_api.c
+++ b/src/vnet/udp/udp_api.c
@@ -43,7 +43,8 @@
 _(UDP_ENCAP_DUMP, udp_encap_dump)
 
 static void
-send_udp_encap_details (const udp_encap_t * ue, svm_queue_t * q, u32 context)
+send_udp_encap_details (const udp_encap_t * ue, vl_api_registration_t * reg,
+			u32 context)
 {
   vl_api_udp_encap_details_t *mp;
   fib_table_t *fib_table;
@@ -74,24 +75,24 @@
   mp->table_id = htonl (fib_table->ft_table_id);
   mp->id = htonl (ue->ue_id);
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
 vl_api_udp_encap_dump_t_handler (vl_api_udp_encap_dump_t * mp,
 				 vlib_main_t * vm)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   udp_encap_t *ue;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   /* *INDENT-OFF* */
   pool_foreach(ue, udp_encap_pool,
   ({
-    send_udp_encap_details(ue, q, mp->context);
+    send_udp_encap_details(ue, reg, mp->context);
   }));
   /* *INDENT-ON* */
 }
diff --git a/src/vnet/unix/tap_api.c b/src/vnet/unix/tap_api.c
index 2375572..026a963 100644
--- a/src/vnet/unix/tap_api.c
+++ b/src/vnet/unix/tap_api.c
@@ -60,7 +60,7 @@
  */
 static void
 send_sw_interface_event_deleted (vpe_api_main_t * am,
-				 svm_queue_t * q, u32 sw_if_index)
+				 vl_api_registration_t * reg, u32 sw_if_index)
 {
   vl_api_sw_interface_event_t *mp;
 
@@ -72,7 +72,7 @@
   mp->admin_up_down = 0;
   mp->link_up_down = 0;
   mp->deleted = 1;
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
@@ -82,7 +82,7 @@
   int rv;
   vl_api_tap_connect_reply_t *rmp;
   vnet_main_t *vnm = vnet_get_main ();
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   u32 sw_if_index = (u32) ~ 0;
   u8 *tag;
   vnet_tap_connect_args_t _a, *ap = &_a;
@@ -118,8 +118,8 @@
       vnet_set_sw_interface_tag (vnm, tag, sw_if_index);
     }
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
@@ -128,7 +128,7 @@
   rmp->retval = ntohl (rv);
   rmp->sw_if_index = ntohl (sw_if_index);
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
@@ -136,7 +136,7 @@
 {
   int rv;
   vl_api_tap_modify_reply_t *rmp;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   u32 sw_if_index = (u32) ~ 0;
   vlib_main_t *vm = vlib_get_main ();
   vnet_tap_connect_args_t _a, *ap = &_a;
@@ -153,8 +153,8 @@
 
   rv = vnet_tap_modify (vm, ap);
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
@@ -163,7 +163,7 @@
   rmp->retval = ntohl (rv);
   rmp->sw_if_index = ntohl (sw_if_index);
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
@@ -173,7 +173,7 @@
   int rv;
   vpe_api_main_t *vam = &vpe_api_main;
   vl_api_tap_delete_reply_t *rmp;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   u32 sw_if_index = ntohl (mp->sw_if_index);
 
   rv = vnet_tap_delete (vm, sw_if_index);
@@ -183,8 +183,8 @@
       vnet_clear_sw_interface_tag (vnm, sw_if_index);
     }
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
@@ -192,15 +192,15 @@
   rmp->context = mp->context;
   rmp->retval = ntohl (rv);
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 
   if (!rv)
-    send_sw_interface_event_deleted (vam, q, sw_if_index);
+    send_sw_interface_event_deleted (vam, reg, sw_if_index);
 }
 
 static void
 send_sw_interface_tap_details (vpe_api_main_t * am,
-			       svm_queue_t * q,
+			       vl_api_registration_t * reg,
 			       tapcli_interface_details_t * tap_if,
 			       u32 context)
 {
@@ -213,7 +213,7 @@
 	   (char *) tap_if->dev_name, ARRAY_LEN (mp->dev_name) - 1);
   mp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & mp);
+  vl_api_send_msg (reg, (u8 *) mp);
 }
 
 static void
@@ -221,12 +221,12 @@
 {
   int rv = 0;
   vpe_api_main_t *am = &vpe_api_main;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   tapcli_interface_details_t *tapifs = NULL;
   tapcli_interface_details_t *tap_if = NULL;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   rv = vnet_tap_dump_ifs (&tapifs);
@@ -235,7 +235,7 @@
 
   vec_foreach (tap_if, tapifs)
   {
-    send_sw_interface_tap_details (am, q, tap_if, mp->context);
+    send_sw_interface_tap_details (am, reg, tap_if, mp->context);
   }
 
   vec_free (tapifs);
diff --git a/src/vnet/vxlan-gpe/vxlan_gpe_api.c b/src/vnet/vxlan-gpe/vxlan_gpe_api.c
index b3e300e..a710bb5 100644
--- a/src/vnet/vxlan-gpe/vxlan_gpe_api.c
+++ b/src/vnet/vxlan-gpe/vxlan_gpe_api.c
@@ -144,7 +144,7 @@
 }
 
 static void send_vxlan_gpe_tunnel_details
-  (vxlan_gpe_tunnel_t * t, svm_queue_t * q, u32 context)
+  (vxlan_gpe_tunnel_t * t, vl_api_registration_t * reg, u32 context)
 {
   vl_api_vxlan_gpe_tunnel_details_t *rmp;
   ip4_main_t *im4 = &ip4_main;
@@ -175,22 +175,20 @@
   rmp->is_ipv6 = is_ipv6;
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void vl_api_vxlan_gpe_tunnel_dump_t_handler
   (vl_api_vxlan_gpe_tunnel_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   vxlan_gpe_main_t *vgm = &vxlan_gpe_main;
   vxlan_gpe_tunnel_t *t;
   u32 sw_if_index;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   sw_if_index = ntohl (mp->sw_if_index);
 
@@ -199,7 +197,7 @@
       /* *INDENT-OFF* */
       pool_foreach (t, vgm->tunnels,
       ({
-        send_vxlan_gpe_tunnel_details(t, q, mp->context);
+        send_vxlan_gpe_tunnel_details(t, reg, mp->context);
       }));
       /* *INDENT-ON* */
     }
@@ -211,7 +209,7 @@
 	  return;
 	}
       t = &vgm->tunnels[vgm->tunnel_index_by_sw_if_index[sw_if_index]];
-      send_vxlan_gpe_tunnel_details (t, q, mp->context);
+      send_vxlan_gpe_tunnel_details (t, reg, mp->context);
     }
 }
 
diff --git a/src/vnet/vxlan/vxlan_api.c b/src/vnet/vxlan/vxlan_api.c
index 20034f7..1227f88 100644
--- a/src/vnet/vxlan/vxlan_api.c
+++ b/src/vnet/vxlan/vxlan_api.c
@@ -116,7 +116,7 @@
 }
 
 static void send_vxlan_tunnel_details
-  (vxlan_tunnel_t * t, svm_queue_t * q, u32 context)
+  (vxlan_tunnel_t * t, vl_api_registration_t * reg, u32 context)
 {
   vl_api_vxlan_tunnel_details_t *rmp;
   ip4_main_t *im4 = &ip4_main;
@@ -145,22 +145,20 @@
   rmp->is_ipv6 = is_ipv6;
   rmp->context = context;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void vl_api_vxlan_tunnel_dump_t_handler
   (vl_api_vxlan_tunnel_dump_t * mp)
 {
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   vxlan_main_t *vxm = &vxlan_main;
   vxlan_tunnel_t *t;
   u32 sw_if_index;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (q == 0)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   sw_if_index = ntohl (mp->sw_if_index);
 
@@ -169,7 +167,7 @@
       /* *INDENT-OFF* */
       pool_foreach (t, vxm->tunnels,
       ({
-        send_vxlan_tunnel_details(t, q, mp->context);
+        send_vxlan_tunnel_details(t, reg, mp->context);
       }));
       /* *INDENT-ON* */
     }
@@ -181,7 +179,7 @@
 	  return;
 	}
       t = &vxm->tunnels[vxm->tunnel_index_by_sw_if_index[sw_if_index]];
-      send_vxlan_tunnel_details (t, q, mp->context);
+      send_vxlan_tunnel_details (t, reg, mp->context);
     }
 }
 
diff --git a/src/vpp/api/api.c b/src/vpp/api/api.c
index 70b1042..8bb11c9 100644
--- a/src/vpp/api/api.c
+++ b/src/vpp/api/api.c
@@ -164,16 +164,16 @@
 vl_api_cli_t_handler (vl_api_cli_t * mp)
 {
   vl_api_cli_reply_t *rp;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   vlib_main_t *vm = vlib_get_main ();
   api_main_t *am = &api_main;
   unformat_input_t input;
   u8 *shmem_vec = 0;
   void *oldheap;
 
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (!q)
-    return;
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;;
 
   rp = vl_msg_api_alloc (sizeof (*rp));
   rp->_vl_msg_id = ntohs (VL_API_CLI_REPLY);
@@ -193,7 +193,7 @@
 
   rp->reply_in_shmem = (uword) shmem_vec;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rp);
+  vl_api_send_msg (reg, (u8 *) rp);
 }
 
 static void
diff --git a/src/vpp/oam/oam_api.c b/src/vpp/oam/oam_api.c
index 6d25a36..915d02d 100644
--- a/src/vpp/oam/oam_api.c
+++ b/src/vpp/oam/oam_api.c
@@ -47,22 +47,22 @@
 send_oam_event (oam_target_t * t)
 {
   vpe_api_main_t *vam = &vpe_api_main;
-  svm_queue_t *q;
+  vl_api_registration_t *vl_reg;
   vpe_client_registration_t *reg;
   vl_api_oam_event_t *mp;
 
   /* *INDENT-OFF* */
   pool_foreach(reg, vam->oam_events_registrations,
   ({
-    q = vl_api_client_index_to_input_queue (reg->client_index);
-    if (q)
+    vl_reg = vl_api_client_index_to_registration (reg->client_index);
+    if (vl_reg)
       {
         mp = vl_msg_api_alloc (sizeof (*mp));
         mp->_vl_msg_id = ntohs (VL_API_OAM_EVENT);
         clib_memcpy (mp->dst_address, &t->dst_address,
                      sizeof (mp->dst_address));
         mp->state = t->state;
-        vl_msg_api_send_shmem (q, (u8 *)&mp);
+        vl_api_send_msg (vl_reg, (u8 *)mp);
       }
   }));
   /* *INDENT-ON* */
diff --git a/src/vpp/stats/stats.c b/src/vpp/stats/stats.c
index 2c3c866..4ac96df 100644
--- a/src/vpp/stats/stats.c
+++ b/src/vpp/stats/stats.c
@@ -544,7 +544,7 @@
   vl_api_want_interface_combined_stats_reply_t *rmp;
   uword *p;
   i32 retval = 0;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   u32 swif;
 
   swif = ~0;			//Using same mechanism as _per_interface_
@@ -555,9 +555,8 @@
 			      mp->enable_disable);
 
 reply:
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     {
       sm->enable_poller =
 	clear_client_for_stat (IDX_PER_INTERFACE_COMBINED_COUNTERS, swif,
@@ -570,7 +569,7 @@
   rmp->context = mp->context;
   rmp->retval = retval;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
@@ -687,7 +686,7 @@
   vlib_combined_counter_main_t *cm;
   uword *p;
   i32 retval = 0;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   int i;
   u32 swif;
 
@@ -718,9 +717,8 @@
     }
 
 reply:
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     {
       for (i = 0; i < mp->num; i++)
 	{
@@ -737,7 +735,7 @@
   rmp->context = mp->context;
   rmp->retval = retval;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 /* Per Interface Combined distribution to client */
@@ -748,7 +746,7 @@
   vnet_interface_main_t *im = sm->interface_main;
   api_main_t *am = sm->api_main;
   vl_shmem_hdr_t *shmem_hdr = am->shmem_hdr;
-  svm_queue_t *q = NULL;
+  vl_api_registration_t *vl_reg;
   vlib_combined_counter_main_t *cm;
   /*
    * items_this_message will eventually be used to optimise the batching
@@ -790,11 +788,14 @@
   timestamp = vlib_time_now (sm->vlib_main);
 
   vec_reset_length (sm->regs_tmp);
+
+  /* *INDENT-OFF* */
   pool_foreach (reg,
-		sm->stats_registrations[IDX_PER_INTERFACE_COMBINED_COUNTERS],
-		(
-		    {
-		    vec_add1 (sm->regs_tmp, reg);}));
+                sm->stats_registrations[IDX_PER_INTERFACE_COMBINED_COUNTERS],
+  ({
+    vec_add1 (sm->regs_tmp, reg);
+  }));
+  /* *INDENT-ON* */
 
   for (i = 0; i < vec_len (sm->regs_tmp); i++)
     {
@@ -807,21 +808,23 @@
 	  continue;
 	}
       vec_reset_length (sm->clients_tmp);
-      pool_foreach (client, reg->clients, (
-					    {
-					    vec_add1 (sm->clients_tmp,
-						      client);}
-		    ));
+
+      /* *INDENT-OFF* */
+      pool_foreach (client, reg->clients, ({
+	vec_add1 (sm->clients_tmp, client);
+      }));
+      /* *INDENT-ON* */
 
       //FIXME - should be doing non-variant part of mp here and managing
       // any alloc per client in that vec_foreach
       for (j = 0; j < vec_len (sm->clients_tmp); j++)
 	{
 	  client = sm->clients_tmp[j];
-	  q = vl_api_client_index_to_input_queue (client->client_index);
+
+	  vl_reg = vl_api_client_index_to_registration (client->client_index);
 
 	  //Client may have disconnected abrubtly, clean up so we don't poll nothing.
-	  if (!q)
+	  if (!vl_reg)
 	    {
 	      sm->enable_poller =
 		clear_client_for_stat (IDX_PER_INTERFACE_COMBINED_COUNTERS,
@@ -860,7 +863,7 @@
 	  clib_mem_unaligned (&vp->tx_bytes, u64) =
 	    clib_host_to_net_u64 (v.bytes);
 
-	  vl_msg_api_send_shmem (q, (u8 *) & mp);
+	  vl_api_send_msg (vl_reg, (u8 *) mp);
 	}
     }
 
@@ -882,7 +885,7 @@
   vlib_simple_counter_main_t *cm;
   uword *p;
   i32 retval = 0;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   int i;
   u32 swif;
 
@@ -912,10 +915,10 @@
     }
 
 reply:
-  q = vl_api_client_index_to_input_queue (mp->client_index);
+  reg = vl_api_client_index_to_registration (mp->client_index);
 
-  //Client may have disconnected abrubtly, clean up so we don't poll nothing.
-  if (!q)
+  /* Client may have disconnected abruptly, clean up */
+  if (!reg)
     {
       for (i = 0; i < mp->num; i++)
 	{
@@ -934,7 +937,7 @@
   rmp->context = mp->context;
   rmp->retval = retval;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 /* Per Interface Simple distribution to client */
@@ -945,7 +948,7 @@
   vnet_interface_main_t *im = sm->interface_main;
   api_main_t *am = sm->api_main;
   vl_shmem_hdr_t *shmem_hdr = am->shmem_hdr;
-  svm_queue_t *q = NULL;
+  vl_api_registration_t *vl_reg;
   vlib_simple_counter_main_t *cm;
   /*
    * items_this_message will eventually be used to optimise the batching
@@ -987,12 +990,13 @@
   timestamp = vlib_time_now (sm->vlib_main);
 
   vec_reset_length (sm->regs_tmp);
+
+  /* *INDENT-OFF* */
   pool_foreach (reg,
-		sm->stats_registrations[IDX_PER_INTERFACE_SIMPLE_COUNTERS], (
-									       {
-									       vec_add1
-									       (sm->regs_tmp,
-										reg);}));
+                sm->stats_registrations[IDX_PER_INTERFACE_SIMPLE_COUNTERS], ({
+    vec_add1 (sm->regs_tmp, reg);
+  }));
+  /* *INDENT-ON* */
 
   for (i = 0; i < vec_len (sm->regs_tmp); i++)
     {
@@ -1005,21 +1009,22 @@
 	  continue;
 	}
       vec_reset_length (sm->clients_tmp);
-      pool_foreach (client, reg->clients, (
-					    {
-					    vec_add1 (sm->clients_tmp,
-						      client);}
-		    ));
+
+      /* *INDENT-OFF* */
+      pool_foreach (client, reg->clients, ({
+	vec_add1 (sm->clients_tmp, client);
+      }));
+      /* *INDENT-ON* */
 
       //FIXME - should be doing non-variant part of mp here and managing
       // any alloc per client in that vec_foreach
       for (j = 0; j < vec_len (sm->clients_tmp); j++)
 	{
 	  client = sm->clients_tmp[j];
-	  q = vl_api_client_index_to_input_queue (client->client_index);
+	  vl_reg = vl_api_client_index_to_registration (client->client_index);
 
-	  //Client may have disconnected abrubtly, clean up so we don't poll nothing.
-	  if (!q)
+	  /* Client may have disconnected abrubtly, clean up */
+	  if (!vl_reg)
 	    {
 	      sm->enable_poller =
 		clear_client_for_stat (IDX_PER_INTERFACE_SIMPLE_COUNTERS,
@@ -1086,7 +1091,7 @@
 	  v = vlib_get_simple_counter (cm, reg->item);
 	  clib_mem_unaligned (&vp->rx_mpls, u64) = clib_host_to_net_u64 (v);
 
-	  vl_msg_api_send_shmem (q, (u8 *) & mp);
+	  vl_api_send_msg (vl_reg, (u8 *) mp);
 	}
     }
 
@@ -2392,7 +2397,7 @@
   uword *p;
   i32 retval = 0;
   u32 item;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
   item = ~0;			//"ALL THE THINGS IN THE THINGS
   rp.client_index = mp->client_index;
@@ -2417,9 +2422,8 @@
 			      item, mp->enable_disable);
 
 reply:
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     return;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
@@ -2427,7 +2431,7 @@
   rmp->context = mp->context;
   rmp->retval = retval;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
@@ -2440,7 +2444,7 @@
   uword *p;
   i32 retval = 0;
   u32 swif;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
 
   swif = ~0;			//Using same mechanism as _per_interface_
   rp.client_index = mp->client_index;
@@ -2450,9 +2454,9 @@
 			      mp->enable_disable);
 
 reply:
-  q = vl_api_client_index_to_input_queue (mp->client_index);
+  reg = vl_api_client_index_to_registration (mp->client_index);
 
-  if (!q)
+  if (!reg)
     {
       sm->enable_poller =
 	clear_client_for_stat (IDX_PER_INTERFACE_SIMPLE_COUNTERS, swif,
@@ -2465,7 +2469,7 @@
   rmp->context = mp->context;
   rmp->retval = retval;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 
@@ -2477,7 +2481,7 @@
   vl_api_want_ip4_fib_stats_reply_t *rmp;
   uword *p;
   i32 retval = 0;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   u32 fib;
 
   fib = ~0;			//Using same mechanism as _per_interface_
@@ -2488,9 +2492,9 @@
 			      mp->enable_disable);
 
 reply:
-  q = vl_api_client_index_to_input_queue (mp->client_index);
+  reg = vl_api_client_index_to_registration (mp->client_index);
 
-  if (!q)
+  if (!reg)
     {
       sm->enable_poller = clear_client_for_stat (IDX_IP4_FIB_COUNTERS,
 						 fib, mp->client_index);
@@ -2502,7 +2506,7 @@
   rmp->context = mp->context;
   rmp->retval = retval;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
@@ -2513,7 +2517,7 @@
   vl_api_want_ip4_mfib_stats_reply_t *rmp;
   uword *p;
   i32 retval = 0;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   u32 mfib;
 
   mfib = ~0;			//Using same mechanism as _per_interface_
@@ -2524,9 +2528,8 @@
 			      mp->enable_disable);
 
 reply:
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     {
       sm->enable_poller = clear_client_for_stat (IDX_IP4_MFIB_COUNTERS,
 						 mfib, mp->client_index);
@@ -2538,7 +2541,7 @@
   rmp->context = mp->context;
   rmp->retval = retval;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
@@ -2549,7 +2552,7 @@
   vl_api_want_ip4_fib_stats_reply_t *rmp;
   uword *p;
   i32 retval = 0;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   u32 fib;
 
   fib = ~0;			//Using same mechanism as _per_interface_
@@ -2560,9 +2563,8 @@
 			      mp->enable_disable);
 
 reply:
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     {
       sm->enable_poller = clear_client_for_stat (IDX_IP6_FIB_COUNTERS,
 						 fib, mp->client_index);
@@ -2574,7 +2576,7 @@
   rmp->context = mp->context;
   rmp->retval = retval;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 static void
@@ -2585,7 +2587,7 @@
   vl_api_want_ip4_mfib_stats_reply_t *rmp;
   uword *p;
   i32 retval = 0;
-  svm_queue_t *q;
+  vl_api_registration_t *reg;
   u32 mfib;
 
   mfib = ~0;			//Using same mechanism as _per_interface_
@@ -2596,9 +2598,8 @@
 			      mp->enable_disable);
 
 reply:
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-
-  if (!q)
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
     {
       sm->enable_poller = clear_client_for_stat (IDX_IP6_MFIB_COUNTERS,
 						 mfib, mp->client_index);
@@ -2610,7 +2611,7 @@
   rmp->context = mp->context;
   rmp->retval = retval;
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 /* FIXME - NBR stats broken - this will be fixed in subsequent patch */
@@ -2635,13 +2636,11 @@
   int i, which;
   u64 total_pkts[VLIB_N_RX_TX];
   u64 total_bytes[VLIB_N_RX_TX];
+  vl_api_registration_t *reg;
 
-  svm_queue_t *q = vl_api_client_index_to_input_queue (mp->client_index);
-
-  if (!q)
-    {
-      return;
-    }
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
   rmp->_vl_msg_id = ntohs (VL_API_VNET_GET_SUMMARY_STATS_REPLY);
@@ -2673,7 +2672,7 @@
   rmp->vector_rate =
     clib_host_to_net_u64 (vlib_last_vector_length_per_node (sm->vlib_main));
 
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+  vl_api_send_msg (reg, (u8 *) rmp);
 }
 
 int