diff --git a/Makefile b/Makefile
index 3e9ad1d..9237a55 100644
--- a/Makefile
+++ b/Makefile
@@ -1,66 +1,66 @@
-.EXPORT_ALL_VARIABLES:
-
-TOPDIR     := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
-SYSROOTDIR := $(TOPDIR)/sysroot
-TOOLSDIR   := $(TOPDIR)/tools
-
-RM = echo
-
-MK_BUGREPORT := \"https://git.cute.engineering/d0p1/StupidOS/issues\"
-MK_COMMIT    := \"$(shell git rev-parse --short HEAD)\"
-
-SUBDIRS	:= tools boot kernel lib bin
-
-TARGET	= stupid.tar.gz floppy_boot.img
-ifneq ($(OS),Windows_NT)
-EXEXT	=
-TARGET	+= stupid.iso stdupid.hdd
-else
-EXEXT	= .exe
-endif
-
-.PHONY: all
-all: $(TARGET)
-
-GOAL:=install
-clean: GOAL:=clean
-
-.PHONY: $(SUBDIRS)
-$(SUBDIRS):
-	@echo "📁 $@"
-	DESTDIR=$(SYSROOTDIR) $(MAKE) -C $@ $(GOAL)
-
-.PHONY: stupid.iso
-stupid.iso: $(SUBDIRS)
-	$(TOPDIR)/tools/create-iso $@ sysroot
-
-.PHONY: stupid.hdd
-stupid.hdd: $(SUBDIRS)
-	@echo ""
-
-.PHONY: stupid.tar.gz
-stupid.tar.gz: $(SUBDIRS)
-	tar -czvf $@ sysroot
-
-.PHONY: floppy_boot.img
-floppy_boot.img: $(SUBDIRS)
-	dd if=/dev/zero of=$@ bs=512 count=1440
-	mformat -C -f 1440 -i $@
-	dd if=boot/bootsector.bin of=$@ conv=notrunc
-	mcopy -i $@ boot/stpdboot.sys ::/STPDBOOT.SYS
-	mcopy -i $@ kernel/vmstupid.sys ::/VMSTUPID.SYS
-
-.PHONY: run
-run: all
-	qemu-system-i386 \
-		-rtc base=localtime \
-		-drive file=floppy_boot.img,if=none,format=raw,id=boot \
-		-drive file=fat:rw:./sysroot,if=none,id=hdd \
-		-device floppy,drive=boot \
-		-device ide-hd,drive=hdd \
-		-global isa-fdc.bootindexA=0 \
-		-serial mon:stdio
-
-.PHONY: clean
-clean: $(SUBDIRS)
-	$(RM) $(TARGET) $(SYSROOTDIR)
+.EXPORT_ALL_VARIABLES:
+
+TOPDIR     := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
+SYSROOTDIR := $(TOPDIR)/sysroot
+TOOLSDIR   := $(TOPDIR)/tools
+
+RM = echo
+
+MK_BUGREPORT := \"https://git.cute.engineering/d0p1/StupidOS/issues\"
+MK_COMMIT    := \"$(shell git rev-parse --short HEAD)\"
+
+SUBDIRS	:= tools boot kernel lib bin
+
+TARGET	= stupid.tar.gz floppy_boot.img
+ifneq ($(OS),Windows_NT)
+EXEXT	=
+TARGET	+= stupid.iso stupid.hdd
+else
+EXEXT	= .exe
+endif
+
+.PHONY: all
+all: $(TARGET)
+
+GOAL:=install
+clean: GOAL:=clean
+
+.PHONY: $(SUBDIRS)
+$(SUBDIRS):
+	@echo "📁 $@"
+	DESTDIR=$(SYSROOTDIR) $(MAKE) -C $@ $(GOAL)
+
+.PHONY: stupid.iso
+stupid.iso: $(SUBDIRS)
+	$(TOPDIR)/tools/create-iso $@ sysroot
+
+.PHONY: stupid.hdd
+stupid.hdd: $(SUBDIRS)
+	@echo ""
+
+.PHONY: stupid.tar.gz
+stupid.tar.gz: $(SUBDIRS)
+	tar -czvf $@ sysroot
+
+.PHONY: floppy_boot.img
+floppy_boot.img: $(SUBDIRS)
+	dd if=/dev/zero of=$@ bs=512 count=1440
+	mformat -C -f 1440 -i $@
+	dd if=boot/bootsector.bin of=$@ conv=notrunc
+	mcopy -i $@ boot/stpdboot.sys ::/STPDBOOT.SYS
+	mcopy -i $@ kernel/vmstupid.sys ::/VMSTUPID.SYS
+
+.PHONY: run
+run: all
+	qemu-system-i386 \
+		-rtc base=localtime \
+		-drive file=floppy_boot.img,if=none,format=raw,id=boot \
+		-drive file=fat:rw:./sysroot,if=none,id=hdd \
+		-device floppy,drive=boot \
+		-device ide-hd,drive=hdd \
+		-global isa-fdc.bootindexA=0 \
+		-serial mon:stdio
+
+.PHONY: clean
+clean: $(SUBDIRS)
+	$(RM) $(TARGET) $(SYSROOTDIR)
diff --git a/boot/boot0.asm b/boot/boot0.asm
index 144110d..7468a24 100644
--- a/boot/boot0.asm
+++ b/boot/boot0.asm
@@ -1,120 +1,120 @@
-        INCLUDE 'const.inc'
-
-        ORG STAGE0_BASE
-        USE16
-
-        jmp short _start
-        nop
-
-        ; Boot Record
-OEM_identifier      db 'STUPID  '
-bytes_per_sector    dw 512
-sectors_per_cluster db 1
-reserved_sectors    dw 1
-FAT_count           db 2
-root_dir_entries    dw 224
-total_sectors       dw 2880
-media_desc_type     db 0xF0
-sectors_per_FAT     dw 9
-sectors_per_track   dw 18
-heads_per_cylinder  dw 2
-hidden_sectors      dd 0
-large_sector_count  dd 0
-
-        ; Extended Boot Record
-drive_number db 0x0
-reserved     db 0x0
-signature    db 0x29   ; 0x28 or 0x29
-volume_id    dd 0xB00B135 ; hope mine will grow :'(
-volume_label db 'Stupid Boot'
-system_id    db 'FAT12  '
-
-
-_start:
-        cli
-        cld
-        jmp 0x0:.canonicalize_cs
-
-.canonicalize_cs:
-        xor ax, ax
-        mov ds, ax
-        mov ss, ax
-        mov es, ax
-        mov sp, 0x7c00
-
-        mov [drive_number], dl
-
-        ; reset floppy disk
-@@:
-        mov dl, [drive_number]
-        xor ah, ah
-        int 0x13
-        jc @b
-
-        call fat_load_root
-
-        ; search in root directory
-
-        mov si, kernel_file
-        call fat_search_root
-        jc .error_not_found
-        mov [kernel_start], ax
-
-        mov si, stage1_file
-        call fat_search_root
-        jc .error_not_found
-        mov [stage1_start], ax
-
-        ; load fat
-        xor ax, ax
-        mov al, [FAT_count]
-        mul word [sectors_per_FAT]
-        mov cx, ax
-        mov ax, [reserved_sectors]
-
-        xor bx, bx
-
-        call disk_read_sectors
-
-        ; preload kernel
-        mov ax, KERNEL_PRELOAD/0x10
-        mov es, ax
-        mov ax, [kernel_start]
-        xor bx, bx
-        call fat_load_binary
-
-        ; load stage 2
-        mov ax, STAGE1_BASE/0x10
-        mov es, ax
-        mov ax, [stage1_start]
-        xor bx, bx
-        call fat_load_binary
-
-        jmp 0x0:STAGE1_BASE
-
-.error_not_found:
-        push si
-        mov si, msg_error
-        call bios_print
-        pop si
-        call bios_print
-        mov si, msg_not_found
-        call bios_print
-        hlt
-        jmp $
-
-        INCLUDE "utils.inc"
-        INCLUDE "fat12.inc"
-
-msg_error                  db "ERROR: ", 0
-msg_not_found              db " not found", CR, LF, 0
-
-kernel_file db "VMSTUPIDSYS", 0
-stage1_file db "STPDBOOTSYS", 0
-
-kernel_start dw 0x0
-stage1_start dw 0x0
-
-
-        rb 0x7C00+512-2-$
-        db 0x55, 0xAA
+        INCLUDE 'const.inc'
+
+        ORG STAGE0_BASE
+        USE16
+
+        jmp short _start
+        nop
+
+        ; Boot Record
+OEM_identifier      db 'STUPID  '
+bytes_per_sector    dw 512
+sectors_per_cluster db 1
+reserved_sectors    dw 1
+FAT_count           db 2
+root_dir_entries    dw 224
+total_sectors       dw 2880
+media_desc_type     db 0xF0
+sectors_per_FAT     dw 9
+sectors_per_track   dw 18
+heads_per_cylinder  dw 2
+hidden_sectors      dd 0
+large_sector_count  dd 0
+
+        ; Extended Boot Record
+drive_number db 0x0
+reserved     db 0x0
+signature    db 0x29   ; 0x28 or 0x29
+volume_id    dd 0xB00B135 ; hope mine will grow :'(
+volume_label db 'Stupid Boot'
+system_id    db 'FAT12  '
+
+
+_start:
+        cli
+        cld
+        jmp 0x0:.canonicalize_cs
+
+.canonicalize_cs:
+        xor ax, ax
+        mov ds, ax
+        mov ss, ax
+        mov es, ax
+        mov sp, 0x7c00
+
+        mov [drive_number], dl
+
+        ; reset floppy disk
+@@:
+        mov dl, [drive_number]
+        xor ah, ah
+        int 0x13
+        jc @b
+
+        call fat_load_root
+
+        ; search in root directory
+
+        mov si, kernel_file
+        call fat_search_root
+        jc .error_not_found
+        mov [kernel_start], ax
+
+        mov si, stage1_file
+        call fat_search_root
+        jc .error_not_found
+        mov [stage1_start], ax
+
+        ; load fat
+        xor ax, ax
+        mov al, [FAT_count]
+        mul word [sectors_per_FAT]
+        mov cx, ax
+        mov ax, [reserved_sectors]
+
+        xor bx, bx
+
+        call disk_read_sectors
+
+        ; preload kernel
+        mov ax, KERNEL_PRELOAD/0x10
+        mov es, ax
+        mov ax, [kernel_start]
+        xor bx, bx
+        call fat_load_binary
+
+        ; load stage 2
+        mov ax, STAGE1_BASE/0x10
+        mov es, ax
+        mov ax, [stage1_start]
+        xor bx, bx
+        call fat_load_binary
+
+        jmp 0x0:STAGE1_BASE
+
+.error_not_found:
+        push si
+        mov si, msg_error
+        call bios_print
+        pop si
+        call bios_print
+        mov si, msg_not_found
+        call bios_print
+        hlt
+        jmp $
+
+        INCLUDE "utils.inc"
+        INCLUDE "fat12.inc"
+
+msg_error                  db "ERROR: ", 0
+msg_not_found              db " not found", CR, LF, 0
+
+kernel_file db "VMSTUPIDSYS", 0
+stage1_file db "STPDBOOTSYS", 0
+
+kernel_start dw 0x0
+stage1_start dw 0x0
+
+
+        rb 0x7C00+512-2-$
+        db 0x55, 0xAA
diff --git a/boot/boot1.asm b/boot/boot1.asm
index f1bddf0..221621e 100644
--- a/boot/boot1.asm
+++ b/boot/boot1.asm
@@ -1,65 +1,68 @@
-	INCLUDE 'const.inc'
-        INCLUDE 'multiboot.inc'
-
-        ORG STAGE1_BASE
-        USE16
-
-	jmp _start
-
-	mb_header MultibootHeader mb_header
-
-_start:
-        cmp eax, MULTIBOOT_MAGIC
-        je .multiboot
-
-	;; non multiboot process
-        push cs
-        pop ds
-
-        mov si, msg_stage2
-        call bios_print
-
-        call a20_enable
-        jc .error_a20
-
-        ; detect memory
-        call memory_get_map
-        jc .error_memory
-        xchg bx, bx
-
-	call video_setup
-
-.multiboot:
-        jmp .hang
-
-.error_memory:
-        mov si, msg_error_memory
-        jmp .error
-.error_a20:
-        mov si, msg_error_a20
-.error:
-        call bios_print
-.hang:
-        hlt
-        jmp $
-
-        INCLUDE 'a20.inc'
-        INCLUDE 'utils.inc'
-        INCLUDE 'memory.inc'
-	INCLUDE 'video.inc'
-
-msg_stage2       db "StupidOS Bootloader (Stage 1)", CR, LF, 0
-msg_error_a20    db "ERROR: can't enable a20 line", CR, LF, 0
-msg_error_memory db "ERROR: can't detect available memory", CR, LF, 0
-
-
-	;;
-bi_screen_width:	dw 0
-bi_screen_height:	dw 0
-
-_edata:
-
-        ; BSS
-        rb 0x4000
-
-_end:
+	INCLUDE 'const.inc'
+	INCLUDE 'multiboot.inc'
+
+	ORG STAGE1_BASE
+	USE32
+
+	jmp _start
+
+	ALIGN 4
+multiboot_header:
+	mb_header MultibootHeader multiboot_header
+
+_start:
+	cmp eax, MULTIBOOT_MAGIC
+	je .multiboot
+
+	USE16
+	;; non multiboot process
+	push cs
+	pop ds
+
+	mov si, msg_stage2
+	call bios_print
+
+	call a20_enable
+	jc .error_a20
+
+    ; detect memory
+    call memory_get_map
+    jc .error_memory
+    xchg bx, bx
+
+	call video_setup
+
+.multiboot:
+	jmp .hang
+
+.error_memory:
+	mov si, msg_error_memory
+	jmp .error
+.error_a20:
+	mov si, msg_error_a20
+.error:
+	call bios_print
+.hang:
+	hlt
+	jmp $
+
+	INCLUDE 'a20.inc'
+	INCLUDE 'utils.inc'
+	INCLUDE 'memory.inc'
+	INCLUDE 'video.inc'
+
+msg_stage2       db "StupidOS Bootloader (Stage 1)", CR, LF, 0
+msg_error_a20    db "ERROR: can't enable a20 line", CR, LF, 0
+msg_error_memory db "ERROR: can't detect available memory", CR, LF, 0
+
+
+	;;
+bi_screen_width:	dw 0
+bi_screen_height:	dw 0
+
+_edata:
+
+	; BSS
+	rb 0x4000
+
+_end:
diff --git a/boot/const.inc b/boot/const.inc
index a52a058..b053e62 100644
--- a/boot/const.inc
+++ b/boot/const.inc
@@ -1,14 +1,15 @@
-CR   = 0x0D
-LF   = 0x0A
-
-; -------- Address ----------
-STAGE0_BASE    = 0x7C00
-STAGE1_BASE    = 0x1000
-DISK_BUFFER    = 0x8000
-KERNEL_PRELOAD = 0xF000
-STACK_TOP      = 0x7000
-
-; ---------- Video ------------
-VIDEO_WIDTH  = 1024
-VIDEO_HEIGHT = 768
-VIDEO_DEPTH  = 32
+CR   = 0x0D
+LF   = 0x0A
+
+; -------- Address ----------
+STAGE0_BASE    = 0x7C00
+STAGE1_BASE    = 0x1000
+MULTIBOOT_BASE = 0x100000
+DISK_BUFFER    = 0x8000
+KERNEL_PRELOAD = 0xF000
+STACK_TOP      = 0x7000
+
+; ---------- Video ------------
+VIDEO_WIDTH  = 1024
+VIDEO_HEIGHT = 768
+VIDEO_DEPTH  = 32
diff --git a/boot/multiboot.inc b/boot/multiboot.inc
index 299a39b..fff67db 100644
--- a/boot/multiboot.inc
+++ b/boot/multiboot.inc
@@ -1,107 +1,108 @@
-MULTIBOOT_HDR_MAGIC = 0x1BADB002
-MULTIBOOT_MAGIC     = 0x2BADB002
-
-MULTIBOOT_HDR_ALIGN   = 0x1
-MULTIBOOT_HDR_MEMINFO = 0x2
-MULTIBOOT_HDR_VIDEO   = 0x4
-MULTIBOOT_FLAGS       = MULTIBOOT_HDR_ALIGN or MULTIBOOT_HDR_MEMINFO or MULTIBOOT_HDR_VIDEO
-
-struc MultibootHeader addr
-{
-        .magic    dd MULTIBOOT_HDR_MAGIC
-        .flags    dd MULTIBOOT_FLAGS
-        .checksum dd -(MULTIBOOT_HDR_MAGIC + MULTIBOOT_FLAGS)
-
-        ; address fields (we'll just skip them)
-        .header_addr   dd addr
-        .load_addr     dd STAGE1_BASE
-        .load_end_addr dd _edata - STAGE1_BASE
-        .bss_end_addr  dd _end - STAGE1_BASE
-        .entry_addr    dd _start
-
-        ; Video mode
-        .mode_type dd 0x0
-        .width     dd VIDEO_WIDTH
-        .height    dd VIDEO_HEIGHT
-        .depth     dd VIDEO_DEPTH
-}
-
-struc MultibootData
-{
-        .flags dd ?
-
-        ; if flags[0] is set
-        .mem_lower dd ?
-        .mem_upper dd ?
-
-        ; if flags[1] is set
-        .boot_device dd ?
-
-        ; if flags[2] is set
-        .cmdline dd ?
-
-        ; if flags[3] is set
-        .mods_count dd ?
-        .mods_addr  dd ?
-
-        ; if flags[4] is set
-        .syms dd 4 dup ?
-
-        ; if flags[6] is set
-        .mmap_length dd ?
-        .mmap_addr   dd ?
-
-        ; if flags[7] is set
-        .drives_length dd ?
-        .drives_addr   dd ?
-
-        ; if flags[8] is set
-        .config_table dd ?
-
-        ; if flags[9] is set
-        .bootloader_name dd ?
-
-        ; if flags[10] is set
-        .apm_table dd ?
-
-        ; if flags[11] is set
-        .vbe_control_info dd ?
-        .vbe_mode_info    dd ?
-        .vbe_mode         dw ?
-        .vbe_if_seg       dw ?
-        .vbe_if_off       dw ?
-        .vbe_if_length    dw ?
-
-        ; if flags[12] is set
-        .fb_addr   dq ?
-        .fb_pitch  dd ?
-        .fb_width  dd ?
-        .fb_height dd ?
-        .fb_bpp    db ?
-        .fb_type   db ?
-        .fb_misc   dw 3 dup ?
-}
-
-MULTIBOOT_DATA_MEM             = 0x0001
-MULTIBOOT_DATA_BOOTDEV         = 0x0002
-MULTIBOOT_DATA_CMDLINE         = 0x0004
-MULTIBOOT_DATA_MODULES         = 0x0008
-MULTIBOOT_DATA_MMAP            = 0x0040
-MULTIBOOT_DATA_DRIVES          = 0x0080
-MULTIBOOT_DATA_BOOTLOADER_NAME = 0x0200
-MULTIBOOT_DATA_VBE             = 0x0800
-MULTIBOOT_DATA_FB              = 0x1000
-
-struc MultibootMMap
-{
-        .size   dd ?
-        .addr   dq ?
-        .length dq ?
-        .type   dd ?
-}
-
-MULTIBOOT_MEMORY_AVAILABLE = 0x1
-MULTIBOOT_MEMORY_RESERVED  = 0x2
-MULTIBOOT_MEMORY_ACPI      = 0x3
-MULTIBOOT_MEMORY_NVS       = 0x4
-MULTIBOOT_MEMORY_BADPARAM  = 0x5
+MULTIBOOT_HDR_MAGIC = 0x1BADB002
+MULTIBOOT_MAGIC     = 0x2BADB002
+
+MULTIBOOT_HDR_ALIGN       = 0x1
+MULTIBOOT_HDR_MEMINFO     = 0x2
+MULTIBOOT_HDR_VIDEO       = 0x4
+MULTIBOOT_HDR_AOUT_KLUDGE = 0x10000
+MULTIBOOT_FLAGS = MULTIBOOT_HDR_ALIGN or MULTIBOOT_HDR_MEMINFO or MULTIBOOT_HDR_VIDEO or MULTIBOOT_HDR_AOUT_KLUDGE
+
+struc MultibootHeader addr
+{
+        .magic    dd MULTIBOOT_HDR_MAGIC
+        .flags    dd MULTIBOOT_FLAGS
+        .checksum dd -(MULTIBOOT_HDR_MAGIC + MULTIBOOT_FLAGS)
+
+        ; address fields (we'll just skip them)
+        .header_addr   dd addr
+        .load_addr     dd STAGE1_BASE
+        .load_end_addr dd _edata
+        .bss_end_addr  dd _end
+        .entry_addr    dd _start
+
+        ; Video mode
+        .mode_type dd 0x0
+        .width     dd VIDEO_WIDTH
+        .height    dd VIDEO_HEIGHT
+        .depth     dd VIDEO_DEPTH
+}
+
+struc MultibootData
+{
+        .flags dd ?
+
+        ; if flags[0] is set
+        .mem_lower dd ?
+        .mem_upper dd ?
+
+        ; if flags[1] is set
+        .boot_device dd ?
+
+        ; if flags[2] is set
+        .cmdline dd ?
+
+        ; if flags[3] is set
+        .mods_count dd ?
+        .mods_addr  dd ?
+
+        ; if flags[4] is set
+        .syms dd 4 dup ?
+
+        ; if flags[6] is set
+        .mmap_length dd ?
+        .mmap_addr   dd ?
+
+        ; if flags[7] is set
+        .drives_length dd ?
+        .drives_addr   dd ?
+
+        ; if flags[8] is set
+        .config_table dd ?
+
+        ; if flags[9] is set
+        .bootloader_name dd ?
+
+        ; if flags[10] is set
+        .apm_table dd ?
+
+        ; if flags[11] is set
+        .vbe_control_info dd ?
+        .vbe_mode_info    dd ?
+        .vbe_mode         dw ?
+        .vbe_if_seg       dw ?
+        .vbe_if_off       dw ?
+        .vbe_if_length    dw ?
+
+        ; if flags[12] is set
+        .fb_addr   dq ?
+        .fb_pitch  dd ?
+        .fb_width  dd ?
+        .fb_height dd ?
+        .fb_bpp    db ?
+        .fb_type   db ?
+        .fb_misc   dw 3 dup ?
+}
+
+MULTIBOOT_DATA_MEM             = 0x0001
+MULTIBOOT_DATA_BOOTDEV         = 0x0002
+MULTIBOOT_DATA_CMDLINE         = 0x0004
+MULTIBOOT_DATA_MODULES         = 0x0008
+MULTIBOOT_DATA_MMAP            = 0x0040
+MULTIBOOT_DATA_DRIVES          = 0x0080
+MULTIBOOT_DATA_BOOTLOADER_NAME = 0x0200
+MULTIBOOT_DATA_VBE             = 0x0800
+MULTIBOOT_DATA_FB              = 0x1000
+
+struc MultibootMMap
+{
+        .size   dd ?
+        .addr   dq ?
+        .length dq ?
+        .type   dd ?
+}
+
+MULTIBOOT_MEMORY_AVAILABLE = 0x1
+MULTIBOOT_MEMORY_RESERVED  = 0x2
+MULTIBOOT_MEMORY_ACPI      = 0x3
+MULTIBOOT_MEMORY_NVS       = 0x4
+MULTIBOOT_MEMORY_BADPARAM  = 0x5
diff --git a/tools/create-iso b/tools/create-iso
index c6f5355..d2a1dcd 100755
--- a/tools/create-iso
+++ b/tools/create-iso
@@ -8,7 +8,8 @@ set default=0
 menuentry "StupidOS" {
    echo "verify system integrity"
    hashsum --hash sha256 --check /boot/hashfile --prefix /
-   multiboot /vmstupid
+   multiboot /stpdboot.sys
+   module /vmstupid.sys
    boot
 }
 
@@ -18,7 +19,10 @@ EOF
 gen_iso_file() {
 	mkdir -p "$2/boot/grub"
 	echo "$grub_config" > "$2/boot/grub/grub.cfg"
-	sha256sum "$2/vmstupid" > "$2/boot/hashfile"
+	sha256sum "$2/vmstupid.sys" > "$2/boot/hashfile"
+	sha256sum "$2/stpdboot.sys" >> "$2/boot/hashfile"
+
+	grub-file --is-x86-multiboot "$2/stpdboot.sys" || exit 1
 
 	grub-mkrescue -o $1 $2
 }