diff --git a/AcessNative/acesskernel_src/Makefile b/AcessNative/acesskernel_src/Makefile
index 71782a9a444e8bf2c5599471c0c79364d35216ee..c69cf066d339e9b565296a1c1eec6136ed9a3d2b 100644
--- a/AcessNative/acesskernel_src/Makefile
+++ b/AcessNative/acesskernel_src/Makefile
@@ -12,7 +12,7 @@ KERNEL_OBJ += vfs/main.o vfs/open.o vfs/acls.o vfs/io.o vfs/dir.o vfs/nodecache.
 KERNEL_OBJ += vfs/fs/root.o vfs/fs/devfs.o
 KERNEL_OBJ += drv/vterm.o drv/fifo.o drv/proc.o
 
-OBJ := main.o helpers.o threads.o syscalls.o
+OBJ := main.o helpers.o threads.o server.o syscalls.o
 OBJ += video.o keyboard.o mouse.o nativefs.o vfs_handle.o ui_sdl.o
 OBJ += $(addprefix $(KERNEL_SRC),$(KERNEL_OBJ))
 
diff --git a/AcessNative/acesskernel_src/main.c b/AcessNative/acesskernel_src/main.c
index 7de6bf959bf863dbb1e3d2a8cea4eeaebcda0aa0..3f152efaca6b5e4a4ea8c18a04cf12f6989ec1e7 100644
--- a/AcessNative/acesskernel_src/main.c
+++ b/AcessNative/acesskernel_src/main.c
@@ -13,6 +13,7 @@ extern int	VFS_Init(void);
 extern int	Video_Install(char **Arguments);
 extern int	NativeKeyboard_Install(char **Arguments);
 extern int	VT_Install(char **Arguments);
+extern int	SyscallServer(void);
 
 // === CODE ===
 int main(int argc, char *argv[])
@@ -38,10 +39,8 @@ int main(int argc, char *argv[])
 	}
 	
 	// Start syscall server
-	for( ;; )
-	{
-		UI_Redraw();
-	}
+	// - Blocks
+	SyscallServer();
 	
 	return 0;
 }
diff --git a/AcessNative/acesskernel_src/syscalls.c b/AcessNative/acesskernel_src/syscalls.c
index db7907706033d8be2286f0d563884f1e80ba5b00..7e8d1ecd52fd4d39123cc4d6690d11c53bf9490c 100644
--- a/AcessNative/acesskernel_src/syscalls.c
+++ b/AcessNative/acesskernel_src/syscalls.c
@@ -2,7 +2,7 @@
  * Acess2 Native Kernel
  * - Acess kernel emulation on another OS using SDL and UDP
  *
- * Syscall Server
+ * Syscall Distribution
  */
 #include <acess.h>
 #include "../syscalls.h"
diff --git a/AcessNative/ld-acess_src/request.c b/AcessNative/ld-acess_src/request.c
index df6e5c5596c1a0d1d99ca3d0533676cc686e36fa..1fff68e8091a420d41d58afe778c2cb1f551ac07 100644
--- a/AcessNative/ld-acess_src/request.c
+++ b/AcessNative/ld-acess_src/request.c
@@ -14,7 +14,11 @@
 #include "request.h"
 #include "../syscalls.h"
 
-#define	SERVER_PORT	0xACE
+#define USE_TCP	0
+
+// === PROTOTYPES ===
+void	SendData(void *Data, int Length);
+ int	ReadData(void *Dest, int MaxLen, int Timeout);
 
 // === GLOBALS ===
 #ifdef __WIN32__
@@ -26,13 +30,12 @@ SOCKET	gSocket = INVALID_SOCKET;
 #endif
 // Client ID to pass to server
 // TODO: Implement such that each thread gets a different one
-static int	siSyscall_ClientID = 0;
+ int	giSyscall_ClientID = 0;
+struct sockaddr_in	gSyscall_ServerAddr;
 
 // === CODE ===
 int _InitSyscalls()
 {
-	struct sockaddr_in	server;
-	struct sockaddr_in	client;
 	
 	#ifdef __WIN32__
 	/* Open windows connection */
@@ -43,10 +46,13 @@ int _InitSyscalls()
 	}
 	#endif
 	
+	#if USE_TCP
 	// Open TCP Connection
 	gSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+	#else
 	// Open UDP Connection
-	//gSocket = socket(AF_INET, SOCK_DGRAM, 0);
+	gSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+	#endif
 	if (gSocket == INVALID_SOCKET)
 	{
 		fprintf(stderr, "Could not create socket.\n");
@@ -57,18 +63,21 @@ int _InitSyscalls()
 	}
 	
 	// Set server address
-	memset((void *)&server, '\0', sizeof(struct sockaddr_in));
-	server.sin_family = AF_INET;
-	server.sin_port = htons(SERVER_PORT);
-	server.sin_addr.s_addr = htonl(0x7F00001);
+	memset((void *)&gSyscall_ServerAddr, '\0', sizeof(struct sockaddr_in));
+	gSyscall_ServerAddr.sin_family = AF_INET;
+	gSyscall_ServerAddr.sin_port = htons(SERVER_PORT);
+	gSyscall_ServerAddr.sin_addr.s_addr = htonl(0x7F000001);
 	
