diff --git a/Usermode/Libraries/Makefile.tpl b/Usermode/Libraries/Makefile.tpl
index 9712bf8a5776fbeba1cca5ce24564b8051e86899..51e404d4930082e8866ec84a3468f29d78d6da2a 100644
--- a/Usermode/Libraries/Makefile.tpl
+++ b/Usermode/Libraries/Makefile.tpl
@@ -5,16 +5,17 @@
 DEPFILES := $(addsuffix .d,$(OBJ))
 
 _BIN := $(OUTPUTDIR)Libs/$(BIN)
+_XBIN := $(addprefix $(OUTPUTDIR)Libs/,$(EXTRABIN))
 
 .PHONY: all clean install postbuild
 
-all: $(_BIN) postbuild
+all: $(_BIN) $(_XBIN)
 
 clean:
-	$(RM) $(_BIN) $(OBJ) $(_BIN).dsm $(DEPFILES)
+	$(RM) $(_BIN) $(_XBIN) $(OBJ) $(_BIN).dsm $(DEPFILES)
 
 install: all
-	$(xCP) $(_BIN) $(DISTROOT)/Libs/
+	$(xCP) $(_BIN) $(_XBIN) $(DISTROOT)/Libs/
 
 $(_BIN): $(OBJ)
 	@mkdir -p $(dir $(_BIN))
diff --git a/Usermode/Libraries/ld-acess.so_src/Makefile b/Usermode/Libraries/ld-acess.so_src/Makefile
index 3c02d3dbc78efa06db344e5dff7b610c1a214ac4..668460a06f5b9ebdd2800b4e4737078bc0e6de4e 100644
--- a/Usermode/Libraries/ld-acess.so_src/Makefile
+++ b/Usermode/Libraries/ld-acess.so_src/Makefile
@@ -4,18 +4,19 @@
 
 -include ../Makefile.cfg
 
-OBJ := main.o lib.o loadlib.o elf.o pe.o
+OBJ := main.o lib.o loadlib.o export.o elf.o pe.o
 OBJ += core.ao vfs.ao mm.ao
 BIN = ld-acess.so
+EXTRABIN := libld-acess.so
 
 CFLAGS   = -Wall -fno-builtin -fno-leading-underscore -fno-stack-protector
+CFLAGS  += $(CPPFLAGS)
 ASFLAGS  = -felf
-LDFLAGS  = -T link.ld -Map map.txt -Bstatic -shared
+LDFLAGS  = -T link.ld -Map map.txt --export-dynamic
 
 include ../Makefile.tpl
 
-postbuild: $(OUTPUTDIR)Libs/libld-acess.so
-
-$(OUTPUTDIR)Libs/libld-acess.so:
-	ln -s $(_BIN) $(OUTPUTDIR)Libs/libld-acess.so
+$(_XBIN): $(_BIN)
+	@echo [LD] -o -shared libld-acess.so
+	@$(LD) $(LDFLAGS) -shared -o $@ $(OBJ)
 
diff --git a/Usermode/Libraries/ld-acess.so_src/common.h b/Usermode/Libraries/ld-acess.so_src/common.h
index 3356a27dc80a599e5d5abfd31b6ec82327ada9cd..fad0344a6ac7fe4227089b8cb2dacefa14cf9199 100644
--- a/Usermode/Libraries/ld-acess.so_src/common.h
+++ b/Usermode/Libraries/ld-acess.so_src/common.h
@@ -54,12 +54,12 @@ extern int	file_exists(char *filename);
 
 // === System Calls ===
 extern void	_exit(int retval);
-extern void	SysDebug(char *fmt, ...);	//!< Now implemented in main.c
-extern void	SysDebugV(char *fmt, ...);
-extern Uint	SysLoadBin(char *path, Uint *entry);
+extern void	SysDebug(const char *fmt, ...);	//!< Now implemented in main.c
+extern void	SysDebugV(const char *fmt, ...);
+extern Uint	SysLoadBin(const char *path, Uint *entry);
 extern Uint	SysUnloadBin(Uint Base);
 extern void	SysSetFaultHandler(int (*Hanlder)(int));
-extern int	open(char *filename, int flags);
+extern int	open(const char *filename, int flags);
 extern void	close(int fd);
 
 // === ELF Loader ===
diff --git a/Usermode/Libraries/ld-acess.so_src/elf.c b/Usermode/Libraries/ld-acess.so_src/elf.c
index e1fcd2d4426819899c48b4cae5ebc298a1694cb3..dcde746dda1a3e52ff830caf5032bba649f1feab 100644
--- a/Usermode/Libraries/ld-acess.so_src/elf.c
+++ b/Usermode/Libraries/ld-acess.so_src/elf.c
@@ -315,6 +315,49 @@ int ElfGetSymbol(Uint Base, char *Name, Uint *ret)
 
 	//DEBUGS("ElfGetSymbol: (Base=0x%x, Name='%s')\n", Base, Name);
 
