diff --git a/x86_64/bootsector.asm b/x86_64/bootsector.asm
index 80e40e834f28e0db13a7c9e812b0a1e1c04bdb5a..506e569c70342773c4c20bfc29f53d3817f195d5 100644
--- a/x86_64/bootsector.asm
+++ b/x86_64/bootsector.asm
@@ -86,45 +86,6 @@ load:
     jc error
     ret
 
-  ; store some sectors to disk from a buffer in memory
-  ; buffer has to be below 1MiB
-  ; IN
-  ;   ax: start sector
-  ;   bx: offset of buffer
-  ;   cx: number of sectors (512 Bytes each)
-  ;   dx: segment of buffer
-  ; CLOBBER
-  ;   ax, bx, cx, dx, si
-  ; TODO rewrite to (eventually) move larger parts at once
-  ; if that is done increase buffer_size_sectors in startup-common to that (max 0x80000 - startup_end)
-  store:
-      cmp cx, 127
-      jbe .good_size
-
-      pusha
-      mov cx, 127
-      call store
-      popa
-      add ax, 127
-      add dx, 127 * 512 / 16
-      sub cx, 127
-
-      jmp store
-  .good_size:
-      mov [DAPACK.addr], eax
-      mov [DAPACK.buf], bx
-      mov [DAPACK.count], cx
-      mov [DAPACK.seg], dx
-
-      call print_dapack
-
-      mov dl, [disk]
-      mov si, DAPACK
-      mov ah, 0x43
-      int 0x13
-      jc error
-      ret
-
 print_dapack:
     mov al, 13
     call print_char
@@ -189,6 +150,7 @@ DAPACK:
 .seg:   dw 0 ; in memory page zero
 .addr:  dq 0 ; put the lba to read in this spot
 
-times 510-($-$$) db 0
+times 446-($-$$) db 0
+partitions: times 4 * 16 db 0
 db 0x55
 db 0xaa
diff --git a/x86_64/config.asm b/x86_64/config.asm
index 8e3b220c667dcf69501d18e04613ad0112937485..80e35e160ecf5095bd9d8fa15d39490c03df9d9a 100644
--- a/x86_64/config.asm
+++ b/x86_64/config.asm
@@ -16,3 +16,42 @@ save_config:
     xor dx, dx
     call store
     ret
+
+; store some sectors to disk from a buffer in memory
+; buffer has to be below 1MiB
+; IN
+;   ax: start sector
+;   bx: offset of buffer
+;   cx: number of sectors (512 Bytes each)
+;   dx: segment of buffer
+; CLOBBER
+;   ax, bx, cx, dx, si
+; TODO rewrite to (eventually) move larger parts at once
+; if that is done increase buffer_size_sectors in startup-common to that (max 0x80000 - startup_end)
+store:
+    cmp cx, 127
+    jbe .good_size
+
+    pusha
+    mov cx, 127
+    call store
+    popa
+    add ax, 127
+    add dx, 127 * 512 / 16
+    sub cx, 127
+
+    jmp store
+.good_size:
+    mov [DAPACK.addr], eax
+    mov [DAPACK.buf], bx
+    mov [DAPACK.count], cx
+    mov [DAPACK.seg], dx
+
+    call print_dapack
+
+    mov dl, [disk]
+    mov si, DAPACK
+    mov ah, 0x43
+    int 0x13
+    jc error
+    ret
diff --git a/x86_64/disk.asm b/x86_64/disk.asm
index 1ef4cc36c957febb3a356be14a8a0d4005d78051..a47454ac62625866d0792f42d85d0d36a15578e1 100644
--- a/x86_64/disk.asm
+++ b/x86_64/disk.asm
@@ -22,12 +22,10 @@ startup_end:
 %else
     align BLOCK_SIZE, db 0
     %ifdef FILESYSTEM
-        filesystem:
-            %defstr FILESYSTEM_STR %[FILESYSTEM]
-            incbin FILESYSTEM_STR
-        .end:
-        align BLOCK_SIZE, db 0
-    %else
-        filesystem:
+     filesystem:
+         %defstr FILESYSTEM_STR %[FILESYSTEM]
+         incbin FILESYSTEM_STR
+     align BLOCK_SIZE, db 0
+     .end:
     %endif
 %endif
