diff --git a/zebra/Makefile.am b/zebra/Makefile.am
index 0591a55..4a76317 100644
--- a/zebra/Makefile.am
+++ b/zebra/Makefile.am
@@ -9,14 +9,13 @@
 
 ipforward = @IPFORWARD@
 if_method = @IF_METHOD@
-if_proc = @IF_PROC@
 rt_method = @RT_METHOD@
 rtread_method = @RTREAD_METHOD@
 kernel_method = @KERNEL_METHOD@
 other_method = @OTHER_METHOD@
 ioctl_method = @IOCTL_METHOD@
 
-otherobj = $(ioctl_method) $(ipforward) $(if_method) $(if_proc) \
+otherobj = $(ioctl_method) $(ipforward) $(if_method) \
 	$(rt_method) $(rtread_method) $(kernel_method) $(other_method)
 
 if HAVE_NETLINK
@@ -51,10 +50,10 @@
 
 zebra_DEPENDENCIES = $(otherobj)
 
-EXTRA_DIST = if_ioctl.c if_ioctl_solaris.c if_netlink.c if_proc.c \
+EXTRA_DIST = if_ioctl.c if_ioctl_solaris.c if_netlink.c \
         if_sysctl.c ipforward_aix.c ipforward_ews.c ipforward_proc.c \
 	ipforward_solaris.c ipforward_sysctl.c rt_ioctl.c rt_netlink.c \
-	rt_socket.c rtread_netlink.c rtread_proc.c rtread_sysctl.c \
+	rt_socket.c rtread_netlink.c rtread_sysctl.c \
 	rtread_getmsg.c kernel_socket.c kernel_netlink.c mtu_kvm.c \
 	ioctl.c ioctl_solaris.c \
 	GNOME-SMI GNOME-PRODUCT-ZEBRA-MIB
