]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/zebra_vty.c
Merge branch 'cmaster-next' into vtysh-grammar
[mirror_frr.git] / zebra / zebra_vty.c
index 9b0fad93e0b2f3ca9ffbb497dd77c9eef2618d58..667dfd031aeca8c0b1c5358bb6367d1135d80864 100644 (file)
@@ -14,9 +14,9 @@
  * General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with GNU Zebra; see the file COPYING.  If not, write to the 
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
- * Boston, MA 02111-1307, USA.  
+ * along with GNU Zebra; see the file COPYING.  If not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
  */
 
 #include <zebra.h>
@@ -177,7 +177,7 @@ zebra_static_ipv4 (struct vty *vty, safi_t safi, int add_cmd,
 
     return CMD_SUCCESS;
   }
-  
+
   /* When gateway is A.B.C.D format, gate is treated as nexthop
      address other case gate is treated as interface name. */
   ret = inet_aton (gate_str, &gate);
@@ -212,7 +212,7 @@ zebra_static_ipv4 (struct vty *vty, safi_t safi, int add_cmd,
 /* Static unicast routes for multicast RPF lookup. */
 DEFUN (ip_mroute_dist,
        ip_mroute_dist_cmd,
-       "ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) <1-255>",
+       "ip mroute A.B.C.D/M <A.B.C.D|INTERFACE> [(1-255)]",
        IP_STR
        "Configure static unicast route into MRIB for multicast RPF lookup\n"
        "IP destination prefix (e.g. 10.0.0.0/8)\n"
@@ -220,22 +220,16 @@ DEFUN (ip_mroute_dist,
        "Nexthop interface name\n"
        "Distance\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_MULTICAST, 1, argv[0], NULL, argv[1],
-                           NULL, NULL, argc > 2 ? argv[2] : NULL, NULL, NULL);
-}
+  char *destprefix = argv[2]->arg;
+  char *nexthop = argv[3]->arg;
+  char *distance = (argc == 5) ? argv[4]->arg : NULL;
 
-ALIAS (ip_mroute_dist,
-       ip_mroute_cmd,
-       "ip mroute A.B.C.D/M (A.B.C.D|INTERFACE)",
-       IP_STR
-       "Configure static unicast route into MRIB for multicast RPF lookup\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Nexthop address\n"
-       "Nexthop interface name\n")
+  return zebra_static_ipv4 (vty, SAFI_MULTICAST, 1, destprefix, NULL, nexthop, NULL, NULL, distance, NULL, NULL);
+}
 
 DEFUN (no_ip_mroute_dist,
        no_ip_mroute_dist_cmd,
-       "no ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) <1-255>",
+       "no ip mroute A.B.C.D/M <A.B.C.D|INTERFACE> [(1-255)]",
        IP_STR
        "Configure static unicast route into MRIB for multicast RPF lookup\n"
        "IP destination prefix (e.g. 10.0.0.0/8)\n"
@@ -243,23 +237,16 @@ DEFUN (no_ip_mroute_dist,
        "Nexthop interface name\n"
        "Distance\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_MULTICAST, 0, argv[0], NULL, argv[1],
-                           NULL, NULL, argc > 2 ? argv[2] : NULL, NULL, NULL);
-}
+  char *destprefix = argv[3]->arg;
+  char *nexthop = argv[4]->arg;
+  char *distance = (argc == 6) ? argv[5]->arg : NULL;
 
-ALIAS (no_ip_mroute_dist,
-       no_ip_mroute_cmd,
-       "no ip mroute A.B.C.D/M (A.B.C.D|INTERFACE)",
-       NO_STR
-       IP_STR
-       "Configure static unicast route into MRIB for multicast RPF lookup\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Nexthop address\n"
-       "Nexthop interface name\n")
+  return zebra_static_ipv4 (vty, SAFI_MULTICAST, 0, destprefix, NULL, nexthop, NULL, NULL, distance, NULL, NULL);
+}
 
 DEFUN (ip_multicast_mode,
        ip_multicast_mode_cmd,
-       "ip multicast rpf-lookup-mode (urib-only|mrib-only|mrib-then-urib|lower-distance|longer-prefix)",
+       "ip multicast rpf-lookup-mode <urib-only|mrib-only|mrib-then-urib|lower-distance|longer-prefix>",
        IP_STR
        "Multicast options\n"
        "RPF lookup behavior\n"
@@ -269,16 +256,17 @@ DEFUN (ip_multicast_mode,
        "Lookup both, use entry with lower distance\n"
        "Lookup both, use entry with longer prefix\n")
 {
+  char *mode = argv[3]->text;
 
-  if (!strncmp (argv[0], "u", 1))
+  if (strmatch (mode, "urib-only"))
     multicast_mode_ipv4_set (MCAST_URIB_ONLY);
-  else if (!strncmp (argv[0], "mrib-o", 6))
+  else if (strmatch (mode, "mrib-only"))
     multicast_mode_ipv4_set (MCAST_MRIB_ONLY);
-  else if (!strncmp (argv[0], "mrib-t", 6))
+  else if (strmatch (mode, "mrib-then-urib"))
     multicast_mode_ipv4_set (MCAST_MIX_MRIB_FIRST);
-  else if (!strncmp (argv[0], "low", 3))
+  else if (strmatch (mode, "lower-distance"))
     multicast_mode_ipv4_set (MCAST_MIX_DISTANCE);
-  else if (!strncmp (argv[0], "lon", 3))
+  else if (strmatch (mode, "longer-prefix"))
     multicast_mode_ipv4_set (MCAST_MIX_PFXLEN);
   else
     {
@@ -291,7 +279,7 @@ DEFUN (ip_multicast_mode,
 
 DEFUN (no_ip_multicast_mode,
        no_ip_multicast_mode_cmd,
-       "no ip multicast rpf-lookup-mode (urib-only|mrib-only|mrib-then-urib|lower-distance|longer-prefix)",
+       "no ip multicast rpf-lookup-mode [<urib-only|mrib-only|mrib-then-urib|lower-distance|longer-prefix>]",
        NO_STR
        IP_STR
        "Multicast options\n"
@@ -306,13 +294,6 @@ DEFUN (no_ip_multicast_mode,
   return CMD_SUCCESS;
 }
 
-ALIAS (no_ip_multicast_mode,
-       no_ip_multicast_mode_noarg_cmd,
-       "no ip multicast rpf-lookup-mode",
-       NO_STR
-       IP_STR
-       "Multicast options\n"
-       "RPF lookup behavior\n")
 
 DEFUN (show_ip_rpf,
        show_ip_rpf_cmd,
@@ -332,12 +313,13 @@ DEFUN (show_ip_rpf_addr,
        "Display RPF information for multicast source\n"
        "IP multicast source address (e.g. 10.0.0.0)\n")
 {
+  int idx_ipv4 = 3;
   struct in_addr addr;
   struct route_node *rn;
   struct rib *rib;
   int ret;
 
-  ret = inet_aton (argv[0], &addr);
+  ret = inet_aton (argv[idx_ipv4]->arg, &addr);
   if (ret == 0)
     {
       vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
@@ -354,24 +336,47 @@ DEFUN (show_ip_rpf_addr,
   return CMD_SUCCESS;
 }
 
-/* Static route configuration.  */
-DEFUN (ip_route, 
-       ip_route_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n")
+static void
+zebra_vty_ip_route_tdv_helper (int argc, struct cmd_token *argv[],
+                              int idx_curr, char **tag,
+                              char **distance, char **vrf, char **labels)
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL, NULL,
-                            NULL, NULL, NULL);
+  *distance = NULL;
+  while (idx_curr < argc)
+  {
+    if (strmatch (argv[idx_curr]->text, "tag"))
+      {
+        if (tag)
+          *tag = argv[idx_curr+1]->arg;
+        idx_curr += 2;
+      }
+    else if (strmatch (argv[idx_curr]->text, "vrf"))
+      {
+        if (vrf)
+          *vrf = argv[idx_curr+1]->arg;
+        idx_curr += 2;
+      }
+    else if (strmatch (argv[idx_curr]->text, "label"))
+      {
+        if (labels)
+          *labels = argv[idx_curr+1]->arg;
+        idx_curr += 2;
+      }
+    else
+      {
+        if (distance)
+          *distance = argv[idx_curr]->arg;
+        idx_curr++;
+      }
+  }
+
+  return;
 }
 
-DEFUN (ip_route_tag,
-       ip_route_tag_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-4294967295>",
+/* Static route configuration.  */
+DEFUN (ip_route,
+       ip_route_cmd,
+       "ip route A.B.C.D/M <A.B.C.D|INTERFACE|null0> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
        IP_STR
        "Establish static routes\n"
        "IP destination prefix (e.g. 10.0.0.0/8)\n"
@@ -379,30 +384,29 @@ DEFUN (ip_route_tag,
        "IP gateway interface name\n"
        "Null interface\n"
        "Set tag for this route\n"
-       "One or more labels separated by '/'\n")
+       "Tag value\n"
+       "Distance value for this route\n"
+       VRF_CMD_HELP_STR)
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL, argv[2],
-                            NULL, NULL, NULL);
+  int idx_ipv4_prefixlen = 2;
+  int idx_ipv4_ifname_null = 3;
+  int idx_curr = 4;
+  char *tag, *distance, *vrf;
+
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1,
+                           argv[idx_ipv4_prefixlen]->arg,
+                           NULL,
+                           argv[idx_ipv4_ifname_null]->arg,
+                           NULL,
+                           tag, distance, vrf, NULL);
 }
 
 DEFUN (ip_route_flags,
        ip_route_flags_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole)",
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], argv[2], NULL,
-                            NULL, NULL, NULL);
-}
-
-DEFUN (ip_route_flags_tag,
-       ip_route_flags_tag_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-4294967295>",
+       "ip route A.B.C.D/M <A.B.C.D|INTERFACE> <reject|blackhole> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
        IP_STR
        "Establish static routes\n"
        "IP destination prefix (e.g. 10.0.0.0/8)\n"
@@ -411,61 +415,64 @@ DEFUN (ip_route_flags_tag,
        "Emit an ICMP unreachable when matched\n"
        "Silently discard pkts when matched\n"
        "Set tag for this route\n"
-       "Tag value\n")
-
+       "Tag value\n"
+       "Distance value for this route\n"
+        VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], argv[2], argv[3],
-                            NULL, NULL, NULL);
+  int idx_ipv4_prefixlen = 2;
+  int idx_ipv4_ifname = 3;
+  int idx_reject_blackhole = 4;
+  int idx_curr = 5;
+  char *tag, *distance, *vrf;
+
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1,
+                           argv[idx_ipv4_prefixlen]->arg,
+                           NULL,
+                           argv[idx_ipv4_ifname]->arg,
+                           argv[idx_reject_blackhole]->arg,
+                            tag, distance, vrf, NULL);
 }
 
 DEFUN (ip_route_flags2,
        ip_route_flags2_cmd,
-       "ip route A.B.C.D/M (reject|blackhole)",
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1], NULL,
-                            NULL, NULL, NULL);
-}
-
-DEFUN (ip_route_flags2_tag,
-       ip_route_flags2_tag_cmd,
-       "ip route A.B.C.D/M (reject|blackhole) tag <1-4294967295>",
+       "ip route A.B.C.D/M <reject|blackhole> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
        IP_STR
        "Establish static routes\n"
        "IP destination prefix (e.g. 10.0.0.0/8)\n"
        "Emit an ICMP unreachable when matched\n"
        "Silently discard pkts when matched\n"
        "Set tag for this route\n"
-       "Tag value\n")
-
+       "Tag value\n"
+       "Distance value for this route\n"
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1], argv[2],
-                            NULL, NULL, NULL);
+  int idx_ipv4_prefixlen = 2;
+  int idx_reject_blackhole = 3;
+  int idx_curr = 4;
+  char *tag, *distance, *vrf;
+
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1,
+                           argv[idx_ipv4_prefixlen]->arg,
+                           NULL,
+                           NULL,
+                           argv[idx_reject_blackhole]->arg,
+                           tag, distance, vrf, NULL);
 }
 
 /* Mask as A.B.C.D format.  */
 DEFUN (ip_route_mask,
        ip_route_mask_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0)",
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], NULL, NULL,
-                            NULL, NULL, NULL);
-}
-
-DEFUN (ip_route_mask_tag,
-       ip_route_mask_tag_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-4294967295>",
+       "ip route A.B.C.D A.B.C.D <A.B.C.D|INTERFACE|null0> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
        IP_STR
        "Establish static routes\n"
        "IP destination prefix\n"
@@ -474,32 +481,31 @@ DEFUN (ip_route_mask_tag,
        "IP gateway interface name\n"
        "Null interface\n"
        "Set tag for this route\n"
-       "Tag value\n")
-
+       "Tag value\n"
+       "Distance value for this route\n"
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], NULL, argv[3],
-                            NULL, NULL, NULL);
+  int idx_ipv4 = 2;
+  int idx_ipv4_2 = 3;
+  int idx_ipv4_ifname_null = 4;
+  int idx_curr = 5;
+  char *tag, *distance, *vrf;
+
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1,
+                           argv[idx_ipv4]->arg,
+                           argv[idx_ipv4_2]->arg,
+                           argv[idx_ipv4_ifname_null]->arg,
+                           NULL, tag, distance, vrf, NULL);
 }
 
 DEFUN (ip_route_mask_flags,
        ip_route_mask_flags_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole)",
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], argv[3], NULL,
-                            NULL, NULL, NULL);
-}
-
-DEFUN (ip_route_mask_flags_tag,
-       ip_route_mask_flags_tag_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-4294967295>",
+       "ip route A.B.C.D A.B.C.D <A.B.C.D|INTERFACE> <reject|blackhole> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
        IP_STR
        "Establish static routes\n"
        "IP destination prefix\n"
@@ -509,30 +515,34 @@ DEFUN (ip_route_mask_flags_tag,
        "Emit an ICMP unreachable when matched\n"
        "Silently discard pkts when matched\n"
        "Set tag for this route\n"
-       "Tag value\n")
-
+       "Tag value\n"
+       "Distance value for this route\n"
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], argv[3], argv[4],
-                            NULL, NULL, NULL);
+  int idx_ipv4 = 2;
+  int idx_ipv4_2 = 3;
+  int idx_ipv4_ifname = 4;
+  int idx_reject_blackhole = 5;
+  int idx_curr = 6;
+  char *tag, *distance, *vrf;
+
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1,
+                           argv[idx_ipv4]->arg,
+                           argv[idx_ipv4_2]->arg,
+                           argv[idx_ipv4_ifname]->arg,
+                           argv[idx_reject_blackhole]->arg,
+                           tag, distance, vrf, NULL);
 }
 
+
 DEFUN (ip_route_mask_flags2,
        ip_route_mask_flags2_cmd,
-       "ip route A.B.C.D A.B.C.D (reject|blackhole)",
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL, argv[2], NULL,
-                            NULL, NULL, NULL);
-}
-
-DEFUN (ip_route_mask_flags2_tag,
-       ip_route_mask_flags2_tag_cmd,
-       "ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-4294967295>",
+       "ip route A.B.C.D A.B.C.D <reject|blackhole> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
        IP_STR
        "Establish static routes\n"
        "IP destination prefix\n"
@@ -540,129 +550,95 @@ DEFUN (ip_route_mask_flags2_tag,
        "Emit an ICMP unreachable when matched\n"
        "Silently discard pkts when matched\n"
        "Set tag for this route\n"
-       "Tag value\n")
+       "Tag value\n"
+       "Distance value for this route\n"
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL, argv[2], argv[3],
-                            NULL, NULL, NULL);
-}
+  int idx_ipv4 = 2;
+  int idx_ipv4_2 = 3;
+  int idx_reject_blackhole = 4;
+  int idx_curr = 5;
+  char *tag, *distance, *vrf;
 
-/* Distance option value.  */
-DEFUN (ip_route_distance,
-       ip_route_distance_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255>",
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL, NULL,
-                            argv[2], NULL, NULL);
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1,
+                           argv[idx_ipv4]->arg,
+                           argv[idx_ipv4_2]->arg,
+                           NULL,
+                           argv[idx_reject_blackhole]->arg,
+                           tag, distance, vrf, NULL);
 }
 
-DEFUN (ip_route_tag_distance,
-       ip_route_tag_distance_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-4294967295> <1-255>",
+DEFUN (no_ip_route,
+       no_ip_route_cmd,
+       "no ip route A.B.C.D/M <A.B.C.D|INTERFACE|null0> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
+       NO_STR
        IP_STR
        "Establish static routes\n"
        "IP destination prefix (e.g. 10.0.0.0/8)\n"
        "IP gateway address\n"
        "IP gateway interface name\n"
        "Null interface\n"
-       "Set tag for this route\n"
+       "Tag of this route\n"
        "Tag value\n"
-       "Distance value for this route\n")
-
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL, argv[2],
-                            argv[3], NULL, NULL);
-}
-
-DEFUN (ip_route_flags_distance,
-       ip_route_flags_distance_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this route\n")
+       "Distance value for this route\n"
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], argv[2], NULL,
-                            argv[3], NULL, NULL);
-}
+  int idx_ipv4_prefixlen = 3;
+  int idx_ipv4_ifname_null = 4;
+  int idx_curr = 5;
+  char *tag, *distance, *vrf;
 
-DEFUN (ip_route_flags_tag_distance,
-       ip_route_flags_tag_distance_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-4294967295> <1-255>",
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], argv[2], argv[3],
-                            argv[4], NULL, NULL);
-}
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
 
-DEFUN (ip_route_flags_distance2,
-       ip_route_flags_distance2_cmd,
-       "ip route A.B.C.D/M (reject|blackhole) <1-255>",
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1], NULL,
-                            argv[2], NULL, NULL);
+  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0,
+                           argv[idx_ipv4_prefixlen]->arg,
+                           NULL,
+                           argv[idx_ipv4_ifname_null]->arg,
+                           NULL,
+                           tag, distance, vrf, NULL);
 }
 
-DEFUN (ip_route_flags_tag_distance2,
-       ip_route_flags_tag_distance2_cmd,
-       "ip route A.B.C.D/M (reject|blackhole) tag <1-4294967295> <1-255>",
+DEFUN (no_ip_route_flags2,
+       no_ip_route_flags2_cmd,
+       "no ip route A.B.C.D/M <reject|blackhole> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
+       NO_STR
        IP_STR
        "Establish static routes\n"
        "IP destination prefix (e.g. 10.0.0.0/8)\n"
        "Emit an ICMP unreachable when matched\n"
        "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
+       "Tag of this route\n"
        "Tag value\n"
-       "Distance value for this route\n")
+       "Distance value for this route\n"
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1], argv[2],
-                            argv[3], NULL, NULL);
-}
+  int idx_ipv4_prefixlen = 3;
+  int idx_curr = 5;
+  char *tag, *distance, *vrf;
 
-DEFUN (ip_route_mask_distance,
-       ip_route_mask_distance_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255>",
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], NULL, NULL,
-                            argv[3], NULL, NULL);
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0,
+                           argv[idx_ipv4_prefixlen]->arg,
+                           NULL, NULL, NULL,
+                           tag, distance, vrf, NULL);
 }
 
-DEFUN (ip_route_mask_tag_distance,
-       ip_route_mask_tag_distance_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-4294967295> <1-255>",
+DEFUN (no_ip_route_mask,
+       no_ip_route_mask_cmd,
+       "no ip route A.B.C.D A.B.C.D <A.B.C.D|INTERFACE|null0> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
+       NO_STR
        IP_STR
        "Establish static routes\n"
        "IP destination prefix\n"
@@ -670,4083 +646,1991 @@ DEFUN (ip_route_mask_tag_distance,
        "IP gateway address\n"
        "IP gateway interface name\n"
        "Null interface\n"
-       "Set tag for this route\n"
+       "Tag of this route\n"
        "Tag value\n"
-       "Distance value for this route\n")
+       "Distance value for this route\n"
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], NULL, argv[3],
-                            argv[4], NULL, NULL);
+  int idx_ipv4 = 3;
+  int idx_ipv4_2 = 4;
+  int idx_ipv4_ifname_null = 5;
+  int idx_curr = 6;
+  char *tag, *distance, *vrf;
+
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0,
+                           argv[idx_ipv4]->arg,
+                           argv[idx_ipv4_2]->arg,
+                           argv[idx_ipv4_ifname_null]->arg,
+                           NULL,
+                           tag, distance, vrf, NULL);
 }
 
-DEFUN (ip_route_mask_flags_tag_distance,
-       ip_route_mask_flags_tag_distance_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole)  tag <1-4294967295> <1-255>",
+DEFUN (no_ip_route_mask_flags2,
+       no_ip_route_mask_flags2_cmd,
+       "no ip route A.B.C.D A.B.C.D <reject|blackhole> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
+       NO_STR
        IP_STR
        "Establish static routes\n"
        "IP destination prefix\n"
        "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Set tag for this route\n"
+       "Emit an ICMP unreachable when matched\n"
+       "Silently discard pkts when matched\n"
+       "Tag of this route\n"
        "Tag value\n"
        "Distance value for this route\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n")
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], argv[3], argv[4],
-                            argv[5], NULL, NULL);
-}
+  int idx_ipv4 = 3;
+  int idx_ipv4_2 = 4;
+  int idx_curr = 6;
+  char *tag, *distance, *vrf;
+
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
 
+  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0,
+                           argv[idx_ipv4]->arg,
+                           argv[idx_ipv4_2]->arg,
+                           NULL, NULL,
+                           tag, distance, vrf, NULL);
+}
 
-DEFUN (ip_route_mask_flags_distance,
-       ip_route_mask_flags_distance_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
+DEFUN (no_ip_route_flags,
+       no_ip_route_flags_cmd,
+       "no ip route A.B.C.D/M <A.B.C.D|INTERFACE> <reject|blackhole> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
+       NO_STR
        IP_STR
        "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
+       "IP destination prefix (e.g. 10.0.0.0/8)\n"
        "IP gateway address\n"
        "IP gateway interface name\n"
        "Emit an ICMP unreachable when matched\n"
        "Silently discard pkts when matched\n"
-       "Distance value for this route\n")
+       "Tag of this route\n"
+       "Tag value\n"
+       "Distance value for this route\n"
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], argv[3], NULL,
-                            argv[4], NULL, NULL);
+  int idx_ipv4_prefixlen = 3;
+  int idx_ipv4_ifname = 4;
+  int idx_reject_blackhole = 5;
+  int idx_curr = 6;
+  char *tag, *distance, *vrf;
+
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0,
+                           argv[idx_ipv4_prefixlen]->arg,
+                           NULL,
+                           argv[idx_ipv4_ifname]->arg,
+                           argv[idx_reject_blackhole]->arg,
+                           tag, distance, vrf, NULL);
 }
 
-DEFUN (ip_route_mask_flags_distance2,
-       ip_route_mask_flags_distance2_cmd,
-       "ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255>",
+DEFUN (no_ip_route_mask_flags,
+       no_ip_route_mask_flags_cmd,
+       "no ip route A.B.C.D A.B.C.D <A.B.C.D|INTERFACE> <reject|blackhole> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
+       NO_STR
        IP_STR
        "Establish static routes\n"
        "IP destination prefix\n"
        "IP destination prefix mask\n"
+       "IP gateway address\n"
+       "IP gateway interface name\n"
        "Emit an ICMP unreachable when matched\n"
        "Silently discard pkts when matched\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL, argv[2], NULL,
-                            argv[3], NULL, NULL);
-}
-
-DEFUN (ip_route_mask_flags_tag_distance2,
-       ip_route_mask_flags_tag_distance2_cmd,
-       "ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-4294967295> <1-255>",
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "Set tag for this route\n"
+       "Tag of this route\n"
        "Tag value\n"
        "Distance value for this route\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n")
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL, argv[2], argv[3],
-                            argv[4], NULL, NULL);
-}
+  int idx_ipv4 = 3;
+  int idx_ipv4_2 = 4;
+  int idx_ipv4_ifname = 5;
+  int idx_reject_blackhole = 6;
+  int idx_curr = 7;
+  char *tag, *distance, *vrf;
 
-DEFUN (no_ip_route, 
-       no_ip_route_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL, NULL,
-                            NULL, NULL, NULL);
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0,
+                           argv[idx_ipv4]->arg,
+                           argv[idx_ipv4_2]->arg,
+                           argv[idx_ipv4_ifname]->arg,
+                           argv[idx_reject_blackhole]->arg,
+                           tag, distance, vrf, NULL);
 }
 
-DEFUN (no_ip_route_tag,
-       no_ip_route_tag_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-4294967295>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Tag of this route\n"
-       "Tag value\n")
+/* New RIB.  Detailed information for IPv4 route. */
+static void
+vty_show_ip_route_detail (struct vty *vty, struct route_node *rn, int mcast)
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL, argv[2],
-                            NULL, NULL, NULL);
-}
+  struct rib *rib;
+  struct nexthop *nexthop, *tnexthop;
+  int recursing;
+  char buf[PREFIX_STRLEN];
+  struct zebra_vrf *zvrf;
 
-ALIAS (no_ip_route,
-       no_ip_route_flags_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole)",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n")
+  RNODE_FOREACH_RIB (rn, rib)
+    {
+      const char *mcast_info = "";
+      if (mcast)
+        {
+          rib_table_info_t *info = rn->table->info;
+          mcast_info = (info->safi == SAFI_MULTICAST)
+                       ? " using Multicast RIB"
+                       : " using Unicast RIB";
+        }
 
-ALIAS (no_ip_route_tag,
-       no_ip_route_flags_tag_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-4294967295>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n")
+      vty_out (vty, "Routing entry for %s%s%s",
+              prefix2str (&rn->p, buf, sizeof(buf)), mcast_info,
+              VTY_NEWLINE);
+      vty_out (vty, "  Known via \"%s", zebra_route_string (rib->type));
+      if (rib->instance)
+        vty_out (vty, "[%d]", rib->instance);
+      vty_out (vty, "\"");
+      vty_out (vty, ", distance %u, metric %u", rib->distance, rib->metric);
+      if (rib->tag)
+       vty_out (vty, ", tag %d", rib->tag);
+       if (rib->mtu)
+        vty_out (vty, ", mtu %u", rib->mtu);
+      if (rib->vrf_id != VRF_DEFAULT)
+        {
+          zvrf = vrf_info_lookup(rib->vrf_id);
+          vty_out (vty, ", vrf %s", zvrf->name);
+        }
+      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
+       vty_out (vty, ", best");
+      if (rib->refcnt)
+       vty_out (vty, ", refcnt %ld", rib->refcnt);
+      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
+       vty_out (vty, ", blackhole");
+      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
+       vty_out (vty, ", reject");
+      vty_out (vty, "%s", VTY_NEWLINE);
 
-DEFUN (no_ip_route_flags2,
-       no_ip_route_flags2_cmd,
-       "no ip route A.B.C.D/M (reject|blackhole)",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, NULL, NULL,
-                            NULL, NULL, NULL);
-}
+      if (rib->type == ZEBRA_ROUTE_RIP
+         || rib->type == ZEBRA_ROUTE_OSPF
+         || rib->type == ZEBRA_ROUTE_ISIS
+         || rib->type == ZEBRA_ROUTE_TABLE
+         || rib->type == ZEBRA_ROUTE_BGP)
+       {
+         time_t uptime;
+         struct tm *tm;
 
-DEFUN (no_ip_route_flags2_tag,
-       no_ip_route_flags2_tag_cmd,
-       "no ip route A.B.C.D/M (reject|blackhole) tag <1-4294967295>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, NULL, argv[1],
-                            NULL, NULL, NULL);
-}
+         uptime = time (NULL);
+         uptime -= rib->uptime;
+         tm = gmtime (&uptime);
 
-DEFUN (no_ip_route_mask,
-       no_ip_route_mask_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0)",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], NULL, NULL,
-                            NULL, NULL, NULL);
-}
+         vty_out (vty, "  Last update ");
 
