diff --git a/x86_64/disk.asm b/x86_64/disk.asm
index 6376521ed2eaa19eb5218cc27439a23fed7aa740..fce7e9436a8a1c5edfb6afd8f4a7a10000245239 100644
--- a/x86_64/disk.asm
+++ b/x86_64/disk.asm
@@ -11,7 +11,18 @@ startup_start:
 align 512, db 0
 startup_end:
 
-filesystem:
-    %defstr FILESYSTEM_STR %[FILESYSTEM]
-    incbin FILESYSTEM_STR
+%ifdef KERNEL
+    kernel_file:
+      %defstr KERNEL_STR %[KERNEL]
+      incbin KERNEL_STR
+    .end:
     align 512, db 0
+%endif
+
+%ifdef FILESYSTEM
+    filesystem:
+        %defstr FILESYSTEM_STR %[FILESYSTEM]
+        incbin FILESYSTEM_STR
+    .end:
+    align 512, db 0
+%endif
diff --git a/x86_64/startup-common.asm b/x86_64/startup-common.asm
index 2b9bd923d06cec4358989942cc57480073bed775..fb29d7fe84fb06aee6740a0461c24256cf9c4036 100644
--- a/x86_64/startup-common.asm
+++ b/x86_64/startup-common.asm
@@ -10,8 +10,25 @@ startup:
     or al, 2
     out 0x92, al
 
-    call redoxfs
+    %ifdef KERNEL
+        mov edi, [kernel_base]
+        mov ecx, (kernel_file.end - kernel_file)
+        mov [kernel_size], ecx
 
+        mov eax, (kernel_file - boot)/512
+        add ecx, 511
+        shr ecx, 9
+        call load_extent
+
+        jmp .loaded_kernel
+    %endif
+
+    %ifdef FILESYSTEM
+        call redoxfs
+        jmp .loaded_kernel
+    %endif
+
+.loaded_kernel:
     call memory_map
 
     call vesa
@@ -113,7 +130,9 @@ load_extent:
 %include "memory_map.asm"
 %include "vesa.asm"
 %include "initialize.asm"
-%include "redoxfs.asm"
+%ifdef FILESYSTEM
+    %include "redoxfs.asm"
+%endif
 
 init_fpu_msg: db "Init FPU",13,10,0
 init_sse_msg: db "Init SSE",13,10,0