diff --git a/configure.ac b/configure.ac
index 73cbda9..f46673c 100755
--- a/configure.ac
+++ b/configure.ac
@@ -226,10 +226,6 @@
 [  --enable-solaris          build solaris])
 AC_ARG_ENABLE(bgp-announce,
 [  --disable-bgp-announce, turn off BGP route announcement])
-AC_ARG_ENABLE(netlink,
-[  --enable-netlink        force to use Linux netlink interface])
-AC_ARG_ENABLE(broken-aliases,
-[  --enable-broken-aliases enable aliases as distinct interfaces for Linux 2.2.X])
 AC_ARG_ENABLE(snmp,
 [  --enable-snmp=ARG       enable SNMP support (smux or agentx)])
 AC_ARG_WITH(libpam,
@@ -308,15 +304,6 @@
    AC_DEFINE(HAVE_FPM,,Forwarding Plane Manager support)
 fi
 
-if test "${enable_broken_aliases}" = "yes"; then
-  if test "${enable_netlink}" = "yes"
-  then
-    AC_MSG_FAILURE([Sorry you can not use netlink with broken aliases])
-  fi
-  AC_DEFINE(HAVE_BROKEN_ALIASES,,Broken Alias)
-  enable_netlink=no
-fi
-
 if test "${enable_tcp_zebra}" = "yes"; then
   AC_DEFINE(HAVE_TCP_ZEBRA,,Use TCP for zebra communication)
 fi
@@ -814,21 +801,10 @@
 dnl ------------------------------------
 AC_MSG_CHECKING(zebra between kernel interface method)
 if test x"$opsys" = x"gnu-linux"; then
-  if test "${enable_netlink}" = "yes";then
-    AC_MSG_RESULT(netlink)
-    RT_METHOD=rt_netlink.o
-    AC_DEFINE(HAVE_NETLINK,,netlink)
-    netlink=yes
-  elif test "${enable_netlink}" = "no"; then
-    AC_MSG_RESULT(ioctl)
-    RT_METHOD=rt_ioctl.o
-    netlink=no
-  else
-    AC_MSG_RESULT(netlink)
-    RT_METHOD=rt_netlink.o
-    AC_DEFINE(HAVE_NETLINK,,netlink)
-    netlink=yes
-  fi
+  AC_MSG_RESULT(netlink)
+  RT_METHOD=rt_netlink.o
+  AC_DEFINE(HAVE_NETLINK,,netlink)
+  netlink=yes
 elif test x"$opsys" = x"sol2-6";then
   AC_MSG_RESULT(Route socket)
   KERNEL_METHOD="kernel_socket.o"
@@ -941,12 +917,11 @@
 [if test "x$netlink" = xyes; then
   quagga_cv_rtread_method="netlink"
 else
-for quagga_cv_rtread_method in /proc/net/route /dev/ip /dev/null;
+for quagga_cv_rtread_method in /dev/ip /dev/null;
 do
   test x`ls $quagga_cv_rtread_method 2>/dev/null` = x"$quagga_cv_rtread_method" && break
 done
 case $quagga_cv_rtread_method in
-  "/proc/net/route") quagga_cv_rtread_method="proc";;
   "/dev/ip")
                      case "$host" in
                        *-freebsd*)    quagga_cv_rtread_method="sysctl";;
@@ -1063,21 +1038,6 @@
        AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
 fi
 
-dnl -----------------------
-dnl check proc file system.
-dnl -----------------------
-if test "$netlink" != yes; then
-  if test -r /proc/net/dev; then
-    AC_DEFINE(HAVE_PROC_NET_DEV,,/proc/net/dev)
-    IF_PROC=if_proc.o
-  fi
-  if test -r /proc/net/if_inet6; then
-    AC_DEFINE(HAVE_PROC_NET_IF_INET6,,/proc/net/if_inet6)
-    IF_PROC=if_proc.o
-  fi
-fi
-AC_SUBST(IF_PROC)
-
 dnl -----------------------------
 dnl check ipforward detect method
 dnl -----------------------------
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 */
-}