-DEFUN (no_ip_route_mask_tag,
-       no_ip_route_mask_tag_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-4294967295>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Tag of this route\n"
-       "Tag value\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], NULL, argv[3],
-                            NULL, NULL, NULL);
-}
+         if (uptime < ONE_DAY_SECOND)
+           vty_out (vty,  "%02d:%02d:%02d",
+                    tm->tm_hour, tm->tm_min, tm->tm_sec);
+         else if (uptime < ONE_WEEK_SECOND)
+           vty_out (vty, "%dd%02dh%02dm",
+                    tm->tm_yday, tm->tm_hour, tm->tm_min);
+         else
+           vty_out (vty, "%02dw%dd%02dh",
+                    tm->tm_yday/7,
+                    tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
+         vty_out (vty, " ago%s", VTY_NEWLINE);
+       }
 
-ALIAS (no_ip_route_mask,
-       no_ip_route_mask_flags_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole)",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n")
+      for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
+       {
+          char addrstr[32];
 
-ALIAS (no_ip_route_mask_tag,
-       no_ip_route_mask_flags_tag_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-4294967295>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n")
+         vty_out (vty, "  %c%s",
+                  CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ',
+                  recursing ? "  " : "");
 
-DEFUN (no_ip_route_mask_flags2,
-       no_ip_route_mask_flags2_cmd,
-       "no ip route A.B.C.D A.B.C.D (reject|blackhole)",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL, NULL, NULL,
-                            NULL, NULL, NULL);
-}
+         switch (nexthop->type)
+           {
+           case NEXTHOP_TYPE_IPV4:
+           case NEXTHOP_TYPE_IPV4_IFINDEX:
+             vty_out (vty, " %s", inet_ntoa (nexthop->gate.ipv4));
+             if (nexthop->ifindex)
+               vty_out (vty, ", via %s",
+                         ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
+             break;
+           case NEXTHOP_TYPE_IPV6:
+           case NEXTHOP_TYPE_IPV6_IFINDEX:
+             vty_out (vty, " %s",
+                      inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
+             if (nexthop->ifindex)
+               vty_out (vty, ", via %s",
+                         ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
+             break;
+           case NEXTHOP_TYPE_IFINDEX:
+             vty_out (vty, " directly connected, %s",
+                      ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
+             break;
+           case NEXTHOP_TYPE_BLACKHOLE:
+             vty_out (vty, " directly connected, Null0");
+             break;
+           default:
+             break;
+           }
+         if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
+           vty_out (vty, " inactive");
 
-DEFUN (no_ip_route_mask_flags2_tag,
-       no_ip_route_mask_flags2_tag_cmd,
-       "no ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-4294967295>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL, NULL, argv[2],
-                            NULL, NULL, NULL);
-}
+         if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
+           vty_out (vty, " onlink");
 
-DEFUN (no_ip_route_distance,
-       no_ip_route_distance_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL, NULL,
-                            argv[2], NULL, NULL);
-}
+         if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
+           vty_out (vty, " (recursive)");
 
-DEFUN (no_ip_route_tag_distance,
-       no_ip_route_tag_distance_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-4294967295> <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL, argv[2],
-                            argv[3], NULL, NULL);
+         switch (nexthop->type)
+            {
+            case NEXTHOP_TYPE_IPV4:
+            case NEXTHOP_TYPE_IPV4_IFINDEX:
+              if (nexthop->src.ipv4.s_addr)
+                {
+                 if (inet_ntop(AF_INET, &nexthop->src.ipv4, addrstr,
+                     sizeof addrstr))
+                    vty_out (vty, ", src %s", addrstr);
+                }
+              break;
+            case NEXTHOP_TYPE_IPV6:
+            case NEXTHOP_TYPE_IPV6_IFINDEX:
+              if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
+                {
+                 if (inet_ntop(AF_INET6, &nexthop->src.ipv6, addrstr,
+                     sizeof addrstr))
+                    vty_out (vty, ", src %s", addrstr);
+                }
+              break;
+            default:
+              break;
+            }
+         vty_out (vty, "%s", VTY_NEWLINE);
+       }
+      vty_out (vty, "%s", VTY_NEWLINE);
+    }
 }
 
-DEFUN (no_ip_route_flags_distance,
-       no_ip_route_flags_distance_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], argv[2], NULL,
-                            argv[3], NULL, NULL);
-}
-
-DEFUN (no_ip_route_flags_tag_distance,
-       no_ip_route_flags_tag_distance_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-4294967295> <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       "Distance value for this route\n")
+static void
+vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib,
+                   json_object *json)
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], argv[2], argv[3],
-                            argv[4], NULL, NULL);
-}
+  struct nexthop *nexthop, *tnexthop;
+  int recursing;
+  int len = 0;
+  char buf[BUFSIZ];
+  json_object *json_nexthops = NULL;
+  json_object *json_nexthop = NULL;
+  json_object *json_route = NULL;
 
-DEFUN (no_ip_route_flags_distance2,
-       no_ip_route_flags_distance2_cmd,
-       "no ip route A.B.C.D/M (reject|blackhole) <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, argv[1], NULL,
-                            argv[2], NULL, NULL);
-}
+  if (json)
+    {
+      json_route = json_object_new_object();
+      json_nexthops = json_object_new_array();
 
-DEFUN (no_ip_route_flags_tag_distance2,
-       no_ip_route_flags_tag_distance2_cmd,
-       "no ip route A.B.C.D/M (reject|blackhole) tag <1-4294967295> <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, argv[1], argv[2],
-                            argv[3], NULL, NULL);
-}
+      json_object_string_add(json_route, "prefix", prefix2str (&rn->p, buf, sizeof buf));
+      json_object_string_add(json_route, "protocol", zebra_route_string(rib->type));
 
-DEFUN (no_ip_route_mask_distance,
-       no_ip_route_mask_distance_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], NULL, NULL,
-                            argv[3], NULL, NULL);
-}
+      if (rib->instance)
+        json_object_int_add(json_route, "instance", rib->instance);
 
-DEFUN (no_ip_route_mask_tag_distance,
-       no_ip_route_mask_tag_distance_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-4294967295> <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], NULL, argv[3],
-                            argv[4], NULL, NULL);
-}
+      if (rib->vrf_id)
+        json_object_int_add(json_route, "vrfId", rib->vrf_id);
 
-DEFUN (no_ip_route_mask_flags_distance,
-       no_ip_route_mask_flags_distance_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], argv[3], NULL,
-                            argv[4], NULL, NULL);
-}
+      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
+        json_object_boolean_true_add(json_route, "selected");
 
-DEFUN (no_ip_route_mask_flags_tag_distance,
-       no_ip_route_mask_flags_tag_distance_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-4294967295> <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], argv[3], argv[4],
-                            argv[5], NULL, NULL);
-}
+      if (rib->type != ZEBRA_ROUTE_CONNECT && rib->type != ZEBRA_ROUTE_KERNEL)
+        {
+          json_object_int_add(json_route, "distance", rib->distance);
+          json_object_int_add(json_route, "metric", rib->metric);
+        }
 
-DEFUN (no_ip_route_mask_flags_distance2,
-       no_ip_route_mask_flags_distance2_cmd,
-       "no ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL, argv[2], NULL,
-                            argv[3], NULL, NULL);
-}
+      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
+        json_object_boolean_true_add(json_route, "blackhole");
 
-DEFUN (no_ip_route_mask_flags_tag_distance2,
-       no_ip_route_mask_flags_tag_distance2_cmd,
-       "no ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-4294967295> <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       "Distance value for this route\n")
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL, argv[2], argv[3],
-                            argv[4], NULL, NULL);
-}
+      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
+        json_object_boolean_true_add(json_route, "reject");
 
-/* Static route configuration.  */
-DEFUN (ip_route_vrf, 
-       ip_route_vrf_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL,
-                           NULL, NULL, argv[2], NULL);
-}
+      if (rib->type == ZEBRA_ROUTE_RIP
+          || rib->type == ZEBRA_ROUTE_OSPF
+          || rib->type == ZEBRA_ROUTE_ISIS
+          || rib->type == ZEBRA_ROUTE_TABLE
+          || rib->type == ZEBRA_ROUTE_BGP)
+        {
+          time_t uptime;
+          struct tm *tm;
 
-DEFUN (ip_route_tag_vrf,
-       ip_route_tag_vrf_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-4294967295> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL,
-                           argv[2], NULL, argv[3], NULL);
-}
+          uptime = time (NULL);
+          uptime -= rib->uptime;
+          tm = gmtime (&uptime);
 
-DEFUN (ip_route_flags_vrf,
-       ip_route_flags_vrf_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1],
-                           argv[2], NULL, NULL, argv[3], NULL);
-}
+          if (uptime < ONE_DAY_SECOND)
+            sprintf(buf, "%02d:%02d:%02d", tm->tm_hour, tm->tm_min, tm->tm_sec);
+          else if (uptime < ONE_WEEK_SECOND)
+            sprintf(buf, "%dd%02dh%02dm", tm->tm_yday, tm->tm_hour, tm->tm_min);
+          else
+            sprintf(buf, "%02dw%dd%02dh", tm->tm_yday/7, tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
 
-DEFUN (ip_route_flags_tag_vrf,
-       ip_route_flags_tag_vrf_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-4294967295> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
+          json_object_string_add(json_route, "uptime", buf);
+        }
 
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1],
-                           argv[2], argv[3], NULL, argv[4], NULL);
-}
+      for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
+        {
+          json_nexthop = json_object_new_object();
 
-DEFUN (ip_route_flags2_vrf,
-       ip_route_flags2_vrf_cmd,
-       "ip route A.B.C.D/M (reject|blackhole) " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1],
-                           NULL, NULL, argv[2], NULL);
-}
+          if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
+            json_object_boolean_true_add(json_nexthop, "fib");
 
-DEFUN (ip_route_flags2_tag_vrf,
-       ip_route_flags2_tag_vrf_cmd,
-       "ip route A.B.C.D/M (reject|blackhole) tag <1-4294967295> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
+          switch (nexthop->type)
+            {
+            case NEXTHOP_TYPE_IPV4:
+            case NEXTHOP_TYPE_IPV4_IFINDEX:
+              json_object_string_add(json_nexthop, "ip", inet_ntoa (nexthop->gate.ipv4));
+              json_object_string_add(json_nexthop, "afi", "ipv4");
 
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1],
-                           argv[2], NULL, argv[3], NULL);
-}
+              if (nexthop->ifindex)
+                {
+                  json_object_int_add(json_nexthop, "interfaceIndex", nexthop->ifindex);
+                  json_object_string_add(json_nexthop, "interfaceName", ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
+                }
+              break;
+            case NEXTHOP_TYPE_IPV6:
+            case NEXTHOP_TYPE_IPV6_IFINDEX:
+              json_object_string_add(json_nexthop, "ip", inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
+              json_object_string_add(json_nexthop, "afi", "ipv6");
 
-/* Mask as A.B.C.D format.  */
-DEFUN (ip_route_mask_vrf,
-       ip_route_mask_vrf_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2],
-                           NULL, NULL, NULL, argv[3], NULL);
-}
+              if (nexthop->ifindex)
+                {
+                  json_object_int_add(json_nexthop, "interfaceIndex", nexthop->ifindex);
+                  json_object_string_add(json_nexthop, "interfaceName", ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
+                }
+              break;
 
-DEFUN (ip_route_mask_tag_vrf,
-       ip_route_mask_tag_vrf_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-4294967295> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
+            case NEXTHOP_TYPE_IFINDEX:
+              json_object_boolean_true_add(json_nexthop, "directlyConnected");
+              json_object_int_add(json_nexthop, "interfaceIndex", nexthop->ifindex);
+              json_object_string_add(json_nexthop, "interfaceName", ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
+              break;
+            case NEXTHOP_TYPE_BLACKHOLE:
+              json_object_boolean_true_add(json_nexthop, "blackhole");
+              break;
+            default:
+              break;
+            }
 
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2],
-                           NULL, argv[3], NULL, argv[4], NULL);
-}
+          if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
+            json_object_boolean_true_add(json_nexthop, "active");
 
-DEFUN (ip_route_mask_flags_vrf,
-       ip_route_mask_flags_vrf_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2],
-                           argv[3], NULL, NULL, argv[4], NULL);
-}
+          if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
+            json_object_boolean_true_add(json_nexthop, "onLink");
 
-DEFUN (ip_route_mask_flags_tag_vrf,
-       ip_route_mask_flags_tag_vrf_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-4294967295> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
+          if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
+            json_object_boolean_true_add(json_nexthop, "recursive");
 
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2],
-                           argv[3], argv[4], NULL, argv[5], NULL);
-}
+          switch (nexthop->type)
+            {
+              case NEXTHOP_TYPE_IPV4:
+              case NEXTHOP_TYPE_IPV4_IFINDEX:
+                if (nexthop->src.ipv4.s_addr)
+                  {
+                    if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, sizeof buf))
+                      json_object_string_add(json_nexthop, "source", buf);
+                  }
+                break;
+              case NEXTHOP_TYPE_IPV6:
+              case NEXTHOP_TYPE_IPV6_IFINDEX:
+                if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
+                  {
+                    if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, sizeof buf))
+                      json_object_string_add(json_nexthop, "source", buf);
+                  }
+                break;
+              default:
+                break;
+            }
 
-DEFUN (ip_route_mask_flags2_vrf,
-       ip_route_mask_flags2_vrf_cmd,
-       "ip route A.B.C.D A.B.C.D (reject|blackhole) " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL,
-                           argv[2], NULL, NULL, argv[3], NULL);
-}
+          json_object_array_add(json_nexthops, json_nexthop);
+        }
 
-DEFUN (ip_route_mask_flags2_tag_vrf,
-       ip_route_mask_flags2_tag_vrf_cmd,
-       "ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-4294967295> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL,
-                           argv[2], argv[3], NULL, argv[4], NULL);
-}
+      json_object_object_add(json_route, "nexthops", json_nexthops);
+      json_object_array_add(json, json_route);
+      return;
+    }
 
-/* Distance option value.  */
-DEFUN (ip_route_distance_vrf,
-       ip_route_distance_vrf_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL,
-                           NULL, argv[2], argv[3], NULL);
-}
+  /* Nexthop information. */
+  for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
+    {
+      if (nexthop == rib->nexthop)
+       {
+         /* Prefix information. */
+         len = vty_out (vty, "%c", zebra_route_char (rib->type));
+          if (rib->instance)
+           len += vty_out (vty, "[%d]", rib->instance);
+          len += vty_out (vty, "%c%c %s",
+                         CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED)
+                         ? '>' : ' ',
+                         CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
+                         ? '*' : ' ',
+                         prefix2str (&rn->p, buf, sizeof buf));
 
-DEFUN (ip_route_tag_distance_vrf,
-       ip_route_tag_distance_vrf_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-4294967295> <1-255> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
+         /* Distance and metric display. */
+         if (rib->type != ZEBRA_ROUTE_CONNECT
+             && rib->type != ZEBRA_ROUTE_KERNEL)
+           len += vty_out (vty, " [%d/%d]", rib->distance,
+                           rib->metric);
+       }
+      else
+       vty_out (vty, "  %c%*c",
+                CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
+                ? '*' : ' ',
+                len - 3 + (2 * recursing), ' ');
 
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL,
-                           argv[2], argv[3], argv[4], NULL);
-}
+      switch (nexthop->type)
+       {
+       case NEXTHOP_TYPE_IPV4:
+       case NEXTHOP_TYPE_IPV4_IFINDEX:
+         vty_out (vty, " via %s", inet_ntoa (nexthop->gate.ipv4));
+         if (nexthop->ifindex)
+           vty_out (vty, ", %s",
+                     ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
+         break;
+        case NEXTHOP_TYPE_IPV6:
+       case NEXTHOP_TYPE_IPV6_IFINDEX:
+         vty_out (vty, " via %s",
+                  inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
+         if (nexthop->ifindex)
+           vty_out (vty, ", %s",
+                     ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
+         break;
 
-DEFUN (ip_route_flags_distance_vrf,
-       ip_route_flags_distance_vrf_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1],
-                           argv[2], NULL, argv[3], argv[4], NULL);
+       case NEXTHOP_TYPE_IFINDEX:
+         vty_out (vty, " is directly connected, %s",
+                  ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
+         break;
+       case NEXTHOP_TYPE_BLACKHOLE:
+         vty_out (vty, " is directly connected, Null0");
+         break;
+       default:
+         break;
+       }
+      if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
+       vty_out (vty, " inactive");
+
+      if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
+       vty_out (vty, " onlink");
+
+      if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
+       vty_out (vty, " (recursive)");
+
+      switch (nexthop->type)
+        {
+          case NEXTHOP_TYPE_IPV4:
+          case NEXTHOP_TYPE_IPV4_IFINDEX:
+            if (nexthop->src.ipv4.s_addr)
+              {
+               if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, sizeof buf))
+                  vty_out (vty, ", src %s", buf);
+              }
+            break;
+          case NEXTHOP_TYPE_IPV6:
+          case NEXTHOP_TYPE_IPV6_IFINDEX:
+            if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
+              {
+               if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, sizeof buf))
+                  vty_out (vty, ", src %s", buf);
+              }
+            break;
+          default:
+           break;
+        }
+
+      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
+               vty_out (vty, ", bh");
+      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
+               vty_out (vty, ", rej");
+
+      if (rib->type == ZEBRA_ROUTE_RIP
+         || rib->type == ZEBRA_ROUTE_OSPF
+         || rib->type == ZEBRA_ROUTE_ISIS
+         || rib->type == ZEBRA_ROUTE_TABLE
+         || rib->type == ZEBRA_ROUTE_BGP)
+       {
+         time_t uptime;
+         struct tm *tm;
+
+         uptime = time (NULL);
+         uptime -= rib->uptime;
+         tm = gmtime (&uptime);
+
+         if (uptime < ONE_DAY_SECOND)
+           vty_out (vty,  ", %02d:%02d:%02d",
+                    tm->tm_hour, tm->tm_min, tm->tm_sec);
+         else if (uptime < ONE_WEEK_SECOND)
+           vty_out (vty, ", %dd%02dh%02dm",
+                    tm->tm_yday, tm->tm_hour, tm->tm_min);
+         else
+           vty_out (vty, ", %02dw%dd%02dh",
+                    tm->tm_yday/7,
+                    tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
+       }
+      vty_out (vty, "%s", VTY_NEWLINE);
+    }
 }
 
-DEFUN (ip_route_flags_tag_distance_vrf,
-       ip_route_flags_tag_distance_vrf_cmd,
-       "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-4294967295> <1-255> " VRF_CMD_STR,
+DEFUN (show_ip_route,
+       show_ip_route_cmd,
+       "show ip route [json]",
+       SHOW_STR
        IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
+       "IP routing table\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1],
-                           argv[2], argv[3], argv[4],argv[5], NULL);
+  return do_show_ip_route (vty, VRF_DEFAULT_NAME, SAFI_UNICAST, use_json(argc, argv));
 }
 
-DEFUN (ip_route_flags_distance2_vrf,
-       ip_route_flags_distance2_vrf_cmd,
-       "ip route A.B.C.D/M (reject|blackhole) <1-255> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
+static int
+do_show_ip_route (struct vty *vty, const char *vrf_name, safi_t safi,
+                  u_char use_json)
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1],
-                           NULL, argv[2], argv[3], NULL);
+  struct route_table *table;
+  struct route_node *rn;
+  struct rib *rib;
+  int first = 1;
+  struct zebra_vrf *zvrf = NULL;
+  char buf[BUFSIZ];
+  json_object *json = NULL;
+  json_object *json_prefix = NULL;
+
+  if (!(zvrf = zebra_vrf_list_lookup_by_name (vrf_name)))
+    {
+      if (use_json)
+        vty_out (vty, "{}%s", VTY_NEWLINE);
+      else
+        vty_out (vty, "vrf %s not defined%s", vrf_name, VTY_NEWLINE);
+      return CMD_SUCCESS;
+    }
+
+  if (zvrf->vrf_id == VRF_UNKNOWN)
+    {
+      if (use_json)
+        vty_out (vty, "{}%s", VTY_NEWLINE);
+      else
+        vty_out (vty, "vrf %s inactive%s", vrf_name, VTY_NEWLINE);
+      return CMD_SUCCESS;
+    }
+
+  table = zebra_vrf_table (AFI_IP, safi, zvrf->vrf_id);
+  if (! table)
+    {
+      if (use_json)
+        vty_out (vty, "{}%s", VTY_NEWLINE);
+      return CMD_SUCCESS;
+    }
+
+  if (use_json)
+    {
+      json = json_object_new_object();
+
+      /* Show all IPv4 routes. */
+      for (rn = route_top (table); rn; rn = route_next (rn))
+        {
+          RNODE_FOREACH_RIB (rn, rib)
+            {
+              if (!json_prefix)
+                json_prefix = json_object_new_array();
+              vty_show_ip_route (vty, rn, rib, json_prefix);
+            }
+
+          if (json_prefix)
+            {
+              prefix2str (&rn->p, buf, sizeof buf);
+              json_object_object_add(json, buf, json_prefix);
+              json_prefix = NULL;
+            }
+        }
+
+      vty_out (vty, "%s%s", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY), VTY_NEWLINE);
+      json_object_free(json);
+    }
+  else
+    {
+      /* Show all IPv4 routes. */
+      for (rn = route_top (table); rn; rn = route_next (rn))
+        {
+          RNODE_FOREACH_RIB (rn, rib)
+            {
+              if (first)
+                {
+                  vty_out (vty, SHOW_ROUTE_V4_HEADER);
+                  first = 0;
+                }
+              vty_show_ip_route (vty, rn, rib, NULL);
+            }
+        }
+    }
+
+  return CMD_SUCCESS;
 }
 
-DEFUN (ip_route_flags_tag_distance2_vrf,
-       ip_route_flags_tag_distance2_vrf_cmd,
-       "ip route A.B.C.D/M (reject|blackhole) tag <1-4294967295> <1-255> " VRF_CMD_STR,
+DEFUN (show_ip_route_vrf,
+       show_ip_route_vrf_cmd,
+       "show ip route vrf NAME [json]",
+       SHOW_STR
        IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this route\n"
+       "IP routing table\n"
        VRF_CMD_HELP_STR)
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1],
-                           argv[2], argv[3], argv[4], NULL);
+  int idx_vrf = 4;
+  u_char uj = use_json(argc, argv);
+
+  return do_show_ip_route (vty, argv[idx_vrf]->arg, SAFI_UNICAST, uj);
 }
 
-DEFUN (ip_route_mask_distance_vrf,
-       ip_route_mask_distance_vrf_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
+DEFUN (show_ip_nht,
+       show_ip_nht_cmd,
+       "show ip nht [vrf NAME]",
+       SHOW_STR
        IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Distance value for this route\n"
+       "IP nexthop tracking table\n"
        VRF_CMD_HELP_STR)
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2],
-                           NULL, NULL, argv[3], argv[4], NULL);
+  int idx_vrf = 4;
+  vrf_id_t vrf_id = VRF_DEFAULT;
+
+  if (argc == 5)
+    VRF_GET_ID (vrf_id, argv[idx_vrf]->arg);
+
+  zebra_print_rnh_table(vrf_id, AF_INET, vty, RNH_NEXTHOP_TYPE);
+  return CMD_SUCCESS;
 }
 
-DEFUN (ip_route_mask_tag_distance_vrf,
-       ip_route_mask_tag_distance_vrf_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-4294967295> <1-255> " VRF_CMD_STR,
+
+DEFUN (show_ip_nht_vrf_all,
+       show_ip_nht_vrf_all_cmd,
+       "show ip nht vrf all",
+       SHOW_STR
        IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
+       "IP nexthop tracking table\n"
+       VRF_ALL_CMD_HELP_STR)
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2],
-                           NULL, argv[3], argv[4], argv[5], NULL);
+  struct zebra_vrf *zvrf;
+  vrf_iter_t iter;
+
+  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+    if ((zvrf = vrf_iter2info (iter)) != NULL)
+      {
+        vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
+        zebra_print_rnh_table(zvrf->vrf_id, AF_INET, vty, RNH_NEXTHOP_TYPE);
+      }
+
+  return CMD_SUCCESS;
 }
 
-DEFUN (ip_route_mask_flags_tag_distance_vrf,
-       ip_route_mask_flags_tag_distance_vrf_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole)  tag <1-4294967295> <1-255> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this route\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
+DEFUN (show_ipv6_nht,
+       show_ipv6_nht_cmd,
+       "show ipv6 nht [vrf NAME]",
+       SHOW_STR
+       IPV6_STR
+       "IPv6 nexthop tracking table\n"
        VRF_CMD_HELP_STR)
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2],
-                           argv[3], argv[4], argv[5], argv[6], NULL);
-}
+  int idx_vrf = 4;
+  vrf_id_t vrf_id = VRF_DEFAULT;
 
+  if (argc == 5)
+    VRF_GET_ID (vrf_id, argv[idx_vrf]->arg);
 
-DEFUN (ip_route_mask_flags_distance_vrf,
-       ip_route_mask_flags_distance_vrf_cmd,
-       "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2],
-                           argv[3], NULL, argv[4], argv[5], NULL);
+  zebra_print_rnh_table(vrf_id, AF_INET6, vty, RNH_NEXTHOP_TYPE);
+  return CMD_SUCCESS;
 }
 
