*: use an ifindex_t type, defined in lib/if.h, for ifindex values
diff --git a/lib/if.c b/lib/if.c
index 3426212..44b8586 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -189,41 +189,41 @@
 
 /* Interface existance check by index. */
 struct interface *
-if_lookup_by_index_vrf (unsigned int index, vrf_id_t vrf_id)
+if_lookup_by_index_vrf (ifindex_t ifindex, vrf_id_t vrf_id)
 {
   struct listnode *node;
   struct interface *ifp;
 
   for (ALL_LIST_ELEMENTS_RO (vrf_iflist (vrf_id), node, ifp))
     {
-      if (ifp->ifindex == index)
+      if (ifp->ifindex == ifindex)
 	return ifp;
     }
   return NULL;
 }
 
 struct interface *
-if_lookup_by_index (unsigned int index)
+if_lookup_by_index (ifindex_t ifindex)
 {
-  return if_lookup_by_index_vrf (index, VRF_DEFAULT);
+  return if_lookup_by_index_vrf (ifindex, VRF_DEFAULT);
 }
 
 const char *
-ifindex2ifname_vrf (unsigned int index, vrf_id_t vrf_id)
+ifindex2ifname_vrf (ifindex_t ifindex, vrf_id_t vrf_id)
 {
   struct interface *ifp;
 
-  return ((ifp = if_lookup_by_index_vrf (index, vrf_id)) != NULL) ?
+  return ((ifp = if_lookup_by_index_vrf (ifindex, vrf_id)) != NULL) ?
   	 ifp->name : "unknown";
 }
 
 const char *
-ifindex2ifname (unsigned int index)
+ifindex2ifname (ifindex_t ifindex)
 {
-  return ifindex2ifname_vrf (index, VRF_DEFAULT);
+  return ifindex2ifname_vrf (ifindex, VRF_DEFAULT);
 }
 
-unsigned int
+ifindex_t
 ifname2ifindex_vrf (const char *name, vrf_id_t vrf_id)
 {
   struct interface *ifp;
@@ -232,7 +232,7 @@
                                                    : IFINDEX_INTERNAL;
 }
 
-unsigned int
+ifindex_t
 ifname2ifindex (const char *name)
 {
   return ifname2ifindex_vrf (name, VRF_DEFAULT);
@@ -928,7 +928,7 @@
 }
 
 #ifndef HAVE_IF_NAMETOINDEX
