diff --git a/Usermode/Libraries/libnet.so_src/Makefile b/Usermode/Libraries/libnet.so_src/Makefile
index 8bbf403524215b7e8b3d8f14414317c2c72a5124..00bb8783a616e65847948cf9f1886b8b23795fd0 100644
--- a/Usermode/Libraries/libnet.so_src/Makefile
+++ b/Usermode/Libraries/libnet.so_src/Makefile
@@ -6,7 +6,8 @@ CPPFLAGS +=
 CFLAGS   += -Wall
 LDFLAGS  += -lc -soname libnet.so
 
-OBJ = main.o address.o socket.o dns.o
+OBJ = main.o address.o socket.o
+OBJ += hostnames.o dns.o
 BIN = libnet.so
 
 include ../Makefile.tpl
diff --git a/Usermode/Libraries/libnet.so_src/dns.c b/Usermode/Libraries/libnet.so_src/dns.c
index 43213a485faaae52f1103d46307db8fea7d5c12e..001ec0006162a7f76ce5c987525ab95266b5557a 100644
--- a/Usermode/Libraries/libnet.so_src/dns.c
+++ b/Usermode/Libraries/libnet.so_src/dns.c
@@ -7,7 +7,7 @@
  */
 #include <stddef.h>	// size_t / NULL
 #include <stdint.h>	// uint*_t
-#include <string.h>	// memcpy, strchrnul
+#include <string.h>	// memcpy, strchr
 #include <assert.h>
 #include <net.h>
 #include "include/dns.h"
diff --git a/Usermode/Libraries/libnet.so_src/hostnames.c b/Usermode/Libraries/libnet.so_src/hostnames.c
new file mode 100644
index 0000000000000000000000000000000000000000..203f4aa462aa66cdb773f54aa11e832545fd48f3
--- /dev/null
+++ b/Usermode/Libraries/libnet.so_src/hostnames.c
@@ -0,0 +1,117 @@
+/*
+ * Acess2 Networking Toolkit
+ * By John Hodge (thePowersGang)
+ * 
+ * dns.c
+ * - Hostname<->Address resolution
+ */
+#include <net.h>
+#include "include/dns.h"
+#include <string.h>
+#include <stdbool.h>
+
+// === TYPES ===
+struct sDNSServer
+{
+	 int	AddrType;
+	char	AddrData[16];
+};
+
+struct sHostEntry
+{
+	 int	AddrType;
+	char	AddrData[16];
+	char	*Names[];
+};
+
+struct sDNSCallbackInfo
+{
+	 int	expected_size;
+	void	*dest_ptr;
+	enum eTypes	desired_type;
+	enum eClass	desired_class;
+	bool	have_result;
+};
+
+// === PROTOTYPES ===
+void	int_DNS_callback(void *info, const char *name, enum eTypes type, enum eClass class, unsigned int ttl, size_t rdlength, const void *rdata);
+
+// === GLOBALS ===
+ int	giNumDNSServers;
+struct sDNSServer	*gaDNSServers;
+ int	giNumHostEntries;
+struct sHostEntry	*gaHostEntries;
+
+// === CODE ===
+int Net_Lookup_AnyAddr(const char *Name, int AddrType, void *Addr)
+{
+	// 1. Load (if not loaded) the DNS config from "/Acess/Conf/dns"
+	// - "* <ip> <ip>" for DNS server(s)
+	// - "127.0.0.1 localhost localhost.localdomain"
+	
+	// 2. Check the hosts list
+	for( int i = 0; i < giNumHostEntries; i ++ )
+	{
+		const struct sHostEntry* he = &gaHostEntries[i];
+		if( he->AddrType == AddrType )
+		{
+			for( const char * const *namep = (const char**)he->Names; *namep; namep ++ )
+			{
+				if( strcasecmp(Name, *namep) == 0 )
+				{
+					memcpy(Addr, he->AddrData, Net_GetAddressSize(AddrType));
+					return 0;
+				}
+			}
+		}
+	}
+	// 3. Contact DNS server specified in config
+	for( int i = 0; i < giNumDNSServers; i ++ )
+	{
+		// TODO
+		const struct sDNSServer	*s = &gaDNSServers[i];
+		struct sDNSCallbackInfo	info = {
+			.expected_size = Net_GetAddressSize(AddrType),
+			.dest_ptr = Addr,
+			.desired_type = TYPE_A,
+			.desired_class = CLASS_IN,
+			.have_result = false
+			};
+		if( ! DNS_Query(s->AddrType, s->AddrData, Name, info.desired_type, info.desired_class, int_DNS_callback, &info) )
+		{
+			if( info.have_result )
+			{
+				return 0;
+			}
+			else
+			{
+				// NXDomain, I guess
+				return 1;
+			}
+		}
+	}
+	return 1;
+}
+
+void int_DNS_callback(void *info_v, const char *name, enum eTypes type, enum eClass class, unsigned int ttl, size_t rdlength, const void *rdata)
+{
+	struct sDNSCallbackInfo	*info = info_v;
+	if( type == info->desired_type && class == info->desired_class && info->have_result == false )
+	{
+		// We're just working with A and AAAA, so copying from rdata is safe
+		if( rdlength != info->expected_size ) {
+			// ... oh, that's not good
+			return ;
+		}
+		
+		memcpy(info->dest_ptr, rdata, rdlength);
+		
+		info->have_result = true;
+	}
+}
+
+int Net_Lookup_Name(int AddrType, const void *Addr, char *Dest[256])
+{
+	return 1;
+}
+
diff --git a/Usermode/Libraries/libnet.so_src/include/dns.h b/Usermode/Libraries/libnet.so_src/include/dns.h
index 1f2dd61ddc7f47fb360cd839da8ccfbdc13584a1..8a6ba440a581ee97802035860c75368d923b73a6 100644
--- a/Usermode/Libraries/libnet.so_src/include/dns.h
+++ b/Usermode/Libraries/libnet.so_src/include/dns.h
@@ -1,8 +1,15 @@
 /*
+ * Acess2 Networking Toolkit
+ * By John Hodge (thePowersGang)
+ * 
+ * dns.h
+ * - DNS Protocol Interface
  */
 #ifndef _DNS_H_
 #define _DNS_H_
 
+#include <stddef.h>
+
 enum eTypes
 {
 	TYPE_A = 1,