diff --git a/Makefile b/Makefile
index 303a82f1c1a77dbb241cd157a2cd358c2a49cb41..b5bd258e0d86198e3cdea7ff7585ce83625f769d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,10 +1,14 @@
 
+default: assemble
+
 bootloader:
 	$(MAKE) -C bootloader
 
 kernel:
 	$(MAKE) -C kernel
 
+.PHONY: bootloader kernel
+
 build: bootloader kernel
 
 assemble: build
diff --git a/bootloader/boot.asm b/bootloader/boot.asm
index 43313ea19205e84820f56a23d5c5745d33a99e29..389dee964450fc77f3c0de68f60c4107678a3b12 100644
--- a/bootloader/boot.asm
+++ b/bootloader/boot.asm
@@ -1,6 +1,7 @@
 [bits 16]
 [org 0x7c00]
 
+mov [_boot_drive_id], dl
 jmp _init_prot_mode
 
 gdt_begin:
@@ -61,14 +62,45 @@ _prot_begin:
     mov ebx, _motd_32
     call println_vga
 
-    KERN_ADDR equ 0x1000
 
+    ; Load the kernel image from boot disk, disk offset 512B to 64KB.
+    KERN_ADDR equ 0x7e00
+    mov ah, 0x02
+    mov ch, 0
+    mov dh, 0
+    mov cl, 2 ; from the second one,
+    mov al, 127 ; read 127 sectors in total.
+    mov bx, KERN_ADDR
+    int 0x13 ; Set carry on error, and set AL to sectors that actual read.
+    jmp _stall
+
+    jc disk_io_error
+    mov dl, 0x7f
+    cmp dl, al
+    jne disk_io_error
+    ; kernel successfully loaded now!
+    mov ebx, _motd_kern_ok
+    call println_vga
+
+
+_stall:
     jmp $
 
+disk_io_error:
+    mov ebx, _motd_disk_error
+    call println_vga
+    jmp _stall
+
+_motd_disk_error:
+    db 'DISK_IO_ERROR', 0x0
 _motd_32:
-    db '[ENTER X86 MODE SUCC] [LOADING KERN..]', 0x0
+    db '[ENTER X86 MODE SUCC]', 0x0
+_motd_kern_ok:
+    db '[ENTER X86 MODE SUCC] [LOAD KERN SUCC]', 0x0
 _motd_endk:
-    db '[ENTER X86 MODE SUCC] [LOADING KERN..] [KERN EXITED]', 0x0
+    db '[ENTER X86 MODE SUCC] [LOAD KERN SUCC] [KERN EXITED]', 0x0
+_boot_drive_id:
+    db 0x0
     
 %include "./mbr_end.inc"    
 
diff --git a/kernel/Makefile b/kernel/Makefile
index b712a806b524ac11ecc73ef64702d39f99783b89..6d07b257eb5e8f05c1fbe6a006d50546ab0cd091 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -1,7 +1,9 @@
 
 kernel:
 	gcc -ffreestanding -c kernel.c -o kernel.o # -m32
-	ld -o kernel.img -Ttext 0x1000 --oformat binary kernel.o # -m elf_i386
+	ld -o kernel.img -Ttext 0x7e00 --oformat binary kernel.o # -m elf_i386
+	# Sector 1 = bootloader, Sector 2 - (512B TO 64K) = kernel
+	truncate --size=65024 kernel.img
 
 clean:
 	rm *.o *.img