-DEFUN (ip_route_mask_flags_distance2_vrf,
-       ip_route_mask_flags_distance2_vrf_cmd,
-       "ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255> " VRF_CMD_STR,
+
+DEFUN (show_ipv6_nht_vrf_all,
+       show_ipv6_nht_vrf_all_cmd,
+       "show ipv6 nht vrf all",
+       SHOW_STR
        IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
+       "IPv6 nexthop tracking table\n"
+       VRF_ALL_CMD_HELP_STR)
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL,
-                           argv[2], NULL, argv[3], argv[4], NULL);
+  struct zebra_vrf *zvrf;
+  vrf_iter_t iter;
+
+  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+    if ((zvrf = vrf_iter2info (iter)) != NULL)
+      {
+        vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
+        zebra_print_rnh_table(zvrf->vrf_id, AF_INET6, vty, RNH_NEXTHOP_TYPE);
+      }
+
+  return CMD_SUCCESS;
 }
 
-DEFUN (ip_route_mask_flags_tag_distance2_vrf,
-       ip_route_mask_flags_tag_distance2_vrf_cmd,
-       "ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-4294967295> <1-255> " VRF_CMD_STR,
+DEFUN (ip_nht_default_route,
+       ip_nht_default_route_cmd,
+       "ip nht resolve-via-default",
        IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this route\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       VRF_CMD_HELP_STR)
+       "Filter Next Hop tracking route resolution\n"
+       "Resolve via default route\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL,
-                           argv[2], argv[3], argv[4], argv[5], NULL);
+  if (zebra_rnh_ip_default_route)
+    return CMD_SUCCESS;
+
+  zebra_rnh_ip_default_route = 1;
+  zebra_evaluate_rnh(0, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL);
+  return CMD_SUCCESS;
 }
 
-DEFUN (no_ip_route_vrf, 
-       no_ip_route_vrf_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
+DEFUN (no_ip_nht_default_route,
+       no_ip_nht_default_route_cmd,
+       "no ip nht resolve-via-default",
        NO_STR
        IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       VRF_CMD_HELP_STR)
+       "Filter Next Hop tracking route resolution\n"
+       "Resolve via default route\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL,
-                           NULL, NULL, argv[2], NULL);
+  if (!zebra_rnh_ip_default_route)
+    return CMD_SUCCESS;
+
+  zebra_rnh_ip_default_route = 0;
+  zebra_evaluate_rnh(0, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL);
+  return CMD_SUCCESS;
 }
 
-DEFUN (no_ip_route_flags_vrf,
-       no_ip_route_flags_vrf_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       VRF_CMD_HELP_STR)
+DEFUN (ipv6_nht_default_route,
+       ipv6_nht_default_route_cmd,
+       "ipv6 nht resolve-via-default",
+       IP6_STR
+       "Filter Next Hop tracking route resolution\n"
+       "Resolve via default route\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1],
-                           argv[2], NULL, NULL, argv[3], NULL);
+  if (zebra_rnh_ipv6_default_route)
+    return CMD_SUCCESS;
+
+  zebra_rnh_ipv6_default_route = 1;
+  zebra_evaluate_rnh(0, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL);
+  return CMD_SUCCESS;
 }
 
-DEFUN (no_ip_route_tag_vrf,
-       no_ip_route_tag_vrf_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-4294967295> " VRF_CMD_STR,
+DEFUN (no_ipv6_nht_default_route,
+       no_ipv6_nht_default_route_cmd,
+       "no ipv6 nht resolve-via-default",
        NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
+       IP6_STR
+       "Filter Next Hop tracking route resolution\n"
+       "Resolve via default route\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL,
-                           argv[2], NULL, argv[3], NULL);
-}
+  if (!zebra_rnh_ipv6_default_route)
+    return CMD_SUCCESS;
 
-DEFUN (no_ip_route_flags_tag_vrf,
-       no_ip_route_flags_tag_vrf_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-4294967295> " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1],
-                           argv[2], argv[3], NULL, argv[4], NULL);
+  zebra_rnh_ipv6_default_route = 0;
+  zebra_evaluate_rnh(0, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL);
+  return CMD_SUCCESS;
 }
 
-DEFUN (no_ip_route_flags2_vrf,
-       no_ip_route_flags2_vrf_cmd,
-       "no ip route A.B.C.D/M (reject|blackhole) " VRF_CMD_STR,
-       NO_STR
+DEFUN (show_ip_route_tag,
+       show_ip_route_tag_cmd,
+       "show ip route [vrf NAME] tag (1-4294967295)",
+       SHOW_STR
        IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       VRF_CMD_HELP_STR)
+       "IP routing table\n"
+       VRF_CMD_HELP_STR
+       "Show only routes with tag\n"
+       "Tag value\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, argv[1],
-                           NULL, NULL, argv[2], NULL);
-}
+  int idx_vrf = 3;
+  int idx_name = 4;
+  int idx_tag = 6;
+  struct route_table *table;
+  struct route_node *rn;
+  struct rib *rib;
+  int first = 1;
+  route_tag_t tag = 0;
+  vrf_id_t vrf_id = VRF_DEFAULT;
 
-DEFUN (no_ip_route_flags2_tag_vrf,
-       no_ip_route_flags2_tag_vrf_cmd,
-       "no ip route A.B.C.D/M (reject|blackhole) tag <1-4294967295> " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, argv[1],
-                           argv[2], NULL, argv[3], NULL);
-}
+  if (strmatch(argv[idx_vrf]->text, "vrf"))
+    {
+      VRF_GET_ID (vrf_id, argv[idx_name]->arg);
+      tag = atol(argv[idx_tag]->arg);
+    }
+  else
+    {
+      idx_tag -= 2;
+      tag = atol(argv[idx_tag]->arg);
+    }
 
-DEFUN (no_ip_route_mask_vrf,
-       no_ip_route_mask_vrf_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2],
-                           NULL, NULL, NULL, argv[3], NULL);
-}
+  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
+  if (! table)
+    return CMD_SUCCESS;
 
-DEFUN (no_ip_route_mask_flags_vrf,
-       no_ip_route_mask_flags_vrf_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2],
-                           argv[3], NULL, NULL, argv[4], NULL);
-}
+  /* Show all IPv4 routes with matching tag value. */
+  for (rn = route_top (table); rn; rn = route_next (rn))
+    RNODE_FOREACH_RIB (rn, rib)
+      {
+        if (rib->tag != tag)
+          continue;
 
-DEFUN (no_ip_route_mask_tag_vrf,
-       no_ip_route_mask_tag_vrf_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-4294967295> " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2],
-                           NULL, argv[3], NULL, argv[4], NULL);
+        if (first)
+          {
+            vty_out (vty, SHOW_ROUTE_V4_HEADER);
+            first = 0;
+          }
+        vty_show_ip_route (vty, rn, rib, NULL);
+      }
+  return CMD_SUCCESS;
 }
 
-DEFUN (no_ip_route_mask_flags_tag_vrf,
-       no_ip_route_mask_flags_tag_vrf_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-4294967295> " VRF_CMD_STR,
-       NO_STR
+DEFUN (show_ip_route_prefix_longer,
+       show_ip_route_prefix_longer_cmd,
+       "show ip route [vrf NAME] A.B.C.D/M longer-prefixes",
+       SHOW_STR
        IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
+       "IP routing table\n"
+       VRF_CMD_HELP_STR
+       "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
+       "Show route matching the specified Network/Mask pair only\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2],
-                           argv[3], argv[4], NULL, argv[5], NULL);
-}
+  struct route_table *table;
+  struct route_node *rn;
+  struct rib *rib;
+  struct prefix p;
+  int ret;
+  int first = 1;
+  vrf_id_t vrf_id = VRF_DEFAULT;
 
-DEFUN (no_ip_route_mask_flags2_vrf,
-       no_ip_route_mask_flags2_vrf_cmd,
-       "no ip route A.B.C.D A.B.C.D (reject|blackhole) " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL,
-                           argv[2], NULL, NULL, argv[3], NULL);
-}
+  if (strmatch(argv[3]->text, "vrf"))
+    {
+      VRF_GET_ID (vrf_id, argv[4]->arg);
+      ret = str2prefix (argv[5]->arg, &p);
+    }
+  else
+    {
+      ret = str2prefix (argv[3]->arg, &p);
+    }
 
-DEFUN (no_ip_route_mask_flags2_tag_vrf,
-       no_ip_route_mask_flags2_tag_vrf_cmd,
-       "no ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-4294967295> " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL,
-                           argv[2], argv[3], NULL, argv[4], NULL);
-}
+  if (! ret)
+    {
+      vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
+      return CMD_WARNING;
+    }
 
+  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
+  if (! table)
+    return CMD_SUCCESS;
 
-DEFUN (no_ip_route_distance_vrf,
-       no_ip_route_distance_vrf_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL,
-                           NULL, argv[2], argv[3], NULL);
+  /* Show matched type IPv4 routes. */
+  for (rn = route_top (table); rn; rn = route_next (rn))
+    RNODE_FOREACH_RIB (rn, rib)
+      if (prefix_match (&p, &rn->p))
+       {
+         if (first)
+           {
+             vty_out (vty, SHOW_ROUTE_V4_HEADER);
+             first = 0;
+           }
+         vty_show_ip_route (vty, rn, rib, NULL);
+       }
+  return CMD_SUCCESS;
 }
 
-DEFUN (no_ip_route_tag_distance_vrf,
-       no_ip_route_tag_distance_vrf_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-4294967295> <1-255> " VRF_CMD_STR,
-       NO_STR
+DEFUN (show_ip_route_supernets,
+       show_ip_route_supernets_cmd,
+       "show ip route [vrf NAME] supernets-only",
+       SHOW_STR
        IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
+       "IP routing table\n"
+       VRF_CMD_HELP_STR
+       "Show supernet entries only\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL,
-                           argv[2], argv[3], argv[4], NULL);
+  struct route_table *table;
+  struct route_node *rn;
+  struct rib *rib;
+  u_int32_t addr;
+  int first = 1;
+  vrf_id_t vrf_id = VRF_DEFAULT;
+
+  if (strmatch(argv[3]->text, "vrf"))
+    VRF_GET_ID (vrf_id, argv[4]->arg);
+
+  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
+  if (! table)
+    return CMD_SUCCESS;
+
+  /* Show matched type IPv4 routes. */
+  for (rn = route_top (table); rn; rn = route_next (rn))
+    RNODE_FOREACH_RIB (rn, rib)
+      {
+       addr = ntohl (rn->p.u.prefix4.s_addr);
+
+       if ((IN_CLASSC (addr) && rn->p.prefixlen < 24)
+          || (IN_CLASSB (addr) && rn->p.prefixlen < 16)
+          || (IN_CLASSA (addr) && rn->p.prefixlen < 8))
+         {
+           if (first)
+             {
+               vty_out (vty, SHOW_ROUTE_V4_HEADER);
+               first = 0;
+             }
+           vty_show_ip_route (vty, rn, rib, NULL);
+         }
+      }
+  return CMD_SUCCESS;
 }
 
-DEFUN (no_ip_route_flags_distance_vrf,
-       no_ip_route_flags_distance_vrf_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
-       NO_STR
+DEFUN (show_ip_route_protocol,
+       show_ip_route_protocol_cmd,
+       "show ip route [vrf NAME] <kernel|connected|static|rip|ospf|isis|bgp|pim|table>",
+       SHOW_STR
        IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
+       "IP routing table\n"
+       VRF_CMD_HELP_STR
+       QUAGGA_IP_REDIST_HELP_STR_ZEBRA)
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1],
-                           argv[2], NULL, argv[3], argv[4], NULL);
-}
+  int type;
+  struct route_table *table;
+  struct route_node *rn;
+  struct rib *rib;
+  int first = 1;
+  vrf_id_t vrf_id = VRF_DEFAULT;
 
-DEFUN (no_ip_route_flags_tag_distance_vrf,
-       no_ip_route_flags_tag_distance_vrf_cmd,
-       "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-4294967295> <1-255> " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1],
-                           argv[2], argv[3], argv[4],argv[5], NULL);
-}
+  if (strmatch(argv[3]->text, "vrf"))
+    {
+      type = proto_redistnum (AFI_IP, argv[5]->arg);
+      VRF_GET_ID (vrf_id, argv[4]->arg);
+    }
+  else
+    {
+      type = proto_redistnum (AFI_IP, argv[3]->arg);
+    }
 
-DEFUN (no_ip_route_flags_distance2_vrf,
-       no_ip_route_flags_distance2_vrf_cmd,
-       "no ip route A.B.C.D/M (reject|blackhole) <1-255> " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, argv[1],
-                           NULL, argv[2], argv[3], NULL);
-}
+  if (type < 0)
+    {
+      vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
+      return CMD_WARNING;
+    }
 
-DEFUN (no_ip_route_flags_tag_distance2_vrf,
-       no_ip_route_flags_tag_distance2_vrf_cmd,
-       "no ip route A.B.C.D/M (reject|blackhole) tag <1-4294967295> <1-255> " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix (e.g. 10.0.0.0/8)\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, argv[1],
-                           argv[2] , argv[3], argv[4], NULL);
-}
+  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
+  if (! table)
+    return CMD_SUCCESS;
 
-DEFUN (no_ip_route_mask_distance_vrf,
-       no_ip_route_mask_distance_vrf_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2],
-                           NULL, NULL, argv[3], argv[4], NULL);
+  /* Show matched type IPv4 routes. */
+  for (rn = route_top (table); rn; rn = route_next (rn))
+    RNODE_FOREACH_RIB (rn, rib)
+      if (rib->type == type)
+       {
+         if (first)
+           {
+             vty_out (vty, SHOW_ROUTE_V4_HEADER);
+             first = 0;
+           }
+         vty_show_ip_route (vty, rn, rib, NULL);
+       }
+  return CMD_SUCCESS;
 }
 
-DEFUN (no_ip_route_mask_tag_distance_vrf,
-       no_ip_route_mask_tag_distance_vrf_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-4294967295> <1-255> " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Null interface\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2],
-                           NULL, argv[3], argv[4], argv[5], NULL);
-}
 
-DEFUN (no_ip_route_mask_flags_distance_vrf,
-       no_ip_route_mask_flags_distance_vrf_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
-       NO_STR
+DEFUN (show_ip_route_ospf_instance,
+       show_ip_route_ospf_instance_cmd,
+       "show ip route ospf (1-65535)",
+       SHOW_STR
        IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
+       "IP routing table\n"
+       "Open Shortest Path First (OSPFv2)\n"
+       "Instance ID\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2],
-                           argv[3], NULL, argv[4], argv[5], NULL);
-}
+  int idx_number = 4;
+  struct route_table *table;
+  struct route_node *rn;
+  struct rib *rib;
+  int first = 1;
+  u_short instance = 0;
 
-DEFUN (no_ip_route_mask_flags_tag_distance_vrf,
-       no_ip_route_mask_flags_tag_distance_vrf_cmd,
-       "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-4294967295> <1-255> " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "IP gateway address\n"
-       "IP gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
-{
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2],
-                           argv[3], argv[4], argv[5], argv[6], NULL);
+  VTY_GET_INTEGER ("Instance", instance, argv[idx_number]->arg);
+
+  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, VRF_DEFAULT);
+  if (! table)
+    return CMD_SUCCESS;
+
+  /* Show matched type IPv4 routes. */
+  for (rn = route_top (table); rn; rn = route_next (rn))
+    RNODE_FOREACH_RIB (rn, rib)
+      if (rib->type == ZEBRA_ROUTE_OSPF && rib->instance == instance)
+       {
+         if (first)
+           {
+             vty_out (vty, SHOW_ROUTE_V4_HEADER);
+             first = 0;
+           }
+         vty_show_ip_route (vty, rn, rib, NULL);
+       }
+  return CMD_SUCCESS;
 }
 
-DEFUN (no_ip_route_mask_flags_distance2_vrf,
-       no_ip_route_mask_flags_distance2_vrf_cmd,
-       "no ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255> " VRF_CMD_STR,
-       NO_STR
+DEFUN (show_ip_route_addr,
+       show_ip_route_addr_cmd,
+       "show ip route [vrf NAME] A.B.C.D",
+       SHOW_STR
        IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
+       "IP routing table\n"
+       VRF_CMD_HELP_STR
+       "Network in the IP routing table to display\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL,
-                           argv[2], NULL, argv[3], argv[4], NULL);
+  int ret;
+  struct prefix_ipv4 p;
+  struct route_table *table;
+  struct route_node *rn;
+  vrf_id_t vrf_id = VRF_DEFAULT;
+
+  if (strmatch(argv[3]->text, "vrf"))
+    {
+      VRF_GET_ID (vrf_id, argv[4]->arg);
+      ret = str2prefix_ipv4 (argv[5]->arg, &p);
+    }
+  else
+    {
+      ret = str2prefix_ipv4 (argv[3]->arg, &p);
+    }
+
+  if (ret <= 0)
+    {
+      vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
+      return CMD_WARNING;
+    }
+
+  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
+  if (! table)
+    return CMD_SUCCESS;
+
+  rn = route_node_match (table, (struct prefix *) &p);
+  if (! rn)
+    {
+      vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
+      return CMD_WARNING;
+    }
+
+  vty_show_ip_route_detail (vty, rn, 0);
+
+  route_unlock_node (rn);
+
+  return CMD_SUCCESS;
 }
 
-DEFUN (no_ip_route_mask_flags_tag_distance2_vrf,
-       no_ip_route_mask_flags_tag_distance2_vrf_cmd,
-       "no ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-4294967295> <1-255> " VRF_CMD_STR,
-       NO_STR
+DEFUN (show_ip_route_prefix,
+       show_ip_route_prefix_cmd,
+       "show ip route [vrf NAME] A.B.C.D/M",
+       SHOW_STR
        IP_STR
-       "Establish static routes\n"
-       "IP destination prefix\n"
-       "IP destination prefix mask\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Tag of this route\n"
-       "Tag value\n"
-       "Distance value for this route\n"
-       VRF_CMD_HELP_STR)
+       "IP routing table\n"
+       VRF_CMD_HELP_STR
+       "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
 {
-  return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL,
-                           argv[2], argv[3], argv[4], argv[5], NULL);
-}
+  int ret;
+  struct prefix_ipv4 p;
+  struct route_table *table;
+  struct route_node *rn;
+  vrf_id_t vrf_id = VRF_DEFAULT;
 
-/* New RIB.  Detailed information for IPv4 route. */
-static void
-vty_show_ip_route_detail (struct vty *vty, struct route_node *rn, int mcast)
-{
-  struct rib *rib;
-  struct nexthop *nexthop, *tnexthop;
-  int recursing;
-  char buf[PREFIX_STRLEN];
-  struct zebra_vrf *zvrf;
+  if (strmatch(argv[3]->text, "vrf"))
+    {
+      VRF_GET_ID (vrf_id, argv[4]->arg);
+      ret = str2prefix_ipv4 (argv[5]->arg, &p);
+    }
+  else
+    {
+      ret = str2prefix_ipv4 (argv[3]->arg, &p);
+    }
 
-  RNODE_FOREACH_RIB (rn, rib)
+  if (ret <= 0)
     {
-      const char *mcast_info = "";
-      if (mcast)
-        {
-          rib_table_info_t *info = rn->table->info;
-          mcast_info = (info->safi == SAFI_MULTICAST)
-                       ? " using Multicast RIB"
-                       : " using Unicast RIB";
-        }
-      
-      vty_out (vty, "Routing entry for %s%s%s",
-              prefix2str (&rn->p, buf, sizeof(buf)), mcast_info,
-              VTY_NEWLINE);
-      vty_out (vty, "  Known via \"%s", zebra_route_string (rib->type));
-      if (rib->instance)
-        vty_out (vty, "[%d]", rib->instance);
-      vty_out (vty, "\"");
-      vty_out (vty, ", distance %u, metric %u", rib->distance, rib->metric);
-      if (rib->tag)
-       vty_out (vty, ", tag %"ROUTE_TAG_PRI, rib->tag);
-       if (rib->mtu)
-        vty_out (vty, ", mtu %u", rib->mtu);
-      if (rib->vrf_id != VRF_DEFAULT)
-        {
-          zvrf = vrf_info_lookup(rib->vrf_id);
-          vty_out (vty, ", vrf %s", zvrf->name);
-        }
-      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
-       vty_out (vty, ", best");
-      else if (CHECK_FLAG (rib->status, RIB_ENTRY_SELECTED_FIB))
-        vty_out (vty, ", fib");
-      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_FIB_OVERRIDE))
-        vty_out (vty, ", fib-override");
-      if (rib->refcnt)
-       vty_out (vty, ", refcnt %ld", rib->refcnt);
-      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
-       vty_out (vty, ", blackhole");
-      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
-       vty_out (vty, ", reject");
-      vty_out (vty, "%s", VTY_NEWLINE);
+      vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
+      return CMD_WARNING;
+    }
 
-      if (rib->type == ZEBRA_ROUTE_RIP
-         || rib->type == ZEBRA_ROUTE_OSPF
-         || rib->type == ZEBRA_ROUTE_ISIS
-         || rib->type == ZEBRA_ROUTE_TABLE
-         || rib->type == ZEBRA_ROUTE_BGP)
-       {
-         time_t uptime;
-         struct tm *tm;
+  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
+  if (! table)
+    return CMD_SUCCESS;
 
-         uptime = time (NULL);
-         uptime -= rib->uptime;
-         tm = gmtime (&uptime);
+  rn = route_node_match (table, (struct prefix *) &p);
+  if (! rn || rn->p.prefixlen != p.prefixlen)
+    {
+      vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
+      return CMD_WARNING;
+    }
 
-         vty_out (vty, "  Last update ");
+  vty_show_ip_route_detail (vty, rn, 0);
 
-         if (uptime < ONE_DAY_SECOND)
-           vty_out (vty,  "%02d:%02d:%02d", 
-                    tm->tm_hour, tm->tm_min, tm->tm_sec);
-         else if (uptime < ONE_WEEK_SECOND)
-           vty_out (vty, "%dd%02dh%02dm", 
-                    tm->tm_yday, tm->tm_hour, tm->tm_min);
-         else
-           vty_out (vty, "%02dw%dd%02dh", 
-                    tm->tm_yday/7,
-                    tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
-         vty_out (vty, " ago%s", VTY_NEWLINE);
-       }
+  route_unlock_node (rn);
 
-      for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
-       {
-          char addrstr[32];
+  return CMD_SUCCESS;
+}
 
-         vty_out (vty, "  %c%s",
-                  CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ',
-                  recursing ? "  " : "");
 
-         switch (nexthop->type)
-           {
-           case NEXTHOP_TYPE_IPV4:
-           case NEXTHOP_TYPE_IPV4_IFINDEX:
-             vty_out (vty, " %s", inet_ntoa (nexthop->gate.ipv4));
-             if (nexthop->ifindex)
-               vty_out (vty, ", via %s",
-                         ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
-             break;
-           case NEXTHOP_TYPE_IPV6:
-           case NEXTHOP_TYPE_IPV6_IFINDEX:
-             vty_out (vty, " %s",
-                      inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
-             if (nexthop->ifindex)
-               vty_out (vty, ", via %s",
-                         ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
-             break;
-           case NEXTHOP_TYPE_IFINDEX:
-             vty_out (vty, " directly connected, %s",
-                      ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
-             break;
-           case NEXTHOP_TYPE_BLACKHOLE:
-             vty_out (vty, " directly connected, Null0");
-             break;
-           default:
-             break;
-           }
-         if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
-           vty_out (vty, " inactive");
+static void
+vty_show_ip_route_summary (struct vty *vty, struct route_table *table)
+{
+  struct route_node *rn;
+  struct rib *rib;
+#define ZEBRA_ROUTE_IBGP  ZEBRA_ROUTE_MAX
+#define ZEBRA_ROUTE_TOTAL (ZEBRA_ROUTE_IBGP + 1)
+  u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1];
+  u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1];
+  u_int32_t i;
+  u_int32_t is_ibgp;
 
-         if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
-           vty_out (vty, " onlink");
+  memset (&rib_cnt, 0, sizeof(rib_cnt));
+  memset (&fib_cnt, 0, sizeof(fib_cnt));
+  for (rn = route_top (table); rn; rn = route_next (rn))
+    RNODE_FOREACH_RIB (rn, rib)
+      {
+        is_ibgp = (rib->type == ZEBRA_ROUTE_BGP &&
+                   CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP));
 
-         if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
-           vty_out (vty, " (recursive)");
+        rib_cnt[ZEBRA_ROUTE_TOTAL]++;
+        if (is_ibgp)
+          rib_cnt[ZEBRA_ROUTE_IBGP]++;
+        else
+          rib_cnt[rib->type]++;
 
-         switch (nexthop->type)
-            {
-            case NEXTHOP_TYPE_IPV4:
-            case NEXTHOP_TYPE_IPV4_IFINDEX:
-              if (nexthop->src.ipv4.s_addr)
-                {
-                 if (inet_ntop(AF_INET, &nexthop->src.ipv4, addrstr,
-                     sizeof addrstr))
-                    vty_out (vty, ", src %s", addrstr);
-                }
-              break;
-            case NEXTHOP_TYPE_IPV6:
-            case NEXTHOP_TYPE_IPV6_IFINDEX:
-              if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
-                {
-                 if (inet_ntop(AF_INET6, &nexthop->src.ipv6, addrstr,
-                     sizeof addrstr))
-                    vty_out (vty, ", src %s", addrstr);
-                }
-              break;
-            default:
-              break;
-            }
+        if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
+          {
+            fib_cnt[ZEBRA_ROUTE_TOTAL]++;
+
+            if (is_ibgp)
+              fib_cnt[ZEBRA_ROUTE_IBGP]++;
+            else
+              fib_cnt[rib->type]++;
+          }
+      }
+
+  vty_out (vty, "%-20s %-20s %s  (vrf %s)%s",
+           "Route Source", "Routes", "FIB",
+           ((rib_table_info_t *)table->info)->zvrf->name,
+           VTY_NEWLINE);
 
-          /* Label information */
-          if (nexthop->nh_label && nexthop->nh_label->num_labels)
+  for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
+    {
+      if ((rib_cnt[i] > 0) ||
+         (i == ZEBRA_ROUTE_BGP && rib_cnt[ZEBRA_ROUTE_IBGP] > 0))
+        {
+          if (i == ZEBRA_ROUTE_BGP)
             {
-              vty_out (vty, " label %s",
-                       mpls_label2str (nexthop->nh_label->num_labels,
-                                   nexthop->nh_label->label,  buf, BUFSIZ));
+              vty_out (vty, "%-20s %-20d %-20d %s", "ebgp",
+                       rib_cnt[ZEBRA_ROUTE_BGP], fib_cnt[ZEBRA_ROUTE_BGP],
+                       VTY_NEWLINE);
+              vty_out (vty, "%-20s %-20d %-20d %s", "ibgp",
+                       rib_cnt[ZEBRA_ROUTE_IBGP], fib_cnt[ZEBRA_ROUTE_IBGP],
+                       VTY_NEWLINE);
             }
-
-         vty_out (vty, "%s", VTY_NEWLINE);
-       }
-      vty_out (vty, "%s", VTY_NEWLINE);
+          else
+            vty_out (vty, "%-20s %-20d %-20d %s", zebra_route_string(i),
+                     rib_cnt[i], fib_cnt[i], VTY_NEWLINE);
+        }
     }
+
+  vty_out (vty, "------%s", VTY_NEWLINE);
+  vty_out (vty, "%-20s %-20d %-20d %s", "Totals", rib_cnt[ZEBRA_ROUTE_TOTAL],
+           fib_cnt[ZEBRA_ROUTE_TOTAL], VTY_NEWLINE);
+  vty_out (vty, "%s", VTY_NEWLINE);
 }
 
+/*
+ * Implementation of the ip route summary prefix command.
+ *
+ * This command prints the primary prefixes that have been installed by various
+ * protocols on the box.
+ *
+ */
 static void
-vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib,
-                   json_object *json)
+vty_show_ip_route_summary_prefix (struct vty *vty, struct route_table *table)
 {
-  struct nexthop *nexthop, *tnexthop;
-  int recursing;
-  int len = 0;
-  char buf[BUFSIZ];
-  json_object *json_nexthops = NULL;
-  json_object *json_nexthop = NULL;
-  json_object *json_route = NULL;
-
-  if (json)
-    {
-      json_route = json_object_new_object();
-      json_nexthops = json_object_new_array();
+  struct route_node *rn;
+  struct rib *rib;
+  struct nexthop *nexthop;
+#define ZEBRA_ROUTE_IBGP  ZEBRA_ROUTE_MAX
+#define ZEBRA_ROUTE_TOTAL (ZEBRA_ROUTE_IBGP + 1)
+  u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1];
+  u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1];
+  u_int32_t i;
+  int       cnt;
 