diff --git a/zebra/if_proc.c b/zebra/if_proc.c
deleted file mode 100644
index 2dbc472..0000000
--- a/zebra/if_proc.c
+++ /dev/null
@@ -1,248 +0,0 @@
-/* Interface name and statistics get function using proc file system
- * Copyright (C) 1999 Kunihiro Ishiguro
- *
- * This file is part of GNU Zebra.
- *
- * GNU Zebra is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2, or (at your option) any
- * later version.
- *
- * GNU Zebra is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * 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.  
- */
-
-#include <zebra.h>
-
-#include "if.h"
-#include "prefix.h"
-#include "log.h"
-
-#include "zebra/ioctl.h"
-#include "zebra/connected.h"
-#include "zebra/interface.h"
-
-/* Proc filesystem one line buffer. */
-#define PROCBUFSIZ                  1024
-
-/* Path to device proc file system. */
-#ifndef _PATH_PROC_NET_DEV
-#define _PATH_PROC_NET_DEV        "/proc/net/dev"
-#endif /* _PATH_PROC_NET_DEV */
-
-/* Return statistics data pointer. */
-static char *
-interface_name_cut (char *buf, char **name)
-{
-  char *stat;
-
-  /* Skip white space.  Line will include header spaces. */
-  while (*buf == ' ')
-    buf++;
-  *name = buf;
-
-  /* Cut interface name. */
-  stat = strrchr (buf, ':');
-  *stat++ = '\0';
-
-  return stat;
-}
-
-/* Fetch each statistics field. */
-static int
-ifstat_dev_fields (int version, char *buf, struct interface *ifp)
-{
-  switch (version) 
-    {
-    case 3:
-      sscanf(buf,
-	     "%ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld",
-	     &ifp->stats.rx_bytes,
-	     &ifp->stats.rx_packets,
-	     &ifp->stats.rx_errors,
-	     &ifp->stats.rx_dropped,
-	     &ifp->stats.rx_fifo_errors,
-	     &ifp->stats.rx_frame_errors,
-	     &ifp->stats.rx_compressed,
-	     &ifp->stats.rx_multicast,
-
-	     &ifp->stats.tx_bytes,
-	     &ifp->stats.tx_packets,
-	     &ifp->stats.tx_errors,
-	     &ifp->stats.tx_dropped,
-	     &ifp->stats.tx_fifo_errors,
-	     &ifp->stats.collisions,
-	     &ifp->stats.tx_carrier_errors,
-	     &ifp->stats.tx_compressed);
-      break;
-    case 2:
-      sscanf(buf, "%ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld",
-	     &ifp->stats.rx_bytes,
-	     &ifp->stats.rx_packets,
-	     &ifp->stats.rx_errors,
-	     &ifp->stats.rx_dropped,
-	     &ifp->stats.rx_fifo_errors,
-	     &ifp->stats.rx_frame_errors,
-
-	     &ifp->stats.tx_bytes,
-	     &ifp->stats.tx_packets,
-	     &ifp->stats.tx_errors,
-	     &ifp->stats.tx_dropped,
-	     &ifp->stats.tx_fifo_errors,
-	     &ifp->stats.collisions,
-	     &ifp->stats.tx_carrier_errors);
-      ifp->stats.rx_multicast = 0;
-      break;
-    case 1:
-      sscanf(buf, "%ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld",
-	     &ifp->stats.rx_packets,
-	     &ifp->stats.rx_errors,
-	     &ifp->stats.rx_dropped,
-	     &ifp->stats.rx_fifo_errors,
-	     &ifp->stats.rx_frame_errors,
-
-	     &ifp->stats.tx_packets,
-	     &ifp->stats.tx_errors,
-	     &ifp->stats.tx_dropped,
-	     &ifp->stats.tx_fifo_errors,
-	     &ifp->stats.collisions,
-	     &ifp->stats.tx_carrier_errors);
-      ifp->stats.rx_bytes = 0;
-      ifp->stats.tx_bytes = 0;
-      ifp->stats.rx_multicast = 0;
-      break;
-    }
-  return 0;
-}
-
-/* Update interface's statistics. */
-void
-ifstat_update_proc (void)
-{
-  FILE *fp;
-  char buf[PROCBUFSIZ];
-  int version;
-  struct interface *ifp;
-  char *stat;
-  char *name;
-
-  /* Open /proc/net/dev. */
-  fp = fopen (_PATH_PROC_NET_DEV, "r");
-  if (fp == NULL)
-    {
-      zlog_warn ("Can't open proc file %s: %s",
-		 _PATH_PROC_NET_DEV, safe_strerror (errno));
-      return;
-    }
-
-  /* Drop header lines. */
-  fgets (buf, PROCBUFSIZ, fp);
-  fgets (buf, PROCBUFSIZ, fp);
-
-  /* To detect proc format veresion, parse second line. */
-  if (strstr (buf, "compressed"))
-    version = 3;
-  else if (strstr (buf, "bytes"))
-    version = 2;
-  else
-    version = 1;
-
-  /* Update each interface's statistics. */
-  while (fgets (buf, PROCBUFSIZ, fp) != NULL)
-    {
-      stat = interface_name_cut (buf, &name);
-      ifp = if_get_by_name (name);
-      ifstat_dev_fields (version, stat, ifp);
-    }
-  fclose(fp);
-  return;
-}
-
-/* Interface structure allocation by proc filesystem. */
-int
-interface_list_proc ()
-{
-  FILE *fp;
-  char buf[PROCBUFSIZ];
-  struct interface *ifp;
-  char *name;
-
-  /* Open /proc/net/dev. */
-  fp = fopen (_PATH_PROC_NET_DEV, "r");
-  if (fp == NULL)
-    {
-      zlog_warn ("Can't open proc file %s: %s",
-		 _PATH_PROC_NET_DEV, safe_strerror (errno));
-      return -1;
-    }
-
-  /* Drop header lines. */
-  fgets (buf, PROCBUFSIZ, fp);
-  fgets (buf, PROCBUFSIZ, fp);
-
-  /* Only allocate interface structure.  Other jobs will be done in
-     if_ioctl.c. */
-  while (fgets (buf, PROCBUFSIZ, fp) != NULL)
-    {
-      interface_name_cut (buf, &name);
-      ifp = if_get_by_name (name);
-      if_add_update (ifp);
-    }
-  fclose(fp);
-  return 0;
-}
-
-#if defined(HAVE_IPV6) && defined(HAVE_PROC_NET_IF_INET6)
-
-#ifndef _PATH_PROC_NET_IF_INET6
-#define _PATH_PROC_NET_IF_INET6          "/proc/net/if_inet6"
-#endif /* _PATH_PROC_NET_IF_INET6 */
-
-int
-ifaddr_proc_ipv6 ()
-{
-  FILE *fp;
-  char buf[PROCBUFSIZ];
-  int n;
-  char addr[33];
-  char ifname[21];
-  int ifindex, plen, scope, status;
-  struct interface *ifp;
-  struct prefix_ipv6 p;
-
-  /* Open proc file system. */
-  fp = fopen (_PATH_PROC_NET_IF_INET6, "r");
-  if (fp == NULL)
-    {
-      zlog_warn ("Can't open proc file %s: %s",
-		 _PATH_PROC_NET_IF_INET6, safe_strerror (errno));
-      return -1;
-    }
-  
-  /* Get interface's IPv6 address. */
-  while (fgets (buf, PROCBUFSIZ, fp) != NULL)
-    {
-      n = sscanf (buf, "%32s %02x %02x %02x %02x %20s", 
-		  addr, &ifindex, &plen, &scope, &status, ifname);
-      if (n != 6)
-	continue;
-
-      ifp = if_get_by_name (ifname);
-
-      /* Fetch interface's IPv6 address. */
-      str2in6_addr (addr, &p.prefix);
-      p.prefixlen = plen;
-
-      connected_add_ipv6 (ifp, 0, &p.prefix, p.prefixlen, NULL, ifname);
-    }
-  fclose (fp);
-  return 0;
-}
-#endif /* HAVE_IPV6 && HAVE_PROC_NET_IF_INET6 */
diff --git a/zebra/rtread_proc.c b/zebra/rtread_proc.c
deleted file mode 100644
index 07e8491..0000000
--- a/zebra/rtread_proc.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Kernel routing readup by /proc filesystem
- * Copyright (C) 1997 Kunihiro Ishiguro
- *
- * This file is part of GNU Zebra.
- *
- * GNU Zebra is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2, or (at your option) any
- * later version.
- *
- * GNU Zebra is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * 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.  
- */
-
-#include <zebra.h>
-
-#include "prefix.h"
-#include "log.h"
-#include "if.h"
-#include "rib.h"
-
-#include "zebra/zserv.h"
-#include "zebra/rt.h"
-
-/* Proc file system to read IPv4 routing table. */
-#ifndef _PATH_PROCNET_ROUTE
-#define _PATH_PROCNET_ROUTE      "/proc/net/route"
-#endif /* _PATH_PROCNET_ROUTE */
-
-/* Proc file system to read IPv6 routing table. */
-#ifndef _PATH_PROCNET_ROUTE6
-#define _PATH_PROCNET_ROUTE6     "/proc/net/ipv6_route"
-#endif /* _PATH_PROCNET_ROUTE6 */
-
-/* To read interface's name */
-#define INTERFACE_NAMSIZ 20  
-
-/* Reading buffer for one routing entry. */
-#define RT_BUFSIZ 1024
-
-/* Kernel routing table read up by /proc filesystem. */
-static int
-proc_route_read (void)
-{
-  FILE *fp;
-  char buf[RT_BUFSIZ];
-  char iface[INTERFACE_NAMSIZ], dest[9], gate[9], mask[9];
-  int flags, refcnt, use, metric, mtu, window, rtt;
-
-  /* Open /proc filesystem */
-  fp = fopen (_PATH_PROCNET_ROUTE, "r");
-  if (fp == NULL)
-    {
-      zlog_warn ("Can't open %s : %s\n", _PATH_PROCNET_ROUTE, safe_strerror (errno));
-      return -1;
-    }
-  
-  /* Drop first label line. */
-  fgets (buf, RT_BUFSIZ, fp);
-
-  while (fgets (buf, RT_BUFSIZ, fp) != NULL)
-    {
-      int n;
-      struct prefix_ipv4 p;
-      struct in_addr tmpmask;
-      struct in_addr gateway;
-      u_char zebra_flags = 0;
-
-      n = sscanf (buf, "%s %s %s %x %d %d %d %s %d %d %d",
-		  iface, dest, gate, &flags, &refcnt, &use, &metric, 
-		  mask, &mtu, &window, &rtt);
-      if (n != 11)
-	{	
-	  zlog_warn ("can't read all of routing information\n");
-	  continue;
-	}
-      if (! (flags & RTF_UP))
-	continue;
-      if (! (flags & RTF_GATEWAY))
-	continue;
-
-      if (flags & RTF_DYNAMIC)
-	zebra_flags |= ZEBRA_FLAG_SELFROUTE;
-
-      p.family = AF_INET;
-      sscanf (dest, "%lX", (unsigned long *)&p.prefix);
-      sscanf (mask, "%lX", (unsigned long *)&tmpmask);
-      p.prefixlen = ip_masklen (tmpmask);
-      sscanf (gate, "%lX", (unsigned long *)&gateway);
-
-      rib_add_ipv4 (ZEBRA_ROUTE_KERNEL, zebra_flags, &p, &gateway, NULL, 0, 0, 0, 0, SAFI_UNICAST);
-    }
-
-  fclose (fp);
-  return 0;
-}
-
-#ifdef HAVE_IPV6
-static int
-proc_ipv6_route_read ()
-{
-  FILE *fp;
-  char buf [RT_BUFSIZ];
-
-  /* Open /proc filesystem */
-  fp = fopen (_PATH_PROCNET_ROUTE6, "r");
-  if (fp == NULL)
-    {
-      zlog_warn ("Can't open %s : %s", _PATH_PROCNET_ROUTE6, 
-		safe_strerror (errno));
-      return -1;
-    }
-  
-  /* There is no title line, so we don't drop first line.  */
-  while (fgets (buf, RT_BUFSIZ, fp) != NULL)
-    {
-      int n;
-      char dest[33], src[33], gate[33];
-      char iface[INTERFACE_NAMSIZ];
-      int dest_plen, src_plen;
-      int metric, use, refcnt, flags;
-      struct prefix_ipv6 p;
-      struct in6_addr gateway;
-      u_char zebra_flags = 0;
-
-      /* Linux 2.1.x write this information at net/ipv6/route.c
-         rt6_info_node () */
-      n = sscanf (buf, "%32s %02x %32s %02x %32s %08x %08x %08x %08x %s",
-		  dest, &dest_plen, src, &src_plen, gate,
-		  &metric, &use, &refcnt, &flags, iface);
-
-      if (n != 10)
-	{	
-	  /* zlog_warn ("can't read all of routing information %d\n%s\n", n, buf); */
-	  continue;
-	}
-
-      if (! (flags & RTF_UP))
-	continue;
-      if (! (flags & RTF_GATEWAY))
-	continue;
-
-      if (flags & RTF_DYNAMIC)
-	zebra_flags |= ZEBRA_FLAG_SELFROUTE;
-
-      p.family = AF_INET6;
-      str2in6_addr (dest, &p.prefix);
-      str2in6_addr (gate, &gateway);
-      p.prefixlen = dest_plen;
-
-      rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, zebra_flags, &p, &gateway, 0, 0,
-		    metric, 0);
-    }
-
-  fclose (fp);
-  return 0;
-}
-#endif /* HAVE_IPV6 */
-
-void
-route_read (void)
-{
-  proc_route_read ();
-#ifdef HAVE_IPV6
-  proc_ipv6_route_read ();
-#endif /* HAVE_IPV6 */
-}
