diff --git a/.cproject b/.cproject
index 697a696..04b8d6f 100644
--- a/.cproject
+++ b/.cproject
@@ -24,13 +24,13 @@
 							
 							
 							
-								
 								
 							
 							
-								
 								
diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml
index bfaac99..207fcc1 100644
--- a/.settings/language.settings.xml
+++ b/.settings/language.settings.xml
@@ -5,7 +5,7 @@
 			
 			
 			
-			
+			
 				
 				
 			
diff --git a/sys/i386/i386_exec.c b/sys/i386/i386_exec.c
index 176e41e..2bc2613 100644
--- a/sys/i386/i386_exec.c
+++ b/sys/i386/i386_exec.c
@@ -91,7 +91,7 @@
   Elf32_Addr pcpu_stop; /* Pre-relocation pcpu set stop. */
   Elf32_Addr pcpu_base; /* Relocated pcpu set address. */
   Elf32_Addr ld_addr; // Entry Point Of Linker (Load It Too)
-}*elf_file_t;
+} *elf_file_t;
 
 static int elf_parse_dynamic(elf_file_t ef);
 
@@ -106,12 +106,14 @@
  so do not use out side of kernel space
 
  *****************************************************************************************/
-uInt32 execThread(void (*tproc)(void), uint32_t stack, char *arg) {
+uint32_t execThread(void (*tproc)(void), uint32_t stack, char *arg) {
+
   kTask_t * newProcess = 0x0;
+
   /* Find A New Thread */
   newProcess = schedNewTask();
-
   assert(newProcess);
+
   if (stack < 0x100000)
     kpanic("exec: stack not in valid area: [0x%X]\n", stack);
 
@@ -131,7 +133,7 @@
   newProcess->tss.esi = 0x0;
   newProcess->tss.edi = 0x0;
 
-  /* Set these up to be ring 3 tasks */
+  /* Ring 3 Selectors */
   /*
    newProcess->tss.es           = 0x30+3;
    newProcess->tss.cs           = 0x28+3;
@@ -141,6 +143,7 @@
    newProcess->tss.gs           = 0x30+3;
    */
 
+  /* Ring 0 Selectors */
   newProcess->tss.es = 0x10;
   newProcess->tss.cs = 0x08;
   newProcess->tss.ss = 0x10;
@@ -157,26 +160,26 @@
 
   /* Set up default stack for thread here filled with arg list 3 times */
   asm volatile(
-      "pusha               \n"
-      "movl   %%esp,%%ecx  \n"
-      "movl   %1,%%eax     \n"
-      "movl   %%eax,%%esp  \n"
-      "pushl  %%ebx        \n"
-      "pushl  %%ebx        \n"
-      "pushl  %%ebx        \n"
-      "movl   %%esp,%%eax  \n"
-      "movl   %%eax,%1     \n"
-      "movl   %%ecx,%%esp  \n"
-      "popa                \n"
-      :
-      : "b" (arg),"m" (newProcess->tss.esp)
+    "pusha               \n"
+    "movl   %%esp,%%ecx  \n"
+    "movl   %1,%%eax     \n"
+    "movl   %%eax,%%esp  \n"
+    "pushl  %%ebx        \n"
+    "pushl  %%ebx        \n"
+    "pushl  %%ebx        \n"
+    "movl   %%esp,%%eax  \n"
+    "movl   %%eax,%1     \n"
+    "movl   %%ecx,%%esp  \n"
+    "popa                \n"
+    :
+    : "b" (arg),"m" (newProcess->tss.esp)
   );
 
   /* Put new thread into the READY state */
   sched_setStatus(newProcess->id, READY);
 
   /* Return with the new process ID */
-  return ((uInt32) newProcess);
+  return ((uint32_t) newProcess);
 }
 
 /*****************************************************************************************
@@ -197,110 +200,118 @@
  *****************************************************************************************/
 void execFile(char *file, int argc, char **argv, int console) {
 
+  kTask_t newProcess = 0x0;
+
   int i = 0x0;
   int x = 0x0;
+
   uint32_t *tmp = 0x0;
 
-  fileDescriptor *tmpFd = 0x0;
   Elf32_Ehdr *binaryHeader = 0x0;
-  elfProgramHeader *programHeader = 0x0;
+
+  Elf32_Phdr *programHeader = 0x0;
 
   /* Get A New Task For This Proccess */
-  _current = schedNewTask();
-  assert(_current);
+  newProcess = schedNewTask();
+  assert(newProcess);
 
-  _current->gid = 0x0;
-  _current->uid = 0x0;
-  _current->term = tty_find(console);
+  newProcess->gid = 0x0;
+  newProcess->uid = 0x0;
+  newProcess->term = tty_find(console);
 
-  if (_current->term == 0x0)
+  if (newProcess->term == 0x0)
     kprintf("Error: invalid console\n");
 
   /* Set tty ownership */
-  _current->term->owner = _current->id;
+  newProcess->term->owner = newProcess->id;
 
   /* Now We Must Create A Virtual Space For This Proccess To Run In */
-  _current->tss.cr3 = (uInt32) vmm_createVirtualSpace(_current->id);
-  kprintf("_current->tss.cr3: 0x%X", _current->tss.cr3);
+  newProcess->tss.cr3 = (uint32_t) vmm_createVirtualSpace(newProcess->id);
+
+
   /* To Better Load This Application We Will Switch Over To Its VM Space */
   asm volatile(
-      "movl %0,%%eax          \n"
-      "movl %%eax,%%cr3       \n"
-      : : "d" ((uInt32 *)(_current->tss.cr3))
+    "movl %0,%%eax          \n"
+    "movl %%eax,%%cr3       \n"
+    : : "d" ((uint32_t *)(newProcess->tss.cr3))
   );
+
+
   /* Lets Find The File */
-  tmpFd = fopen(file, "r");
+  newProcess->imageFd = fopen(file, "r");
 
   /* If We Dont Find the File Return */
-  if (tmpFd == 0x0) {
+  if (newProcess->imageFd == 0x0) {
     kprintf("Exec Format Error: Binary File Not Executable.\n");
-    fclose(tmpFd);
+    fclose(newProcess->imageFd);
     return;
   }
-  if (tmpFd->perms == 0x0) {
+
+  if (newProcess->imageFd->perms == 0x0) {
     kprintf("Exec Format Error: Binary File Not Executable.\n");
-    fclose(tmpFd);
+    fclose(newProcess->imageFd);
     return;
   }
 
   /* Load ELF Header */
   binaryHeader = (Elf32_Ehdr *) kmalloc(sizeof(Elf32_Ehdr));
 
-  //kprintf(">a:%i:0x%X:0x%X<",sizeof(Elf32_Ehdr),binaryHeader,tmpFd);
-  fread(binaryHeader, sizeof(Elf32_Ehdr), 1, tmpFd);
+  fread(binaryHeader, sizeof(Elf32_Ehdr), 1, newProcess->imageFd);
 
   /* Check If App Is A Real Application */
   if ((binaryHeader->e_ident[1] != 'E') && (binaryHeader->e_ident[2] != 'L') && (binaryHeader->e_ident[3] != 'F')) {
     kprintf("Exec Format Error: Binary File Not Executable.\n");
     kfree(binaryHeader);
-    fclose(tmpFd);
+    fclose(newProcess->imageFd);
     return;
-  } else if (binaryHeader->e_type != 2) {
+  }
+  else if (binaryHeader->e_type != 2) {
     kprintf("Exec Format Error: Binary File Not Executable.\n");
     kfree(binaryHeader);
-    fclose(tmpFd);
+    fclose(newProcess->imageFd);
     return;
-  } else if (binaryHeader->e_entry == 0x300000) {
+  }
+  else if (binaryHeader->e_entry == 0x300000) {
     kprintf("Exec Format Error: Binary File Not Executable.\n");
     kfree(binaryHeader);
-    fclose(tmpFd);
+    fclose(newProcess->imageFd);
     return;
   }
 
-  _current->td.abi = binaryHeader->e_ident[EI_OSABI];
+  newProcess->td.abi = binaryHeader->e_ident[EI_OSABI];
 
   /* Load The Program Header(s) */
   programHeader = (elfProgramHeader *) kmalloc(sizeof(elfProgramHeader) * binaryHeader->e_phnum);
-  fseek(tmpFd, binaryHeader->e_phoff, 0);
+  fseek(newProcess->imageFd, binaryHeader->e_phoff, 0);
 
   //kprintf(">c:%i:0x%X:0x%X<",sizeof(elfProgramHeader)*binaryHeader->e_phnum,programHeader,tmpFd);
-  fread(programHeader, (sizeof(elfProgramHeader) * binaryHeader->e_phnum), 1, tmpFd);
+  fread(programHeader, (sizeof(elfProgramHeader) * binaryHeader->e_phnum), 1, newProcess->imageFd);
   //kprintf(">d<");
 
   /* Loop Through The Header And Load Sections Which Need To Be Loaded */
   for (i = 0; i < binaryHeader->e_phnum; i++) {
-    if (programHeader[i].phType == 1) {
+    if (programHeader[i].p_type == 1) {
       /*
        Allocate Memory Im Going To Have To Make This Load Memory With Correct
        Settings so it helps us in the future
        */
-      for (x = 0x0; x < (programHeader[i].phMemsz); x += 0x1000) {
+      for (x = 0x0; x < (programHeader[i].p_memsz); x += 0x1000) {
         /* Make readonly and read/write !!! */
-        if (vmm_remapPage(vmm_findFreePage(_current->id), ((programHeader[i].phVaddr & 0xFFFFF000) + x), PAGE_DEFAULT) == 0x0)
+        if (vmm_remapPage(vmm_findFreePage(newProcess->id), ((programHeader[i].p_vaddr & 0xFFFFF000) + x), PAGE_DEFAULT) == 0x0)
           K_PANIC("Remap Page Failed");
 
-        memset((void *) ((programHeader[i].phVaddr & 0xFFFFF000) + x), 0x0, 0x1000);
+        memset((void *) ((programHeader[i].p_vaddr & 0xFFFFF000) + x), 0x0, 0x1000);
 
       }
-      _current->oInfo.vmStart = 0x80000000;
-      _current->td.vm_daddr = (u_long) (programHeader[i].phVaddr & 0xFFFFF000);
+
       /* Now Load Section To Memory */
-      fseek(tmpFd, programHeader[i].phOffset, 0);
-      fread((void *) programHeader[i].phVaddr, programHeader[i].phFilesz, 1, tmpFd);
-      if ((programHeader[i].phFlags & 0x2) != 0x2) {
-        kprintf("pH: [0x%X]\n", programHeader[i].phMemsz);
-        for (x = 0x0; x < (programHeader[i].phMemsz); x += 0x1000) {
-          if ((vmm_setPageAttributes((programHeader[i].phVaddr & 0xFFFFF000) + x, PAGE_PRESENT | PAGE_USER)) != 0x0)
+      fseek(newProcess->imageFd, programHeader[i].p_offset, 0);
+
+      fread((void *) programHeader[i].p_vaddr, programHeader[i].p_filesz, 1, newProcess->imageFd);
+
+      if ((programHeader[i].p_flags & 0x2) != 0x2) {
+        for (x = 0x0; x < (programHeader[i].p_memsz); x += 0x1000) {
+          if ((vmm_setPageAttributes((programHeader[i].p_vaddr & 0xFFFFF000) + x, PAGE_PRESENT | PAGE_USER)) != 0x0)
             kpanic("Error: vmm_setPageAttributes failed, File: %s, Line: %i\n", __FILE__, __LINE__);
         }
       }
@@ -308,57 +319,58 @@
   }
 
   /* Set Virtual Memory Start */
-  _current->oInfo.vmStart = 0x80000000;
-  _current->td.vm_daddr = (u_long) (programHeader[i].phVaddr & 0xFFFFF000);
+  newProcess->oInfo.vmStart = 0x80000000;
+  newProcess->td.vm_daddr = (u_long) (programHeader[i].p_vaddr & 0xFFFFF000);
 
   /* Set Up Stack Space */
   //MrOlsen (2016-01-14) FIX: is the stack start supposed to be addressable xhcnage x= 1 to x=0
   for (x = 0; x < 100; x++) {
-    vmm_remapPage(vmm_findFreePage(_current->id), STACK_ADDR - (x * 0x1000), PAGE_DEFAULT | PAGE_STACK);
+    vmm_remapPage(vmm_findFreePage(newProcess->id), STACK_ADDR - (x * 0x1000), PAGE_DEFAULT | PAGE_STACK);
   }
 
   /* Kernel Stack 0x2000 bytes long */
-  vmm_remapPage(vmm_findFreePage(_current->id), 0x5BC000, KERNEL_PAGE_DEFAULT | PAGE_STACK);
-  vmm_remapPage(vmm_findFreePage(_current->id), 0x5BB000, KERNEL_PAGE_DEFAULT | PAGE_STACK);
+  vmm_remapPage(vmm_findFreePage(newProcess->id), 0x5BC000, KERNEL_PAGE_DEFAULT | PAGE_STACK);
+  vmm_remapPage(vmm_findFreePage(newProcess->id), 0x5BB000, KERNEL_PAGE_DEFAULT | PAGE_STACK);
 
   /* Set All The Proper Information For The Task */
-  _current->tss.back_link = 0x0;
-  _current->tss.esp0 = 0x5BC000;
-  _current->tss.ss0 = 0x10;
-  _current->tss.esp1 = 0x0;
-  _current->tss.ss1 = 0x0;
-  _current->tss.esp2 = 0x0;
-  _current->tss.ss2 = 0x0;
-  _current->tss.eip = (long) binaryHeader->e_entry;
-  _current->tss.eflags = 0x206;
-  _current->tss.esp = STACK_ADDR - 16;
-  _current->tss.ebp = STACK_ADDR;
-  _current->tss.esi = 0x0;
-  _current->tss.edi = 0x0;
+  newProcess->tss.back_link = 0x0;
+  newProcess->tss.esp0 = 0x5BC000;
+  newProcess->tss.ss0 = 0x10;
+  newProcess->tss.esp1 = 0x0;
+  newProcess->tss.ss1 = 0x0;
+  newProcess->tss.esp2 = 0x0;
+  newProcess->tss.ss2 = 0x0;
+  newProcess->tss.eip = (long) binaryHeader->e_entry;
+  newProcess->tss.eflags = 0x206;
+  newProcess->tss.esp = STACK_ADDR - 16;
+  newProcess->tss.ebp = STACK_ADDR;
+  newProcess->tss.esi = 0x0;
+  newProcess->tss.edi = 0x0;
 
   /* Set these up to be ring 3 tasks */
-  _current->tss.es = 0x30 + 3;
-  _current->tss.cs = 0x28 + 3;
-  _current->tss.ss = 0x30 + 3;
-  _current->tss.ds = 0x30 + 3;
-  _current->tss.fs = 0x30 + 3;
-  _current->tss.gs = 0x50 + 3; //0x30 + 3;
+  newProcess->tss.es = 0x30 + 3;
+  newProcess->tss.cs = 0x28 + 3;
+  newProcess->tss.ss = 0x30 + 3;
+  newProcess->tss.ds = 0x30 + 3;
+  newProcess->tss.fs = 0x30 + 3;
+  newProcess->tss.gs = 0x50 + 3; //0x30 + 3;
 
-  _current->tss.ldt = 0x18;
-  _current->tss.trace_bitmap = 0x0000;
-  _current->tss.io_map = 0x8000;
+  newProcess->tss.ldt = 0x18;
+  newProcess->tss.trace_bitmap = 0x0000;
+  newProcess->tss.io_map = 0x8000;
 
-  sched_setStatus(_current->id, READY);
+  sched_setStatus(newProcess->id, READY);
 
   kfree(binaryHeader);
   kfree(programHeader);
-  fclose(tmpFd);
+  fclose(newProcess->imageFd);
 
-  tmp = (uInt32 *) _current->tss.esp0 - 5;
+  tmp = (uInt32 *) newProcess->tss.esp0 - 5;
+
   tmp[0] = binaryHeader->e_entry;
   tmp[3] = STACK_ADDR - 12;
 
-  tmp = (uint32_t *) _current->tss.esp;
+  tmp = (uint32_t *) newProcess->tss.esp;
 
   kprintf("argv: [0x%X]\n", argv);
   //*tmp++ = 0x0; // Stack EIP Return Addr
@@ -376,33 +388,27 @@
 
   /* Switch Back To The Kernels VM Space */
   asm volatile(
-      "movl %0,%%eax          \n"
-      "movl %%eax,%%cr3       \n"
-      : : "d" ((uInt32 *)(kernelPageDirectory))
+    "movl %0,%%eax          \n"
+    "movl %%eax,%%cr3       \n"
+    : : "d" ((uint32_t *)(kernelPageDirectory))
   );
 
-  kprintf("execFile Return: %i\n", _current->id);
+  kprintf("execFile Return: %i\n", newProcess->id);
+
+  /* Put new thread into the READY state */
+  sched_setStatus(newProcess->id, READY);
+
   /* Finally Return */
   return;
 }
 
-/*****************************************************************************************
-
- Function: void sysExec();
- Description: This Is The System Call To Execute A New Task
-
- Notes:
-
- 2016-01-19 - Start Of Enhanced Exec
-
- 04-22-03 - It Now Loads Sections Not The Full File
-
- *****************************************************************************************/
 
 int sys_exec(struct thread *td, char *file, char **argv, char **envp) {
+
   int i = 0x0;
   int x = 0x0;
   int argc = 0x0;
+
   uint32_t cr3 = 0x0;
 
   unsigned int *tmp = 0x0;
@@ -428,13 +434,10 @@
 
   struct i386_frame *iFrame = 0x0;
 
-  //Elf_Auxargs *auxargs = 0x0;
-
   asm("movl %%cr3, %0;" : "=r" (cr3));
 
   fd = fopen(file, "r");
 
-  /* If the file doesn't exist fail */
   if (fd == 0x0)
     return (-1);
 
@@ -466,12 +469,14 @@
     kfree(binaryHeader);
     fclose(fd);
     return (-1);
-  } else if (binaryHeader->e_type != ET_EXEC) {
+  }
+  else if (binaryHeader->e_type != ET_EXEC) {
     kprintf("Exec Format Error: Binary File Not Executable.\n");
     kfree(binaryHeader);
     fclose(fd);
     return (-1);
-  } else if (binaryHeader->e_entry == 0x300000) {
+  }
+  else if (binaryHeader->e_entry == 0x300000) {
     kprintf("Exec Format Error: Binary File Not Executable.\n");
     kfree(binaryHeader);
     fclose(fd);
@@ -544,7 +549,8 @@
           kprintf("setting text: 0x%X - 0x%X\n", seg_addr, seg_size);
           text_size = seg_size;
           text_addr = seg_addr;
-        } else {
+        }
+        else {
           kprintf("setting data: 0x%X - 0x%X\n", seg_addr, seg_size);
           data_size = seg_size;
           data_addr = seg_addr;
@@ -560,14 +566,14 @@
          * Thjis is for stack space
          */
         _current->oInfo.vmStart = ((programHeader[i].p_vaddr & 0xFFFFF000) + 0xA900000);
-        break;
+      break;
       case PT_DYNAMIC:
         //newLoc = (char *)programHeader[i].phVaddr;
         //elfDynamicS = (elfDynamic *) programHeader[i].p_vaddr;
         ef->dynamic = (Elf32_Dyn *) programHeader[i].p_vaddr;
         //fseek( fd, programHeader[i].phOffset, 0 );
         //fread( (void *) programHeader[i].phVaddr, programHeader[i].phFilesz, 1, fd );
-        break;
+      break;
       case PT_INTERP:
         kprintf("Malloc: %i\n", programHeader[i].p_filesz);
         interp = (char *) kmalloc(programHeader[i].p_filesz);
@@ -576,11 +582,11 @@
         kprintf("Interp: [%s]\n", interp);
         //ldAddr = ldEnable();
         ef->ld_addr = ldEnable();
-        break;
+      break;
       case PT_GNU_STACK:
-        break;
+      break;
       default:
-        break;
+      break;
     }
   }
 
@@ -618,7 +624,8 @@
       //x++;
     }
     argv = argvNew;
-  } else {
+  }
+  else {
     argc = 1;
   }
 
@@ -720,13 +727,13 @@
     switch (dynp->d_tag) {
       case DT_NEEDED:
         asm("nop");
-        break;
+      break;
       case DT_INIT:
         asm("nop");
-        break;
+      break;
       case DT_FINI:
         asm("nop");
-        break;
+      break;
       case DT_HASH:
         asm("nop");
         /* From src/libexec/rtld-elf/rtld.c */
@@ -735,51 +742,51 @@
         ef->nchains = hashtab[1];
         ef->buckets = hashtab + 2;
         ef->chains = ef->buckets + ef->nbuckets;
-        break;
+      break;
       case DT_STRTAB:
         ef->strtab = (caddr_t) (ef->address + dynp->d_un.d_ptr);
-        break;
+      break;
       case DT_STRSZ:
         ef->strsz = dynp->d_un.d_val;
-        break;
+      break;
       case DT_SYMTAB:
         ef->symtab = (Elf32_Sym *) (ef->address + dynp->d_un.d_ptr);
-        break;
+      break;
       case DT_SYMENT:
         if (dynp->d_un.d_val != sizeof(Elf32_Sym))
           return (ENOEXEC);
-        break;
+      break;
       case DT_REL:
         ef->rel = (const Elf32_Rel *) (ef->address + dynp->d_un.d_ptr);
-        break;
+      break;
       case DT_RELSZ:
         ef->relsize = dynp->d_un.d_val;
-        break;
+      break;
       case DT_RELENT:
         if (dynp->d_un.d_val != sizeof(Elf32_Rel))
           return (ENOEXEC);
-        break;
+      break;
       case DT_JMPREL:
         ef->pltrel = (const Elf32_Rel *) (ef->address + dynp->d_un.d_ptr);
-        break;
+      break;
       case DT_PLTRELSZ:
         ef->pltrelsize = dynp->d_un.d_val;
-        break;
+      break;
       case DT_RELA:
         ef->rela = (const Elf32_Rela *) (ef->address + dynp->d_un.d_ptr);
-        break;
+      break;
       case DT_RELASZ:
         ef->relasize = dynp->d_un.d_val;
-        break;
+      break;
       case DT_RELAENT:
         if (dynp->d_un.d_val != sizeof(Elf32_Rela))
           return (ENOEXEC);
-        break;
+      break;
       case DT_PLTREL:
         plttype = dynp->d_un.d_val;
         if (plttype != DT_REL && plttype != DT_RELA)
           return (ENOEXEC);
-        break;
+      break;
       case DT_PLTGOT:
         ef->got = (Elf32_Addr *) (ef->address + dynp->d_un.d_ptr);
         tmp = (void *) dynp->d_un.d_ptr; //elfDynamicS[i].dynPtr;
@@ -789,10 +796,10 @@
           kprintf("[0x%X]", tmp);
         tmp[2] = (uInt32) ef->ld_addr;
         tmp[1] = (uInt32) ef;
-        break;
+      break;
       default:
         kprintf("t_tag: 0x%X>", dynp->d_tag);
-        break;
+      break;
     }
   }
   ef->pltrela = (const Elf32_Rela *) ef->pltrel;
diff --git a/sys/include/i386/elf.h b/sys/include/i386/elf.h
index 0f92ee6..be6287c 100644
--- a/sys/include/i386/elf.h
+++ b/sys/include/i386/elf.h
@@ -1,72 +1,118 @@
 #ifndef _I386_ELF_H_
-#define _i386_ELF_H_ 1
+#define _I386_ELF_H_ 1
 
-#include 
+#if defined(__i386__) || defined(_MACHINE_ELF_WANT_32BIT)
 
-#define elfExecutable 0x002
-#define elfLibrary    0x003
+/*
+ * ELF definitions for the i386 architecture.
+ */
 
+#include   /* Definitions common to all 32 bit architectures. */
+#if defined(__ELF_WORD_SIZE) && __ELF_WORD_SIZE == 64
+#include   /* Definitions common to all 64 bit architectures. */
+#endif
+
+#ifndef __ELF_WORD_SIZE
+#define __ELF_WORD_SIZE 32      /* Used by  */
+#endif
+
+#include 
+
+#define ELF_ARCH        EM_386
+
+#define ELF_MACHINE_OK(x) ((x) == EM_386 || (x) == EM_486)
+
+/*
+ * Auxiliary vector entries for passing information to the interpreter.
+ *
+ * The i386 supplement to the SVR4 ABI specification names this "auxv_t",
+ * but POSIX lays claim to all symbols ending with "_t".
+ */
+
+typedef struct {        /* Auxiliary vector entry on initial stack */
+        int     a_type;                 /* Entry type. */
+        union {
+                long    a_val;          /* Integer value. */
+                void    *a_ptr;         /* Address. */
+                void    (*a_fcn)(void); /* Function pointer (not used). */
+        } a_un;
+} Elf32_Auxinfo;
+
+#if __ELF_WORD_SIZE == 64
+/* Fake for amd64 loader support */
 typedef struct {
-    uInt32 phType; /* Entry type. */
-    uInt32 phOffset; /* File offset of contents. */
-    uInt32 phVaddr; /* Virtual address in memory image. */
-    uInt32 phPaddr; /* Physical address (not used). */
-    uInt32 phFilesz; /* Size of contents in file. */
-    uInt32 phMemsz; /* Size of contents in memory. */
-    uInt32 phFlags; /* Access permission flags. */
-    uInt32 phAlign; /* Alignment in memory and file. */
-} elfProgramHeader;
+        int fake;
+} Elf64_Auxinfo;
+#endif
 
-typedef struct {
-    uInt32 shName; /* Section name (index into the section header string table). */
-    uInt32 shType; /* Section type. */
-    uInt32 shFlags; /* Section flags. */
-    uInt32 shAddr; /* Address in memory image. */
-    uInt32 shOffset; /* Offset in file. */
-    uInt32 shSize; /* Size in bytes. */
-    uInt32 shLink; /* Index of a related section. */
-    uInt32 shInfo; /* Depends on section type. */
-    uInt32 shAddralign; /* Alignment in bytes. */
-    uInt32 shEntsize; /* Size of each entry in section. */
-} elfSectionHeader;
+__ElfType(Auxinfo);
 
-typedef struct {
-    uInt32 pltOffset;
-    uInt32 pltInfo;
-} elfPltInfo;
+/* Values for a_type. */
+#define AT_NULL         0       /* Terminates the vector. */
+#define AT_IGNORE       1       /* Ignored entry. */
+#define AT_EXECFD       2       /* File descriptor of program to load. */
+#define AT_PHDR         3       /* Program header of program already loaded. */
+#define AT_PHENT        4       /* Size of each program header entry. */
+#define AT_PHNUM        5       /* Number of program header entries. */
+#define AT_PAGESZ       6       /* Page size in bytes. */
+#define AT_BASE         7       /* Interpreter's base address. */
+#define AT_FLAGS        8       /* Flags (unused for i386). */
+#define AT_ENTRY        9       /* Where interpreter should transfer control. */
+#define AT_NOTELF       10      /* Program is not ELF ?? */
+#define AT_UID          11      /* Real uid. */
+#define AT_EUID         12      /* Effective uid. */
+#define AT_GID          13      /* Real gid. */
+#define AT_EGID         14      /* Effective gid. */
+#define AT_EXECPATH     15      /* Path to the executable. */
+#define AT_CANARY       16      /* Canary for SSP. */
+#define AT_CANARYLEN    17      /* Length of the canary. */
+#define AT_OSRELDATE    18      /* OSRELDATE. */
+#define AT_NCPUS        19      /* Number of CPUs. */
+#define AT_PAGESIZES    20      /* Pagesizes. */
+#define AT_PAGESIZESLEN 21      /* Number of pagesizes. */
+#define AT_TIMEKEEP     22      /* Pointer to timehands. */
+#define AT_STACKPROT    23      /* Initial stack protection. */
 
-typedef struct {
-    uInt32 dynName;
-    uInt32 dynValue;
-    uInt32 dynSize;
-    uInt32 dynInfo;
-} elfDynSym;
+#define AT_COUNT        24      /* Count of defined aux entry types. */
 
-typedef struct {
-    uInt32 dynVal;
-    uInt32 dynPtr;
-} elfDynamic_Old;
+/*
+ * Relocation types.
+ */
 
-typedef struct {
-  uint32_t d_tag;
-  union {
-    uint32_t d_val;
-    uint32_t d_ptr;
-  } d_un;
-} elfDynamic;
+#define R_386_COUNT     38      /* Count of defined relocation types. */
 
-typedef struct {
-    int32_t execfd;
-    uint32_t phdr;
-    uint32_t phent;
-    uint32_t phnum;
-    uint32_t pagesz;
-    uint32_t base;
-    uint32_t flags;
-    uint32_t entry;
-    uint32_t trace;
-} Elf_Auxargs;
+/* Define "machine" characteristics */
+#define ELF_TARG_CLASS  ELFCLASS32
+#define ELF_TARG_DATA   ELFDATA2LSB
+#define ELF_TARG_MACH   EM_386
+#define ELF_TARG_VER    1
 
+#define ET_DYN_LOAD_ADDR 0x01001000
+
+#elif defined(__amd64__)
+
+/*
+ * ELF definitions for the AMD64 architecture.
+ */
+
+#ifndef __ELF_WORD_SIZE
+#define __ELF_WORD_SIZE 64      /* Used by  */
+#endif
+#include   /* Definitions common to all 32 bit architectures. */
+#include   /* Definitions common to all 64 bit architectures. */
+#include 
+
+#define ELF_ARCH        EM_X86_64
+#define ELF_ARCH32      EM_386
+
+#define ELF_MACHINE_OK(x) ((x) == EM_X86_64)
+
+/*
+ * Auxiliary vector entries for passing information to the interpreter.
+ *
+ * The i386 supplement to the SVR4 ABI specification names this "auxv_t",
+ * but POSIX lays claim to all symbols ending with "_t".
+ */
 typedef struct {        /* Auxiliary vector entry on initial stack */
         int     a_type;                 /* Entry type. */
         union {
@@ -74,6 +120,75 @@
         } a_un;
 } Elf32_Auxinfo;
 
+
+typedef struct {        /* Auxiliary vector entry on initial stack */
+        long    a_type;                 /* Entry type. */
+        union {
+                long    a_val;          /* Integer value. */
+                void    *a_ptr;         /* Address. */
+                void    (*a_fcn)(void); /* Function pointer (not used). */
+        } a_un;
+} Elf64_Auxinfo;
+
+__ElfType(Auxinfo);
+
+/* Values for a_type. */
+#define AT_NULL         0       /* Terminates the vector. */
+#define AT_IGNORE       1       /* Ignored entry. */
+#define AT_EXECFD       2       /* File descriptor of program to load. */
+#define AT_PHDR         3       /* Program header of program already loaded. */
+#define AT_PHENT        4       /* Size of each program header entry. */
+#define AT_PHNUM        5       /* Number of program header entries. */
+#define AT_PAGESZ       6       /* Page size in bytes. */
+#define AT_BASE         7       /* Interpreter's base address. */
+#define AT_FLAGS        8       /* Flags (unused for i386). */
+#define AT_ENTRY        9       /* Where interpreter should transfer control. */
+#define AT_NOTELF       10      /* Program is not ELF ?? */
+#define AT_UID          11      /* Real uid. */
+#define AT_EUID         12      /* Effective uid. */
+#define AT_GID          13      /* Real gid. */
+#define AT_EGID         14      /* Effective gid. */
+#define AT_EXECPATH     15      /* Path to the executable. */
+#define AT_CANARY       16      /* Canary for SSP */
+#define AT_CANARYLEN    17      /* Length of the canary. */
+#define AT_OSRELDATE    18      /* OSRELDATE. */
+#define AT_NCPUS        19      /* Number of CPUs. */
+#define AT_PAGESIZES    20      /* Pagesizes. */
+#define AT_PAGESIZESLEN 21      /* Number of pagesizes. */
+#define AT_TIMEKEEP     22      /* Pointer to timehands. */
+#define AT_STACKPROT    23      /* Initial stack protection. */
+
+#define AT_COUNT        24      /* Count of defined aux entry types. */
+
+/*
+ * Relocation types.
+ */
+
+#define R_X86_64_COUNT  24      /* Count of defined relocation types. */
+
+/* Define "machine" characteristics */
+#if __ELF_WORD_SIZE == 32
+#define ELF_TARG_CLASS  ELFCLASS32
+#else
+#define ELF_TARG_CLASS  ELFCLASS64
+#endif
+#define ELF_TARG_DATA   ELFDATA2LSB
+#define ELF_TARG_MACH   EM_X86_64
+#define ELF_TARG_VER    1
+
+#if __ELF_WORD_SIZE == 32
+#define ET_DYN_LOAD_ADDR 0x01001000
+#else
+#define ET_DYN_LOAD_ADDR 0x01021000
+#endif
+
+#endif /* __i386__, __amd64__ */
+
+#include 
+
+#define elfExecutable 0x002
+#define elfLibrary    0x003
+
 char *elfGetShType( int );
 char *elfGetPhType( int );
 char *elfGetRelType( int );
diff --git a/sys/include/sys/elf.h b/sys/include/sys/elf.h
index 853cbf5..e0f465d 100644
--- a/sys/include/sys/elf.h
+++ b/sys/include/sys/elf.h
@@ -35,4 +35,43 @@
 #include 
 #include 
 
+typedef struct elf_file {
+  int preloaded; /* Was file pre-loaded */
+  caddr_t address; /* Relocation address */
+  Elf32_Dyn *dynamic; /* Symbol table etc. */
+  Elf32_Hashelt nbuckets; /* DT_HASH info */
+  Elf32_Hashelt nchains;
+  const Elf32_Hashelt *buckets;
+  const Elf32_Hashelt *chains;
+  caddr_t hash;
+  caddr_t strtab; /* DT_STRTAB */
+  int strsz; /* DT_STRSZ */
+  const Elf32_Sym *symtab; /* DT_SYMTAB */
+  Elf32_Addr *got; /* DT_PLTGOT */
+  const Elf32_Rel *pltrel; /* DT_JMPREL */
+  int pltrelsize; /* DT_PLTRELSZ */
+  const Elf32_Rela *pltrela; /* DT_JMPREL */
+  int pltrelasize; /* DT_PLTRELSZ */
+  const Elf32_Rel *rel; /* DT_REL */
+  int relsize; /* DT_RELSZ */
+  const Elf32_Rela *rela; /* DT_RELA */
+  int relasize; /* DT_RELASZ */
+  caddr_t modptr;
+  const Elf32_Sym *ddbsymtab; /* The symbol table we are using */
+  long ddbsymcnt; /* Number of symbols */
+  caddr_t ddbstrtab; /* String table */
+  long ddbstrcnt; /* number of bytes in string table */
+  caddr_t symbase; /* malloc'ed symbold base */
+  caddr_t strbase; /* malloc'ed string base */
+  caddr_t ctftab; /* CTF table */
+  long ctfcnt; /* number of bytes in CTF table */
+  caddr_t ctfoff; /* CTF offset table */
+  caddr_t typoff; /* Type offset table */
+  long typlen; /* Number of type entries. */
+  Elf32_Addr pcpu_start; /* Pre-relocation pcpu set start. */
+  Elf32_Addr pcpu_stop; /* Pre-relocation pcpu set stop. */
+  Elf32_Addr pcpu_base; /* Relocated pcpu set address. */
+  Elf32_Addr ld_addr; // Entry Point Of Linker (Load It Too)
+} *elf_file_t;
+
 #endif
diff --git a/sys/include/sys/elf_generic.h b/sys/include/sys/elf_generic.h
new file mode 100644
index 0000000..36df0db
--- /dev/null
+++ b/sys/include/sys/elf_generic.h
@@ -0,0 +1,61 @@
+#ifndef _SYS_ELF_GENERIC_H_
+#define _SYS_ELF_GENERIC_H_ 1
+
+#include 
+
+/*
+ * Definitions of generic ELF names which relieve applications from
+ * needing to know the word size.
+ */
+
+#if __ELF_WORD_SIZE != 32 && __ELF_WORD_SIZE != 64
+#error "__ELF_WORD_SIZE must be defined as 32 or 64"
+#endif
+
+#define ELF_CLASS       __CONCAT(ELFCLASS,__ELF_WORD_SIZE)
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+#define ELF_DATA        ELFDATA2LSB
+#elif BYTE_ORDER == BIG_ENDIAN
+#define ELF_DATA        ELFDATA2MSB
+#else
+#error "Unknown byte order"
+#endif
+
+#define __elfN(x)       __CONCAT(__CONCAT(__CONCAT(elf,__ELF_WORD_SIZE),_),x)
+#define __ElfN(x)       __CONCAT(__CONCAT(__CONCAT(Elf,__ELF_WORD_SIZE),_),x)
+#define __ELFN(x)       __CONCAT(__CONCAT(__CONCAT(ELF,__ELF_WORD_SIZE),_),x)
+#define __ElfType(x)    typedef __ElfN(x) __CONCAT(Elf_,x)
+
+__ElfType(Addr);
+__ElfType(Half);
+__ElfType(Off);
+__ElfType(Sword);
+__ElfType(Word);
+__ElfType(Ehdr);
+__ElfType(Shdr);
+__ElfType(Phdr);
+__ElfType(Dyn);
+__ElfType(Rel);
+__ElfType(Rela);
+__ElfType(Sym);
+__ElfType(Verdef);
+__ElfType(Verdaux);
+__ElfType(Verneed);
+__ElfType(Vernaux);
+__ElfType(Versym);
+
+/* Non-standard ELF types. */
+__ElfType(Hashelt);
+__ElfType(Size);
+__ElfType(Ssize);
+
+#define ELF_R_SYM       __ELFN(R_SYM)
+#define ELF_R_TYPE      __ELFN(R_TYPE)
+#define ELF_R_INFO      __ELFN(R_INFO)
+#define ELF_ST_BIND     __ELFN(ST_BIND)
+#define ELF_ST_TYPE     __ELFN(ST_TYPE)
+#define ELF_ST_INFO     __ELFN(ST_INFO)
+#define ELF_ST_VISIBILITY       __ELFN(ST_VISIBILITY)
+
+#endif /* !_SYS_ELF_GENERIC_H_ */
diff --git a/sys/kernel/elf.c b/sys/kernel/elf.c
index da3be43..c2e2096 100644
--- a/sys/kernel/elf.c
+++ b/sys/kernel/elf.c
@@ -1,31 +1,28 @@
-/*****************************************************************************************
- Copyright (c) 2002-2004 The UbixOS Project
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without modification, are
- permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this list of
- conditions, the following disclaimer and the list of authors.  Redistributions in binary
- form must reproduce the above copyright notice, this list of conditions, the following
- disclaimer and the list of authors in the documentation and/or other materials provided
- with the distribution. Neither the name of the UbixOS Project nor the names of its
- contributors may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- $Id: elf.c 141 2016-01-17 02:05:18Z reddawg $
-
- *****************************************************************************************/
+/*-
+ * Copyright (c) 2002-2004, 2018 The UbixOS Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions, the following disclaimer and the list of authors.  Redistributions in binary
+ * form must reproduce the above copyright notice, this list of conditions, the following
+ * disclaimer and the list of authors in the documentation and/or other materials provided
+ * with the distribution. Neither the name of the UbixOS Project nor the names of its
+ * contributors may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
 
 #include 
 #include 
@@ -37,15 +34,15 @@
 
 typedef struct elf_file {
 
-} *elf_file_type;
+}*elf_file_type;
 
 int elf_load_file(kTask_t *p, const char *file, uint32_t *addr, uint32_t *entry) {
+  int ret = 0;
 
   int i = 0x0;
   int x = 0x0;
   int numsegs = 0x0;
 
-  //uint32_t base = 0x0;
   uint32_t base_addr = 0x0;
   uint32_t real_base_addr = 0x0;
 
@@ -59,7 +56,6 @@
   if (exec_fd == 0x0)
     return (-1);
 
-
   /* Load the ELF header */
   if ((binaryHeader = (Elf32_Ehdr *) kmalloc(sizeof(Elf32_Ehdr))) == 0x0)
     K_PANIC("malloc failed!");
@@ -68,17 +64,18 @@
 
   /* Check If App Is A Real Application */
   if ((binaryHeader->e_ident[1] != 'E') && (binaryHeader->e_ident[2] != 'L') && (binaryHeader->e_ident[3] != 'F')) {
-    kfree(binaryHeader);
-    fclose(exec_fd);
-    return (-1);
+    ret = -1;
+    goto failed;
   }
 
   if (binaryHeader->e_type == ET_DYN)
     real_base_addr = *addr;
   else if (binaryHeader->e_type == ET_EXEC)
     real_base_addr = 0x0;
-  else
-    return (-1);
+  else {
+    ret = -1;
+    goto failed;
+  }
 
   /* Load The Program Header(s) */
   if ((programHeader = (Elf32_Phdr *) kmalloc(sizeof(Elf32_Phdr) * binaryHeader->e_phnum)) == 0x0)
@@ -115,7 +112,7 @@
           }
         }
         if (numsegs == 0x0)
-          base_addr = (programHeader[i].p_vaddr & 0xFFFFF000) + real_base_addr;
+          base_addr = programHeader[i].p_vaddr + real_base_addr; //(programHeader[i].p_vaddr & 0xFFFFF000) + real_base_addr;
         numsegs++;
       break;
     }
@@ -125,9 +122,20 @@
 
   *entry = binaryHeader->e_entry + real_base_addr;
 
-  kfree(binaryHeader);
-  kfree(programHeader);
-  return (0x0);
+  failed:
+
+  /* Close The Open File */
+  fclose(exec_fd);
+
+  /* Free Binary Header Memory */
+  if (binaryHeader != 0x0)
+    kfree(binaryHeader);
+
+  /* Free Program Header Memory */
+  if (programHeader != 0x0)
+    kfree(programHeader);
+
+  return (ret);
 }
 
 const struct {
@@ -162,8 +170,6 @@
   return ((char *) elfRelType[relType].relTypeName);
 }
 
-
-
 /***
  END
  ***/