diff --git a/Kernel/Cargo.toml b/Kernel/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..1017b5fb67b0094894333782eea18063ab29edb0
--- /dev/null
+++ b/Kernel/Cargo.toml
@@ -0,0 +1,27 @@
+[package]
+name = "main"
+version = "0.0.0"
+
+[lib]
+path = "main/main.rs"
+crate-type = ["staticlib"]
+
+[dependencies]
+kernel = { path = "Core" }
+syscalls = { path = "Modules/syscalls" }
+network = { path = "Modules/network" }
+usb-core = { path = "Modules/usb_core" }
+
+fs_fat = { path = "Modules/fs_fat" }
+fs_iso9660 = { path = "Modules/fs_iso9660" }
+fs_extN = { path = "Modules/fs_extN" }
+
+virtio = { path = "Modules/virtio" }
+storage-ata = { path = "Modules/storage_ata" }
+storage-ahci = { path = "Modules/storage_ahci" }
+input_ps2 = { path = "Modules/input_ps2" }
+nic-rtl8139 = { path = "Modules/nic_rtl8139" }
+usb-ohci = { path = "Modules/usb_ohci" }
+
+[target.'cfg(target_arch = "x86_64")'.dependencies]
+#video-vga = { path = "Modules/video_vga" }
diff --git a/Kernel/Core/Cargo.toml b/Kernel/Core/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..e690200584966744e2f549a332a2bb4a84594f89
--- /dev/null
+++ b/Kernel/Core/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "kernel"
+version = "0.0.0"
+
+[lib]
+path = "main.rs"
+
+[dependencies]
+stack_dst = { path = "../../externals/crates.io/stack_dst", default-features = false }
+tag_safe = "0.2"
diff --git a/Kernel/Makefile-xargo b/Kernel/Makefile-xargo
new file mode 100644
index 0000000000000000000000000000000000000000..2cb7ab011f318983ff7521262b0d0583e84a2110
--- /dev/null
+++ b/Kernel/Makefile-xargo
@@ -0,0 +1,84 @@
+#
+#
+#
+V ?= @
+-include ../common.mk
+
+-include BuildNum.$(ARCH).mk
+BUILDNUM ?= 1
+
+OBJDIR := .obj/$(ARCH)/
+OBJS := $(addprefix $(OBJDIR),start.ao log_cfg.ao libmain.a)
+
+ENV := RUST_VERSION="$(shell $(RUSTC) --version)"
+ENV += TK_GITSPEC="$(shell git log -n 1 | head -n 1 | awk '{print $$2}')"
+ENV += TK_VERSION="0.1"
+ENV += TK_BUILD="$(shell hostname --fqdn):$(BUILDNUM)"
+
+LINKFLAGS := -T Core/arch/$(ARCH)/link.ld -Map $(OBJDIR)map.txt -g
+LINKFLAGS += -z max-page-size=0x1000	# Reduces binary size
+LINKFLAGS += --gc-sections	# Prevents complaining about floating point methods
+#LINKFLAGS += --print-gc-sections
+
+EXCLUDE_FEATURES :=
+ifeq ($(ARCH),amd64)
+EXCLUDE_FEATURES := 3dnow avx avx2 sse sse2 sse3 sse4.1 sse4.2 mmx
+endif
+
+XARGO := RUST_TARGET_PATH=$(abspath targets) $(XARGO)
+
+.PHONY: all dsm PHONY
+
+all: bin/kernel-$(ARCH).bin
+dsm: bin/kernel-$(ARCH).bin.dsm
+
+# 
+# Final linking stage
+# 
+bin/kernel-$(ARCH).bin: $(OBJS) Core/arch/$(ARCH)/link.ld
+	@mkdir -p bin/
+	@echo [LD] -o $@
+	$V$(LD) -o $@ $(OBJS) --no-whole-archive $(LINKFLAGS)
+ifeq ($(ARCH),amd64)
+	$Vobjcopy $@ --only-keep-debug $@.debug
+	$Vobjcopy $@ -F elf32-i386 $@.elf32
+	$V$(TRIPLE)-strip -g $@.elf32
+else
+	#$V$(TRIPLE)-strip $@
+endif
+	@echo "BUILDNUM := $$(( $(BUILDNUM) + 1 ))" > BuildNum.$(ARCH).mk
+
+#
+# Disassembly
+#
+%.dsm: %
+	@echo "[OBJDUMP] >" $*.dsm
+	$V$(OBJDUMP) -s -C -S $* > $*.dsm
+
+#
+# Invoke xargo to build the main part of the kernel
+# - This includes all modules enabled in ./Cargo.toml
+#
+$(OBJDIR)libmain.a: PHONY targets/target-$(ARCH).json
+	@echo "[XARGO] . > $@"
+	$V$(ENV) $(XARGO) rustc --target=target-$(ARCH) --release -- -C target-feature=$(subst $(space),$(comma),$(EXCLUDE_FEATURES:%=-%))
+	@mkdir -p $(dir $@)
+	@cp target/target-$(ARCH)/release/libmain.a $@
+
+targets/target-$(ARCH).json: Core/arch/$(ARCH)/target.json
+	@mkdir -p $(dir $@)
+	$Vcp $< $@
+
+$(OBJDIR)%.ao: Core/arch/$(ARCH)/%.asm
+	@echo [AS] -o $@
+	@mkdir -p $(dir $@)
+	$Vnasm -o $@ $< -f elf64 -MD $@.d -MP
+$(OBJDIR)%.ao: Core/arch/$(ARCH)/%.S
+	@echo [AS] -o $@
+	@mkdir -p $(dir $@)
+	$V$(CC) -o $@ -c $<
+# Log configuration
+$(OBJDIR)log_cfg.ao: Core/log_cfg.S
+	@echo [AS] -o $@
+	@mkdir -p $(dir $@)
+	$V$(CC) -o $@ -c $<
diff --git a/Kernel/Modules/block_cache/Cargo.toml b/Kernel/Modules/block_cache/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..d93265a7fecd553d4456d07db34a893a6e0b65e5
--- /dev/null
+++ b/Kernel/Modules/block_cache/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "block_cache"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+
diff --git a/Kernel/Modules/blockcache/Cargo.toml b/Kernel/Modules/blockcache/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..b24b0e3ad05716451cf26dc20421892aca143055
--- /dev/null
+++ b/Kernel/Modules/blockcache/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "blockcache"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+
+
diff --git a/Kernel/Modules/fs_extN/Cargo.toml b/Kernel/Modules/fs_extN/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..d99482e119c3360a9dcef25d27a53b89c1992e3f
--- /dev/null
+++ b/Kernel/Modules/fs_extN/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "fs_extN"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+block_cache = { path = "../block_cache" }
diff --git a/Kernel/Modules/fs_fat/Cargo.toml b/Kernel/Modules/fs_fat/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..5ea64edc3f114eb451382c13fb14632f24a87c80
--- /dev/null
+++ b/Kernel/Modules/fs_fat/Cargo.toml
@@ -0,0 +1,13 @@
+[package]
+name = "fs_fat"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+blockcache = { path = "../blockcache" }
+block_cache = { path = "../block_cache" }
+utf16 = { path = "../utf16" }
+
diff --git a/Kernel/Modules/fs_iso9660/Cargo.toml b/Kernel/Modules/fs_iso9660/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..360654226062791c1b153d2be72296e979bea1be
--- /dev/null
+++ b/Kernel/Modules/fs_iso9660/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "fs_iso9660"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+block_cache = { path = "../block_cache" }
+
diff --git a/Kernel/Modules/gui/Cargo.toml b/Kernel/Modules/gui/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..e8b241ea6903e8e70830b74feea9aa90d50e07d8
--- /dev/null
+++ b/Kernel/Modules/gui/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "gui"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+tag_safe = "*"
+
diff --git a/Kernel/Modules/input_ps2/Cargo.toml b/Kernel/Modules/input_ps2/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..f8d2b9b0074ebbde9cdd6e058ae900acfbf9daaf
--- /dev/null
+++ b/Kernel/Modules/input_ps2/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "input_ps2"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+gui = { path = "../gui" }
+
diff --git a/Kernel/Modules/network/Cargo.toml b/Kernel/Modules/network/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..337c8adf43f6509a6d2feb64cabfc21aa0b34233
--- /dev/null
+++ b/Kernel/Modules/network/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "network"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+stack_dst = { path = "../../../externals/crates.io/stack_dst", default-features = false }
+shared_map = { path = "../shared_map" }
+
diff --git a/Kernel/Modules/network/lib.rs b/Kernel/Modules/network/lib.rs
index 1d286c9a68ff9906a9e8056d2f427770c6b2fd02..6531675aa025bb7a5e9f0a52102a1ce16ad1bab7 100644
--- a/Kernel/Modules/network/lib.rs
+++ b/Kernel/Modules/network/lib.rs
@@ -7,7 +7,6 @@
 #![feature(linkage)]
 #![feature(const_fn)] 
 #![feature(no_more_cas)]	// AtomicUsize::fetch_update