+	#if 0
 	// Set client address
 	memset((void *)&client, '\0', sizeof(struct sockaddr_in));
 	client.sin_family = AF_INET;
 	client.sin_port = htons(0);
-	client.sin_addr.s_addr = htonl(0x7F00001);
+	client.sin_addr.s_addr = htonl(0x7F000001);
+	#endif
 	
-	if( connect(gSocket, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) < 0 )
+	#if USE_TCP
+	if( connect(gSocket, (struct sockaddr *)&gSyscall_ServerAddr, sizeof(struct sockaddr_in)) < 0 )
 	{
 		fprintf(stderr, "Cannot connect to server (localhost:%i)\n", SERVER_PORT);
 		perror("_InitSyscalls");
@@ -80,6 +89,7 @@ int _InitSyscalls()
 		#endif
 		exit(0);
 	}
+	#endif
 	
 	#if 0
 	// Bind
@@ -96,6 +106,24 @@ int _InitSyscalls()
 	}
 	#endif
 	
+	#if !USE_TCP
+	// Ask server for a client ID
+	{
+		tRequestHeader	req;
+		 int	len;
+		req.ClientID = 0;
+		req.CallID = 0;
+		req.NParams = 0;
+		req.NReturn = 0;
+		
+		SendData(&req, sizeof(req));
+		
+		len = ReadData(&req, sizeof(req), 5);
+		
+		giSyscall_ClientID = req.ClientID;
+	}
+	#endif
+	
 	return 0;
 }
 
@@ -125,7 +153,7 @@ int SendRequest(int RequestID, int NumOutput, tOutValue **Output, int NumInput,
 	data = (char*)&request->Params[ NumOutput + NumInput ];
 	
 	// Set header
-	request->ClientID = siSyscall_ClientID;
+	request->ClientID = giSyscall_ClientID;
 	request->CallID = RequestID;	// Syscall
 	request->NParams = NumOutput;
 	request->NReturn = NumInput;
@@ -181,21 +209,10 @@ int SendRequest(int RequestID, int NumOutput, tOutValue **Output, int NumInput,
 	#endif
 	
 	// Send it off
-	if( send(gSocket, request, requestLen, 0) != requestLen ) {
-		fprintf(stderr, "SendRequest: send() failed\n");
-		perror("SendRequest - send");
-		free( request );
-		return -1;
-	}
+	SendData(request, requestLen);
 	
-	// Wait for a response
-	requestLen = recv(gSocket, request, requestLen, 0);
-	if( requestLen < 0 ) {
-		fprintf(stderr, "SendRequest: revc() failed\n");
-		perror("SendRequest - recv");
-		free( request );
-		return -1;
-	}
+	// Wait for a response (no timeout)
+	requestLen = ReadData(request, requestLen, -1);
 	
 	// Parse response out
 	if( request->NParams != NumInput ) {
@@ -211,3 +228,57 @@ int SendRequest(int RequestID, int NumOutput, tOutValue **Output, int NumInput,
 	
 	return 0;
 }
+
+void SendData(void *Data, int Length)
+{
+	 int	len;
+	
+	#if USE_TCP
+	len = send(Data, Length, 0);
+	#else
+	len = sendto(gSocket, Data, Length, 0,
+		(struct sockaddr*)&gSyscall_ServerAddr, sizeof(gSyscall_ServerAddr));
+	#endif
+	
+	if( len != Length ) {
+		perror("SendData");
+		exit(-1);
+	}
+}
+
+int ReadData(void *Dest, int MaxLength, int Timeout)
+{
+	 int	ret;
+	fd_set	fds;
+	struct timeval	tv;
+	
+	FD_ZERO(&fds);
+	FD_SET(gSocket, &fds);
+	
+	tv.tv_sec = Timeout;
+	tv.tv_usec = 0;
+	
+	ret = select(1, &fds, NULL, NULL, &tv);
+	if( ret == -1 ) {
+		perror("ReadData - select");
+		exit(-1);
+	}
+	
+	if( !ret ) {
+		printf("Timeout reading from socket\n");
+		return 0;	// Timeout
+	}
+	
+	#if USE_TCP
+	ret = recv(gSocket, Dest, MaxLength, 0);
+	#else
+	ret = recvfrom(gSocket, Dest, MaxLength, 0, NULL, 0);
+	#endif
+	
+	if( ret < 0 ) {
+		perror("ReadData");
+		exit(-1);
+	}
+	
+	return ret;
+}
diff --git a/AcessNative/syscalls.h b/AcessNative/syscalls.h
index 5081a53d2430551ea80cfd7075601ee50ea69ebf..903cbfaeacaf78e0da53ce18588e99f2bcead584 100644
--- a/AcessNative/syscalls.h
+++ b/AcessNative/syscalls.h
@@ -3,6 +3,8 @@
 #ifndef _NATIVE_SYSCALLS_H_
 #define _NATIVE_SYSCALLS_H_
 
+#define	SERVER_PORT	0xACE
+
 /*
  * Request format
  *