diff --git a/include/call_user.h b/include/call_user.h
new file mode 100644
index 0000000000000000000000000000000000000000..babb507c38f29f05cb9b6f26e0514db730a52707
--- /dev/null
+++ b/include/call_user.h
@@ -0,0 +1,3 @@
+
+__attribute__((fastcall)) void call_user(void (*user_fct)(), void *user_stack);
+
diff --git a/iso/boot/mykernel.bin b/iso/boot/mykernel.bin
new file mode 100755
index 0000000000000000000000000000000000000000..6e4de47c237cb24f498eea1ac1959800813d807b
Binary files /dev/null and b/iso/boot/mykernel.bin differ
diff --git a/link.ld b/link.ld
index b62e5ebc708679f936fb23b9824ab600954abe8c..59278d992d4b34df3f559943015da9234d15f9c0 100644
--- a/link.ld
+++ b/link.ld
@@ -3,6 +3,10 @@ ENTRY(start)
 phys = 0x00100000;
 SECTIONS
 {
+	.user 0x00400000 :
+	{
+		src/user.o (.text* .data .rodata .bss)
+	}
 	.text phys : AT(phys)
 	{
 		code = .; _code = .; __code = .;
diff --git a/mykernel.iso b/mykernel.iso
new file mode 100644
index 0000000000000000000000000000000000000000..ed3d07451bec53a66a115930a80b3dc1d3a99dbc
Binary files /dev/null and b/mykernel.iso differ
diff --git a/src/0boot.o b/src/0boot.o
new file mode 100644
index 0000000000000000000000000000000000000000..e992706a4649984f97948f623d14e7111c4b080d
Binary files /dev/null and b/src/0boot.o differ
diff --git a/src/0user.o b/src/0user.o
new file mode 100644
index 0000000000000000000000000000000000000000..4a053bd1bc4cb28c909d2ad78276caf99447589a
Binary files /dev/null and b/src/0user.o differ
diff --git a/src/appmain.o b/src/appmain.o
new file mode 100644
index 0000000000000000000000000000000000000000..7c5cff2111a357f3294703bd1c53e0b3b08ecf08
Binary files /dev/null and b/src/appmain.o differ
diff --git a/src/call_user.o b/src/call_user.o
new file mode 100644
index 0000000000000000000000000000000000000000..b7317d853508fc0ef5c1a6256df69c68e7464860
Binary files /dev/null and b/src/call_user.o differ
diff --git a/src/call_user.s b/src/call_user.s
new file mode 100644
index 0000000000000000000000000000000000000000..9976e2a9a7a2c3af04ddf5689c3a0e81beba41af
--- /dev/null
+++ b/src/call_user.s
@@ -0,0 +1,18 @@
+global call_user
+
+call_user:
+	mov ax, 0x28
+	ltr ax
+	
+	mov ax, 0x23
+	mov ds, ax
+	mov es, ax
+	mov fs, ax
+	mov gs, ax
+	push 0x23
+	push edx ; second arg of call_user stack
+	pushf
+	push 0x1B
+	push ecx ; first arg of call_user fct
+	iret
+
diff --git a/src/gdt.o b/src/gdt.o
new file mode 100644
index 0000000000000000000000000000000000000000..b99d2e3bec701853cc2ec72ed9f62a82da025c79
Binary files /dev/null and b/src/gdt.o differ
diff --git a/src/idt.o b/src/idt.o
new file mode 100644
index 0000000000000000000000000000000000000000..2e89ee525516d99f21eda03102eca9c3175a8a35
Binary files /dev/null and b/src/idt.o differ
diff --git a/src/idt0.o b/src/idt0.o
new file mode 100644
index 0000000000000000000000000000000000000000..f6b6199ecf89ef1e00bc813119ff5818c384913b
Binary files /dev/null and b/src/idt0.o differ
diff --git a/src/main.c b/src/main.c
index 3be5bb25f6edb723d6597302cbbe75372863dc53..83dbef75eced85018b0914263cedf3289542ec39 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,11 +1,24 @@
 #include "gdt.h"
 #include "idt.h"
 #include "minilib.h"
+#include "mmu.h"
+#include "call_user.h"
 
+extern void user_entry();
 void empty_irq(int_regs_t *r)
 {
 }
+extern char user_stack[];
 
+void page_fault_handler(int_regs_t *r)
+{
+    puts("page call\n");
+    for(;;);
+}
+
+void sys_handler(int_regs_t *r)
+{
+}
 /* multiboot entry-point with datastructure as arg. */
 void main(unsigned int * mboot_info)
 {
@@ -24,10 +37,13 @@ void main(unsigned int * mboot_info)
 
     idt_setup_int_handler(0, empty_irq);
     idt_setup_int_handler(1, empty_irq);
-
+    idt_setup_int_handler(14, page_fault_handler);
     __asm volatile("sti");
 
     /* minimal setup done ! */
+    setup_mmu();
+    call_user(user_entry, user_stack);
+
 
     puts("Going idle\n");
     for(;;) ; /* nothing more to do... really nothing ! */
diff --git a/src/main.o b/src/main.o
new file mode 100644
index 0000000000000000000000000000000000000000..89a090d4588887b153d4c629c0fd14545968d471
Binary files /dev/null and b/src/main.o differ
diff --git a/src/minilib.o b/src/minilib.o
new file mode 100644
index 0000000000000000000000000000000000000000..27561cc7945ffd2f4c9b70f34c0c14855d73fba3
Binary files /dev/null and b/src/minilib.o differ
diff --git a/src/mmu.o b/src/mmu.o
new file mode 100644
index 0000000000000000000000000000000000000000..de1b7198ea48b034240bcd453f187bb1bd11333a
Binary files /dev/null and b/src/mmu.o differ
diff --git a/src/tss.o b/src/tss.o
new file mode 100644
index 0000000000000000000000000000000000000000..3379ce29aee87f6ab5b05671db1f139160d69e23
Binary files /dev/null and b/src/tss.o differ
diff --git a/src/user.c b/src/user.c
index 456d6cc81a5c6de858ae359894048153af127a43..939fad635f33876ba2f452a2e904dc4c7c9a5e74 100644
--- a/src/user.c
+++ b/src/user.c
@@ -1,21 +1,22 @@
 char user_stack[65536];
 
-static void putc(int c) {
-	asm("movl $1, %%eax" "\n\t" "movl %0, %%edi" "\n\t" "int $87" : : "r"(c) : "eax", "edi");
-}
+// static void putc(int c) {
+// 	asm("movl $1, %%eax" "\n\t" "movl %0, %%edi" "\n\t" "int $87" : : "r"(c) : "eax", "edi");
+// }
 
-static void puts(char *s) {
-	int i;
-	for (i = 0; s[i] != 0; i++) {
-		putc(s[i]);
-	}
-}
+// static void puts(char *s) {
+// 	int i;
+// 	for (i = 0; s[i] != 0; i++) {
+// 		putc(s[i]);
+// 	}
+// }
 
+int variable = 200;
 void user_entry() {
-	puts("Hello from userland\n"); 
+	//puts("Hello from userland\n"); 
 
 	char *ptr = (char*) 0x800000;
 	*ptr = 42;
-	puts("Write succeeded!\n");
+	//puts("Write succeeded!\n");
 	for(;;);
 }
diff --git a/src/user.o b/src/user.o
new file mode 100644
index 0000000000000000000000000000000000000000..236dc8bd44558dd44af34c0ebcff75368b97fc13
Binary files /dev/null and b/src/user.o differ