+	// Catch the current executable
+	#if 0
+	if( !hdr->misc.HashTable )
+	{
+		Elf32_Phdr	*phtab;
+		Elf32_Dyn	*dynTab = NULL;
+		 int	j;
+		
+		// Locate the tables
+		phtab = (void*)( Base + hdr->phoff );
+		for( i = 0; i < hdr->phentcount; i ++ )
+		{
+			if( phtab[i].Type == PT_DYNAMIC ) {
+				dynTab = (void*)phtab[i].VAddr;
+				break ;
+			}
+		}
+		if( !dynTab ) {
+			SysDebug("ERROR - Unable to find DYNAMIC segment in %p", (void*)Base);
+			return 0;
+		}
+		
+		for( j = 0; dynTab[j].d_tag != DT_NULL; j++)
+		{
+			switch(dynTab[j].d_tag)
+			{
+			// --- Symbol Table ---
+			case DT_SYMTAB:
+				hdr->misc.SymTable = dynTab[j].d_val;
+				break;
+			// --- Hash Table --
+			case DT_HASH:
+				hdr->misc.HashTable = dynTab[j].d_val;
+				break;
+			}
+		}
+	}
+	#endif
+	
+	if( !hdr->misc.SymTable || !hdr->misc.HashTable ) {
+		return 0;
+	}
+
 	pBuckets = (void *) hdr->misc.HashTable;
 	symtab = (void *) hdr->misc.SymTable;
 	