-      json_object_string_add(json_route, "prefix", prefix2str (&rn->p, buf, sizeof buf));
-      json_object_string_add(json_route, "protocol", zebra_route_string(rib->type));
+  memset (&rib_cnt, 0, sizeof(rib_cnt));
+  memset (&fib_cnt, 0, sizeof(fib_cnt));
+  for (rn = route_top (table); rn; rn = route_next (rn))
+    RNODE_FOREACH_RIB (rn, rib)
+      {
 
-      if (rib->instance)
-        json_object_int_add(json_route, "instance", rib->instance);
+       /*
+        * In case of ECMP, count only once.
+        */
+       cnt = 0;
+       for (nexthop = rib->nexthop; (!cnt && nexthop); nexthop = nexthop->next)
+         {
+          cnt++;
+          rib_cnt[ZEBRA_ROUTE_TOTAL]++;
+          rib_cnt[rib->type]++;
+          if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
+               {
+                fib_cnt[ZEBRA_ROUTE_TOTAL]++;
+             fib_cnt[rib->type]++;
+            }
+             if (rib->type == ZEBRA_ROUTE_BGP &&
+                 CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP))
+            {
+                rib_cnt[ZEBRA_ROUTE_IBGP]++;
+                    if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
+                       fib_cnt[ZEBRA_ROUTE_IBGP]++;
+            }
+            }
+      }
 
-      if (rib->vrf_id)
-        json_object_int_add(json_route, "vrfId", rib->vrf_id);
+  vty_out (vty, "%-20s %-20s %s  (vrf %s)%s",
+           "Route Source", "Prefix Routes", "FIB",
+           ((rib_table_info_t *)table->info)->zvrf->name,
+           VTY_NEWLINE);
 
-      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
-        json_object_boolean_true_add(json_route, "selected");
+  for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
+    {
+      if (rib_cnt[i] > 0)
+       {
+         if (i == ZEBRA_ROUTE_BGP)
+           {
+             vty_out (vty, "%-20s %-20d %-20d %s", "ebgp",
+                      rib_cnt[ZEBRA_ROUTE_BGP] - rib_cnt[ZEBRA_ROUTE_IBGP],
+                      fib_cnt[ZEBRA_ROUTE_BGP] - fib_cnt[ZEBRA_ROUTE_IBGP],
+                      VTY_NEWLINE);
+             vty_out (vty, "%-20s %-20d %-20d %s", "ibgp",
+                      rib_cnt[ZEBRA_ROUTE_IBGP], fib_cnt[ZEBRA_ROUTE_IBGP],
+                      VTY_NEWLINE);
+           }
+         else
+           vty_out (vty, "%-20s %-20d %-20d %s", zebra_route_string(i),
+                    rib_cnt[i], fib_cnt[i], VTY_NEWLINE);
+       }
+    }
 
-      if (rib->type != ZEBRA_ROUTE_CONNECT && rib->type != ZEBRA_ROUTE_KERNEL)
-        {
-          json_object_int_add(json_route, "distance", rib->distance);
-          json_object_int_add(json_route, "metric", rib->metric);
-        }
+  vty_out (vty, "------%s", VTY_NEWLINE);
+  vty_out (vty, "%-20s %-20d %-20d %s", "Totals", rib_cnt[ZEBRA_ROUTE_TOTAL],
+          fib_cnt[ZEBRA_ROUTE_TOTAL], VTY_NEWLINE);
+  vty_out (vty, "%s", VTY_NEWLINE);
+}
 
-      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
-        json_object_boolean_true_add(json_route, "blackhole");
+/* Show route summary.  */
+DEFUN (show_ip_route_summary,
+       show_ip_route_summary_cmd,
+       "show ip route [vrf NAME] summary",
+       SHOW_STR
+       IP_STR
+       "IP routing table\n"
+       VRF_CMD_HELP_STR
+       "Summary of all routes\n")
+{
+  struct route_table *table;
+  vrf_id_t vrf_id = VRF_DEFAULT;
 
-      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
-        json_object_boolean_true_add(json_route, "reject");
+  if (strmatch(argv[3]->text, "vrf"))
+    VRF_GET_ID (vrf_id, argv[4]->arg);
 
-      if (rib->type == ZEBRA_ROUTE_RIP
-          || rib->type == ZEBRA_ROUTE_OSPF
-          || rib->type == ZEBRA_ROUTE_ISIS
-          || rib->type == ZEBRA_ROUTE_TABLE
-          || rib->type == ZEBRA_ROUTE_BGP)
-        {
-          time_t uptime;
-          struct tm *tm;
+  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
+  if (! table)
+    return CMD_SUCCESS;
 
-          uptime = time (NULL);
-          uptime -= rib->uptime;
-          tm = gmtime (&uptime);
+  vty_show_ip_route_summary (vty, table);
 
-          if (uptime < ONE_DAY_SECOND)
-            sprintf(buf, "%02d:%02d:%02d", tm->tm_hour, tm->tm_min, tm->tm_sec);
-          else if (uptime < ONE_WEEK_SECOND)
-            sprintf(buf, "%dd%02dh%02dm", tm->tm_yday, tm->tm_hour, tm->tm_min);
-          else
-            sprintf(buf, "%02dw%dd%02dh", tm->tm_yday/7, tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
+  return CMD_SUCCESS;
+}
 
-          json_object_string_add(json_route, "uptime", buf);
-        }
+/* Show route summary prefix.  */
+DEFUN (show_ip_route_summary_prefix,
+       show_ip_route_summary_prefix_cmd,
+       "show ip route [vrf NAME] summary prefix",
+       SHOW_STR
+       IP_STR
+       "IP routing table\n"
+       VRF_CMD_HELP_STR
+       "Summary of all routes\n"
+       "Prefix routes\n")
+{
+  struct route_table *table;
+  vrf_id_t vrf_id = VRF_DEFAULT;
 
-      for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
-        {
-          json_nexthop = json_object_new_object();
+  if (strmatch(argv[3]->text, "vrf"))
+    VRF_GET_ID (vrf_id, argv[4]->arg);
 
-          if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
-            json_object_boolean_true_add(json_nexthop, "fib");
+  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
+  if (! table)
+    return CMD_SUCCESS;
 
-          switch (nexthop->type)
-            {
-            case NEXTHOP_TYPE_IPV4:
-            case NEXTHOP_TYPE_IPV4_IFINDEX:
-              json_object_string_add(json_nexthop, "ip", inet_ntoa (nexthop->gate.ipv4));
-              json_object_string_add(json_nexthop, "afi", "ipv4");
+  vty_show_ip_route_summary_prefix (vty, table);
 
-              if (nexthop->ifindex)
-                {
-                  json_object_int_add(json_nexthop, "interfaceIndex", nexthop->ifindex);
-                  json_object_string_add(json_nexthop, "interfaceName", ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
-                }
-              break;
-            case NEXTHOP_TYPE_IPV6:
-            case NEXTHOP_TYPE_IPV6_IFINDEX:
-              json_object_string_add(json_nexthop, "ip", inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
-              json_object_string_add(json_nexthop, "afi", "ipv6");
+  return CMD_SUCCESS;
+}
 
-              if (nexthop->ifindex)
-                {
-                  json_object_int_add(json_nexthop, "interfaceIndex", nexthop->ifindex);
-                  json_object_string_add(json_nexthop, "interfaceName", ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
-                }
-              break;
 
-            case NEXTHOP_TYPE_IFINDEX:
-              json_object_boolean_true_add(json_nexthop, "directlyConnected");
-              json_object_int_add(json_nexthop, "interfaceIndex", nexthop->ifindex);
-              json_object_string_add(json_nexthop, "interfaceName", ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
-              break;
-            case NEXTHOP_TYPE_BLACKHOLE:
-              json_object_boolean_true_add(json_nexthop, "blackhole");
-              break;
-            default:
-              break;
-            }
+DEFUN (show_ip_route_vrf_all,
+       show_ip_route_vrf_all_cmd,
+       "show ip route vrf all",
+       SHOW_STR
+       IP_STR
+       "IP routing table\n"
+       VRF_ALL_CMD_HELP_STR)
+{
+  struct route_table *table;
+  struct route_node *rn;
+  struct rib *rib;
+  struct zebra_vrf *zvrf;
+  vrf_iter_t iter;
+  int first = 1;
+  int vrf_header = 1;
 
-          if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
-            json_object_boolean_true_add(json_nexthop, "active");
+  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+    {
+      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
+        continue;
 
-          if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
-            json_object_boolean_true_add(json_nexthop, "onLink");
+      /* Show all IPv4 routes. */
+      for (rn = route_top (table); rn; rn = route_next (rn))
+        RNODE_FOREACH_RIB (rn, rib)
+          {
+            if (first)
+              {
+                vty_out (vty, SHOW_ROUTE_V4_HEADER);
+                first = 0;
+              }
 
-          if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
-            json_object_boolean_true_add(json_nexthop, "recursive");
+            if (vrf_header)
+              {
+                vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
+                vrf_header = 0;
+              }
+            vty_show_ip_route (vty, rn, rib, NULL);
+          }
+      vrf_header  = 1;
+    }
 
-          switch (nexthop->type)
-            {
-              case NEXTHOP_TYPE_IPV4:
-              case NEXTHOP_TYPE_IPV4_IFINDEX:
-                if (nexthop->src.ipv4.s_addr)
-                  {
-                    if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, sizeof buf))
-                      json_object_string_add(json_nexthop, "source", buf);
-                  }
-                break;
-              case NEXTHOP_TYPE_IPV6:
-              case NEXTHOP_TYPE_IPV6_IFINDEX:
-                if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
-                  {
-                    if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, sizeof buf))
-                      json_object_string_add(json_nexthop, "source", buf);
-                  }
-                break;
-              default:
-                break;
-            }
+  return CMD_SUCCESS;
+}
 
-          json_object_array_add(json_nexthops, json_nexthop);
-        }
+DEFUN (show_ip_route_vrf_all_tag,
+       show_ip_route_vrf_all_tag_cmd,
+       "show ip route vrf all tag (1-4294967295)",
+       SHOW_STR
+       IP_STR
+       "IP routing table\n"
+       VRF_ALL_CMD_HELP_STR
+       "Show only routes with tag\n"
+       "Tag value\n")
+{
+  int idx_number = 6;
+  struct route_table *table;
+  struct route_node *rn;
+  struct rib *rib;
+  struct zebra_vrf *zvrf;
+  vrf_iter_t iter;
+  int first = 1;
+  int vrf_header = 1;
+  route_tag_t tag = 0;
 
-      json_object_object_add(json_route, "nexthops", json_nexthops);
-      json_object_array_add(json, json_route);
-      return;
-    }
+  if (argv[idx_number]->arg)
+    tag = atol(argv[idx_number]->arg);
 
-  /* Nexthop information. */
-  for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
+  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
     {
-      if (nexthop == rib->nexthop)
-       {
-         /* Prefix information. */
-         len = vty_out (vty, "%c", zebra_route_char (rib->type));
-          if (rib->instance)
-           len += vty_out (vty, "[%d]", rib->instance);
-          len += vty_out (vty, "%c%c %s",
-                         CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED)
-                         ? '>' : CHECK_FLAG (rib->status, RIB_ENTRY_SELECTED_FIB)
-                         ? '!' : ' ',
-                         CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
-                         ? '*' : ' ',
-                         prefix2str (&rn->p, buf, sizeof buf));
+      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
+        continue;
 
-         /* Distance and metric display. */
-         if (rib->type != ZEBRA_ROUTE_CONNECT 
-             && rib->type != ZEBRA_ROUTE_KERNEL)
-           len += vty_out (vty, " [%d/%d]", rib->distance,
-                           rib->metric);
-       }
-      else
-       vty_out (vty, "  %c%*c",
-                CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
-                ? '*' : ' ',
-                len - 3 + (2 * recursing), ' ');
+      /* Show all IPv4 routes with matching tag value. */
+      for (rn = route_top (table); rn; rn = route_next (rn))
+        RNODE_FOREACH_RIB (rn, rib)
+          {
+            if (rib->tag != tag)
+              continue;
 
-      switch (nexthop->type)
-       {
-       case NEXTHOP_TYPE_IPV4:
-       case NEXTHOP_TYPE_IPV4_IFINDEX:
-         vty_out (vty, " via %s", inet_ntoa (nexthop->gate.ipv4));
-         if (nexthop->ifindex)
-           vty_out (vty, ", %s",
-                     ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
-         break;
-        case NEXTHOP_TYPE_IPV6:
-       case NEXTHOP_TYPE_IPV6_IFINDEX:
-         vty_out (vty, " via %s",
-                  inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
-         if (nexthop->ifindex)
-           vty_out (vty, ", %s",
-                     ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
-         break;
-
-       case NEXTHOP_TYPE_IFINDEX:
-         vty_out (vty, " is directly connected, %s",
-                  ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
-         break;
-       case NEXTHOP_TYPE_BLACKHOLE:
-         vty_out (vty, " is directly connected, Null0");
-         break;
-       default:
-         break;
-       }
-      if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
-       vty_out (vty, " inactive");
-
-      if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
-       vty_out (vty, " onlink");
-
-      if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
-       vty_out (vty, " (recursive)");
-
-      switch (nexthop->type)
-        {
-          case NEXTHOP_TYPE_IPV4:
-          case NEXTHOP_TYPE_IPV4_IFINDEX:
-            if (nexthop->src.ipv4.s_addr)
+            if (first)
               {
-               if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, sizeof buf))
-                  vty_out (vty, ", src %s", buf);
+                vty_out (vty, SHOW_ROUTE_V4_HEADER);
+                first = 0;
               }
-            break;
-          case NEXTHOP_TYPE_IPV6:
-          case NEXTHOP_TYPE_IPV6_IFINDEX:
-            if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
+
+            if (vrf_header)
               {
-               if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, sizeof buf))
-                  vty_out (vty, ", src %s", buf);
+                vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
+                vrf_header = 0;
               }
-            break;
-          default:
-           break;
-        }
-
-      /* Label information */
-      if (nexthop->nh_label && nexthop->nh_label->num_labels)
-        {
-         vty_out (vty, " label %s",
-                  mpls_label2str (nexthop->nh_label->num_labels,
-                                  nexthop->nh_label->label,  buf, BUFSIZ));
-        }
-
-      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
-               vty_out (vty, ", bh");
-      if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
-               vty_out (vty, ", rej");
-
-      if (rib->type == ZEBRA_ROUTE_RIP
-         || rib->type == ZEBRA_ROUTE_OSPF
-         || rib->type == ZEBRA_ROUTE_ISIS
-         || rib->type == ZEBRA_ROUTE_TABLE
-         || rib->type == ZEBRA_ROUTE_BGP)
-       {
-         time_t uptime;
-         struct tm *tm;
-
-         uptime = time (NULL);
-         uptime -= rib->uptime;
-         tm = gmtime (&uptime);
-
-         if (uptime < ONE_DAY_SECOND)
-           vty_out (vty,  ", %02d:%02d:%02d", 
-                    tm->tm_hour, tm->tm_min, tm->tm_sec);
-         else if (uptime < ONE_WEEK_SECOND)
-           vty_out (vty, ", %dd%02dh%02dm", 
-                    tm->tm_yday, tm->tm_hour, tm->tm_min);
-         else
-           vty_out (vty, ", %02dw%dd%02dh", 
-                    tm->tm_yday/7,
-                    tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
-       }
-      vty_out (vty, "%s", VTY_NEWLINE);
+            vty_show_ip_route (vty, rn, rib, NULL);
+          }
+      vrf_header = 1;
     }
+  return CMD_SUCCESS;
 }
 
-DEFUN (show_ip_route,
-       show_ip_route_cmd,
-       "show ip route {json}",
+DEFUN (show_ip_route_vrf_all_prefix_longer,
+       show_ip_route_vrf_all_prefix_longer_cmd,
+       "show ip route vrf all A.B.C.D/M longer-prefixes",
        SHOW_STR
        IP_STR
-       "IP routing table\n")
-{
-  return do_show_ip_route (vty, VRF_DEFAULT_NAME, SAFI_UNICAST, use_json(argc, argv));
-}
-
-static int
-do_show_ip_route (struct vty *vty, const char *vrf_name, safi_t safi,
-                  u_char use_json)
+       "IP routing table\n"
+       VRF_ALL_CMD_HELP_STR
+       "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
+       "Show route matching the specified Network/Mask pair only\n")
 {
+  int idx_ipv4_prefixlen = 5;
   struct route_table *table;
   struct route_node *rn;
   struct rib *rib;
+  struct prefix p;
+  struct zebra_vrf *zvrf;
+  vrf_iter_t iter;
+  int ret;
   int first = 1;
-  struct zebra_vrf *zvrf = NULL;
-  char buf[BUFSIZ];
-  json_object *json = NULL;
-  json_object *json_prefix = NULL;
-
-  if (!(zvrf = zebra_vrf_list_lookup_by_name (vrf_name)))
-    {
-      if (use_json)
-        vty_out (vty, "{}%s", VTY_NEWLINE);
-      else
-        vty_out (vty, "vrf %s not defined%s", vrf_name, VTY_NEWLINE);
-      return CMD_SUCCESS;
-    }
-
-  if (zvrf->vrf_id == VRF_UNKNOWN)
-    {
-      if (use_json)
-        vty_out (vty, "{}%s", VTY_NEWLINE);
-      else
-        vty_out (vty, "vrf %s inactive%s", vrf_name, VTY_NEWLINE);
-      return CMD_SUCCESS;
-    }
+  int vrf_header = 1;
 
-  table = zebra_vrf_table (AFI_IP, safi, zvrf->vrf_id);
-  if (! table)
+  ret = str2prefix (argv[idx_ipv4_prefixlen]->arg, &p);
+  if (! ret)
     {
-      if (use_json)
-        vty_out (vty, "{}%s", VTY_NEWLINE);
-      return CMD_SUCCESS;
+      vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
+      return CMD_WARNING;
     }
 
-  if (use_json)
+  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
     {
-      json = json_object_new_object();
-
-      /* Show all IPv4 routes. */
-      for (rn = route_top (table); rn; rn = route_next (rn))
-        {
-          RNODE_FOREACH_RIB (rn, rib)
-            {
-              if (!json_prefix)
-                json_prefix = json_object_new_array();
-              vty_show_ip_route (vty, rn, rib, json_prefix);
-            }
-
-          if (json_prefix)
-            {
-              prefix2str (&rn->p, buf, sizeof buf);
-              json_object_object_add(json, buf, json_prefix);
-              json_prefix = NULL;
-            }
-        }
+      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
+        continue;
 
-      vty_out (vty, "%s%s", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY), VTY_NEWLINE);
-      json_object_free(json);
-    }
-  else
-    {
-      /* Show all IPv4 routes. */
+      /* Show matched type IPv4 routes. */
       for (rn = route_top (table); rn; rn = route_next (rn))
-        {
-          RNODE_FOREACH_RIB (rn, rib)
+        RNODE_FOREACH_RIB (rn, rib)
+          if (prefix_match (&p, &rn->p))
             {
               if (first)
                 {
                   vty_out (vty, SHOW_ROUTE_V4_HEADER);
                   first = 0;
                 }
+
+              if (vrf_header)
+                {
+                  vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
+                  vrf_header = 0;
+                }
               vty_show_ip_route (vty, rn, rib, NULL);
             }
-        }
+      vrf_header = 1;
     }
 
   return CMD_SUCCESS;
 }
 
-DEFUN (show_ip_route_vrf,
-       show_ip_route_vrf_cmd,
-       "show ip route  " VRF_CMD_STR " {json}",
+DEFUN (show_ip_route_vrf_all_supernets,
+       show_ip_route_vrf_all_supernets_cmd,
+       "show ip route vrf all supernets-only",
        SHOW_STR
        IP_STR
        "IP routing table\n"
-       VRF_CMD_HELP_STR)
+       VRF_ALL_CMD_HELP_STR
+       "Show supernet entries only\n")
 {
-  u_char uj = use_json(argc, argv);
+  struct route_table *table;
+  struct route_node *rn;
+  struct rib *rib;
+  struct zebra_vrf *zvrf;
+  vrf_iter_t iter;
+  u_int32_t addr;
+  int first = 1;
+  int vrf_header = 1;
 
-  if (argc == 1 && uj)
-    return do_show_ip_route (vty, NULL, SAFI_UNICAST, uj);
-  else
-    return do_show_ip_route (vty, argv[0], SAFI_UNICAST, uj);
-}
+  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+    {
+      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
+        continue;
 
-DEFUN (show_ip_nht,
-       show_ip_nht_cmd,
-       "show ip nht",
-       SHOW_STR
-       IP_STR
-       "IP nexthop tracking table\n")
-{
-  vrf_id_t vrf_id = VRF_DEFAULT;
+      /* Show matched type IPv4 routes. */
+      for (rn = route_top (table); rn; rn = route_next (rn))
+        RNODE_FOREACH_RIB (rn, rib)
+          {
+            addr = ntohl (rn->p.u.prefix4.s_addr);
 
-  if (argc)
-    VRF_GET_ID (vrf_id, argv[0]);
+            if ((IN_CLASSC (addr) && rn->p.prefixlen < 24)
+               || (IN_CLASSB (addr) && rn->p.prefixlen < 16)
+               || (IN_CLASSA (addr) && rn->p.prefixlen < 8))
+              {
+                if (first)
+                  {
+                    vty_out (vty, SHOW_ROUTE_V4_HEADER);
+                    first = 0;
+                  }
+                if (vrf_header)
+                  {
+                    vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
+                    vrf_header = 0;
+                  }
+                vty_show_ip_route (vty, rn, rib, NULL);
+              }
+          }
+      vrf_header = 1;
+    }
 
-  zebra_print_rnh_table(vrf_id, AF_INET, vty, RNH_NEXTHOP_TYPE);
   return CMD_SUCCESS;
 }
 
-ALIAS (show_ip_nht,
-       show_ip_nht_vrf_cmd,
-       "show ip nht " VRF_CMD_STR,
-       SHOW_STR
-       IP_STR
-       "IP nexthop tracking table\n"
-       VRF_CMD_HELP_STR)
-
-DEFUN (show_ip_nht_vrf_all,
-       show_ip_nht_vrf_all_cmd,
-       "show ip nht " VRF_ALL_CMD_STR,
+DEFUN (show_ip_route_vrf_all_protocol,
+       show_ip_route_vrf_all_protocol_cmd,
+       "show ip route vrf all <kernel|connected|static|rip|ospf|isis|bgp|pim|table>",
        SHOW_STR
        IP_STR
-       "IP nexthop tracking table\n"
-       VRF_ALL_CMD_HELP_STR)
+       "IP routing table\n"
+       VRF_ALL_CMD_HELP_STR
+       QUAGGA_IP_REDIST_HELP_STR_ZEBRA"\n")
 {
+  int type;
+  struct route_table *table;
+  struct route_node *rn;
+  struct rib *rib;
   struct zebra_vrf *zvrf;
   vrf_iter_t iter;
+  int first = 1;
+  int vrf_header = 1;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if ((zvrf = vrf_iter2info (iter)) != NULL)
-      {
-        vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
-        zebra_print_rnh_table(zvrf->vrf_id, AF_INET, vty, RNH_NEXTHOP_TYPE);
-      }
+  type = proto_redistnum (AFI_IP, argv[6]->arg);
+  if (type < 0)
+    {
+      vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
+      return CMD_WARNING;
+    }
 
-  return CMD_SUCCESS;
-}
+  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+    {
+      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
+        continue;
 
-DEFUN (show_ipv6_nht,
-       show_ipv6_nht_cmd,
-       "show ipv6 nht",
-       SHOW_STR
-       IPV6_STR
-       "IPv6 nexthop tracking table\n")
-{
-  vrf_id_t vrf_id = VRF_DEFAULT;
+      /* Show matched type IPv4 routes. */
+      for (rn = route_top (table); rn; rn = route_next (rn))
+        RNODE_FOREACH_RIB (rn, rib)
+          if (rib->type == type)
+            {
+              if (first)
+                {
+                  vty_out (vty, SHOW_ROUTE_V4_HEADER);
+                  first = 0;
+                }
 
-  if (argc)
-    VRF_GET_ID (vrf_id, argv[0]);
+              if (vrf_header)
+                {
+                  vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
+                  vrf_header = 0;
+                }
+              vty_show_ip_route (vty, rn, rib, NULL);
+            }
+      vrf_header = 1;
+    }
 
-  zebra_print_rnh_table(vrf_id, AF_INET6, vty, RNH_NEXTHOP_TYPE);
   return CMD_SUCCESS;
 }
 