-unsigned int
+ifindex_t
 if_nametoindex (const char *name)
 {
   struct interface *ifp;
@@ -940,7 +940,7 @@
 
 #ifndef HAVE_IF_INDEXTONAME
 char *
-if_indextoname (unsigned int ifindex, char *name)
+if_indextoname (ifindex_t ifindex, char *name)
 {
   struct interface *ifp;
 
@@ -1005,7 +1005,7 @@
 
 /* Lookup interface by interface's IP address or interface index. */
 static struct interface *
-ifaddr_ipv4_lookup (struct in_addr *addr, unsigned int ifindex)
+ifaddr_ipv4_lookup (struct in_addr *addr, ifindex_t ifindex)
 {
   struct prefix_ipv4 p;
   struct route_node *rn;
diff --git a/lib/if.h b/lib/if.h
index 0cb2202..b3d14ba 100644
--- a/lib/if.h
+++ b/lib/if.h
@@ -21,6 +21,7 @@
 #ifndef _ZEBRA_IF_H
 #define _ZEBRA_IF_H
 
+#include "zebra.h"
 #include "linklist.h"
 
 /* Interface link-layer type, if known. Derived from:
@@ -96,6 +97,8 @@
 #define INTERFACE_NAMSIZ      20
 #define INTERFACE_HWADDR_MAX  20
 
+typedef signed int ifindex_t;
+
 #ifdef HAVE_PROC_NET_DEV
 struct if_stats
 {
@@ -142,7 +145,7 @@
 
   /* Interface index (should be IFINDEX_INTERNAL for non-kernel or
      deleted interfaces). */
-  unsigned int ifindex;
+  ifindex_t ifindex;
 #define IFINDEX_INTERNAL	0
 
   /* Zebra internal interface status */
@@ -294,15 +297,14 @@
 /* Prototypes. */
 extern int if_cmp_func (struct interface *, struct interface *);
 extern struct interface *if_create (const char *name, int namelen);
-extern struct interface *if_lookup_by_index (unsigned int);
+extern struct interface *if_lookup_by_index (ifindex_t);
 extern struct interface *if_lookup_exact_address (struct in_addr);
 extern struct interface *if_lookup_address (struct in_addr);
 extern struct interface *if_lookup_prefix (struct prefix *prefix);
 
 extern struct interface *if_create_vrf (const char *name, int namelen,
                                 vrf_id_t vrf_id);
-extern struct interface *if_lookup_by_index_vrf (unsigned int,
-                                vrf_id_t vrf_id);
+extern struct interface *if_lookup_by_index_vrf (ifindex_t, vrf_id_t vrf_id);
 extern struct interface *if_lookup_exact_address_vrf (struct in_addr,
                                 vrf_id_t vrf_id);
 extern struct interface *if_lookup_address_vrf (struct in_addr,
@@ -359,14 +361,14 @@
 /* Please use ifindex2ifname instead of if_indextoname where possible;
    ifindex2ifname uses internal interface info, whereas if_indextoname must
    make a system call. */
-extern const char *ifindex2ifname (unsigned int);
-extern const char *ifindex2ifname_vrf (unsigned int, vrf_id_t vrf_id);
+extern const char *ifindex2ifname (ifindex_t);
+extern const char *ifindex2ifname_vrf (ifindex_t, vrf_id_t vrf_id);
 
 /* Please use ifname2ifindex instead of if_nametoindex where possible;
    ifname2ifindex uses internal interface info, whereas if_nametoindex must
    make a system call. */
-extern unsigned int ifname2ifindex(const char *ifname);
-extern unsigned int ifname2ifindex_vrf(const char *ifname, vrf_id_t vrf_id);
+extern ifindex_t ifname2ifindex(const char *ifname);
+extern ifindex_t ifname2ifindex_vrf(const char *ifname, vrf_id_t vrf_id);
 
 /* Connected address functions. */
 extern struct connected *connected_new (void);
@@ -381,10 +383,10 @@
                                              struct in_addr);
 
 #ifndef HAVE_IF_NAMETOINDEX
-extern unsigned int if_nametoindex (const char *);
+extern ifindex_t if_nametoindex (const char *);
 #endif
 #ifndef HAVE_IF_INDEXTONAME
-extern char *if_indextoname (unsigned int, char *);
+extern char *if_indextoname (ifindex_t, char *);
 #endif
 
 /* Exported variables. */
diff --git a/lib/sockopt.c b/lib/sockopt.c
index 257271b..3014237 100644
--- a/lib/sockopt.c
+++ b/lib/sockopt.c
@@ -220,7 +220,7 @@
 setsockopt_ipv4_multicast(int sock,
 			int optname, 
 			unsigned int mcast_addr,
-			unsigned int ifindex)
+			ifindex_t ifindex)
 {
 #ifdef HAVE_RFC3678
   struct group_req gr;
@@ -318,8 +318,7 @@
  * Set IP_MULTICAST_IF socket option in an OS-dependent manner.
  */
 int
-setsockopt_ipv4_multicast_if(int sock,
-			unsigned int ifindex)
+setsockopt_ipv4_multicast_if(int sock, ifindex_t ifindex)
 {
 
 #ifdef HAVE_STRUCT_IP_MREQN_IMR_IFINDEX
@@ -345,7 +344,7 @@
 }
   
 static int
-setsockopt_ipv4_ifindex (int sock, int val)
+setsockopt_ipv4_ifindex (int sock, ifindex_t val)
 {
   int ret;
 
@@ -381,7 +380,7 @@
 
 
 int
-setsockopt_ifindex (int af, int sock, int val)
+setsockopt_ifindex (int af, int sock, ifindex_t val)
 {
   int ret = -1;
   
@@ -408,11 +407,11 @@
  * Returns the interface index (small integer >= 1) if it can be
  * determined, or else 0.
  */
-static int
+static ifindex_t
 getsockopt_ipv4_ifindex (struct msghdr *msgh)
 {
   /* XXX: initialize to zero?  (Always overwritten, so just cosmetic.) */
-  int ifindex = -1;
+  ifindex_t ifindex = -1;
 
 #if defined(IP_PKTINFO)
 /* Linux pktinfo based ifindex retrieval */
@@ -432,7 +431,7 @@
   struct sockaddr_dl *sdl;
 #else
   /* SUNOS_5 uses an integer with the index. */
-  int *ifindex_p;
+  ifindex_t *ifindex_p;
 #endif /* SUNOS_5 */
 
 #ifndef SUNOS_5
@@ -473,7 +472,7 @@
 }
 
 /* return ifindex, 0 if none found */
-int
+ifindex_t
 getsockopt_ifindex (int af, struct msghdr *msgh)
 {
   switch (af)
diff --git a/lib/sockopt.h b/lib/sockopt.h
index cb14efc..a9b8aca 100644
--- a/lib/sockopt.h
+++ b/lib/sockopt.h
@@ -83,16 +83,15 @@
   (((af) == AF_INET) : SOPT_SIZE_CMSG_IFINDEX_IPV4() \
                     ? SOPT_SIZE_CMSG_PKTINFO_IPV6())
 
-extern int setsockopt_ipv4_multicast_if(int sock,
-			             unsigned int ifindex);
+extern int setsockopt_ipv4_multicast_if(int sock, ifindex_t ifindex);
 extern int setsockopt_ipv4_multicast(int sock, int optname,
                                      unsigned int mcast_addr,
-			             unsigned int ifindex);
+			             ifindex_t ifindex);
 extern int setsockopt_ipv4_tos(int sock, int tos);
 
 /* Ask for, and get, ifindex, by whatever method is supported. */
-extern int setsockopt_ifindex (int, int, int);
-extern int getsockopt_ifindex (int, struct msghdr *);
+extern int setsockopt_ifindex (int, int, ifindex_t);
+extern ifindex_t getsockopt_ifindex (int, struct msghdr *);
 
 /* swab the fields in iph between the host order and system order expected 
  * for IP_HDRINCL.
diff --git a/lib/sockunion.c b/lib/sockunion.c
index 492c36e..4a22c63 100644
--- a/lib/sockunion.c
+++ b/lib/sockunion.c
@@ -291,7 +291,7 @@
    1 : connect is in progress */
 enum connect_result
 sockunion_connect (int fd, const union sockunion *peersu, unsigned short port,
-		   unsigned int ifindex)
+		   ifindex_t ifindex)
 {
   int ret;
   int val;
diff --git a/lib/sockunion.h b/lib/sockunion.h
index a6f964f..b91c571 100644
--- a/lib/sockunion.h
+++ b/lib/sockunion.h
@@ -23,6 +23,8 @@
 #ifndef _ZEBRA_SOCKUNION_H
 #define _ZEBRA_SOCKUNION_H
 
+#include "if.h"
+
 #if 0
 union sockunion {
   struct sockinet {
@@ -109,7 +111,7 @@
 extern const char *inet_sutop (const union sockunion *su, char *str);
 extern enum connect_result sockunion_connect (int fd, const union sockunion *su,
                                               unsigned short port,
-                                              unsigned int);
+                                              ifindex_t);
 extern union sockunion *sockunion_getsockname (int);
 extern union sockunion *sockunion_getpeername (int);
 extern union sockunion *sockunion_dup (const union sockunion *);
diff --git a/lib/zclient.c b/lib/zclient.c
index bd93d06..9188c01 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -811,7 +811,7 @@
 struct connected *
 zebra_interface_address_read (int type, struct stream *s, vrf_id_t vrf_id)
 {
-  unsigned int ifindex;
+  ifindex_t ifindex;
   struct interface *ifp;
   struct connected *ifc;
   struct prefix p, d;
diff --git a/lib/zclient.h b/lib/zclient.h
index a14f599..d069eb2 100644
--- a/lib/zclient.h
+++ b/lib/zclient.h
@@ -126,7 +126,7 @@
   struct in_addr **nexthop;
 
   u_char ifindex_num;
-  unsigned int *ifindex;
+  ifindex_t *ifindex;
 
   u_char distance;
 
@@ -201,7 +201,7 @@
   struct in6_addr **nexthop;
 
   u_char ifindex_num;
-  unsigned int *ifindex;
+  ifindex_t *ifindex;
 
   u_char distance;