diff --git a/Usermode/Libraries/ld-acess.so_src/export.c b/Usermode/Libraries/ld-acess.so_src/export.c
new file mode 100644
index 0000000000000000000000000000000000000000..867e17fb68a716705672814905aea5b0407ac490
--- /dev/null
+++ b/Usermode/Libraries/ld-acess.so_src/export.c
@@ -0,0 +1,67 @@
+/*
+ * Acess2 Dynamic Linker
+ */
+#include "common.h"
+#include <acess/sys.h>
+
+#define _STR(x)	#x
+#define STR(x)	_STR(x)
+#define EXP(sym)	{(Uint)&sym, STR(sym)}
+
+// === CONSTANTS ===
+const struct {
+	Uint	Value;
+	char	*Name;
+}	caLocalExports[] = {
+	EXP(gLoadedLibraries),
+	EXP(_exit),
+	EXP(clone),
+	EXP(kill),
+	EXP(yield),
+	EXP(sleep),
+	EXP(waittid),
+	EXP(gettid),
+	EXP(getpid),
+	EXP(getuid),
+	EXP(getgid),
+
+	EXP(setuid),
+	EXP(setgid),
+
+	EXP(SysSetName),
+	//EXP(SysGetName),
+
+	//EXP(SysSetPri),
+
+	EXP(SysSendMessage),
+	EXP(SysGetMessage),
+
+	//EXP(SysSpawn),
+	EXP(execve),
+	EXP(SysLoadBin),
+	EXP(SysUnloadBin),
+
+	EXP(_SysSetFaultHandler),
+	
+	EXP(open),
+	EXP(reopen),
+	EXP(close),
+	EXP(read),
+	EXP(write),
+	EXP(seek),
+	EXP(tell),
+	EXP(finfo),
+	EXP(readdir),
+	EXP(_SysGetACL),
+	EXP(chdir),
+	EXP(ioctl),
+	EXP(_SysMount),
+
+	EXP(_SysOpenChild),
+	
+	EXP(_SysGetPhys),
+	EXP(_SysAllocate)
+
+};
+
+const int	ciNumLocalExports = sizeof(caLocalExports)/sizeof(caLocalExports[0]);
diff --git a/Usermode/Libraries/ld-acess.so_src/link.ld b/Usermode/Libraries/ld-acess.so_src/link.ld
index c318850d97ced996b9a2c27fd4b00f648dd718a1..3ab4f1a94aea1a89ecab2bab7b42be95f99fdcd6 100644
--- a/Usermode/Libraries/ld-acess.so_src/link.ld
+++ b/Usermode/Libraries/ld-acess.so_src/link.ld
@@ -4,6 +4,45 @@ OUTPUT_FORMAT(elf32-i386)
 SECTIONS {
     . = 0xBBFF0000;
     gLinkedBase = .;
+	. += SIZEOF_HEADERS;
+	.interp         : { *(.interp) }
+	.note.gnu.build-id : { *(.note.gnu.build-id) }
+	.hash           : { *(.hash) }
+	.gnu.hash       : { *(.gnu.hash) }
+	.dynsym         : { *(.dynsym) }
+	.dynstr         : { *(.dynstr) }
+	.gnu.version    : { *(.gnu.version) }
+	.gnu.version_d  : { *(.gnu.version_d) }
+	.gnu.version_r  : { *(.gnu.version_r) }
+	.rel.dyn        :
+	{
+		*(.rel.init)
+		*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
+		*(.rel.fini)
+		*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
+		*(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*)
+		*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
+		*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
+		*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
+		*(.rel.ctors)
+		*(.rel.dtors)
+		*(.rel.got)
+		*(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
+	}
+	.rela.dyn       :
+	{
+		*(.rela.init)
+		*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
+		*(.rela.fini)
+		*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
+		*(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
+		*(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
+		*(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
+		*(.rela.ctors)
+		*(.rela.dtors)
+		*(.rela.got)
+		*(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
+	}
 
    .text : AT(ADDR(.text)) {
         code = .;
diff --git a/Usermode/Libraries/ld-acess.so_src/loadlib.c b/Usermode/Libraries/ld-acess.so_src/loadlib.c
index e5090ddd99273b2a5e9abec52d079da3ee270aeb..a5f0bc260c9f8e65d92f326cd6505e7f61df7b36 100644
--- a/Usermode/Libraries/ld-acess.so_src/loadlib.c
+++ b/Usermode/Libraries/ld-acess.so_src/loadlib.c
@@ -16,13 +16,12 @@
 Uint	IsFileLoaded(char *file);
  int	GetSymbolFromBase(Uint base, char *name, Uint *ret);
 
-// === CONSTANTS ===
-const struct {
+// === IMPORTS ===
+extern const struct {
 	Uint	Value;
 	char	*Name;
-}	caLocalExports[] = {
-	{(Uint)gLoadedLibraries, "gLoadedLibraries"}
-};
+}	caLocalExports[];
+extern const int	ciNumLocalExports;
 
 // === GLOABLS ===
 tLoadedLib	gLoadedLibraries[MAX_LOADED_LIBRARIES];
@@ -200,7 +199,9 @@ Uint GetSymbol(char *name)
 {
 	 int	i;
 	Uint	ret;
-	for(i=0;i<sizeof(caLocalExports)/sizeof(caLocalExports[0]);i++)
+	
+	//SysDebug("ciNumLocalExports = %i", ciNumLocalExports);
+	for(i=0;i<ciNumLocalExports;i++)
 	{
 		if( strcmp(caLocalExports[i].Name, name) == 0 )
 			return caLocalExports[i].Value;
@@ -210,11 +211,11 @@ Uint GetSymbol(char *name)
 	{
 		if(gLoadedLibraries[i].Base == 0)	break;
 		
-		//SysDebug(" GetSymbol: Trying 0x%x, '%s'\n",
+		//SysDebug(" GetSymbol: Trying 0x%x, '%s'",
 		//	gLoadedLibraries[i].Base, gLoadedLibraries[i].Name);
 		if(GetSymbolFromBase(gLoadedLibraries[i].Base, name, &ret))	return ret;
 	}
-	SysDebug("GetSymbol: === Symbol '%s' not found ===\n", name);
+	SysDebug("GetSymbol: === Symbol '%s' not found ===", name);
 	return 0;
 }
 
@@ -228,6 +229,7 @@ int GetSymbolFromBase(Uint base, char *name, Uint *ret)
 		return ElfGetSymbol(base, name, ret);
 	if(*(Uint16*)base == ('M'|('Z'<<8)))
 		return PE_GetSymbol(base, name, ret);
+	SysDebug("Unknown type at %p", base);
 	return 0;
 }
 
diff --git a/Usermode/Libraries/ld-acess.so_src/main.c b/Usermode/Libraries/ld-acess.so_src/main.c
index 4f2ef88b41803fa229849d750d2151f767dab52f..85fbc74da90540f8f13825c33ac130b869f5944c 100644
--- a/Usermode/Libraries/ld-acess.so_src/main.c
+++ b/Usermode/Libraries/ld-acess.so_src/main.c
@@ -38,7 +38,7 @@ int SoMain(Uint base, int arg1)
 	}
 
 	gLoadedLibraries[0].Base = (Uint)&gLinkedBase;
-	gLoadedLibraries[0].Name = "ld-acess.so";
+	gLoadedLibraries[0].Name = "/Acess/Libs/libld-acess.so";
 	
 	// Otherwise do relocations
 	//ret = DoRelocate( base, envp, "Executable" );