-ALIAS (show_ipv6_nht,
-       show_ipv6_nht_vrf_cmd,
-       "show ipv6 nht " VRF_CMD_STR,
-       SHOW_STR
-       IPV6_STR
-       "IPv6 nexthop tracking table\n"
-       VRF_CMD_HELP_STR)
-
-DEFUN (show_ipv6_nht_vrf_all,
-       show_ipv6_nht_vrf_all_cmd,
-       "show ipv6 nht " VRF_ALL_CMD_STR,
+DEFUN (show_ip_route_vrf_all_addr,
+       show_ip_route_vrf_all_addr_cmd,
+       "show ip route vrf all A.B.C.D",
        SHOW_STR
        IP_STR
-       "IPv6 nexthop tracking table\n"
-       VRF_ALL_CMD_HELP_STR)
+       "IP routing table\n"
+       VRF_ALL_CMD_HELP_STR
+       "Network in the IP routing table to display\n")
 {
+  int idx_ipv4 = 5;
+  int ret;
+  struct prefix_ipv4 p;
+  struct route_table *table;
+  struct route_node *rn;
   struct zebra_vrf *zvrf;
   vrf_iter_t iter;
 
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if ((zvrf = vrf_iter2info (iter)) != NULL)
-      {
-        vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
-        zebra_print_rnh_table(zvrf->vrf_id, AF_INET6, vty, RNH_NEXTHOP_TYPE);
-      }
-
-  return CMD_SUCCESS;
-}
-
-DEFUN (ip_nht_default_route,
-       ip_nht_default_route_cmd,
-       "ip nht resolve-via-default",
-       IP_STR
-       "Filter Next Hop tracking route resolution\n"
-       "Resolve via default route\n")
-{
-  if (zebra_rnh_ip_default_route)
-    return CMD_SUCCESS;
-
-  zebra_rnh_ip_default_route = 1;
-  zebra_evaluate_rnh(0, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL);
-  return CMD_SUCCESS;
-}
-
-DEFUN (no_ip_nht_default_route,
-       no_ip_nht_default_route_cmd,
-       "no ip nht resolve-via-default",
-       NO_STR
-       IP_STR
-       "Filter Next Hop tracking route resolution\n"
-       "Resolve via default route\n")
-{
-  if (!zebra_rnh_ip_default_route)
-    return CMD_SUCCESS;
+  ret = str2prefix_ipv4 (argv[idx_ipv4]->arg, &p);
+  if (ret <= 0)
+    {
+      vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
+      return CMD_WARNING;
+    }
 
-  zebra_rnh_ip_default_route = 0;
-  zebra_evaluate_rnh(0, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL);
-  return CMD_SUCCESS;
-}
+  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+    {
+      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
+        continue;
 
-DEFUN (ipv6_nht_default_route,
-       ipv6_nht_default_route_cmd,
-       "ipv6 nht resolve-via-default",
-       IP6_STR
-       "Filter Next Hop tracking route resolution\n"
-       "Resolve via default route\n")
-{
-  if (zebra_rnh_ipv6_default_route)
-    return CMD_SUCCESS;
+      rn = route_node_match (table, (struct prefix *) &p);
+      if (! rn)
+        continue;
 
-  zebra_rnh_ipv6_default_route = 1;
-  zebra_evaluate_rnh(0, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL);
-  return CMD_SUCCESS;
-}
+      vty_show_ip_route_detail (vty, rn, 0);
 
-DEFUN (no_ipv6_nht_default_route,
-       no_ipv6_nht_default_route_cmd,
-       "no ipv6 nht resolve-via-default",
-       NO_STR
-       IP6_STR
-       "Filter Next Hop tracking route resolution\n"
-       "Resolve via default route\n")
-{
-  if (!zebra_rnh_ipv6_default_route)
-    return CMD_SUCCESS;
+      route_unlock_node (rn);
+    }
 
-  zebra_rnh_ipv6_default_route = 0;
-  zebra_evaluate_rnh(0, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL);
   return CMD_SUCCESS;
 }
 
-DEFUN (show_ip_route_tag,
-       show_ip_route_tag_cmd,
-       "show ip route tag <1-4294967295>",
+DEFUN (show_ip_route_vrf_all_prefix,
+       show_ip_route_vrf_all_prefix_cmd,
+       "show ip route vrf all A.B.C.D/M",
        SHOW_STR
        IP_STR
        "IP routing table\n"
-       "Show only routes with tag\n"
-       "Tag value\n")
+       VRF_ALL_CMD_HELP_STR
+       "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
 {
+  int idx_ipv4_prefixlen = 5;
+  int ret;
+  struct prefix_ipv4 p;
   struct route_table *table;
   struct route_node *rn;
-  struct rib *rib;
-  int first = 1;
-  route_tag_t tag = 0;
-  vrf_id_t vrf_id = VRF_DEFAULT;
+  struct zebra_vrf *zvrf;
+  vrf_iter_t iter;
 
-  if (argc > 1)
+  ret = str2prefix_ipv4 (argv[idx_ipv4_prefixlen]->arg, &p);
+  if (ret <= 0)
     {
-      tag = atol(argv[1]);
-      VRF_GET_ID (vrf_id, argv[0]);
+      vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
+      return CMD_WARNING;
     }
-  else
-    tag = atol(argv[0]);
 
-  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
-  if (! table)
-    return CMD_SUCCESS;
+  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+    {
+      if ((zvrf = vrf_iter2info (iter)) == NULL ||
+          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
+        continue;
 
-  /* Show all IPv4 routes with matching tag value. */
-  for (rn = route_top (table); rn; rn = route_next (rn))
-    RNODE_FOREACH_RIB (rn, rib)
-      {
-        if (rib->tag != tag)
+      rn = route_node_match (table, (struct prefix *) &p);
+      if (! rn)
+        continue;
+      if (rn->p.prefixlen != p.prefixlen)
+        {
+          route_unlock_node (rn);
           continue;
+        }
+
+      vty_show_ip_route_detail (vty, rn, 0);
+
+      route_unlock_node (rn);
+    }
 
-        if (first)
-          {
-            vty_out (vty, SHOW_ROUTE_V4_HEADER);
-            first = 0;
-          }
-        vty_show_ip_route (vty, rn, rib, NULL);
-      }
   return CMD_SUCCESS;
 }
 
-ALIAS (show_ip_route_tag,
-       show_ip_route_vrf_tag_cmd,
-       "show ip route " VRF_CMD_STR " tag <1-4294967295>",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_CMD_HELP_STR
-       "Show only routes with tag\n"
-       "Tag value\n")
-
-DEFUN (show_ip_route_prefix_longer,
-       show_ip_route_prefix_longer_cmd,
-       "show ip route A.B.C.D/M longer-prefixes",
+DEFUN (show_ip_route_vrf_all_summary,
+       show_ip_route_vrf_all_summary_cmd,
+       "show ip route vrf all summary ",
        SHOW_STR
        IP_STR
        "IP routing table\n"
-       "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
-       "Show route matching the specified Network/Mask pair only\n")
+       VRF_ALL_CMD_HELP_STR
+       "Summary of all routes\n")
 {
-  struct route_table *table;
-  struct route_node *rn;
-  struct rib *rib;
-  struct prefix p;
-  int ret;
-  int first = 1;
-  vrf_id_t vrf_id = VRF_DEFAULT;
-
-  if (argc > 1)
-    {
-      ret = str2prefix (argv[1], &p);
-      VRF_GET_ID (vrf_id, argv[0]);
-    }
-  else
-    ret = str2prefix (argv[0], &p);
-
-  if (! ret)
-    {
-      vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
-      return CMD_WARNING;
-    }
+  struct zebra_vrf *zvrf;
+  vrf_iter_t iter;
 
-  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
-  if (! table)
-    return CMD_SUCCESS;
+  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+    if ((zvrf = vrf_iter2info (iter)) != NULL)
+      vty_show_ip_route_summary (vty, zvrf->table[AFI_IP][SAFI_UNICAST]);
 
-  /* Show matched type IPv4 routes. */
-  for (rn = route_top (table); rn; rn = route_next (rn))
-    RNODE_FOREACH_RIB (rn, rib)
-      if (prefix_match (&p, &rn->p))
-       {
-         if (first)
-           {
-             vty_out (vty, SHOW_ROUTE_V4_HEADER);
-             first = 0;
-           }
-         vty_show_ip_route (vty, rn, rib, NULL);
-       }
   return CMD_SUCCESS;
 }
 
-ALIAS (show_ip_route_prefix_longer,
-       show_ip_route_vrf_prefix_longer_cmd,
-       "show ip route " VRF_CMD_STR " A.B.C.D/M longer-prefixes",
+DEFUN (show_ip_route_vrf_all_summary_prefix,
+       show_ip_route_vrf_all_summary_prefix_cmd,
+       "show ip route vrf all summary prefix",
        SHOW_STR
        IP_STR
        "IP routing table\n"
-       VRF_CMD_HELP_STR
-       "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
-       "Show route matching the specified Network/Mask pair only\n")
+       VRF_ALL_CMD_HELP_STR
+       "Summary of all routes\n"
+       "Prefix routes\n")
+{
+  struct zebra_vrf *zvrf;
+  vrf_iter_t iter;
 
-DEFUN (show_ip_route_supernets,
-       show_ip_route_supernets_cmd,
-       "show ip route supernets-only",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       "Show supernet entries only\n")
-{
-  struct route_table *table;
-  struct route_node *rn;
-  struct rib *rib;
-  u_int32_t addr;
-  int first = 1;
-  vrf_id_t vrf_id = VRF_DEFAULT;
-
-  if (argc > 0)
-    VRF_GET_ID (vrf_id, argv[0]);
-
-  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
-  if (! table)
-    return CMD_SUCCESS;
-
-  /* Show matched type IPv4 routes. */
-  for (rn = route_top (table); rn; rn = route_next (rn))
-    RNODE_FOREACH_RIB (rn, rib)
-      {
-       addr = ntohl (rn->p.u.prefix4.s_addr);
+  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+    if ((zvrf = vrf_iter2info (iter)) != NULL)
+      vty_show_ip_route_summary_prefix (vty, zvrf->table[AFI_IP][SAFI_UNICAST]);
 
-       if ((IN_CLASSC (addr) && rn->p.prefixlen < 24)
-          || (IN_CLASSB (addr) && rn->p.prefixlen < 16)
-          || (IN_CLASSA (addr) && rn->p.prefixlen < 8))
-         {
-           if (first)
-             {
-               vty_out (vty, SHOW_ROUTE_V4_HEADER);
-               first = 0;
-             }
-           vty_show_ip_route (vty, rn, rib, NULL);
-         }
-      }
   return CMD_SUCCESS;
 }
 
-ALIAS (show_ip_route_supernets,
-       show_ip_route_vrf_supernets_cmd,
-       "show ip route " VRF_CMD_STR " supernets-only",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_CMD_HELP_STR
-       "Show supernet entries only\n")
-
-DEFUN (show_ip_route_protocol,
-       show_ip_route_protocol_cmd,
-       "show ip route " QUAGGA_IP_REDIST_STR_ZEBRA,
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       QUAGGA_IP_REDIST_HELP_STR_ZEBRA)
+/* Write IPv4 static route configuration. */
+static int
+static_config_ipv4 (struct vty *vty, safi_t safi, const char *cmd)
 {
-  int type;
-  struct route_table *table;
   struct route_node *rn;
-  struct rib *rib;
-  int first = 1;
-  vrf_id_t vrf_id = VRF_DEFAULT;
+  struct static_route *si;
+  struct route_table *stable;
+  struct zebra_vrf *zvrf;
+  char buf[BUFSIZ];
+  int write =0;
+  struct listnode *node;
 
-  if (argc > 1)
+  for (ALL_LIST_ELEMENTS_RO (zvrf_list, node, zvrf))
     {
-      type = proto_redistnum (AFI_IP, argv[1]);
-      VRF_GET_ID (vrf_id, argv[0]);
-     }
-  else
-    type = proto_redistnum (AFI_IP, argv[0]);
+      if ((stable = zvrf->stable[AFI_IP][safi]) == NULL)
+        continue;
 
-  if (type < 0)
-    {
-      vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
-      return CMD_WARNING;
-    }
+      for (rn = route_top (stable); rn; rn = route_next (rn))
+        for (si = rn->info; si; si = si->next)
+          {
+            vty_out (vty, "%s %s", cmd, prefix2str (&rn->p, buf, sizeof buf));
 
-  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
-  if (! table)
-    return CMD_SUCCESS;
+            switch (si->type)
+              {
+              case STATIC_IPV4_GATEWAY:
+                vty_out (vty, " %s", inet_ntoa (si->addr.ipv4));
+                break;
+              case STATIC_IFINDEX:
+                vty_out (vty, " %s", si->ifname);
+                break;
+              case STATIC_BLACKHOLE:
+                vty_out (vty, " Null0");
+                break;
+              }
 
-  /* Show matched type IPv4 routes. */
-  for (rn = route_top (table); rn; rn = route_next (rn))
-    RNODE_FOREACH_RIB (rn, rib)
-      if (rib->type == type)
-       {
-         if (first)
-           {
-             vty_out (vty, SHOW_ROUTE_V4_HEADER);
-             first = 0;
-           }
-         vty_show_ip_route (vty, rn, rib, NULL);
-       }
-  return CMD_SUCCESS;
-}
+            /* flags are incompatible with STATIC_BLACKHOLE */
+            if (si->type != STATIC_BLACKHOLE)
+              {
+                if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
+                  vty_out (vty, " %s", "reject");
 
-ALIAS (show_ip_route_protocol,
-       show_ip_route_vrf_protocol_cmd,
-       "show ip route " VRF_CMD_STR "  " QUAGGA_IP_REDIST_STR_ZEBRA,
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_CMD_HELP_STR
-       QUAGGA_IP_REDIST_HELP_STR_ZEBRA)
+                if (CHECK_FLAG(si->flags, ZEBRA_FLAG_BLACKHOLE))
+                  vty_out (vty, " %s", "blackhole");
+              }
 
-DEFUN (show_ip_route_ospf_instance,
-       show_ip_route_ospf_instance_cmd,
-       "show ip route ospf <1-65535>",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       "Open Shortest Path First (OSPFv2)\n"
-       "Instance ID\n")
-{
-  struct route_table *table;
-  struct route_node *rn;
-  struct rib *rib;
-  int first = 1;
-  u_short instance = 0;
+            if (si->tag)
+              vty_out (vty, " tag %"ROUTE_TAG_PRI, si->tag);
 
-  VTY_GET_INTEGER ("Instance", instance, argv[0]);
+            if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT)
+              vty_out (vty, " %d", si->distance);
 
-  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, VRF_DEFAULT);
-  if (! table)
-    return CMD_SUCCESS;
+            if (si->vrf_id != VRF_DEFAULT)
+                vty_out (vty, " vrf %s", zvrf ? zvrf->name : "");
 
-  /* Show matched type IPv4 routes. */
-  for (rn = route_top (table); rn; rn = route_next (rn))
-    RNODE_FOREACH_RIB (rn, rib)
-      if (rib->type == ZEBRA_ROUTE_OSPF && rib->instance == instance)
-       {
-         if (first)
-           {
-             vty_out (vty, SHOW_ROUTE_V4_HEADER);
-             first = 0;
-           }
-         vty_show_ip_route (vty, rn, rib, NULL);
-       }
-  return CMD_SUCCESS;
+            /* Label information */
+            if (si->snh_label.num_labels)
+              vty_out (vty, " label %s",
+                       mpls_label2str (si->snh_label.num_labels,
+                                       si->snh_label.label, buf, sizeof buf));
+
+            vty_out (vty, "%s", VTY_NEWLINE);
+
+            write = 1;
+          }
+    }
+  return write;
 }
 
-DEFUN (show_ip_route_addr,
-       show_ip_route_addr_cmd,
-       "show ip route A.B.C.D",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       "Network in the IP routing table to display\n")
+/* General fucntion for IPv6 static route. */
+int
+static_ipv6_func (struct vty *vty, int add_cmd, const char *dest_str,
+                  const char *gate_str, const char *ifname,
+                  const char *flag_str, const char *tag_str,
+                  const char *distance_str, const char *vrf_id_str,
+                  const char *label_str)
 {
   int ret;
-  struct prefix_ipv4 p;
-  struct route_table *table;
-  struct route_node *rn;
-  vrf_id_t vrf_id = VRF_DEFAULT;
-
-  if (argc > 1)
-    {
-      VRF_GET_ID (vrf_id, argv[0]);
-      ret = str2prefix_ipv4 (argv[1], &p);
-    }
-  else
-    ret = str2prefix_ipv4 (argv[0], &p);
+  u_char distance;
+  struct prefix p;
+  struct in6_addr *gate = NULL;
+  struct in6_addr gate_addr;
+  u_char type = STATIC_BLACKHOLE;
+  u_char flag = 0;
+  route_tag_t tag = 0;
+  unsigned int ifindex = 0;
+  struct interface *ifp = NULL;
+  struct zebra_vrf *zvrf;
+  struct static_nh_label snh_label;
 
+  ret = str2prefix (dest_str, &p);
   if (ret <= 0)
     {
-      vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
-      return CMD_WARNING;
-    }
-
-  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
-  if (! table)
-    return CMD_SUCCESS;
-
-  rn = route_node_match (table, (struct prefix *) &p);
-  if (! rn)
-    {
-      vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
+      vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
 
-  vty_show_ip_route_detail (vty, rn, 0);
-
-  route_unlock_node (rn);
+  /* Apply mask for given prefix. */
+  apply_mask (&p);
 
-  return CMD_SUCCESS;
-}
+  /* Administrative distance. */
+  if (distance_str)
+    distance = atoi (distance_str);
+  else
+    distance = ZEBRA_STATIC_DISTANCE_DEFAULT;
 
-ALIAS (show_ip_route_addr,
-       show_ip_route_vrf_addr_cmd,
-       "show ip route "  VRF_CMD_STR " A.B.C.D",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_CMD_HELP_STR
-       "Network in the IP routing table to display\n")
+  /* tag */
+  if (tag_str)
+    tag = atol(tag_str);
 
-DEFUN (show_ip_route_prefix,
-       show_ip_route_prefix_cmd,
-       "show ip route A.B.C.D/M",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
-{
-  int ret;
-  struct prefix_ipv4 p;
-  struct route_table *table;
-  struct route_node *rn;
-  vrf_id_t vrf_id = VRF_DEFAULT;
+  /* When gateway is valid IPv6 addrees, then gate is treated as
+     nexthop address other case gate is treated as interface name. */
+  ret = inet_pton (AF_INET6, gate_str, &gate_addr);
 
-  if (argc > 1)
-    {
-      VRF_GET_ID (vrf_id, argv[0]);
-      ret = str2prefix_ipv4 (argv[1], &p);
-    }
-  else
-    ret = str2prefix_ipv4 (argv[0], &p);
+  /* VRF id */
+  zvrf = zebra_vrf_list_lookup_by_name (vrf_id_str);
 
-  if (ret <= 0)
+  if (!zvrf)
     {
-      vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
+      vty_out (vty, "%% vrf %s is not defined%s", vrf_id_str, VTY_NEWLINE);
       return CMD_WARNING;
     }
 
-  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
-  if (! table)
-    return CMD_SUCCESS;
-
-  rn = route_node_match (table, (struct prefix *) &p);
-  if (! rn || rn->p.prefixlen != p.prefixlen)
+  /* Labels */
+  memset (&snh_label, 0, sizeof (struct static_nh_label));
+  if (label_str)
     {
-      vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
-      return CMD_WARNING;
+      if (!mpls_enabled)
+        {
+          vty_out (vty, "%% MPLS not turned on in kernel, ignoring command%s",
+                   VTY_NEWLINE);
+          return CMD_WARNING;
+        }
+      if (mpls_str2label (label_str, &snh_label.num_labels,
+                          snh_label.label))
+        {
+          vty_out (vty, "%% Malformed label(s)%s", VTY_NEWLINE);
+          return CMD_WARNING;
+        }
     }
 
-  vty_show_ip_route_detail (vty, rn, 0);
-
-  route_unlock_node (rn);
-
-  return CMD_SUCCESS;
-}
-
-ALIAS (show_ip_route_prefix,
-       show_ip_route_vrf_prefix_cmd,
-       "show ip route " VRF_CMD_STR " A.B.C.D/M",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_CMD_HELP_STR
-       "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
-
-static void
-vty_show_ip_route_summary (struct vty *vty, struct route_table *table)
-{
-  struct route_node *rn;
-  struct rib *rib;
-#define ZEBRA_ROUTE_IBGP  ZEBRA_ROUTE_MAX
-#define ZEBRA_ROUTE_TOTAL (ZEBRA_ROUTE_IBGP + 1)
-  u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1];
-  u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1];
-  u_int32_t i;
-  u_int32_t is_ibgp;
-
-  memset (&rib_cnt, 0, sizeof(rib_cnt));
-  memset (&fib_cnt, 0, sizeof(fib_cnt));
-  for (rn = route_top (table); rn; rn = route_next (rn))
-    RNODE_FOREACH_RIB (rn, rib)
-      {
-        is_ibgp = (rib->type == ZEBRA_ROUTE_BGP &&
-                   CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP));
-
-        rib_cnt[ZEBRA_ROUTE_TOTAL]++;
-        if (is_ibgp)
-          rib_cnt[ZEBRA_ROUTE_IBGP]++;
-        else
-          rib_cnt[rib->type]++;
-
-        if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
-          {
-            fib_cnt[ZEBRA_ROUTE_TOTAL]++;
-
-            if (is_ibgp)
-              fib_cnt[ZEBRA_ROUTE_IBGP]++;
-            else
-              fib_cnt[rib->type]++;
-          }
-      }
-
-  vty_out (vty, "%-20s %-20s %s  (vrf %s)%s",
-           "Route Source", "Routes", "FIB",
-           ((rib_table_info_t *)table->info)->zvrf->name,
-           VTY_NEWLINE);
-
-  for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
+  /* Null0 static route.  */
+  if ((gate_str != NULL) && (strncasecmp (gate_str, "Null0", strlen (gate_str)) == 0))
     {
-      if ((rib_cnt[i] > 0) ||
-         (i == ZEBRA_ROUTE_BGP && rib_cnt[ZEBRA_ROUTE_IBGP] > 0))
+      if (flag_str)
         {
-          if (i == ZEBRA_ROUTE_BGP)
-            {
-              vty_out (vty, "%-20s %-20d %-20d %s", "ebgp",
-                       rib_cnt[ZEBRA_ROUTE_BGP], fib_cnt[ZEBRA_ROUTE_BGP],
-                       VTY_NEWLINE);
-              vty_out (vty, "%-20s %-20d %-20d %s", "ibgp",
-                       rib_cnt[ZEBRA_ROUTE_IBGP], fib_cnt[ZEBRA_ROUTE_IBGP],
-                       VTY_NEWLINE);
-            }
-          else
-            vty_out (vty, "%-20s %-20d %-20d %s", zebra_route_string(i),
-                     rib_cnt[i], fib_cnt[i], VTY_NEWLINE);
+          vty_out (vty, "%% can not have flag %s with Null0%s", flag_str, VTY_NEWLINE);
+          return CMD_WARNING;
         }
+      if (add_cmd)
+        static_add_route (AFI_IP6, SAFI_UNICAST, type, &p, NULL, ifindex, ifname,
+                          ZEBRA_FLAG_BLACKHOLE, tag, distance, zvrf, &snh_label);
+      else
+        static_delete_route (AFI_IP6, SAFI_UNICAST, type, &p,  NULL, ifindex, tag,
+                             distance, zvrf, &snh_label);
+      return CMD_SUCCESS;
     }
 
-  vty_out (vty, "------%s", VTY_NEWLINE);
-  vty_out (vty, "%-20s %-20d %-20d %s", "Totals", rib_cnt[ZEBRA_ROUTE_TOTAL],
-           fib_cnt[ZEBRA_ROUTE_TOTAL], VTY_NEWLINE);
-  vty_out (vty, "%s", VTY_NEWLINE);
-}
-
-/*
- * Implementation of the ip route summary prefix command.
- *
- * This command prints the primary prefixes that have been installed by various
- * protocols on the box.
- *
- */
-static void
-vty_show_ip_route_summary_prefix (struct vty *vty, struct route_table *table)
-{
-  struct route_node *rn;
-  struct rib *rib;
-  struct nexthop *nexthop;
-#define ZEBRA_ROUTE_IBGP  ZEBRA_ROUTE_MAX
-#define ZEBRA_ROUTE_TOTAL (ZEBRA_ROUTE_IBGP + 1)
-  u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1];
-  u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1];
-  u_int32_t i;
-  int       cnt;
-
-  memset (&rib_cnt, 0, sizeof(rib_cnt));
-  memset (&fib_cnt, 0, sizeof(fib_cnt));
-  for (rn = route_top (table); rn; rn = route_next (rn))
-    RNODE_FOREACH_RIB (rn, rib)
-      {
-
-       /*
-        * In case of ECMP, count only once.
-        */
-       cnt = 0;
-       for (nexthop = rib->nexthop; (!cnt && nexthop); nexthop = nexthop->next)
-         {
-          cnt++;
-          rib_cnt[ZEBRA_ROUTE_TOTAL]++;
-          rib_cnt[rib->type]++;
-          if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
-               {
-                fib_cnt[ZEBRA_ROUTE_TOTAL]++;
-             fib_cnt[rib->type]++;
-            }
-             if (rib->type == ZEBRA_ROUTE_BGP &&
-                 CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP))
-            {
-                rib_cnt[ZEBRA_ROUTE_IBGP]++;
-                    if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
-                       fib_cnt[ZEBRA_ROUTE_IBGP]++;
-            }
-            }
-      }
-
-  vty_out (vty, "%-20s %-20s %s  (vrf %s)%s",
-           "Route Source", "Prefix Routes", "FIB",
-           ((rib_table_info_t *)table->info)->zvrf->name,
-           VTY_NEWLINE);
+  /* Route flags */
+  if (flag_str) {
+    switch(flag_str[0]) {
+      case 'r':
+      case 'R': /* XXX */
+        SET_FLAG (flag, ZEBRA_FLAG_REJECT);
+        break;
+      case 'b':
+      case 'B': /* XXX */
+        SET_FLAG (flag, ZEBRA_FLAG_BLACKHOLE);
+        break;
+      default:
+        vty_out (vty, "%% Malformed flag %s %s", flag_str, VTY_NEWLINE);
+        return CMD_WARNING;
+    }
+  }
 
 for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
if (ifname)
     {
-      if (rib_cnt[i] > 0)
-       {
-         if (i == ZEBRA_ROUTE_BGP)
-           {
-             vty_out (vty, "%-20s %-20d %-20d %s", "ebgp",
-                      rib_cnt[ZEBRA_ROUTE_BGP] - rib_cnt[ZEBRA_ROUTE_IBGP],
-                      fib_cnt[ZEBRA_ROUTE_BGP] - fib_cnt[ZEBRA_ROUTE_IBGP],
-                      VTY_NEWLINE);
-             vty_out (vty, "%-20s %-20d %-20d %s", "ibgp",
-                      rib_cnt[ZEBRA_ROUTE_IBGP], fib_cnt[ZEBRA_ROUTE_IBGP],
-                      VTY_NEWLINE);
-           }
-         else
-           vty_out (vty, "%-20s %-20d %-20d %s", zebra_route_string(i),
-                    rib_cnt[i], fib_cnt[i], VTY_NEWLINE);
-       }
+      /* When ifname is specified.  It must be come with gateway
+         address. */
+      if (ret != 1)
+        {
+          vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
+          return CMD_WARNING;
+        }
+      type = STATIC_IPV6_GATEWAY_IFINDEX;
+      gate = &gate_addr;
+      ifp = if_lookup_by_name_vrf (ifname, zvrf->vrf_id);
+      if (!ifp)
+        {
+          vty_out (vty, "%% Malformed Interface name %s%s", ifname, VTY_NEWLINE);
+          return CMD_WARNING;
+        }
+      ifindex = ifp->ifindex;
     }
