diff --git a/inet/inet_ntop.c b/inet/inet_ntop.c
new file mode 100644
index 0000000..a34ff36
--- /dev/null
+++ b/inet/inet_ntop.c
@@ -0,0 +1,49 @@
+/*
+ * inet/inet_ntop.c
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <arpa/inet.h>
+#include <netinet/in6.h>
+
+const char *inet_ntop(int af, const void *cp, char *buf, size_t len)
+{
+  int xlen;
+
+  switch ( af ) {
+  case AF_INET:
+    {
+      uint32_t v = ((const struct in_addr *)cp)->s_addr;
+
+      xlen = snprintf(buf, len, "%u.%u.%u.%u",
+		      (v >> 24), (v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff);
+    }
+    break;
+
+  case AF_INET6:
+    {
+      const struct in6_addr *s = (const struct in6_addr *)cp;
+      
+      xlen = snprintf(buf, len, "%x:%x:%x:%x:%x:%x:%x:%x",
+		      ntohs(s->s6_addr16[0]), ntohs(s->s6_addr16[1]),
+		      ntohs(s->s6_addr16[2]), ntohs(s->s6_addr16[3]),
+		      ntohs(s->s6_addr16[4]), ntohs(s->s6_addr16[5]),
+		      ntohs(s->s6_addr16[6]), ntohs(s->s6_addr16[7]));
+    }
+    break;
+
+  default:
+    errno = EAFNOSUPPORT;
+    return NULL;
+  }
+
+  if ( xlen > len ) {
+    errno = ENOSPC;
+    return NULL;
+  }
+
+  return buf;
+}
+
diff --git a/inet/inet_pton.c b/inet/inet_pton.c
new file mode 100644
index 0000000..6c14b3c
--- /dev/null
+++ b/inet/inet_pton.c
@@ -0,0 +1,74 @@
+/*
+ * inet/inet_pton.c
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <errno.h>
+#include <ctype.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <netinet/in6.h>
+
+static inline int hexval(int ch)
+{
+  if ( ch >= '0' && ch <= '9' ) {
+    return ch-'0';
+  } else if ( ch >= 'A' && ch <= 'F' ) {
+    return ch-'A'+10;
+  } else if ( ch >= 'a' && ch <= 'f' ) {
+    return ch-'a'+10;
+  } else {
+    return -1;
+  }
+}
+
+int inet_pton(int af, const char *src, void *dst)
+{
+  switch ( af ) {
+  case AF_INET:
+    return inet_aton(src, (struct in_addr *)dst);
+    
+  case AF_INET6:
+    {
+      struct in6_addr *d = (struct in6_addr *)dst;
+      int colons = 0, dcolons = 0;
+      int i;
+      const char *p;
+
+      /* A double colon will increment colons by 2, dcolons by 1 */
+      for ( p = dst ; *p ; p++ ) {
+	if ( p[0] == ':' ) {
+	  colons++;
+	  if ( p[1] == ':' )
+	    dcolons++;
+	} else if ( !isxdigit(*p) )
+	  return 0;		/* Not a valid address */
+      }
+
+      if ( colons > 7 || dcolons > 1 || (!dcolons && colons != 7) )
+	return 0;		/* Not a valid address */
+
+      memset(d, 0, sizeof(struct in6_addr));
+
+      i = 0;
+      for ( p = dst ; *p ; p++ ) {
+	if ( *p == ':' ) {
+	  if ( p[1] == ':' ) {
+	    i += (8-colons);
+	  } else {
+	    i++;
+	  }
+	} else {
+	  d->s6_addr16[i] = htons((ntohs(d->s6_addr16[i]) << 4) + hexval(*p));
+	}
+      }
+
+      return 1;
+    }
+
+  default:
+    errno = EAFNOSUPPORT;
+    return -1;
+  }
+}
diff --git a/klibc/inet/inet_ntop.c b/klibc/inet/inet_ntop.c
new file mode 100644
index 0000000..a34ff36
--- /dev/null
+++ b/klibc/inet/inet_ntop.c
@@ -0,0 +1,49 @@
+/*
+ * inet/inet_ntop.c
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <arpa/inet.h>
+#include <netinet/in6.h>
+
+const char *inet_ntop(int af, const void *cp, char *buf, size_t len)
+{
+  int xlen;
+
+  switch ( af ) {
+  case AF_INET:
+    {
+      uint32_t v = ((const struct in_addr *)cp)->s_addr;
+
+      xlen = snprintf(buf, len, "%u.%u.%u.%u",
+		      (v >> 24), (v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff);
+    }
+    break;
+
+  case AF_INET6:
+    {
+      const struct in6_addr *s = (const struct in6_addr *)cp;
+      
+      xlen = snprintf(buf, len, "%x:%x:%x:%x:%x:%x:%x:%x",
+		      ntohs(s->s6_addr16[0]), ntohs(s->s6_addr16[1]),
+		      ntohs(s->s6_addr16[2]), ntohs(s->s6_addr16[3]),
+		      ntohs(s->s6_addr16[4]), ntohs(s->s6_addr16[5]),
+		      ntohs(s->s6_addr16[6]), ntohs(s->s6_addr16[7]));
+    }
+    break;
+
+  default:
+    errno = EAFNOSUPPORT;
+    return NULL;
+  }
+
+  if ( xlen > len ) {
+    errno = ENOSPC;
+    return NULL;
+  }
+
+  return buf;
+}
+
diff --git a/klibc/inet/inet_pton.c b/klibc/inet/inet_pton.c
new file mode 100644
index 0000000..6c14b3c
--- /dev/null
+++ b/klibc/inet/inet_pton.c
@@ -0,0 +1,74 @@
+/*
+ * inet/inet_pton.c
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <errno.h>
+#include <ctype.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <netinet/in6.h>
+
+static inline int hexval(int ch)
+{
+  if ( ch >= '0' && ch <= '9' ) {
+    return ch-'0';
+  } else if ( ch >= 'A' && ch <= 'F' ) {
+    return ch-'A'+10;
+  } else if ( ch >= 'a' && ch <= 'f' ) {
+    return ch-'a'+10;
+  } else {
+    return -1;
+  }
+}
+
+int inet_pton(int af, const char *src, void *dst)
+{
+  switch ( af ) {
+  case AF_INET:
+    return inet_aton(src, (struct in_addr *)dst);
+    
+  case AF_INET6:
+    {
+      struct in6_addr *d = (struct in6_addr *)dst;
+      int colons = 0, dcolons = 0;
+      int i;
+      const char *p;
+
+      /* A double colon will increment colons by 2, dcolons by 1 */
+      for ( p = dst ; *p ; p++ ) {
+	if ( p[0] == ':' ) {
+	  colons++;
+	  if ( p[1] == ':' )
+	    dcolons++;
+	} else if ( !isxdigit(*p) )
+	  return 0;		/* Not a valid address */
+      }
+
+      if ( colons > 7 || dcolons > 1 || (!dcolons && colons != 7) )
+	return 0;		/* Not a valid address */
+
+      memset(d, 0, sizeof(struct in6_addr));
+
+      i = 0;
+      for ( p = dst ; *p ; p++ ) {
+	if ( *p == ':' ) {
+	  if ( p[1] == ':' ) {
+	    i += (8-colons);
+	  } else {
+	    i++;
+	  }
+	} else {
+	  d->s6_addr16[i] = htons((ntohs(d->s6_addr16[i]) << 4) + hexval(*p));
+	}
+      }
+
+      return 1;
+    }
+
+  default:
+    errno = EAFNOSUPPORT;
+    return -1;
+  }
+}
