diff --git a/configure.ac b/configure.ac
index f46673c..b9001b3 100755
--- a/configure.ac
+++ b/configure.ac
@@ -605,23 +605,10 @@
       opsys=gnu-linux
       AC_DEFINE(GNU_LINUX,,GNU Linux)
   ;;
-  *-nec-sysv4*)
-      AC_CHECK_LIB(nsl, gethostbyname)
-      AC_CHECK_LIB(socket, socket)
-  ;;
   *-openbsd*)
       opsys=openbsd
       AC_DEFINE(OPEN_BSD,,OpenBSD)
   ;;
-  *-bsdi*)
-      opsys=bsdi
-      OTHER_METHOD="mtu_kvm.o"
-      AC_CHECK_LIB(kvm, main)
-  ;;
-  *-irix6.5)
-      opsys=irix
-      AC_DEFINE(IRIX_65,,IRIX 6.5)
-  ;;
 esac
 
 AC_SYS_LARGEFILE
@@ -813,10 +800,6 @@
   AC_MSG_RESULT(Route socket)
   KERNEL_METHOD="kernel_socket.o"
   RT_METHOD="rt_socket.o"
-elif test "$opsys" = "irix" ; then
-  AC_MSG_RESULT(Route socket)
-  KERNEL_METHOD="kernel_socket.o"
-  RT_METHOD="rt_socket.o"
 else
   AC_TRY_RUN([#include <errno.h>
 #include <sys/types.h>
@@ -842,7 +825,6 @@
 fi
 AC_SUBST(RT_METHOD)
 AC_SUBST(KERNEL_METHOD)
-AC_SUBST(OTHER_METHOD)
 AM_CONDITIONAL([HAVE_NETLINK], [test "x$netlink" = "xyes"])
 
 dnl --------------------------
@@ -949,9 +931,6 @@
   AC_MSG_RESULT(Solaris GLIF)
   IF_METHOD=if_ioctl_solaris.o
   IOCTL_METHOD=ioctl_solaris.o
-elif test "$opsys" = "irix" ; then
-  AC_MSG_RESULT(IRIX)
-  IF_METHOD=if_ioctl.o
 elif test "$opsys" = "openbsd";then
   AC_MSG_RESULT(openbsd)
   IF_METHOD=if_ioctl.o
@@ -1058,7 +1037,6 @@
   "/proc/net/snmp")  quagga_cv_ipforward_method="proc";;
   "/dev/ip")         
                      case "$host" in
-                       *-nec-sysv4*)  quagga_cv_ipforward_method="ews";;
                        *-freebsd*)    quagga_cv_ipforward_method="sysctl";;
                        *)             quagga_cv_ipforward_method="solaris";;
                      esac;;
@@ -1125,12 +1103,7 @@
     AC_DEFINE(NRL,1,NRL)
     RIPNGD="ripngd"
     OSPF6D="ospf6d"
-    if test x"$opsys" = x"bsdi";then
-      AC_DEFINE(BSDI_NRL,,BSDI)
-      AC_MSG_RESULT(BSDI_NRL)
-    else
-      AC_MSG_RESULT(NRL)
-    fi
+    AC_MSG_RESULT(NRL)
 dnl ------------------------------------
 dnl Solaris 9, 10 and potentially higher
 dnl ------------------------------------
diff --git a/lib/zebra.h b/lib/zebra.h
index a4e0214..a5ed20e 100644
--- a/lib/zebra.h
+++ b/lib/zebra.h
@@ -244,20 +244,6 @@
 #include <execinfo.h>
 #endif /* HAVE_GLIBC_BACKTRACE */
 
-#ifdef BSDI_NRL
-
-#ifdef HAVE_NETINET6_IN6_H
-#include <netinet6/in6.h>
-#endif /* HAVE_NETINET6_IN6_H */
-
-#ifdef NRL
-#include <netinet6/in6.h>
-#endif /* NRL */
-
-#define IN6_ARE_ADDR_EQUAL IN6_IS_ADDR_EQUAL
-
-#endif /* BSDI_NRL */
-
 /* Local includes: */
 #if !(defined(__GNUC__) || defined(VTYSH_EXTRACT_PL)) 
 #define __attribute__(x)
diff --git a/zebra/Makefile.am b/zebra/Makefile.am
index 4a76317..8e3c99b 100644
--- a/zebra/Makefile.am
+++ b/zebra/Makefile.am
@@ -12,11 +12,10 @@
 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) \
-	$(rt_method) $(rtread_method) $(kernel_method) $(other_method)
+	$(rt_method) $(rtread_method) $(kernel_method)
 
 if HAVE_NETLINK
 othersrc = zebra_fpm_netlink.c
@@ -51,10 +50,10 @@
 zebra_DEPENDENCIES = $(otherobj)
 
 EXTRA_DIST = if_ioctl.c if_ioctl_solaris.c if_netlink.c \
-        if_sysctl.c ipforward_aix.c ipforward_ews.c ipforward_proc.c \
+        if_sysctl.c ipforward_proc.c \
 	ipforward_solaris.c ipforward_sysctl.c rt_ioctl.c rt_netlink.c \
 	rt_socket.c rtread_netlink.c rtread_sysctl.c \
-	rtread_getmsg.c kernel_socket.c kernel_netlink.c mtu_kvm.c \
+	rtread_getmsg.c kernel_socket.c kernel_netlink.c \
 	ioctl.c ioctl_solaris.c \
 	GNOME-SMI GNOME-PRODUCT-ZEBRA-MIB
 