-#![feature(crate_in_paths)]
 
 #[cfg(test)] #[macro_use] extern crate /**/ std;
 
diff --git a/Kernel/Modules/nic_rtl8139/Cargo.toml b/Kernel/Modules/nic_rtl8139/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..f8e4dda2531458769b6615b9e86583a9259afbcb
--- /dev/null
+++ b/Kernel/Modules/nic_rtl8139/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "nic-rtl8139"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+network = { path = "../network" }
+
diff --git a/Kernel/Modules/shared_map/Cargo.toml b/Kernel/Modules/shared_map/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..b176d0fba881e32c40e33fa248e689810d4226c5
--- /dev/null
+++ b/Kernel/Modules/shared_map/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "shared_map"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+
diff --git a/Kernel/Modules/storage_ahci/Cargo.toml b/Kernel/Modules/storage_ahci/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..13579ba15d2c9f821f94b886cd34ab43893948b6
--- /dev/null
+++ b/Kernel/Modules/storage_ahci/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "storage-ahci"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+storage-ata = { path = "../storage_ata" }
+storage-scsi = { path = "../storage_scsi" }
diff --git a/Kernel/Modules/storage_ata/Cargo.toml b/Kernel/Modules/storage_ata/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..8cccf700c30e0b37962854cb7eefbf26e30c5384
--- /dev/null
+++ b/Kernel/Modules/storage_ata/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "storage-ata"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+storage-scsi = { path = "../storage_scsi" }
+
diff --git a/Kernel/Modules/storage_scsi/Cargo.toml b/Kernel/Modules/storage_scsi/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..83ad9f111829b1093071ea0de5c72608aade934b
--- /dev/null
+++ b/Kernel/Modules/storage_scsi/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "storage-scsi"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
diff --git a/Kernel/Modules/syscalls/Cargo.toml b/Kernel/Modules/syscalls/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..764935eb0091f2c4117af5e54198b252270ec2eb
--- /dev/null
+++ b/Kernel/Modules/syscalls/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "syscalls"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+stack_dst = { path = "../../../externals/crates.io/stack_dst", default-features = false }
+kernel = { path = "../../Core" }
+gui = { path = "../gui" }
+
diff --git a/Kernel/Modules/usb_core/Cargo.toml b/Kernel/Modules/usb_core/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..dcc6d6eb6e40af826476a4bdab7f506dc9c8d050
--- /dev/null
+++ b/Kernel/Modules/usb_core/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "usb-core"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+stack_dst = { path = "../../../externals/crates.io/stack_dst", default-features = false }
+
+
diff --git a/Kernel/Modules/usb_ohci/Cargo.toml b/Kernel/Modules/usb_ohci/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..0226cda675d2f6e53c1d89fe6f9cdd9e867ee180
--- /dev/null
+++ b/Kernel/Modules/usb_ohci/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "usb-ohci"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+usb-core = { path = "../usb_core" }
+
diff --git a/Kernel/Modules/utf16/Cargo.toml b/Kernel/Modules/utf16/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..b7423b954a85882594f37f44f121e59be7d7ae1f
--- /dev/null
+++ b/Kernel/Modules/utf16/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "utf16"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+
diff --git a/Kernel/Modules/video_vga/Cargo.toml b/Kernel/Modules/video_vga/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..70aa9a7f340437701a3fe91252bac93416a68614
--- /dev/null
+++ b/Kernel/Modules/video_vga/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "video-vga"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+
diff --git a/Kernel/Modules/virtio/Cargo.toml b/Kernel/Modules/virtio/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..fb79c7a706dc84e33c257d673e6706f922eca579
--- /dev/null
+++ b/Kernel/Modules/virtio/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "virtio"
+version = "0.0.0"
+
+[lib]
+path = "lib.rs"
+
+[dependencies]
+kernel = { path = "../../Core" }
+
diff --git a/Kernel/Modules/virtio/devices/mod.rs b/Kernel/Modules/virtio/devices/mod.rs
index a347888e9c8cb78cd1cbebc5dacdeab0cff87fe6..aab64f471b04787a0dbe7e521d6ac239006b27c6 100644
--- a/Kernel/Modules/virtio/devices/mod.rs
+++ b/Kernel/Modules/virtio/devices/mod.rs
@@ -23,7 +23,12 @@ pub fn new_boxed<T: Interface+Send+Sync+'static>(dev_id: u32, int: T) -> Box<dev
 		}
 	2 => Box::new( block::BlockDevice::new(int) ),	// 2 = Block device
 	// DISABLED: Changing video modes breaks stuff currently...