diff --git a/x86_64/partitions.asm b/x86_64/partitions.asm
new file mode 100644
index 0000000000000000000000000000000000000000..4fbede1edf06ae466d5ae0d7a29a54b02683e402
--- /dev/null
+++ b/x86_64/partitions.asm
@@ -0,0 +1,38 @@
+struc mbr_partition_rec
+.sys: resb 1
+.chs_start: resb 3
+.ty: resb 1
+.chs_end: resb 3
+.lba_start: resd 1
+.sector_count: resd 1
+endstruc
+
+; Find a partition to load RedoxFS from.
+; The partition has to be one of the primary MBR partitions.
+; OUT
+;   eax - start_lba
+;   edx - sector count
+; CLOBBER
+;   ebx
+find_redoxfs_partition:
+    xor ebx, ebx
+.loop:
+    mov al, byte [partitions + mbr_partition_rec + mbr_partition_rec.ty]
+    cmp al, 0x83
+    je .found
+    add ebx, 1
+    cmp ebx, 4
+    jb .loop
+    jmp .notfound
+.found:
+    mov eax, [partitions + mbr_partition_rec + mbr_partition_rec.lba_start]
+    mov edx, [partitions + mbr_partition_rec + mbr_partition_rec.sector_count]
+    ret
+.notfound:
+    mov si, .no_partition_found_msg
+    call print
+.halt:
+    cli
+    hlt
+    jmp .halt
+.no_partition_found_msg: db "No MBR partition with type 0x83 found", 0xA, 0xD, 0
diff --git a/x86_64/redoxfs.asm b/x86_64/redoxfs.asm
index 8b04b6656cd734f7e2539c9fdc03ce679615df0f..8dec21e4040108feae148a2d0e4fe2efedfa6eb8 100644
--- a/x86_64/redoxfs.asm
+++ b/x86_64/redoxfs.asm
@@ -37,7 +37,12 @@ struc Header
     .padding: resb (BLOCK_SIZE - 56)
 endstruc
 
+; IN
+; eax - the first sector of the filesystem
+; edx - the amount of sectors in the filesystem
 redoxfs:
+        mov [.first_sector], eax
+        mov [.sector_count], ebx
         call redoxfs.open
         test eax, eax
         jz .good_header
@@ -53,7 +58,7 @@ redoxfs:
     ; node in eax, buffer in bx
     .node:
         shl eax, (BLOCK_SHIFT - 9)
-        add eax, (filesystem - boot)/512
+        add eax, [redoxfs.first_sector]
         mov cx, (BLOCK_SIZE/512)
         mov dx, 0
         call load
@@ -71,6 +76,9 @@ redoxfs:
     .file:
         times BLOCK_SIZE db 0
 
+    .first_sector: dd 0
+    .sector_count: dd 0
+
     .env:
         db "REDOXFS_BLOCK="
     .env.block:
@@ -111,7 +119,15 @@ redoxfs.open:
         mov al, ' '
         call print_char
 
-        mov ebx, (filesystem - boot)/BLOCK_SIZE
+        push eax
+        push edx
+        xor edx, edx
+        mov eax, [redoxfs.first_sector]
+        mov ebx, (BLOCK_SIZE / 512)
+        div ebx ; EDX:EAX = EDX:EAX / EBX
+        mov ebx, eax
+        pop edx
+        pop eax
         mov di, redoxfs.env.block_end - 1
     .block:
         mov al, bl
@@ -314,7 +330,7 @@ redoxfs.kernel:
 
 
         shl eax, (BLOCK_SHIFT - 9)
-        add eax, (filesystem - boot)/512
+        add eax, [redoxfs.first_sector]
         add ecx, BLOCK_SIZE
         dec ecx
         shr ecx, 9
diff --git a/x86_64/startup-common.asm b/x86_64/startup-common.asm
index b12978df8907bead6447f4f4ba3934e4a78791b8..147001dd0822c54f3409f5dea3b1cf2f441f23e0 100644
--- a/x86_64/startup-common.asm
+++ b/x86_64/startup-common.asm
@@ -25,6 +25,14 @@ startup:
         shr ecx, 9
         call load_extent
     %else
+
+        %ifdef FILESYSTEM
+            mov eax, (filesystem - boot) / 512
+            mov ebx, (filesystem.end - filesystem) / 512
+        %else
+            call find_redoxfs_partition
+        %endif
+
         call redoxfs
         test eax, eax
         jnz error
@@ -50,10 +58,10 @@ startup:
 
     jmp startup_arch
 
-# load a disk extent into high memory
-# eax - sector address
-# ecx - sector count
-# edi - destination
+; load a disk extent into high memory
+; eax - sector address
+; ecx - sector count
+; edi - destination
 load_extent:
     ; loading kernel to 1MiB
     ; move part of kernel to startup_end via bootsector#load and then copy it up
@@ -132,6 +140,9 @@ load_extent:
 %include "initialize.asm"
 %ifndef KERNEL
     %include "redoxfs.asm"
+    %ifndef FILESYSTEM
+        %include "partitions.asm"
+    %endif
 %endif
 
 init_fpu_msg: db "Init FPU",13,10,0