diff --git a/zebra/interface.h b/zebra/interface.h
index 7a05348..2f3b7b9 100644
--- a/zebra/interface.h
+++ b/zebra/interface.h
@@ -236,8 +236,4 @@
 extern int ifaddr_proc_ipv6 (void);
 #endif /* HAVE_PROC_NET_IF_INET6 */
 
-#ifdef BSDI
-extern int if_kvm_get_mtu (struct interface *);
-#endif /* BSDI */
-
 #endif /* _ZEBRA_INTERFACE_H */
diff --git a/zebra/ipforward_aix.c b/zebra/ipforward_aix.c
deleted file mode 100644
index c79e7f1..0000000
--- a/zebra/ipforward_aix.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * ipforward value get function for aix.
- * 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>
-
-int
-ipforward ()
-{
-  int fd, ret;
-  int af = AF_INET;
-  char netopt[] = "ipforwarding";
-  struct optreq oq;
-
-  fd = socket(af, SOCK_DGRAM, 0);
-  if (fd < 0) {
-    /* need logging here */
-    return -1;
-  }
-
-  strcpy (oq.name, netopt);
-  oq.getnext = 0;
-
-  ret = ioctl (fd, SIOCGNETOPT, (caddr_t)&oq);
-  close(fd);
-
-  if (ret < 0) {
-    /* need logging here */
-    return -1;
-  }
-
-  ret = atoi (oq.data);
-  return ret;
-}
-
-int
-ipforward_on ()
-{
-  ;
-}
-
-int
-ipforward_off ()
-{
-  ;
-}
diff --git a/zebra/ipforward_ews.c b/zebra/ipforward_ews.c
deleted file mode 100644
index c872000..0000000
--- a/zebra/ipforward_ews.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Ipforward value get function for NEC EWS.
- * 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>
-
-int
-ipforward ()
-{
-  int fd;
-  char buf[BUFSIZ];
-  struct mioc_rksym rks;
-
-  fd = open ("/dev/kmem", O_RDWR);
-  if (fd < 0) {
-    /* need logging here */
-    return -1;
-  }
-
-  rks.mirk_symname = "ipforwarding";
-  rks.mirk_buf = buf;
-  rks.mirk_buflen = sizeof (int);
-
-  if (ioctl (fd, MIOC_READKSYM, &rks) < 0) {
-    /* need logging here */
-    return -1;
-  }
-  close (fd);
-  return *(int *)buf;
-}
-
-int
-ipforward_on ()
-{
-  ;
-}
-
-int
-ipforward_off ()
-{
-  ;
-}
diff --git a/zebra/ipforward_sysctl.c b/zebra/ipforward_sysctl.c
index 185aee3..8824418 100644
--- a/zebra/ipforward_sysctl.c
+++ b/zebra/ipforward_sysctl.c
@@ -106,7 +106,7 @@
 {
   CTL_NET,
   PF_INET6,
-#if defined(KAME) || (defined(__bsdi__) && _BSDI_VERSION >= 199802 ) || defined(NRL)
+#if defined(KAME) || defined(NRL)
   IPPROTO_IPV6,
   IPV6CTL_FORWARDING
 #else /* NOT KAME */
diff --git a/zebra/mtu_kvm.c b/zebra/mtu_kvm.c
deleted file mode 100644
index d37bb9b..0000000
--- a/zebra/mtu_kvm.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/* MTU get using kvm_read.
- * 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 <kvm.h>
-#include <limits.h>
-#include <fcntl.h>
-
-#include "if.h"
-
-/* get interface MTU to use kvm_read */
-void
-if_kvm_get_mtu (struct interface *ifp)
-{
-  kvm_t *kvmd;
-  struct ifnet ifnet;
-  unsigned long ifnetaddr;
-  int len;
- 
-  char ifname[IFNAMSIZ];
-  char tname[INTERFACE_NAMSIZ + 1];
-  char buf[_POSIX2_LINE_MAX];
- 
-  struct nlist nl[] = 
-  {
-    {"_ifnet"},
-    {""}
-  };
-
-  ifp->mtu6 = ifp->mtu = -1;
-  
-  kvmd = kvm_openfiles (NULL, NULL, NULL, O_RDONLY, buf);
-
-  if (kvmd == NULL) 
-    return ;
-  
-  kvm_nlist(kvmd, nl);
- 
-  ifnetaddr = nl[0].n_value;
- 
-  if (kvm_read(kvmd, ifnetaddr, (char *)&ifnetaddr, sizeof ifnetaddr) < 0) 
-    {
-      kvm_close (kvmd);
-      return ;
-    }
- 
-  while(ifnetaddr != 0) 
-    {
-      if (kvm_read (kvmd, ifnetaddr, (char *)&ifnet, sizeof ifnet) < 0) 
-	{
-	  kvm_close (kvmd);
-	  return ;
-	}
-
-      if (kvm_read (kvmd, (u_long)ifnet.if_name, ifname, IFNAMSIZ) < 0) 
-	{
-	  kvm_close (kvmd);
-	  return ;
-	}
-
-      len = snprintf (tname, INTERFACE_NAMSIZ + 1, 
-		      "%s%d", ifname, ifnet.if_unit);
-
-      if (strncmp (tname, ifp->name, len) == 0)
-	break;
-
-      ifnetaddr = (u_long)ifnet.if_next;
-    }
-
-  kvm_close (kvmd);
-
-  if (ifnetaddr == 0) 
-    {
-      return ;
-    }
-
-  ifp->mtu6 = ifp->mtu = ifnet.if_mtu;
-}