-
-  vty_out (vty, "------%s", VTY_NEWLINE);
-  vty_out (vty, "%-20s %-20d %-20d %s", "Totals", rib_cnt[ZEBRA_ROUTE_TOTAL],
-          fib_cnt[ZEBRA_ROUTE_TOTAL], VTY_NEWLINE);
-  vty_out (vty, "%s", VTY_NEWLINE);
-}
-
-/* Show route summary.  */
-DEFUN (show_ip_route_summary,
-       show_ip_route_summary_cmd,
-       "show ip route summary",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       "Summary of all routes\n")
-{
-  struct route_table *table;
-  vrf_id_t vrf_id = VRF_DEFAULT;
-
-  if (argc > 0)
-    VRF_GET_ID (vrf_id, argv[0]);
-
-  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
-  if (! table)
-    return CMD_SUCCESS;
-
-  vty_show_ip_route_summary (vty, table);
-
-  return CMD_SUCCESS;
-}
-
-ALIAS (show_ip_route_summary,
-       show_ip_route_vrf_summary_cmd,
-       "show ip route " VRF_CMD_STR " summary",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_CMD_HELP_STR
-       "Summary of all routes\n")
-
-/* Show route summary prefix.  */
-DEFUN (show_ip_route_summary_prefix,
-       show_ip_route_summary_prefix_cmd,
-       "show ip route summary prefix",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       "Summary of all routes\n"
-       "Prefix routes\n")
-{
-  struct route_table *table;
-  vrf_id_t vrf_id = VRF_DEFAULT;
-
-  if (argc > 0)
-    VRF_GET_ID (vrf_id, argv[0]);
-
-  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
-  if (! table)
-    return CMD_SUCCESS;
-
-  vty_show_ip_route_summary_prefix (vty, table);
-
-  return CMD_SUCCESS;
-}
-
-ALIAS (show_ip_route_summary_prefix,
-       show_ip_route_vrf_summary_prefix_cmd,
-       "show ip route " VRF_CMD_STR " summary prefix",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_CMD_HELP_STR
-       "Summary of all routes\n"
-       "Prefix routes\n")
-
-DEFUN (show_ip_route_vrf_all,
-       show_ip_route_vrf_all_cmd,
-       "show ip route " VRF_ALL_CMD_STR,
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_ALL_CMD_HELP_STR)
-{
-  struct route_table *table;
-  struct route_node *rn;
-  struct rib *rib;
-  struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
-  int first = 1;
-  int vrf_header = 1;
-
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
-          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
-        continue;
-
-      /* Show all IPv4 routes. */
-      for (rn = route_top (table); rn; rn = route_next (rn))
-        RNODE_FOREACH_RIB (rn, rib)
-          {
-            if (first)
-              {
-                vty_out (vty, SHOW_ROUTE_V4_HEADER);
-                first = 0;
-              }
-
-            if (vrf_header)
-              {
-                vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
-                vrf_header = 0;
-              }
-            vty_show_ip_route (vty, rn, rib, NULL);
-          }
-      vrf_header  = 1;
-    }
-
-  return CMD_SUCCESS;
-}
-
-DEFUN (show_ip_route_vrf_all_tag,
-       show_ip_route_vrf_all_tag_cmd,
-       "show ip route " VRF_ALL_CMD_STR " tag <1-4294967295>",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_ALL_CMD_HELP_STR
-       "Show only routes with tag\n"
-       "Tag value\n")
-{
-  struct route_table *table;
-  struct route_node *rn;
-  struct rib *rib;
-  struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
-  int first = 1;
-  int vrf_header = 1;
-  route_tag_t tag = 0;
-
-  if (argv[0])
-    tag = atol(argv[0]);
-
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
-          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
-        continue;
-
-      /* Show all IPv4 routes with matching tag value. */
-      for (rn = route_top (table); rn; rn = route_next (rn))
-        RNODE_FOREACH_RIB (rn, rib)
-          {
-            if (rib->tag != tag)
-              continue;
-
-            if (first)
-              {
-                vty_out (vty, SHOW_ROUTE_V4_HEADER);
-                first = 0;
-              }
-
-            if (vrf_header)
-              {
-                vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
-                vrf_header = 0;
-              }
-            vty_show_ip_route (vty, rn, rib, NULL);
-          }
-      vrf_header = 1;
-    }
-  return CMD_SUCCESS;
-}
-
-DEFUN (show_ip_route_vrf_all_prefix_longer,
-       show_ip_route_vrf_all_prefix_longer_cmd,
-       "show ip route " VRF_ALL_CMD_STR " A.B.C.D/M longer-prefixes",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_ALL_CMD_HELP_STR
-       "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
-       "Show route matching the specified Network/Mask pair only\n")
-{
-  struct route_table *table;
-  struct route_node *rn;
-  struct rib *rib;
-  struct prefix p;
-  struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
-  int ret;
-  int first = 1;
-  int vrf_header = 1;
-
-  ret = str2prefix (argv[0], &p);
-  if (! ret)
-    {
-      vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
-      return CMD_WARNING;
-    }
-
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+  else
     {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
-          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
-        continue;
-
-      /* Show matched type IPv4 routes. */
-      for (rn = route_top (table); rn; rn = route_next (rn))
-        RNODE_FOREACH_RIB (rn, rib)
-          if (prefix_match (&p, &rn->p))
+      if (ret == 1)
+        {
+          type = STATIC_IPV6_GATEWAY;
+          gate = &gate_addr;
+        }
+      else
+        {
+          type = STATIC_IFINDEX;
+          ifp = if_lookup_by_name_vrf (gate_str, zvrf->vrf_id);
+          if (!ifp)
             {
-              if (first)
-                {
-                  vty_out (vty, SHOW_ROUTE_V4_HEADER);
-                  first = 0;
-                }
-
-              if (vrf_header)
-                {
-                  vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
-                  vrf_header = 0;
-                }
-              vty_show_ip_route (vty, rn, rib, NULL);
+              vty_out (vty, "%% Malformed Interface name %s%s", gate_str, VTY_NEWLINE);
+              ifindex = IFINDEX_DELETED;
             }
-      vrf_header = 1;
-    }
-
-  return CMD_SUCCESS;
-}
-
-DEFUN (show_ip_route_vrf_all_supernets,
-       show_ip_route_vrf_all_supernets_cmd,
-       "show ip route "  VRF_ALL_CMD_STR " supernets-only",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_ALL_CMD_HELP_STR
-       "Show supernet entries only\n")
-{
-  struct route_table *table;
-  struct route_node *rn;
-  struct rib *rib;
-  struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
-  u_int32_t addr;
-  int first = 1;
-  int vrf_header = 1;
-
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
-          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
-        continue;
-
-      /* Show matched type IPv4 routes. */
-      for (rn = route_top (table); rn; rn = route_next (rn))
-        RNODE_FOREACH_RIB (rn, rib)
-          {
-            addr = ntohl (rn->p.u.prefix4.s_addr);
-
-            if ((IN_CLASSC (addr) && rn->p.prefixlen < 24)
-               || (IN_CLASSB (addr) && rn->p.prefixlen < 16)
-               || (IN_CLASSA (addr) && rn->p.prefixlen < 8))
-              {
-                if (first)
-                  {
-                    vty_out (vty, SHOW_ROUTE_V4_HEADER);
-                    first = 0;
-                  }
-
-                if (vrf_header)
-                  {
-                    vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
-                    vrf_header = 0;
-                  }
-                vty_show_ip_route (vty, rn, rib, NULL);
-              }
-          }
-      vrf_header = 1;
-    }
-
-  return CMD_SUCCESS;
-}
-
-DEFUN (show_ip_route_vrf_all_protocol,
-       show_ip_route_vrf_all_protocol_cmd,
-       "show ip route " VRF_ALL_CMD_STR "  " QUAGGA_IP_REDIST_STR_ZEBRA,
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_ALL_CMD_HELP_STR
-       QUAGGA_IP_REDIST_HELP_STR_ZEBRA"\n")
-{
-  int type;
-  struct route_table *table;
-  struct route_node *rn;
-  struct rib *rib;
-  struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
-  int first = 1;
-  int vrf_header = 1;
-
-  type = proto_redistnum (AFI_IP, argv[0]);
-  if (type < 0)
-    {
-      vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
-      return CMD_WARNING;
-    }
-
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
-          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
-        continue;
-
-      /* Show matched type IPv4 routes. */
-      for (rn = route_top (table); rn; rn = route_next (rn))
-        RNODE_FOREACH_RIB (rn, rib)
-          if (rib->type == type)
-            {
-              if (first)
-                {
-                  vty_out (vty, SHOW_ROUTE_V4_HEADER);
-                  first = 0;
-                }
-
-              if (vrf_header)
-                {
-                  vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
-                  vrf_header = 0;
-                }
-              vty_show_ip_route (vty, rn, rib, NULL);
-            }
-      vrf_header = 1;
-    }
-
-  return CMD_SUCCESS;
-}
-
-DEFUN (show_ip_route_vrf_all_addr,
-       show_ip_route_vrf_all_addr_cmd,
-       "show ip route " VRF_ALL_CMD_STR "  A.B.C.D",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_ALL_CMD_HELP_STR
-       "Network in the IP routing table to display\n")
-{
-  int ret;
-  struct prefix_ipv4 p;
-  struct route_table *table;
-  struct route_node *rn;
-  struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
-
-  ret = str2prefix_ipv4 (argv[0], &p);
-  if (ret <= 0)
-    {
-      vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
-      return CMD_WARNING;
-    }
-
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
-          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
-        continue;
-
-      rn = route_node_match (table, (struct prefix *) &p);
-      if (! rn)
-        continue;
-
-      vty_show_ip_route_detail (vty, rn, 0);
-
-      route_unlock_node (rn);
-    }
-
-  return CMD_SUCCESS;
-}
-
-DEFUN (show_ip_route_vrf_all_prefix,
-       show_ip_route_vrf_all_prefix_cmd,
-       "show ip route " VRF_ALL_CMD_STR " A.B.C.D/M",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_ALL_CMD_HELP_STR
-       "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
-{
-  int ret;
-  struct prefix_ipv4 p;
-  struct route_table *table;
-  struct route_node *rn;
-  struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
-
-  ret = str2prefix_ipv4 (argv[0], &p);
-  if (ret <= 0)
-    {
-      vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
-      return CMD_WARNING;
-    }
-
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    {
-      if ((zvrf = vrf_iter2info (iter)) == NULL ||
-          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
-        continue;
-
-      rn = route_node_match (table, (struct prefix *) &p);
-      if (! rn)
-        continue;
-      if (rn->p.prefixlen != p.prefixlen)
-        {
-          route_unlock_node (rn);
-          continue;
+          else
+            ifindex = ifp->ifindex;
+          ifname = gate_str;
         }
-
-      vty_show_ip_route_detail (vty, rn, 0);
-
-      route_unlock_node (rn);
-    }
-
-  return CMD_SUCCESS;
-}
-
-DEFUN (show_ip_route_vrf_all_summary,
-       show_ip_route_vrf_all_summary_cmd,
-       "show ip route " VRF_ALL_CMD_STR " summary ",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_ALL_CMD_HELP_STR
-       "Summary of all routes\n")
-{
-  struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
-
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if ((zvrf = vrf_iter2info (iter)) != NULL)
-      vty_show_ip_route_summary (vty, zvrf->table[AFI_IP][SAFI_UNICAST]);
-
-  return CMD_SUCCESS;
-}
-
-DEFUN (show_ip_route_vrf_all_summary_prefix,
-       show_ip_route_vrf_all_summary_prefix_cmd,
-       "show ip route " VRF_ALL_CMD_STR " summary prefix",
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_ALL_CMD_HELP_STR
-       "Summary of all routes\n"
-       "Prefix routes\n")
-{
-  struct zebra_vrf *zvrf;
-  vrf_iter_t iter;
-
-  for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
-    if ((zvrf = vrf_iter2info (iter)) != NULL)
-      vty_show_ip_route_summary_prefix (vty, zvrf->table[AFI_IP][SAFI_UNICAST]);
-
-  return CMD_SUCCESS;
-}
-
-/* Write IPv4 static route configuration. */
-static int
-static_config_ipv4 (struct vty *vty, safi_t safi, const char *cmd)
-{
-  struct route_node *rn;
-  struct static_route *si;
-  struct route_table *stable;
-  struct zebra_vrf *zvrf;
-  char buf[BUFSIZ];
-  int write =0;
-  struct listnode *node;
-
-  for (ALL_LIST_ELEMENTS_RO (zvrf_list, node, zvrf))
-    {
-      if ((stable = zvrf->stable[AFI_IP][safi]) == NULL)
-        continue;
-
-      for (rn = route_top (stable); rn; rn = route_next (rn))
-        for (si = rn->info; si; si = si->next)
-          {
-            vty_out (vty, "%s %s", cmd, prefix2str (&rn->p, buf, sizeof buf));
-
-            switch (si->type)
-              {
-              case STATIC_IPV4_GATEWAY:
-                vty_out (vty, " %s", inet_ntoa (si->addr.ipv4));
-                break;
-              case STATIC_IFINDEX:
-                vty_out (vty, " %s", si->ifname);
-                break;
-              case STATIC_BLACKHOLE:
-                vty_out (vty, " Null0");
-                break;
-              }
-
-            /* flags are incompatible with STATIC_BLACKHOLE */
-            if (si->type != STATIC_BLACKHOLE)
-              {
-                if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
-                  vty_out (vty, " %s", "reject");
-
-                if (CHECK_FLAG(si->flags, ZEBRA_FLAG_BLACKHOLE))
-                  vty_out (vty, " %s", "blackhole");
-              }
-
-            if (si->tag)
-              vty_out (vty, " tag %"ROUTE_TAG_PRI, si->tag);
-
-            if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT)
-              vty_out (vty, " %d", si->distance);
-
-            if (si->vrf_id != VRF_DEFAULT)
-                vty_out (vty, " vrf %s", zvrf ? zvrf->name : "");
-
-            /* Label information */
-            if (si->snh_label.num_labels)
-              vty_out (vty, " label %s",
-                       mpls_label2str (si->snh_label.num_labels,
-                                       si->snh_label.label, buf, sizeof buf));
-
-            vty_out (vty, "%s", VTY_NEWLINE);
-
-            write = 1;
-          }
-    }
-  return write;
-}
-
-/* General fucntion for IPv6 static route. */
-int
-static_ipv6_func (struct vty *vty, int add_cmd, const char *dest_str,
-                 const char *gate_str, const char *ifname,
-                 const char *flag_str, const char *tag_str,
-                  const char *distance_str, const char *vrf_id_str,
-                 const char *label_str)
-{
-  int ret;
-  u_char distance;
-  struct prefix p;
-  struct in6_addr *gate = NULL;
-  struct in6_addr gate_addr;
-  u_char type = STATIC_BLACKHOLE;
-  u_char flag = 0;
-  route_tag_t tag = 0;
-  unsigned int ifindex = 0;
-  struct interface *ifp = NULL;
-  struct zebra_vrf *zvrf;
-  struct static_nh_label snh_label;
-  
-  ret = str2prefix (dest_str, &p);
-  if (ret <= 0)
-    {
-      vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
-      return CMD_WARNING;
-    }
-
-  /* Apply mask for given prefix. */
-  apply_mask (&p);
-
-  /* Administrative distance. */
-  if (distance_str)
-    distance = atoi (distance_str);
-  else
-    distance = ZEBRA_STATIC_DISTANCE_DEFAULT;
-
-  /* tag */
-  if (tag_str)
-    tag = atol(tag_str);
-
-  /* When gateway is valid IPv6 addrees, then gate is treated as
-     nexthop address other case gate is treated as interface name. */
-  ret = inet_pton (AF_INET6, gate_str, &gate_addr);
-
-  /* VRF id */
-  zvrf = zebra_vrf_list_lookup_by_name (vrf_id_str);
-
-  if (!zvrf)
-    {
-      vty_out (vty, "%% vrf %s is not defined%s", vrf_id_str, VTY_NEWLINE);
-      return CMD_WARNING;
-    }
-
-  /* Labels */
-  memset (&snh_label, 0, sizeof (struct static_nh_label));
-  if (label_str)
-    {
-      if (!mpls_enabled)
-       {
-         vty_out (vty, "%% MPLS not turned on in kernel, ignoring command%s",
-                  VTY_NEWLINE);
-         return CMD_WARNING;
-       }
-      if (mpls_str2label (label_str, &snh_label.num_labels,
-                          snh_label.label))
-        {
-          vty_out (vty, "%% Malformed label(s)%s", VTY_NEWLINE);
-          return CMD_WARNING;
-        }
-    }
-
-  /* Null0 static route.  */
-  if ((gate_str != NULL) && (strncasecmp (gate_str, "Null0", strlen (gate_str)) == 0))
-    {
-      if (flag_str)
-        {
-          vty_out (vty, "%% can not have flag %s with Null0%s", flag_str, VTY_NEWLINE);
-          return CMD_WARNING;
-        }
-      if (add_cmd)
-        static_add_route (AFI_IP6, SAFI_UNICAST, type, &p, NULL, ifindex, ifname,
-                         ZEBRA_FLAG_BLACKHOLE, tag, distance, zvrf, &snh_label);
-      else
-        static_delete_route (AFI_IP6, SAFI_UNICAST, type, &p,  NULL, ifindex, tag,
-                            distance, zvrf, &snh_label);
-      return CMD_SUCCESS;
-    }
-
-  /* Route flags */
-  if (flag_str) {
-    switch(flag_str[0]) {
-      case 'r':
-      case 'R': /* XXX */
-        SET_FLAG (flag, ZEBRA_FLAG_REJECT);
-        break;
-      case 'b':
-      case 'B': /* XXX */
-        SET_FLAG (flag, ZEBRA_FLAG_BLACKHOLE);
-        break;
-      default:
-        vty_out (vty, "%% Malformed flag %s %s", flag_str, VTY_NEWLINE);
-        return CMD_WARNING;
-    }
-  }
-
- if (ifname)
-    {
-      /* When ifname is specified.  It must be come with gateway
-         address. */
-      if (ret != 1)
-       {
-         vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
-         return CMD_WARNING;
-       }
-      type = STATIC_IPV6_GATEWAY_IFINDEX;
-      gate = &gate_addr;
-      ifp = if_lookup_by_name_vrf (ifname, zvrf->vrf_id);
-      if (!ifp)
-       {
-         vty_out (vty, "%% Malformed Interface name %s%s", ifname, VTY_NEWLINE);
-         return CMD_WARNING;
-       }
-      ifindex = ifp->ifindex;
-    }
-  else
-    {
-      if (ret == 1)
-       {
-         type = STATIC_IPV6_GATEWAY;
-         gate = &gate_addr;
-       }
-      else
-       {
-         type = STATIC_IFINDEX;
-         ifp = if_lookup_by_name_vrf (gate_str, zvrf->vrf_id);
-         if (!ifp)
-           {
-             vty_out (vty, "%% Malformed Interface name %s%s", gate_str, VTY_NEWLINE);
-              ifindex = IFINDEX_DELETED;
-           }
-          else
-           ifindex = ifp->ifindex;
-         ifname = gate_str;
-       }
-    }
-
-  if (add_cmd)
-    static_add_route (AFI_IP6, SAFI_UNICAST, type, &p, (union g_addr *)gate,
-                     ifindex, ifname, flag, tag, distance, zvrf, &snh_label);
-  else
-    static_delete_route (AFI_IP6, SAFI_UNICAST, type, &p, (union g_addr *)gate,
-                        ifindex, tag, distance, zvrf, &snh_label);
-
-  return CMD_SUCCESS;
-}
-
-DEFUN (ipv6_route,
-       ipv6_route_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0)",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Null interface\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL, NULL, NULL, NULL);
-}
-
-DEFUN (ipv6_route_tag,
-       ipv6_route_tag_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) tag <1-4294967295>",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Null interface\n"
-       "Set tag for this route\n"
-       "Tag value\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, argv[2], NULL, NULL, NULL);
-}
-
-DEFUN (ipv6_route_flags,
-       ipv6_route_flags_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole)",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL, NULL, NULL, NULL);
-}
-
-DEFUN (ipv6_route_flags_tag,
-       ipv6_route_flags_tag_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-4294967295>",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3], NULL, NULL, NULL);
-}
-
-DEFUN (ipv6_route_ifname,
-       ipv6_route_ifname_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL, NULL, NULL, NULL);
-}
-DEFUN (ipv6_route_ifname_tag,
-       ipv6_route_ifname_tag_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-4294967295>",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Set tag for this route\n"
-       "Tag value\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3], NULL, NULL, NULL);
-}
-
-DEFUN (ipv6_route_ifname_flags,
-       ipv6_route_ifname_flags_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole)",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL, NULL, NULL, NULL);
-}
-
-DEFUN (ipv6_route_ifname_flags_tag,
-       ipv6_route_ifname_flags_tag_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-4294967295>",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4], NULL, NULL, NULL);
-}
-
-DEFUN (ipv6_route_pref,
-       ipv6_route_pref_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) <1-255>",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Null interface\n"
-       "Distance value for this prefix\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL, argv[2], NULL, NULL);
-}
-
-DEFUN (ipv6_route_pref_tag,
-       ipv6_route_pref_tag_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) tag <1-4294967295> <1-255>",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Null interface\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this prefix\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, argv[2], argv[3], NULL, NULL);
-}
-
-DEFUN (ipv6_route_flags_pref,
-       ipv6_route_flags_pref_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255>",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this prefix\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL, argv[3], NULL, NULL);
-}
-
-DEFUN (ipv6_route_flags_pref_tag,
-       ipv6_route_flags_pref_tag_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-4294967295> <1-255>",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this prefix\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3], argv[4], NULL, NULL);
-}
-
-DEFUN (ipv6_route_ifname_pref,
-       ipv6_route_ifname_pref_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255>",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Distance value for this prefix\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL, argv[3], NULL, NULL);
-}
-
-DEFUN (ipv6_route_ifname_pref_tag,
-       ipv6_route_ifname_pref_tag_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-4294967295> <1-255>",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this prefix\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3], argv[4], NULL, NULL);
-}
-
-DEFUN (ipv6_route_ifname_flags_pref,
-       ipv6_route_ifname_flags_pref_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255>",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this prefix\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL, argv[4], NULL, NULL);
-}
-
-DEFUN (ipv6_route_ifname_flags_pref_tag,
-       ipv6_route_ifname_flags_pref_tag_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-4294967295> <1-255>",
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this prefix\n")
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], NULL, NULL);
-}
-
-DEFUN (no_ipv6_route,
-       no_ipv6_route_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0)",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Null Interface\n")
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL, NULL, NULL, NULL);
-}
-
-DEFUN (no_ipv6_route_tag,
-       no_ipv6_route_tag_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) tag <1-4294967295>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Null interface\n"
-       "Set tag for this route\n"
-       "Tag value\n")
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, argv[2], NULL, NULL, NULL);
-}
-
-DEFUN (no_ipv6_route_flags,
-       no_ipv6_route_flags_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole)",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n")
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], NULL, NULL, NULL, NULL);
-}
-
-DEFUN (no_ipv6_route_flags_tag,
-       no_ipv6_route_flags_tag_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-4294967295>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n")
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3], NULL, NULL, NULL);
-}
-
-DEFUN (no_ipv6_route_ifname,
-       no_ipv6_route_ifname_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n")
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL, NULL, NULL, NULL);
-}
-
-DEFUN (no_ipv6_route_ifname_tag,
-       no_ipv6_route_ifname_tag_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-4294967295>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Set tag for this route\n"
-       "Tag value\n")
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3], NULL, NULL, NULL);
-}
-
-DEFUN (no_ipv6_route_ifname_flags,
-       no_ipv6_route_ifname_flags_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole)",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n")
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], NULL, NULL, NULL, NULL);
-}
-
-DEFUN (no_ipv6_route_ifname_flags_tag,
-       no_ipv6_route_ifname_flags_tag_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-4294967295>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n")
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4], NULL, NULL, NULL);
-}
-
-DEFUN (no_ipv6_route_pref,
-       no_ipv6_route_pref_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Null interface\n"
-       "Distance value for this prefix\n")
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL, argv[2], NULL, NULL);
-}
-
-DEFUN (no_ipv6_route_pref_tag,
-       no_ipv6_route_pref_tag_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) tag <1-4294967295> <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Null interface\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this prefix\n")
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, argv[2], argv[3], NULL, NULL);
-}
-
-DEFUN (no_ipv6_route_flags_pref,
-       no_ipv6_route_flags_pref_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this prefix\n")
-{
-  /* We do not care about argv[2] */
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], NULL, argv[3], NULL, NULL);
-}
-
-DEFUN (no_ipv6_route_flags_pref_tag,
-       no_ipv6_route_flags_pref_tag_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-4294967295> <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this prefix\n")
-{
-  /* We do not care about argv[2] */
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3], argv[4], NULL, NULL);
-}
-
-DEFUN (no_ipv6_route_ifname_pref,
-       no_ipv6_route_ifname_pref_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Distance value for this prefix\n")
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL, argv[3], NULL, NULL);
-}
-
-DEFUN (no_ipv6_route_ifname_pref_tag,
-       no_ipv6_route_ifname_pref_tag_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-4294967295> <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this prefix\n")
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3], argv[4], NULL, NULL);
-}
-
-DEFUN (no_ipv6_route_ifname_flags_pref,
-       no_ipv6_route_ifname_flags_pref_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this prefix\n")
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], NULL, argv[4], NULL, NULL);
-}
-
-DEFUN (no_ipv6_route_ifname_flags_pref_tag,
-       no_ipv6_route_ifname_flags_pref_tag_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-4294967295> <1-255>",
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this prefix\n")
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], NULL, NULL);
-}
-
-DEFUN (ipv6_route_vrf,
-       ipv6_route_vrf_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Null interface\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL, NULL, argv[2], NULL);
-}
-
-DEFUN (ipv6_route_tag_vrf,
-       ipv6_route_tag_vrf_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) tag <1-4294967295> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Null interface\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, argv[2], NULL, argv[3], NULL);
-}
-
-DEFUN (ipv6_route_flags_vrf,
-       ipv6_route_flags_vrf_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL, NULL, argv[3], NULL);
-}
-
-DEFUN (ipv6_route_flags_tag_vrf,
-       ipv6_route_flags_tag_vrf_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-4294967295> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3], NULL, argv[4], NULL);
-}
-
-DEFUN (ipv6_route_ifname_vrf,
-       ipv6_route_ifname_vrf_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL, NULL, argv[3], NULL);
-}
-DEFUN (ipv6_route_ifname_tag_vrf,
-       ipv6_route_ifname_tag_vrf_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-4294967295> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3], NULL, argv[4], NULL);
-}
-
-DEFUN (ipv6_route_ifname_flags_vrf,
-       ipv6_route_ifname_flags_vrf_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL, NULL, argv[4], NULL);
-}
-
-DEFUN (ipv6_route_ifname_flags_tag_vrf,
-       ipv6_route_ifname_flags_tag_vrf_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-4294967295> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4], NULL, argv[5], NULL);
-}
-
-DEFUN (ipv6_route_pref_vrf,
-       ipv6_route_pref_vrf_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) <1-255> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Null interface\n"
-       "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL, argv[2], argv[3], NULL);
-}
-
-DEFUN (ipv6_route_pref_tag_vrf,
-       ipv6_route_pref_tag_vrf_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) tag <1-4294967295> <1-255> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Null interface\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, argv[2], argv[3], argv[4], NULL);
-}
-
-DEFUN (ipv6_route_flags_pref_vrf,
-       ipv6_route_flags_pref_vrf_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL, argv[3], argv[4], NULL);
-}
-
-DEFUN (ipv6_route_flags_pref_tag_vrf,
-       ipv6_route_flags_pref_tag_vrf_cmd,
-       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-4294967295> <1-255> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3], argv[4], argv[5], NULL);
-}
-
-DEFUN (ipv6_route_ifname_pref_vrf,
-       ipv6_route_ifname_pref_vrf_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL, argv[3], argv[4], NULL);
-}
-
-DEFUN (ipv6_route_ifname_pref_tag_vrf,
-       ipv6_route_ifname_pref_tag_vrf_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-4294967295> <1-255> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3], argv[4], argv[5], NULL);
-}
-
-DEFUN (ipv6_route_ifname_flags_pref_vrf,
-       ipv6_route_ifname_flags_pref_vrf_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL, argv[4], argv[5], NULL);
-}
-
-DEFUN (ipv6_route_ifname_flags_pref_tag_vrf,
-       ipv6_route_ifname_flags_pref_tag_vrf_cmd,
-       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-4294967295> <1-255> " VRF_CMD_STR,
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], NULL);
-}
-
-DEFUN (no_ipv6_route_vrf,
-       no_ipv6_route_vrf_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Null interface\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL, NULL, argv[2], NULL);
-}
-
-DEFUN (no_ipv6_route_tag_vrf,
-       no_ipv6_route_tag_vrf_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) tag <1-4294967295> " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Null interface\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, argv[2], NULL, argv[3], NULL);
-}
-
-DEFUN (no_ipv6_route_flags_vrf,
-       no_ipv6_route_flags_vrf_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], NULL, NULL, argv[3], NULL);
-}
-
-DEFUN (no_ipv6_route_flags_tag_vrf,
-       no_ipv6_route_flags_tag_vrf_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-4294967295> " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Set tag for this route\n"
-       "Tag value\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3], NULL, argv[4], NULL);
-}
-
-DEFUN (no_ipv6_route_ifname_vrf,
-       no_ipv6_route_ifname_vrf_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL, NULL, argv[3], NULL);
+    }
+
+  if (add_cmd)
+    static_add_route (AFI_IP6, SAFI_UNICAST, type, &p, (union g_addr *)gate,
+                      ifindex, ifname, flag, tag, distance, zvrf, &snh_label);
+  else
+    static_delete_route (AFI_IP6, SAFI_UNICAST, type, &p, (union g_addr *)gate,
+                         ifindex, tag, distance, zvrf, &snh_label);
+
+  return CMD_SUCCESS;
 }
 