-	//16 => Box::new( video::VideoDevice::new(int) ),	// 16 = Graphics Adapter
+	16 => if false { 	// 16 = Graphics Adapter
+		Box::new( video::VideoDevice::new(int) )
+		}
+		else {
+			Box::new(NullDevice)
+		},
 	dev @ _ => {
 		log_error!("VirtIO device has unknown device ID {:#x}", dev);
 		Box::new(NullDevice)
diff --git a/Kernel/rundir/Makefile b/Kernel/rundir/Makefile
index a9763282f994fa65f250890a0d111560b09aec24..8679262d54f30cbf7b83f8638ec68cdac37bfb0e 100644
--- a/Kernel/rundir/Makefile
+++ b/Kernel/rundir/Makefile
@@ -25,6 +25,8 @@ ifneq ($(QEMU_STALL),)
 endif
 CMDLINE := SYSROOT=/system/Tifflin
 
+#QEMU_ARGS += -tcg-plugin $(shell dirname $(shell type -P qemu-system-x86_64))/../libexec/tcg-plugin-oprofile.so -singlestep
+
 ifneq ($(TIFFLIN_INIT),)
 	CMDLINE += INIT=$(TIFFLIN_INIT)
 endif
@@ -38,19 +40,23 @@ endif
 
 IMGDIR := DiskImages/$(ARCH)/
 
+ifneq ($(ENABLE_TRACE),)
+  QEMU_ARGS += --trace events=.qemu_trace,file=qemu_trace_events
+endif
+
 #
 # --- AMD64 ---
 #
 ifeq ($(ARCH),amd64)
 CMDLINE += SYSDISK=ATA-0p0
-QEMU_ARGS += -net nic,model=rtl8139 -net dump
+QEMU_ARGS += -vga virtio
+QEMU_ARGS += -net nic,model=rtl8139
+# -net dump
 QEMU_ARGS += -drive if=ide,index=0,file=$(IMGDIR)hda.img,format=raw
 QEMU_ARGS += -cdrom $(IMGDIR)test.iso
 QEMU_ARGS += -device ahci,id=ahci
 QEMU_ARGS += -drive if=none,id=sata1,file=$(IMGDIR)hdb.img,format=raw -device ide-hd,drive=sata1,bus=ahci.0
 QEMU_ARGS += -drive if=none,id=sata2,file=$(IMGDIR)test.iso,format=raw -device ide-cd,drive=sata2,bus=ahci.1
-#QEMU_ARGS += -trace file=qemu_trace
-#QEMU_OPTS += -trace events=.qemu_trace,file=qemu_trace
 
 MODE ?= pxe
 ifeq ($(MODE),iso)
@@ -142,14 +148,9 @@ $(IMGDIR)hdb.img: Makefile $(IMGDIR)hdb_0.img $(IMGDIR)hdb_1.img
 	@echo "$(shell echo $$((1*1024*2)),+,0x83)" | /sbin/sfdisk --no-reread $@ -u S -f -q > /dev/null
 
 .qemu_trace: Makefile
-	echo "" 
 	echo "" > $@
-	#echo "apic_deliver_irq" >> $@
-	#echo "apic_local_deliver" >> $@
-	#echo "apic_mem_readl" >> $@
-	echo "bdrv_aio_readv" >> $@
-	echo "bdrv_aio_writev" >> $@
-	echo "bdrv_co_readv" >> $@
-	echo "bdrv_co_do_copy_on_readv" >> $@
+	echo pci_* >> $@
+	echo virtio_* >> $@
+	echo virtqueue_* >> $@