diff --git a/Android.bp b/Android.bp
index 9d2d85e..0eb5298 100644
--- a/Android.bp
+++ b/Android.bp
@@ -50,9 +50,6 @@
         "ipv4.c",
         "ipv6.c",
         "logging.c",
-        "netlink_callbacks.c",
-        "netlink_msg.c",
-        "setif.c",
         "translate.c",
     ],
 }
@@ -67,7 +64,6 @@
     ],
     static_libs: [
         "libip_checksum",
-        "libnl",
     ],
     shared_libs: [
         "libcutils",
@@ -108,7 +104,6 @@
         "libbase",
         "libip_checksum",
         "libnetd_test_tun_interface",
-        "libnl",
     ],
     shared_libs: [
         "libcutils",
diff --git a/clatd.c b/clatd.c
index bc6b652..bb6aedc 100644
--- a/clatd.c
+++ b/clatd.c
@@ -47,7 +47,6 @@
 #include "dump.h"
 #include "getaddr.h"
 #include "logging.h"
-#include "setif.h"
 #include "translate.h"
 
 struct clat_config Global_Clatd_Config;
diff --git a/getaddr.c b/getaddr.c
index f25efc1..ba8052d 100644
--- a/getaddr.c
+++ b/getaddr.c
@@ -22,8 +22,7 @@
 #include <linux/rtnetlink.h>
 #include <net/if.h>
 #include <netinet/in.h>
-#include <netlink/handlers.h>
-#include <netlink/msg.h>
+#include <stdlib.h>
 #include <string.h>
 #include <strings.h>
 #include <unistd.h>
diff --git a/main.c b/main.c
index 069592f..74fb0c2 100644
--- a/main.c
+++ b/main.c
@@ -31,7 +31,6 @@
 #include "common.h"
 #include "config.h"
 #include "logging.h"
-#include "setif.h"
 
 #define DEVICEPREFIX "v4-"
 
diff --git a/netlink_callbacks.c b/netlink_callbacks.c
deleted file mode 100644
index 804976d..0000000
--- a/netlink_callbacks.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2012 Daniel Drown <dan-android@drown.org>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * netlink_callbacks.c - generic callbacks for netlink responses
- */
-#include <net/if.h>
-#include <netinet/in.h>
-
-#include <linux/rtnetlink.h>
-#include <netlink/handlers.h>
-#include <netlink/msg.h>
-
-/* function: ack_handler
- * generic netlink callback for ack messages
- * msg  - netlink message
- * data - pointer to an int, stores the success code
- */
-static int ack_handler(__attribute__((unused)) struct nl_msg *msg, void *data) {
-  int *retval = data;
-  *retval     = 0;
-  return NL_OK;
-}
-
-/* function: error_handler
- * generic netlink callback for error messages
- * nla  - error source
- * err  - netlink error message
- * arg  - pointer to an int, stores the error code
- */
-static int error_handler(__attribute__((unused)) struct sockaddr_nl *nla, struct nlmsgerr *err,
-                         void *arg) {
-  int *retval = arg;
-  if (err->error < 0) {
-    *retval = err->error;
-  } else {
-    *retval = 0;  // NLMSG_ERROR used as reply type on no error
-  }
-  return NL_OK;
-}
-
-/* function: alloc_ack_callbacks
- * allocates a set of netlink callbacks.  returns NULL on failure.  callbacks will modify retval
- * with <0 meaning failure retval - shared state between caller and callback functions
- */
-struct nl_cb *alloc_ack_callbacks(int *retval) {
-  struct nl_cb *callbacks;
-
-  callbacks = nl_cb_alloc(NL_CB_DEFAULT);
-  if (!callbacks) {
-    return NULL;
-  }
-  nl_cb_set(callbacks, NL_CB_ACK, NL_CB_CUSTOM, ack_handler, retval);
-  nl_cb_err(callbacks, NL_CB_CUSTOM, error_handler, retval);
-  return callbacks;
-}
diff --git a/netlink_callbacks.h b/netlink_callbacks.h
deleted file mode 100644
index 298ad3e..0000000
--- a/netlink_callbacks.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2012 Daniel Drown <dan-android@drown.org>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * netlink_callbacks.h - callbacks for netlink responses
- */
-
-#ifndef __NETLINK_CALLBACKS_H__
-#define __NETLINK_CALLBACKS_H__
-
-struct nl_cb *alloc_ack_callbacks(int *retval);
-
-#endif
diff --git a/netlink_msg.c b/netlink_msg.c
deleted file mode 100644
index be76ecd..0000000
--- a/netlink_msg.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright 2012 Daniel Drown
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * netlink_msg.c - send an ifaddrmsg/ifinfomsg/rtmsg via netlink
- */
-
-#include <errno.h>
-#include <linux/netlink.h>
-#include <linux/rtnetlink.h>
-#include <netinet/in.h>
-#include <string.h>
-
-#include <netlink-private/object-api.h>
-#include <netlink-private/types.h>
-#include <netlink/msg.h>
-#include <netlink/netlink.h>
-#include <netlink/socket.h>
-
-#include "netlink_callbacks.h"
-#include "netlink_msg.h"
-
-/* function: family_size
- * returns the size of the address structure for the given family, or 0 on error
- * family - AF_INET or AF_INET6
- */
-size_t inet_family_size(int family) {
-  if (family == AF_INET) {
-    return sizeof(struct in_addr);
-  } else if (family == AF_INET6) {
-    return sizeof(struct in6_addr);
-  } else {
-    return 0;
-  }
-}
-
-/* function: nlmsg_alloc_generic
- * allocates a netlink message with the given struct inside of it. returns NULL on failure
- * type           - netlink message type
- * flags          - netlink message flags
- * payload_struct - pointer to a struct to add to netlink message
- * payload_len    - bytelength of structure
- */
-struct nl_msg *nlmsg_alloc_generic(uint16_t type, uint16_t flags, void *payload_struct,
-                                   size_t payload_len) {
-  struct nl_msg *msg;
-
-  msg = nlmsg_alloc();
-  if (!msg) {
-    return NULL;
-  }
-
-  if ((sizeof(struct nl_msg) + payload_len) > msg->nm_size) {
-    nlmsg_free(msg);
-    return NULL;
-  }
-
-  msg->nm_nlh->nlmsg_len   = NLMSG_LENGTH(payload_len);
-  msg->nm_nlh->nlmsg_flags = flags;
-  msg->nm_nlh->nlmsg_type  = type;
-
-  memcpy(nlmsg_data(msg->nm_nlh), payload_struct, payload_len);
-
-  return msg;
-}
-
-/* function: nlmsg_alloc_ifaddr
- * allocates a netlink message with a struct ifaddrmsg inside of it. returns NULL on failure
- * type  - netlink message type
- * flags - netlink message flags
- * ifa   - ifaddrmsg to copy into the new netlink message
- */
-struct nl_msg *nlmsg_alloc_ifaddr(uint16_t type, uint16_t flags, struct ifaddrmsg *ifa) {
-  return nlmsg_alloc_generic(type, flags, ifa, sizeof(*ifa));
-}
-
-/* function: nlmsg_alloc_ifinfo
- * allocates a netlink message with a struct ifinfomsg inside of it. returns NULL on failure
- * type  - netlink message type
- * flags - netlink message flags
- * ifi   - ifinfomsg to copy into the new netlink message
- */
-struct nl_msg *nlmsg_alloc_ifinfo(uint16_t type, uint16_t flags, struct ifinfomsg *ifi) {
-  return nlmsg_alloc_generic(type, flags, ifi, sizeof(*ifi));
-}
-
-/* function: nlmsg_alloc_rtmsg
- * allocates a netlink message with a struct rtmsg inside of it. returns NULL on failure
- * type  - netlink message type
- * flags - netlink message flags
- * rt    - rtmsg to copy into the new netlink message
- */
-struct nl_msg *nlmsg_alloc_rtmsg(uint16_t type, uint16_t flags, struct rtmsg *rt) {
-  return nlmsg_alloc_generic(type, flags, rt, sizeof(*rt));
-}
-
-/* function: netlink_set_kernel_only
- * sets a socket to receive messages only from the kernel
- * sock - socket to connect
- */
-int netlink_set_kernel_only(struct nl_sock *nl_sk) {
-  struct sockaddr_nl addr = { AF_NETLINK, 0, 0, 0 };
-
-  if (!nl_sk) {
-    return -EFAULT;
-  }
-
-  int sockfd = nl_socket_get_fd(nl_sk);
-  return connect(sockfd, (struct sockaddr *)&addr, sizeof(addr));
-}
-
-/* function: send_netlink_msg
- * sends a netlink message, reads a response, and hands the response(s) to the callbacks
- * msg       - netlink message to send
- * callbacks - callbacks to use on responses
- */
-void send_netlink_msg(struct nl_msg *msg, struct nl_cb *callbacks) {
-  struct nl_sock *nl_sk;
-
-  nl_sk = nl_socket_alloc();
-  if (!nl_sk) goto cleanup;
-
-  if (nl_connect(nl_sk, NETLINK_ROUTE) != 0) goto cleanup;
-
-  if (nl_send_auto_complete(nl_sk, msg) < 0) goto cleanup;
-
-  if (netlink_set_kernel_only(nl_sk) < 0) goto cleanup;
-
-  nl_recvmsgs(nl_sk, callbacks);
-
-cleanup:
-  if (nl_sk) nl_socket_free(nl_sk);
-}
-
-/* function: send_ifaddrmsg
- * sends a netlink/ifaddrmsg message and hands the responses to the callbacks
- * type      - netlink message type
- * flags     - netlink message flags
- * ifa       - ifaddrmsg to send
- * callbacks - callbacks to use with the responses
- */
-void send_ifaddrmsg(uint16_t type, uint16_t flags, struct ifaddrmsg *ifa, struct nl_cb *callbacks) {
-  struct nl_msg *msg = NULL;
-
-  msg = nlmsg_alloc_ifaddr(type, flags, ifa);
-  if (!msg) return;
-
-  send_netlink_msg(msg, callbacks);
-
-  nlmsg_free(msg);
-}
-
-/* function: netlink_sendrecv
- * send a nl_msg and return an int status - only supports OK/ERROR responses
- * msg - msg to send
- */
-int netlink_sendrecv(struct nl_msg *msg) {
-  struct nl_cb *callbacks = NULL;
-  int retval              = -EIO;
-
-  callbacks = alloc_ack_callbacks(&retval);
-  if (!callbacks) {
-    return -ENOMEM;
-  }
-
-  send_netlink_msg(msg, callbacks);
-
-  nl_cb_put(callbacks);
-
-  return retval;
-}
diff --git a/netlink_msg.h b/netlink_msg.h
deleted file mode 100644
index 13e1f28..0000000
--- a/netlink_msg.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2012 Daniel Drown
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * netlink_msg.h - send an ifaddrmsg/ifinfomsg via netlink
- */
-#ifndef __NETLINK_IFMSG_H__
-#define __NETLINK_IFMSG_H__
-
-size_t inet_family_size(int family);
-struct nl_msg *nlmsg_alloc_ifaddr(uint16_t type, uint16_t flags, struct ifaddrmsg *ifa);
-struct nl_msg *nlmsg_alloc_ifinfo(uint16_t type, uint16_t flags, struct ifinfomsg *ifi);
-struct nl_msg *nlmsg_alloc_rtmsg(uint16_t type, uint16_t flags, struct rtmsg *rt);
-void send_netlink_msg(struct nl_msg *msg, struct nl_cb *callbacks);
-void send_ifaddrmsg(uint16_t type, uint16_t flags, struct ifaddrmsg *ifa, struct nl_cb *callbacks);
-int netlink_sendrecv(struct nl_msg *msg);
-int netlink_set_kernel_only(struct nl_sock *nl_sk);
-
-#endif
diff --git a/setif.c b/setif.c
deleted file mode 100644
index 184a46b..0000000
--- a/setif.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright 2012 Daniel Drown <dan-android@drown.org>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * setif.c - network interface configuration
- */
-#include <errno.h>
-#include <net/if.h>
-#include <netinet/in.h>
-
-#include <linux/rtnetlink.h>
-#include <netlink/handlers.h>
-#include <netlink/msg.h>
-
-#include "logging.h"
-#include "netlink_msg.h"
-
-#define DEBUG_OPTNAME(a)                                                                           \
-  case (a): {                                                                                      \
-    optname = #a;                                                                                  \
-    break;                                                                                         \
-  }
-
-/* function: add_address
- * adds an IP address to/from an interface, returns 0 on success and <0 on failure
- * ifname    - name of interface to change
- * family    - address family (AF_INET, AF_INET6)
- * address   - pointer to a struct in_addr or in6_addr
- * prefixlen - bitlength of network (example: 24 for AF_INET's 255.255.255.0)
- * broadcast - broadcast address (only for AF_INET, ignored for AF_INET6)
- */
-int add_address(const char *ifname, int family, const void *address, int prefixlen,
-                const void *broadcast) {
-  int retval;
-  size_t addr_size;
-  struct ifaddrmsg ifa;
-  struct nl_msg *msg = NULL;
-
-  addr_size = inet_family_size(family);
-  if (addr_size == 0) {
-    retval = -EAFNOSUPPORT;
-    goto cleanup;
-  }
-
-  memset(&ifa, 0, sizeof(ifa));
-  if (!(ifa.ifa_index = if_nametoindex(ifname))) {
-    retval = -ENODEV;
-    goto cleanup;
-  }
-  ifa.ifa_family    = family;
-  ifa.ifa_prefixlen = prefixlen;
-  ifa.ifa_scope     = RT_SCOPE_UNIVERSE;
-
-  msg =
-    nlmsg_alloc_ifaddr(RTM_NEWADDR, NLM_F_ACK | NLM_F_REQUEST | NLM_F_CREATE | NLM_F_REPLACE, &ifa);
-  if (!msg) {
-    retval = -ENOMEM;
-    goto cleanup;
-  }
-
-  if (nla_put(msg, IFA_LOCAL, addr_size, address) < 0) {
-    retval = -ENOMEM;
-    goto cleanup;
-  }
-  if (family == AF_INET6) {
-    // AF_INET6 gets IFA_LOCAL + IFA_ADDRESS
-    if (nla_put(msg, IFA_ADDRESS, addr_size, address) < 0) {
-      retval = -ENOMEM;
-      goto cleanup;
-    }
-  } else if (family == AF_INET) {
-    // AF_INET gets IFA_LOCAL + IFA_BROADCAST
-    if (nla_put(msg, IFA_BROADCAST, addr_size, broadcast) < 0) {
-      retval = -ENOMEM;
-      goto cleanup;
-    }
-  } else {
-    retval = -EAFNOSUPPORT;
-    goto cleanup;
-  }
-
-  retval = netlink_sendrecv(msg);
-
-cleanup:
-  if (msg) nlmsg_free(msg);
-
-  return retval;
-}
-
-/* function: if_up
- * sets interface link state to up and sets mtu, returns 0 on success and <0 on failure
- * ifname - interface name to change
- * mtu    - new mtu
- */
-int if_up(const char *ifname, int mtu) {
-  int retval = -1;
-  struct ifinfomsg ifi;
-  struct nl_msg *msg = NULL;
-
-  memset(&ifi, 0, sizeof(ifi));
-  if (!(ifi.ifi_index = if_nametoindex(ifname))) {
-    retval = -ENODEV;
-    goto cleanup;
-  }
-  ifi.ifi_change = IFF_UP;
-  ifi.ifi_flags  = IFF_UP;
-
-  msg = nlmsg_alloc_ifinfo(RTM_SETLINK, NLM_F_ACK | NLM_F_REQUEST | NLM_F_ROOT, &ifi);
-  if (!msg) {
-    retval = -ENOMEM;
-    goto cleanup;
-  }
-
-  if (nla_put(msg, IFLA_MTU, 4, &mtu) < 0) {
-    retval = -ENOMEM;
-    goto cleanup;
-  }
-
-  retval = netlink_sendrecv(msg);
-
-cleanup:
-  if (msg) nlmsg_free(msg);
-
-  return retval;
-}
-
-static int do_anycast_setsockopt(int sock, int what, struct in6_addr *addr, int ifindex) {
-  struct ipv6_mreq mreq = { *addr, ifindex };
-  char *optname;
-  int ret;
-
-  switch (what) {
-    DEBUG_OPTNAME(IPV6_JOIN_ANYCAST)
-    DEBUG_OPTNAME(IPV6_LEAVE_ANYCAST)
-    default:
-      optname = "???";
-      break;
-  }
-
-  ret = setsockopt(sock, SOL_IPV6, what, &mreq, sizeof(mreq));
-  if (ret) {
-    logmsg(ANDROID_LOG_ERROR, "%s: setsockopt(%s): %s", __func__, optname, strerror(errno));
-  }
-
-  return ret;
-}
-
-/* function: add_anycast_address
- * adds an anycast IPv6 address to an interface, returns 0 on success and <0 on failure
- * sock      - the socket to add the address to
- * addr      - the IP address to add
- * ifname    - name of interface to add the address to
- */
-int add_anycast_address(int sock, struct in6_addr *addr, const char *ifname) {
-  int ifindex;
-
-  ifindex = if_nametoindex(ifname);
-  if (!ifindex) {
-    logmsg(ANDROID_LOG_ERROR, "%s: unknown ifindex for interface %s", __func__, ifname);
-    return -ENODEV;
-  }
-
-  return do_anycast_setsockopt(sock, IPV6_JOIN_ANYCAST, addr, ifindex);
-}
-
-/* function: del_anycast_address
- * removes an anycast IPv6 address from the system, returns 0 on success and <0 on failure
- * sock      - the socket to remove from, must have had the address added via add_anycast_address
- * addr      - the IP address to remove
- */
-int del_anycast_address(int sock, struct in6_addr *addr) {
-  return do_anycast_setsockopt(sock, IPV6_LEAVE_ANYCAST, addr, 0);
-}
diff --git a/setif.h b/setif.h
deleted file mode 100644
index 2d0adb1..0000000
--- a/setif.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2012 Daniel Drown
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * setif.h - network interface configuration
- */
-#ifndef __SETIF_H__
-#define __SETIF_H__
-
-int add_address(const char *ifname, int family, const void *address, int cidr,
-                const void *broadcast);
-int if_up(const char *ifname, int mtu);
-
-int add_anycast_address(int sock, const struct in6_addr *addr, const char *interface);
-int del_anycast_address(int sock, const struct in6_addr *addr);
-
-#endif