-DEFUN (no_ipv6_route_ifname_tag_vrf,
-       no_ipv6_route_ifname_tag_vrf_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-4294967295> " VRF_CMD_STR,
-       NO_STR
+DEFUN (ipv6_route,
+       ipv6_route_cmd,
+       "ipv6 route X:X::X:X/M <X:X::X:X|INTERFACE|null0> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
        IP_STR
        "Establish static routes\n"
        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        "IPv6 gateway address\n"
        "IPv6 gateway interface name\n"
+       "Null interface\n"
+       "Null interface\n"
        "Set tag for this route\n"
        "Tag value\n"
-       VRF_CMD_HELP_STR)
+       "Distance value for this prefix\n"
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3], NULL, argv[4], NULL);
-}
+  int idx_ipv6_prefixlen = 2;
+  int idx_ipv6_ifname = 3;
+  int idx_curr = 4;
+  char *tag, *distance, *vrf;
 
-DEFUN (no_ipv6_route_ifname_flags_vrf,
-       no_ipv6_route_ifname_flags_vrf_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], NULL, NULL, argv[4], NULL);
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return static_ipv6_func (vty, 1,
+                          argv[idx_ipv6_prefixlen]->arg,
+                          argv[idx_ipv6_ifname]->arg,
+                          NULL, NULL,
+                          tag, distance, vrf, NULL);
 }
 
-DEFUN (no_ipv6_route_ifname_flags_tag_vrf,
-       no_ipv6_route_ifname_flags_tag_vrf_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-4294967295> " VRF_CMD_STR,
-       NO_STR
+DEFUN (ipv6_route_flags,
+       ipv6_route_flags_cmd,
+       "ipv6 route X:X::X:X/M <X:X::X:X|INTERFACE> <reject|blackhole> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
        IP_STR
        "Establish static routes\n"
        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
@@ -4754,69 +2638,66 @@ DEFUN (no_ipv6_route_ifname_flags_tag_vrf,
        "IPv6 gateway interface name\n"
        "Emit an ICMP unreachable when matched\n"
        "Silently discard pkts when matched\n"
+       "Silently discard pkts when matched\n"
        "Set tag for this route\n"
        "Tag value\n"
-       VRF_CMD_HELP_STR)
-{
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4], NULL, argv[5], NULL);
-}
-
-DEFUN (no_ipv6_route_pref_vrf,
-       no_ipv6_route_pref_vrf_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) <1-255> " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Null interface\n"
        "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL, argv[2], argv[3], NULL);
+  int idx_ipv6_prefixlen = 2;
+  int idx_ipv6_ifname = 3;
+  int idx_reject_blackhole = 4;
+  int idx_curr = 5;
+  char *tag, *distance, *vrf;
+
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return static_ipv6_func (vty, 1,
+                          argv[idx_ipv6_prefixlen]->arg,
+                          argv[idx_ipv6_ifname]->arg,
+                          NULL,
+                          argv[idx_reject_blackhole]->arg,
+                          tag, distance, vrf, NULL);
 }
 
-DEFUN (no_ipv6_route_pref_tag_vrf,
-       no_ipv6_route_pref_tag_vrf_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) tag <1-4294967295> <1-255> " VRF_CMD_STR,
-       NO_STR
+DEFUN (ipv6_route_ifname,
+       ipv6_route_ifname_cmd,
+       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf NAME]",
        IP_STR
        "Establish static routes\n"
        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        "IPv6 gateway address\n"
        "IPv6 gateway interface name\n"
-       "Null interface\n"
        "Set tag for this route\n"
        "Tag value\n"
        "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, argv[2], argv[3], argv[4], NULL);
-}
+  int idx_ipv6_prefixlen = 2;
+  int idx_ipv6 = 3;
+  int idx_interface = 4;
+  int idx_curr = 5;
+  char *tag, *distance, *vrf;
 
-DEFUN (no_ipv6_route_flags_pref_vrf,
-       no_ipv6_route_flags_pref_vrf_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
-       NO_STR
-       IP_STR
-       "Establish static routes\n"
-       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
-       "IPv6 gateway address\n"
-       "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
-       "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
-{
-  /* We do not care about argv[2] */
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], NULL, argv[3], argv[4], NULL);
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return static_ipv6_func (vty, 1,
+                          argv[idx_ipv6_prefixlen]->arg,
+                          argv[idx_ipv6]->arg,
+                          argv[idx_interface]->arg,
+                          NULL,
+                          tag, distance, vrf, NULL);
 }
 
-DEFUN (no_ipv6_route_flags_pref_tag_vrf,
-       no_ipv6_route_flags_pref_tag_vrf_cmd,
-       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-4294967295> <1-255> " VRF_CMD_STR,
-       NO_STR
+DEFUN (ipv6_route_ifname_flags,
+       ipv6_route_ifname_flags_cmd,
+       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE <reject|blackhole> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
        IP_STR
        "Establish static routes\n"
        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
@@ -4827,64 +2708,131 @@ DEFUN (no_ipv6_route_flags_pref_tag_vrf,
        "Set tag for this route\n"
        "Tag value\n"
        "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  /* We do not care about argv[2] */
-  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3], argv[4], argv[5], NULL);
+  int idx_ipv6_prefixlen = 2;
+  int idx_ipv6 = 3;
+  int idx_interface = 4;
+  int idx_reject_blackhole = 5;
+  int idx_curr = 6;
+  char *tag, *distance, *vrf;
+
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return static_ipv6_func (vty, 1,
+                          argv[idx_ipv6_prefixlen]->arg,
+                          argv[idx_ipv6]->arg,
+                          argv[idx_interface]->arg,
+                          argv[idx_reject_blackhole]->arg,
+                          tag, distance, vrf, NULL);
 }
 
-DEFUN (no_ipv6_route_ifname_pref_vrf,
-       no_ipv6_route_ifname_pref_vrf_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255> " VRF_CMD_STR,
+DEFUN (no_ipv6_route,
+       no_ipv6_route_cmd,
+       "no ipv6 route X:X::X:X/M <X:X::X:X|INTERFACE|null0> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
        NO_STR
        IP_STR
        "Establish static routes\n"
        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        "IPv6 gateway address\n"
        "IPv6 gateway interface name\n"
+       "Null interface\n"
+       "Set tag for this route\n"
+       "Tag value\n"
        "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL, argv[3], argv[4], NULL);
+  int idx_ipv6_prefixlen = 3;
+  int idx_ipv6_ifname = 4;
+  int idx_curr = 5;
+  char *tag, *distance, *vrf;
+
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return static_ipv6_func (vty, 0,
+                          argv[idx_ipv6_prefixlen]->arg,
+                          argv[idx_ipv6_ifname]->arg,
+                          NULL, NULL,
+                          tag, distance, vrf, NULL);
 }
 
-DEFUN (no_ipv6_route_ifname_pref_tag_vrf,
-       no_ipv6_route_ifname_pref_tag_vrf_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-4294967295> <1-255> " VRF_CMD_STR,
+DEFUN (no_ipv6_route_flags,
+       no_ipv6_route_flags_cmd,
+       "no ipv6 route X:X::X:X/M <X:X::X:X|INTERFACE> <reject|blackhole> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
        NO_STR
        IP_STR
        "Establish static routes\n"
        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        "IPv6 gateway address\n"
        "IPv6 gateway interface name\n"
+       "Emit an ICMP unreachable when matched\n"
+       "Silently discard pkts when matched\n"
        "Set tag for this route\n"
        "Tag value\n"
        "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3], argv[4], argv[5], NULL);
+  int idx_ipv6_prefixlen = 3;
+  int idx_ipv6_ifname = 4;
+  int idx_reject_blackhole = 5;
+  int idx_curr = 5;
+  char *tag, *distance, *vrf;
+
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return static_ipv6_func (vty, 0,
+                          argv[idx_ipv6_prefixlen]->arg,
+                          argv[idx_ipv6_ifname]->arg,
+                          NULL,
+                          argv[idx_reject_blackhole]->arg,
+                          tag, distance, vrf, NULL);
 }
 
-DEFUN (no_ipv6_route_ifname_flags_pref_vrf,
-       no_ipv6_route_ifname_flags_pref_vrf_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255> " VRF_CMD_STR,
+DEFUN (no_ipv6_route_ifname,
+       no_ipv6_route_ifname_cmd,
+       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE [tag (1-4294967295)] [(1-255)] [vrf NAME]",
        NO_STR
        IP_STR
        "Establish static routes\n"
        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        "IPv6 gateway address\n"
        "IPv6 gateway interface name\n"
-       "Emit an ICMP unreachable when matched\n"
-       "Silently discard pkts when matched\n"
+       "Set tag for this route\n"
+       "Tag value\n"
        "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], NULL, argv[4], argv[5], NULL);
+  int idx_ipv6_prefixlen = 3;
+  int idx_ipv6 = 4;
+  int idx_interface = 5;
+  int idx_curr = 6;
+  char *tag, *distance, *vrf;
+
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return static_ipv6_func (vty, 0,
+                          argv[idx_ipv6_prefixlen]->arg,
+                          argv[idx_ipv6]->arg,
+                          argv[idx_interface]->arg,
+                          NULL,
+                          tag, distance, vrf, NULL);
 }
 
-DEFUN (no_ipv6_route_ifname_flags_pref_tag_vrf,
-       no_ipv6_route_ifname_flags_pref_tag_vrf_cmd,
-       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-4294967295> <1-255> " VRF_CMD_STR,
+DEFUN (no_ipv6_route_ifname_flags,
+       no_ipv6_route_ifname_flags_cmd,
+       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE <reject|blackhole> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
        NO_STR
        IP_STR
        "Establish static routes\n"
@@ -4896,17 +2844,36 @@ DEFUN (no_ipv6_route_ifname_flags_pref_tag_vrf,
        "Set tag for this route\n"
        "Tag value\n"
        "Distance value for this prefix\n"
-       VRF_CMD_HELP_STR)
+       VRF_CMD_HELP_STR
+       "Specify labels for this route\n"
+       "One or more labels separated by '/'\n")
 {
-  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], NULL);
+  int idx_ipv6_prefixlen = 3;
+  int idx_ipv6 = 4;
+  int idx_interface = 5;
+  int idx_reject_blackhole = 6;
+  int idx_curr = 7;
+  char *tag, *distance, *vrf;
+
+  tag = distance = vrf = NULL;
+  zebra_vty_ip_route_tdv_helper (argc, argv, idx_curr, &tag, &distance, &vrf, NULL);
+
+  return static_ipv6_func (vty, 0,
+                          argv[idx_ipv6_prefixlen]->arg,
+                          argv[idx_ipv6]->arg,
+                          argv[idx_interface]->arg,
+                          argv[idx_reject_blackhole]->arg,
+                          tag, distance, vrf, NULL);
 }
 
 DEFUN (show_ipv6_route,
        show_ipv6_route_cmd,
-       "show ipv6 route {json}",
+       "show ipv6 route [vrf NAME] [json]",
        SHOW_STR
        IP_STR
-       "IPv6 routing table\n")
+       "IPv6 routing table\n"
+       VRF_CMD_HELP_STR
+       "Output JSON\n")
 {
   struct route_table *table;
   struct route_node *rn;
@@ -4917,33 +2884,36 @@ DEFUN (show_ipv6_route,
   char buf[BUFSIZ];
   json_object *json = NULL;
   json_object *json_prefix = NULL;
-  u_char uj = use_json(argc, argv);
 
-  if (argc > 0 && argv[0] && strcmp(argv[0], "json") != 0)
-    {
-     if (!(zvrf = zebra_vrf_list_lookup_by_name (argv[0])))
-        {
-          if (uj)
-            vty_out (vty, "{}%s", VTY_NEWLINE);
-          else
-            vty_out (vty, "vrf %s not defined%s", argv[0], VTY_NEWLINE);
-          return CMD_SUCCESS;
-        }
+  int vrf = (argc > 3 && strmatch (argv[3]->text, "vrf"));
+  int uj = vrf ? argc == 6 : argc == 4;
+  char *vrfname = vrf ? argv[4]->arg : NULL;
 
-      if (zvrf->vrf_id == VRF_UNKNOWN)
-        {
-          if (uj)
-            vty_out (vty, "{}%s", VTY_NEWLINE);
-          else
-            vty_out (vty, "vrf %s inactive%s", argv[0], VTY_NEWLINE);
-          return CMD_SUCCESS;
-        }
-      else
-        vrf_id = zvrf->vrf_id;
-    }
+  if (vrf)
+  {
+    if (!(zvrf = zebra_vrf_list_lookup_by_name (vrfname)))
+       {
+         if (uj)
+           vty_out (vty, "{}%s", VTY_NEWLINE);
+         else
+           vty_out (vty, "vrf %s not defined%s", vrfname, VTY_NEWLINE);
+         return CMD_SUCCESS;
+       }
+
+     if (zvrf->vrf_id == VRF_UNKNOWN)
+       {
+         if (uj)
+           vty_out (vty, "{}%s", VTY_NEWLINE);
+         else
+           vty_out (vty, "vrf %s inactive%s", vrfname, VTY_NEWLINE);
+         return CMD_SUCCESS;
+       }
+     else
+       vrf_id = zvrf->vrf_id;
+  }
 
   table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
-  if (! table)
+  if (!table)
     {
       if (uj)
         vty_out (vty, "{}%s", VTY_NEWLINE);
@@ -4995,23 +2965,19 @@ DEFUN (show_ipv6_route,
   return CMD_SUCCESS;
 }
 
-ALIAS (show_ipv6_route,
-       show_ipv6_route_vrf_cmd,
-       "show ipv6 route  " VRF_CMD_STR " {json}",
-       SHOW_STR
-       IP_STR
-       "IPv6 routing table\n"
-       VRF_CMD_HELP_STR)
-
 DEFUN (show_ipv6_route_tag,
        show_ipv6_route_tag_cmd,
-       "show ipv6 route tag <1-4294967295>",
+       "show ipv6 route [vrf NAME] tag (1-4294967295)",
        SHOW_STR
        IP_STR
        "IPv6 routing table\n"
+       VRF_CMD_HELP_STR
        "Show only routes with tag\n"
        "Tag value\n")
 {
+  int idx_vrf = 3;
+  int idx_name = 4;
+  int idx_tag = 6;
   struct route_table *table;
   struct route_node *rn;
   struct rib *rib;
@@ -5019,13 +2985,16 @@ DEFUN (show_ipv6_route_tag,
   route_tag_t tag = 0;
   vrf_id_t vrf_id = VRF_DEFAULT;
 
-  if (argc > 1)
+  if (strmatch(argv[idx_vrf]->text, "vrf"))
     {
-      VRF_GET_ID (vrf_id, argv[0]);
-      tag = atol(argv[1]);
+      VRF_GET_ID (vrf_id, argv[idx_name]->arg);
+      tag = atol(argv[idx_tag]->arg);
     }
   else
-    tag = atol(argv[0]);
+    {
+      idx_tag -= 2;
+      tag = atol(argv[idx_tag]->arg);
+    }
 
   table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
   if (! table)
@@ -5048,22 +3017,13 @@ DEFUN (show_ipv6_route_tag,
   return CMD_SUCCESS;
 }
 
-ALIAS (show_ipv6_route_tag,
-       show_ipv6_route_vrf_tag_cmd,
-       "show ipv6 route " VRF_CMD_STR " tag <1-4294967295>",
-       SHOW_STR
-       IP_STR
-       "IPv6 routing table\n"
-       VRF_CMD_HELP_STR
-       "Show only routes with tag\n"
-       "Tag value\n")
-
 DEFUN (show_ipv6_route_prefix_longer,
        show_ipv6_route_prefix_longer_cmd,
-       "show ipv6 route X:X::X:X/M longer-prefixes",
+       "show ipv6 route [vrf NAME] X:X::X:X/M longer-prefixes",
        SHOW_STR
        IP_STR
        "IPv6 routing table\n"
+       VRF_CMD_HELP_STR
        "IPv6 prefix\n"
        "Show route matching the specified Network/Mask pair only\n")
 {
@@ -5075,13 +3035,15 @@ DEFUN (show_ipv6_route_prefix_longer,
   int first = 1;
   vrf_id_t vrf_id = VRF_DEFAULT;
 
-  if (argc > 1)
+  if (strmatch(argv[3]->text, "vrf"))
     {
-      VRF_GET_ID (vrf_id, argv[0]);
-      ret = str2prefix (argv[1], &p);
+      VRF_GET_ID (vrf_id, argv[4]->arg);
+      ret = str2prefix (argv[5]->arg, &p);
     }
   else
-    ret = str2prefix (argv[0], &p);
+    {
+      ret = str2prefix (argv[3]->arg, &p);
+    }
 
   if (! ret)
     {
@@ -5108,23 +3070,14 @@ DEFUN (show_ipv6_route_prefix_longer,
   return CMD_SUCCESS;
 }
 
-ALIAS (show_ipv6_route_prefix_longer,
-       show_ipv6_route_vrf_prefix_longer_cmd,
-       "show ipv6 route " VRF_CMD_STR " X:X::X:X/M longer-prefixes",
-       SHOW_STR
-       IP_STR
-       "IPv6 routing table\n"
-       VRF_CMD_HELP_STR
-       "IPv6 prefix\n"
-       "Show route matching the specified Network/Mask pair only\n")
-
 DEFUN (show_ipv6_route_protocol,
        show_ipv6_route_protocol_cmd,
-       "show ipv6 route " QUAGGA_IP6_REDIST_STR_ZEBRA,
+       "show ipv6 route [vrf NAME] <kernel|connected|static|ripng|ospf6|isis|bgp|table>",
        SHOW_STR
        IP_STR
        "IP routing table\n"
-       QUAGGA_IP6_REDIST_HELP_STR_ZEBRA)
+       VRF_CMD_HELP_STR
+       QUAGGA_IP6_REDIST_HELP_STR_ZEBRA)
 {
   int type;
   struct route_table *table;
@@ -5133,13 +3086,16 @@ DEFUN (show_ipv6_route_protocol,
   int first = 1;
   vrf_id_t vrf_id = VRF_DEFAULT;
 
-  if ( argc >1 )
+  char *vrfname = (argc == 6) ? argv[4]->arg : NULL;
+  char *proto = argv[argc - 1]->text;
+
+  if (vrfname)
     {
-      VRF_GET_ID (vrf_id, argv[0]);
-      type = proto_redistnum (AFI_IP6, argv[1]);
+      VRF_GET_ID (vrf_id, vrfname);
+      type = proto_redistnum (AFI_IP6, proto);
     }
   else
-    type = proto_redistnum (AFI_IP6, argv[0]);
+    type = proto_redistnum (AFI_IP6, proto);
 
   if (type < 0)
     {
@@ -5166,21 +3122,13 @@ DEFUN (show_ipv6_route_protocol,
   return CMD_SUCCESS;
 }
 
-ALIAS (show_ipv6_route_protocol,
-       show_ipv6_route_vrf_protocol_cmd,
-       "show ipv6 route "  VRF_CMD_STR "  " QUAGGA_IP6_REDIST_STR_ZEBRA,
-       SHOW_STR
-       IP_STR
-       "IP routing table\n"
-       VRF_CMD_HELP_STR
-       QUAGGA_IP6_REDIST_HELP_STR_ZEBRA)
-
 DEFUN (show_ipv6_route_addr,
        show_ipv6_route_addr_cmd,
-       "show ipv6 route X:X::X:X",
+       "show ipv6 route [vrf NAME] X:X::X:X",
        SHOW_STR
        IP_STR
        "IPv6 routing table\n"
+       VRF_CMD_HELP_STR
        "IPv6 Address\n")
 {
   int ret;
@@ -5189,13 +3137,15 @@ DEFUN (show_ipv6_route_addr,
   struct route_node *rn;
   vrf_id_t vrf_id = VRF_DEFAULT;
 
-  if (argc > 1 )
+  if (strmatch(argv[3]->text, "vrf"))
     {
-      VRF_GET_ID (vrf_id, argv[0]);
-      ret = str2prefix_ipv6 (argv[1], &p);
+      VRF_GET_ID (vrf_id, argv[4]->arg);
+      ret = str2prefix_ipv6 (argv[5]->arg, &p);
     }
   else
-    ret = str2prefix_ipv6 (argv[0], &p);
+    {
+      ret = str2prefix_ipv6 (argv[3]->arg, &p);
+    }
 
   if (ret <= 0)
     {
@@ -5221,21 +3171,13 @@ DEFUN (show_ipv6_route_addr,
   return CMD_SUCCESS;
 }
 
-ALIAS (show_ipv6_route_addr,
-       show_ipv6_route_vrf_addr_cmd,
-       "show ipv6 route " VRF_CMD_STR " X:X::X:X",
-       SHOW_STR
-       IP_STR
-       "IPv6 routing table\n"
-       VRF_CMD_HELP_STR
-       "IPv6 Address\n")
-
 DEFUN (show_ipv6_route_prefix,
        show_ipv6_route_prefix_cmd,
-       "show ipv6 route X:X::X:X/M",
+       "show ipv6 route [vrf NAME] X:X::X:X/M",
        SHOW_STR
        IP_STR
        "IPv6 routing table\n"
+       VRF_CMD_HELP_STR
        "IPv6 prefix\n")
 {
   int ret;
@@ -5244,13 +3186,13 @@ DEFUN (show_ipv6_route_prefix,
   struct route_node *rn;
   vrf_id_t vrf_id = VRF_DEFAULT;
 
-  if (argc > 1)
+  if (strmatch(argv[3]->text, "vrf"))
     {
-      VRF_GET_ID (vrf_id, argv[0]);
-      ret = str2prefix_ipv6 (argv[1], &p);
+      VRF_GET_ID (vrf_id, argv[4]->arg);
+      ret = str2prefix_ipv6 (argv[5]->arg, &p);
     }
   else
-    ret = str2prefix_ipv6 (argv[0], &p);
+    ret = str2prefix_ipv6 (argv[3]->arg, &p);
 
   if (ret <= 0)
     {
@@ -5276,29 +3218,22 @@ DEFUN (show_ipv6_route_prefix,
   return CMD_SUCCESS;
 }
 
-ALIAS (show_ipv6_route_prefix,
-       show_ipv6_route_vrf_prefix_cmd,
-       "show ipv6 route " VRF_CMD_STR " X:X::X:X/M ",
-       SHOW_STR
-       IP_STR
-       "IPv6 routing table\n"
-       VRF_CMD_HELP_STR
-       "IPv6 prefix\n")
 
 /* Show route summary.  */
 DEFUN (show_ipv6_route_summary,
        show_ipv6_route_summary_cmd,
-       "show ipv6 route summary",
+       "show ipv6 route [vrf NAME] summary",
        SHOW_STR
        IP_STR
        "IPv6 routing table\n"
+       VRF_CMD_HELP_STR
        "Summary of all IPv6 routes\n")
 {
   struct route_table *table;
   vrf_id_t vrf_id = VRF_DEFAULT;
 
-  if (argc > 0)
-    VRF_GET_ID (vrf_id, argv[0]);
+  if (strmatch(argv[3]->text, "vrf"))
+    VRF_GET_ID (vrf_id, argv[4]->arg);
 
   table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
   if (! table)
@@ -5309,30 +3244,23 @@ DEFUN (show_ipv6_route_summary,
   return CMD_SUCCESS;
 }
 
-ALIAS (show_ipv6_route_summary,
-       show_ipv6_route_vrf_summary_cmd,
-       "show ipv6 route " VRF_CMD_STR " summary",
-       SHOW_STR
-       IP_STR
-       "IPv6 routing table\n"
-       VRF_CMD_HELP_STR
-       "Summary of all IPv6 routes\n")
 
 /* Show ipv6 route summary prefix.  */
 DEFUN (show_ipv6_route_summary_prefix,
        show_ipv6_route_summary_prefix_cmd,
-       "show ipv6 route summary prefix",
+       "show ipv6 route [vrf NAME] summary prefix",
        SHOW_STR
        IP_STR
        "IPv6 routing table\n"
+       VRF_CMD_HELP_STR
        "Summary of all IPv6 routes\n"
        "Prefix routes\n")
 {
   struct route_table *table;
   vrf_id_t vrf_id = VRF_DEFAULT;
 
-  if (argc > 0)
-    VRF_GET_ID (vrf_id, argv[0]);
+  if (strmatch(argv[3]->text, "vrf"))
+    VRF_GET_ID (vrf_id, argv[4]->arg);
 
   table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
   if (! table)
@@ -5343,27 +3271,18 @@ DEFUN (show_ipv6_route_summary_prefix,
   return CMD_SUCCESS;
 }
 
-ALIAS (show_ipv6_route_summary_prefix,
-       show_ipv6_route_vrf_summary_prefix_cmd,
-       "show ipv6 route " VRF_CMD_STR " summary prefix",
-       SHOW_STR
-       IP_STR
-       "IPv6 routing table\n"
-       VRF_CMD_HELP_STR
-       "Summary of all IPv6 routes\n"
-       "Prefix routes\n")
 
 /*
  * Show IPv6 mroute command.Used to dump
  * the Multicast routing table.
  */
-
 DEFUN (show_ipv6_mroute,
        show_ipv6_mroute_cmd,
-       "show ipv6 mroute",
+       "show ipv6 mroute [vrf NAME]",
        SHOW_STR
        IP_STR
-       "IPv6 Multicast routing table\n")
+       "IPv6 Multicast routing table\n"
+       VRF_CMD_HELP_STR)
 {
   struct route_table *table;
   struct route_node *rn;
@@ -5371,8 +3290,8 @@ DEFUN (show_ipv6_mroute,
   int first = 1;
   vrf_id_t vrf_id = VRF_DEFAULT;
 
-  if (argc > 0)
-    VRF_GET_ID (vrf_id, argv[0]);
+  if (strmatch(argv[3]->text, "vrf"))
+    VRF_GET_ID (vrf_id, argv[4]->arg);
 
   table = zebra_vrf_table (AFI_IP6, SAFI_MULTICAST, vrf_id);
   if (! table)
@@ -5392,17 +3311,10 @@ DEFUN (show_ipv6_mroute,
   return CMD_SUCCESS;
 }
 
-ALIAS (show_ipv6_mroute,
-       show_ipv6_mroute_vrf_cmd,
-       "show ipv6 mroute  " VRF_CMD_STR,
-       SHOW_STR
-       IP_STR
-       "IPv6 Multicast routing table\n"
-       VRF_CMD_HELP_STR)
 
 DEFUN (show_ipv6_route_vrf_all,
        show_ipv6_route_vrf_all_cmd,
-       "show ipv6 route " VRF_ALL_CMD_STR,
+       "show ipv6 route vrf all",
        SHOW_STR
        IP_STR
        "IPv6 routing table\n"
@@ -5447,7 +3359,7 @@ DEFUN (show_ipv6_route_vrf_all,
 
 DEFUN (show_ipv6_route_vrf_all_tag,
        show_ipv6_route_vrf_all_tag_cmd,
-       "show ipv6 route " VRF_ALL_CMD_STR " tag <1-4294967295>",
+       "show ipv6 route vrf all tag (1-4294967295)",
        SHOW_STR
        IP_STR
        "IPv6 routing table\n"
@@ -5455,6 +3367,7 @@ DEFUN (show_ipv6_route_vrf_all_tag,
        "Show only routes with tag\n"
        "Tag value\n")
 {
+  int idx_number = 6;
   struct route_table *table;
   struct route_node *rn;
   struct rib *rib;
@@ -5464,8 +3377,8 @@ DEFUN (show_ipv6_route_vrf_all_tag,
   int vrf_header = 1;
   route_tag_t tag = 0;
 
-  if (argv[0])
-    tag = atol(argv[0]);
+  if (argv[idx_number]->arg)
+    tag = atol(argv[idx_number]->arg);
 
   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
     {
@@ -5501,7 +3414,7 @@ DEFUN (show_ipv6_route_vrf_all_tag,
 
 DEFUN (show_ipv6_route_vrf_all_prefix_longer,
        show_ipv6_route_vrf_all_prefix_longer_cmd,
-       "show ipv6 route " VRF_ALL_CMD_STR " X:X::X:X/M longer-prefixes",
+       "show ipv6 route vrf all X:X::X:X/M longer-prefixes",
        SHOW_STR
        IP_STR
        "IPv6 routing table\n"
@@ -5509,6 +3422,7 @@ DEFUN (show_ipv6_route_vrf_all_prefix_longer,
        "IPv6 prefix\n"
        "Show route matching the specified Network/Mask pair only\n")
 {
+  int idx_ipv6_prefixlen = 5;
   struct route_table *table;
   struct route_node *rn;
   struct rib *rib;
@@ -5519,7 +3433,7 @@ DEFUN (show_ipv6_route_vrf_all_prefix_longer,
   int first = 1;
   int vrf_header = 1;
 
-  ret = str2prefix (argv[0], &p);
+  ret = str2prefix (argv[idx_ipv6_prefixlen]->arg, &p);
   if (! ret)
     {
       vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
@@ -5558,13 +3472,14 @@ DEFUN (show_ipv6_route_vrf_all_prefix_longer,
 
 DEFUN (show_ipv6_route_vrf_all_protocol,
        show_ipv6_route_vrf_all_protocol_cmd,
-       "show ipv6 route " VRF_ALL_CMD_STR " " QUAGGA_IP6_REDIST_STR_ZEBRA,
+       "show ipv6 route vrf all <kernel|connected|static|ripng|ospf6|isis|bgp|table>",
        SHOW_STR
        IP_STR
        "IP routing table\n"
        VRF_ALL_CMD_HELP_STR
        QUAGGA_IP6_REDIST_HELP_STR_ZEBRA)
 {
+  int idx_protocol = 5;
   int type;
   struct route_table *table;
   struct route_node *rn;
@@ -5574,7 +3489,7 @@ DEFUN (show_ipv6_route_vrf_all_protocol,
   int first = 1;
   int vrf_header = 1;
 
-  type = proto_redistnum (AFI_IP6, argv[0]);
+  type = proto_redistnum (AFI_IP6, argv[idx_protocol]->arg);
   if (type < 0)
     {
       vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
@@ -5613,13 +3528,14 @@ DEFUN (show_ipv6_route_vrf_all_protocol,
 
 DEFUN (show_ipv6_route_vrf_all_addr,
        show_ipv6_route_vrf_all_addr_cmd,
-       "show ipv6 route " VRF_ALL_CMD_STR " X:X::X:X",
+       "show ipv6 route vrf all X:X::X:X",
        SHOW_STR
        IP_STR
        "IPv6 routing table\n"
        VRF_ALL_CMD_HELP_STR
        "IPv6 Address\n")
 {
+  int idx_ipv6 = 5;
   int ret;
   struct prefix_ipv6 p;
   struct route_table *table;
@@ -5627,7 +3543,7 @@ DEFUN (show_ipv6_route_vrf_all_addr,
   struct zebra_vrf *zvrf;
   vrf_iter_t iter;
 
-  ret = str2prefix_ipv6 (argv[0], &p);
+  ret = str2prefix_ipv6 (argv[idx_ipv6]->arg, &p);
   if (ret <= 0)
     {
       vty_out (vty, "Malformed IPv6 address%s", VTY_NEWLINE);
@@ -5654,13 +3570,14 @@ DEFUN (show_ipv6_route_vrf_all_addr,
 
 DEFUN (show_ipv6_route_vrf_all_prefix,
        show_ipv6_route_vrf_all_prefix_cmd,
-       "show ipv6 route " VRF_ALL_CMD_STR " X:X::X:X/M",
+       "show ipv6 route vrf all X:X::X:X/M",
        SHOW_STR
        IP_STR
        "IPv6 routing table\n"
        VRF_ALL_CMD_HELP_STR
        "IPv6 prefix\n")
 {
+  int idx_ipv6_prefixlen = 5;
   int ret;
   struct prefix_ipv6 p;
   struct route_table *table;
@@ -5668,7 +3585,7 @@ DEFUN (show_ipv6_route_vrf_all_prefix,
   struct zebra_vrf *zvrf;
   vrf_iter_t iter;
 
-  ret = str2prefix_ipv6 (argv[0], &p);
+  ret = str2prefix_ipv6 (argv[idx_ipv6_prefixlen]->arg, &p);
   if (ret <= 0)
     {
       vty_out (vty, "Malformed IPv6 prefix%s", VTY_NEWLINE);
@@ -5700,7 +3617,7 @@ DEFUN (show_ipv6_route_vrf_all_prefix,
 
 DEFUN (show_ipv6_route_vrf_all_summary,
        show_ipv6_route_vrf_all_summary_cmd,
-       "show ipv6 route " VRF_ALL_CMD_STR " summary",
+       "show ipv6 route vrf all summary",
        SHOW_STR
        IP_STR
        "IPv6 routing table\n"
@@ -5719,7 +3636,7 @@ DEFUN (show_ipv6_route_vrf_all_summary,
 
 DEFUN (show_ipv6_mroute_vrf_all,
        show_ipv6_mroute_vrf_all_cmd,
-       "show ipv6 mroute " VRF_ALL_CMD_STR,
+       "show ipv6 mroute vrf all",
        SHOW_STR
        IP_STR
        "IPv6 Multicast routing table\n"
@@ -5755,7 +3672,7 @@ DEFUN (show_ipv6_mroute_vrf_all,
 
 DEFUN (show_ipv6_route_vrf_all_summary_prefix,
        show_ipv6_route_vrf_all_summary_prefix_cmd,
-       "show ipv6 route " VRF_ALL_CMD_STR " summary prefix",
+       "show ipv6 route vrf all summary prefix",
        SHOW_STR
        IP_STR
        "IPv6 routing table\n"
@@ -5902,9 +3819,7 @@ zebra_ip_config (struct vty *vty)
 
   write += static_config_ipv4 (vty, SAFI_UNICAST, "ip route");
   write += static_config_ipv4 (vty, SAFI_MULTICAST, "ip mroute");
-#ifdef HAVE_IPV6
   write += static_config_ipv6 (vty);
-#endif /* HAVE_IPV6 */
 
   write += zebra_import_table_config (vty);
   return write;
@@ -5912,49 +3827,7 @@ zebra_ip_config (struct vty *vty)
 
 DEFUN (ip_zebra_import_table_distance,
        ip_zebra_import_table_distance_cmd,
-       "ip import-table <1-252> distance <1-255>",
-       IP_STR
-       "import routes from non-main kernel table\n"
-       "kernel routing table id\n"
-       "Distance for imported routes\n"
-       "Default distance value\n")
-{
-  u_int32_t table_id = 0;
-  int distance = ZEBRA_TABLE_DISTANCE_DEFAULT;
-
-  if (argc)
-    VTY_GET_INTEGER("table", table_id, argv[0]);
-
-  if (!is_zebra_valid_kernel_table(table_id))
-    {
-      vty_out(vty, "Invalid routing table ID, %d. Must be in range 1-252%s",
-             table_id, VTY_NEWLINE);
-      return CMD_WARNING;
-    }
-
-  if (is_zebra_main_routing_table(table_id))
-    {
-      vty_out(vty, "Invalid routing table ID, %d. Must be non-default table%s",
-             table_id, VTY_NEWLINE);
-      return CMD_WARNING;
-    }
-
-  if (argc > 1)
-    VTY_GET_INTEGER_RANGE("distance", distance, argv[1], 1, 255);
-  return (zebra_import_table(AFI_IP, table_id, distance, NULL, 1));
-
-}
-
-ALIAS (ip_zebra_import_table_distance,
-       ip_zebra_import_table_cmd,
-       "ip import-table <1-252>",
-       IP_STR
-       "import routes from non-main kernel table\n"
-       "kernel routing table id\n")
-
-DEFUN (ip_zebra_import_table_distance_routemap,
-       ip_zebra_import_table_distance_routemap_cmd,
-       "ip import-table <1-252> distance <1-255> route-map WORD",
+       "ip import-table (1-252) [distance (1-255)] [route-map WORD]",
        IP_STR
        "import routes from non-main kernel table\n"
        "kernel routing table id\n"
@@ -5964,11 +3837,13 @@ DEFUN (ip_zebra_import_table_distance_routemap,
        "route-map name\n")
 {
   u_int32_t table_id = 0;
-  int distance = ZEBRA_TABLE_DISTANCE_DEFAULT;
-  const char *rmap_name;
 
-  if (argc)
-    VTY_GET_INTEGER("table", table_id, argv[0]);
+  VTY_GET_INTEGER("table", table_id, argv[2]->arg);
+  int distance = ZEBRA_TABLE_DISTANCE_DEFAULT;
+  char *rmap = strmatch (argv[argc - 2]->text, "route-map") ?
+               XSTRDUP(MTYPE_ROUTE_MAP_NAME, argv[argc - 1]->arg) : NULL;
+  if (argc == 7 || (argc == 5 && !rmap))
+    VTY_GET_INTEGER_RANGE("distance", distance, argv[4]->arg, 1, 255);
 
   if (!is_zebra_valid_kernel_table(table_id))
     {
@@ -5980,42 +3855,23 @@ DEFUN (ip_zebra_import_table_distance_routemap,
   if (is_zebra_main_routing_table(table_id))
     {
       vty_out(vty, "Invalid routing table ID, %d. Must be non-default table%s",
-             table_id, VTY_NEWLINE);
+              table_id, VTY_NEWLINE);
       return CMD_WARNING;
     }
 
-  if (argc > 2)
-    {
-      VTY_GET_INTEGER_RANGE("distance", distance, argv[1], 1, 255);
-      rmap_name =  XSTRDUP (MTYPE_ROUTE_MAP_NAME, argv[2]);
-    }
-  else
-    rmap_name = XSTRDUP (MTYPE_ROUTE_MAP_NAME, argv[1]);
-
-  return (zebra_import_table(AFI_IP, table_id, distance, rmap_name, 1));
+  return (zebra_import_table(AFI_IP, table_id, distance, rmap, 1));
 }
 
-ALIAS (ip_zebra_import_table_distance_routemap,
-       ip_zebra_import_table_routemap_cmd,
-       "ip import-table <1-252> route-map WORD",
-       IP_STR
-       "import routes from non-main kernel table\n"
-       "kernel routing table id\n"
-       "route-map for filtering\n"
-       "route-map name\n")
-
 DEFUN (no_ip_zebra_import_table,
        no_ip_zebra_import_table_cmd,
-       "no ip import-table <1-252> {route-map NAME}",
+       "no ip import-table (1-252) [distance (1-255)] [route-map NAME]",
        NO_STR
        IP_STR
        "import routes from non-main kernel table\n"
        "kernel routing table id\n")
 {
   u_int32_t table_id = 0;
-
-  if (argc)
-    VTY_GET_INTEGER("table", table_id, argv[0]);
+  VTY_GET_INTEGER("table", table_id, argv[3]->arg);
 
   if (!is_zebra_valid_kernel_table(table_id))
     {
@@ -6037,14 +3893,6 @@ DEFUN (no_ip_zebra_import_table,
   return (zebra_import_table(AFI_IP, table_id, 0, NULL, 0));
 }
 
-ALIAS (no_ip_zebra_import_table,
-       no_ip_zebra_import_table_distance_cmd,
-       "no ip import-table <1-252> distance <1-255> {route-map NAME}",
-       IP_STR
-       "import routes from non-main kernel table to main table"
-       "kernel routing table id\n"
-       "distance to be used\n")
-
 static int
 config_write_protocol (struct vty *vty)
 {
@@ -6086,77 +3934,30 @@ zebra_vty_init (void)
 
   install_element (CONFIG_NODE, &allow_external_route_update_cmd);
   install_element (CONFIG_NODE, &no_allow_external_route_update_cmd);
-  install_element (CONFIG_NODE, &ip_mroute_cmd);
   install_element (CONFIG_NODE, &ip_mroute_dist_cmd);
-  install_element (CONFIG_NODE, &no_ip_mroute_cmd);
   install_element (CONFIG_NODE, &no_ip_mroute_dist_cmd);
   install_element (CONFIG_NODE, &ip_multicast_mode_cmd);
   install_element (CONFIG_NODE, &no_ip_multicast_mode_cmd);
-  install_element (CONFIG_NODE, &no_ip_multicast_mode_noarg_cmd);
   install_element (CONFIG_NODE, &ip_route_cmd);
-  install_element (CONFIG_NODE, &ip_route_tag_cmd);
   install_element (CONFIG_NODE, &ip_route_flags_cmd);
-  install_element (CONFIG_NODE, &ip_route_flags_tag_cmd);
   install_element (CONFIG_NODE, &ip_route_flags2_cmd);
-  install_element (CONFIG_NODE, &ip_route_flags2_tag_cmd);
   install_element (CONFIG_NODE, &ip_route_mask_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_tag_cmd);
   install_element (CONFIG_NODE, &ip_route_mask_flags_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_flags_tag_cmd);
   install_element (CONFIG_NODE, &ip_route_mask_flags2_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_flags2_tag_cmd);
   install_element (CONFIG_NODE, &no_ip_route_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_tag_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_flags_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_flags_tag_cmd);
   install_element (CONFIG_NODE, &no_ip_route_flags2_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_flags2_tag_cmd);
   install_element (CONFIG_NODE, &no_ip_route_mask_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_tag_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_flags_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_flags_tag_cmd);
   install_element (CONFIG_NODE, &no_ip_route_mask_flags2_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_flags2_tag_cmd);
-  install_element (CONFIG_NODE, &ip_route_distance_cmd);
-  install_element (CONFIG_NODE, &ip_route_tag_distance_cmd);
-  install_element (CONFIG_NODE, &ip_route_flags_distance_cmd);
-  install_element (CONFIG_NODE, &ip_route_flags_tag_distance_cmd);
-  install_element (CONFIG_NODE, &ip_route_flags_distance2_cmd);
-  install_element (CONFIG_NODE, &ip_route_flags_tag_distance2_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_distance_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_tag_distance_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_flags_distance_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_flags_tag_distance_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_flags_distance2_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_flags_tag_distance2_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_distance_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_tag_distance_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_flags_distance_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_flags_tag_distance_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_flags_distance2_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_flags_tag_distance2_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_distance_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_tag_distance_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_flags_tag_distance_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance2_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_flags_tag_distance2_cmd);
-  install_element (CONFIG_NODE, &ip_zebra_import_table_cmd);
   install_element (CONFIG_NODE, &ip_zebra_import_table_distance_cmd);
-  install_element (CONFIG_NODE, &ip_zebra_import_table_routemap_cmd);
-  install_element (CONFIG_NODE, &ip_zebra_import_table_distance_routemap_cmd);
   install_element (CONFIG_NODE, &no_ip_zebra_import_table_cmd);
-  install_element (CONFIG_NODE, &no_ip_zebra_import_table_distance_cmd);
 
   install_element (VIEW_NODE, &show_vrf_cmd);
   install_element (VIEW_NODE, &show_ip_route_cmd);
   install_element (VIEW_NODE, &show_ip_route_ospf_instance_cmd);
   install_element (VIEW_NODE, &show_ip_route_tag_cmd);
   install_element (VIEW_NODE, &show_ip_nht_cmd);
-  install_element (VIEW_NODE, &show_ip_nht_vrf_cmd);
   install_element (VIEW_NODE, &show_ip_nht_vrf_all_cmd);
   install_element (VIEW_NODE, &show_ipv6_nht_cmd);
-  install_element (VIEW_NODE, &show_ipv6_nht_vrf_cmd);
   install_element (VIEW_NODE, &show_ipv6_nht_vrf_all_cmd);
   install_element (VIEW_NODE, &show_ip_route_addr_cmd);
   install_element (VIEW_NODE, &show_ip_route_prefix_cmd);
@@ -6171,64 +3972,11 @@ zebra_vty_init (void)
 
   /* Commands for VRF */
 
-  install_element (CONFIG_NODE, &ip_route_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_flags_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_flags_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_flags2_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_flags2_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_flags_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_flags_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_flags2_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_flags2_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_flags_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_flags_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_flags2_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_flags2_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_flags_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_flags_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_flags2_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_flags2_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_tag_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_flags_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_flags_tag_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_flags_distance2_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_flags_tag_distance2_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_tag_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_flags_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_flags_tag_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_flags_distance2_vrf_cmd);
-  install_element (CONFIG_NODE, &ip_route_mask_flags_tag_distance2_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_tag_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_flags_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_flags_tag_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_flags_distance2_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_flags_tag_distance2_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_tag_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_flags_tag_distance_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance2_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ip_route_mask_flags_tag_distance2_vrf_cmd);
+  install_element (CONFIG_NODE, &no_ip_route_flags_cmd);
+  install_element (CONFIG_NODE, &no_ip_route_mask_flags_cmd);
 
   install_element (VIEW_NODE, &show_ip_route_vrf_cmd);
-  install_element (VIEW_NODE, &show_ip_route_vrf_addr_cmd);
-  install_element (VIEW_NODE, &show_ip_route_vrf_tag_cmd);
-  install_element (VIEW_NODE, &show_ip_route_vrf_prefix_cmd);
-  install_element (VIEW_NODE, &show_ip_route_vrf_prefix_longer_cmd);
-  install_element (VIEW_NODE, &show_ip_route_vrf_protocol_cmd);
-  install_element (VIEW_NODE, &show_ip_route_vrf_supernets_cmd);
-  install_element (VIEW_NODE, &show_ip_route_vrf_summary_cmd);
-  install_element (VIEW_NODE, &show_ip_route_vrf_summary_prefix_cmd);
+  install_element (VIEW_NODE, &show_ip_route_vrf_cmd);
 
   install_element (VIEW_NODE, &show_ip_route_vrf_all_cmd);
   install_element (VIEW_NODE, &show_ip_route_vrf_all_tag_cmd);
@@ -6240,7 +3988,6 @@ zebra_vty_init (void)
   install_element (VIEW_NODE, &show_ip_route_vrf_all_summary_cmd);
   install_element (VIEW_NODE, &show_ip_route_vrf_all_summary_prefix_cmd);
 
-#ifdef HAVE_IPV6
   install_element (CONFIG_NODE, &ipv6_route_cmd);
   install_element (CONFIG_NODE, &ipv6_route_flags_cmd);
   install_element (CONFIG_NODE, &ipv6_route_ifname_cmd);
@@ -6249,30 +3996,6 @@ zebra_vty_init (void)
   install_element (CONFIG_NODE, &no_ipv6_route_flags_cmd);
   install_element (CONFIG_NODE, &no_ipv6_route_ifname_cmd);
   install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_pref_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_flags_pref_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_ifname_pref_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_ifname_flags_pref_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_pref_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_flags_pref_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_ifname_pref_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_pref_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_tag_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_flags_tag_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_ifname_tag_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_ifname_flags_tag_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_pref_tag_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_flags_pref_tag_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_ifname_pref_tag_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_ifname_flags_pref_tag_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_tag_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_flags_tag_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_ifname_tag_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_tag_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_pref_tag_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_flags_pref_tag_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_ifname_pref_tag_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_pref_tag_cmd);
   install_element (CONFIG_NODE, &ip_nht_default_route_cmd);
   install_element (CONFIG_NODE, &no_ip_nht_default_route_cmd);
   install_element (CONFIG_NODE, &ipv6_nht_default_route_cmd);
@@ -6289,50 +4012,6 @@ zebra_vty_init (void)
   install_element (VIEW_NODE, &show_ipv6_mroute_cmd);
 
   /* Commands for VRF */
-
-  install_element (CONFIG_NODE, &ipv6_route_vrf_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_flags_vrf_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_ifname_vrf_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_ifname_flags_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_flags_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_ifname_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_vrf_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_pref_vrf_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_flags_pref_vrf_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_ifname_pref_vrf_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_ifname_flags_pref_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_pref_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_flags_pref_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_ifname_pref_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_pref_vrf_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_flags_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_ifname_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_ifname_flags_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_pref_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_flags_pref_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_ifname_pref_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &ipv6_route_ifname_flags_pref_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_flags_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_ifname_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_pref_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_flags_pref_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_ifname_pref_tag_vrf_cmd);
-  install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_pref_tag_vrf_cmd);
-
-
-  install_element (VIEW_NODE, &show_ipv6_route_vrf_cmd);
-  install_element (VIEW_NODE, &show_ipv6_route_vrf_tag_cmd);
-  install_element (VIEW_NODE, &show_ipv6_route_vrf_summary_cmd);
-  install_element (VIEW_NODE, &show_ipv6_route_vrf_summary_prefix_cmd);
-  install_element (VIEW_NODE, &show_ipv6_route_vrf_protocol_cmd);
-  install_element (VIEW_NODE, &show_ipv6_route_vrf_addr_cmd);
-  install_element (VIEW_NODE, &show_ipv6_route_vrf_prefix_cmd);
-  install_element (VIEW_NODE, &show_ipv6_route_vrf_prefix_longer_cmd);
-
   install_element (VIEW_NODE, &show_ipv6_route_vrf_all_cmd);
   install_element (VIEW_NODE, &show_ipv6_route_vrf_all_tag_cmd);
   install_element (VIEW_NODE, &show_ipv6_route_vrf_all_summary_cmd);
@@ -6342,8 +4021,5 @@ zebra_vty_init (void)
   install_element (VIEW_NODE, &show_ipv6_route_vrf_all_prefix_cmd);
   install_element (VIEW_NODE, &show_ipv6_route_vrf_all_prefix_longer_cmd);
 
-  install_element (VIEW_NODE, &show_ipv6_mroute_vrf_cmd);
-
   install_element (VIEW_NODE, &show_ipv6_mroute_vrf_all_cmd);
-#endif /* HAVE_IPV6 */
 }