Nandroid fully implemented in C... needs some testing.
diff --git a/extendedcommands.c b/extendedcommands.c
index 9198720..c9e3fc0 100644
--- a/extendedcommands.c
+++ b/extendedcommands.c
@@ -35,6 +35,7 @@
 
 #include "mtdutils/dump_image.h"
 #include "../../external/yaffs2/yaffs2/utils/mkyaffs2image.h"
+#include "../../external/yaffs2/yaffs2/utils/unyaffs.h"
 
 int signature_check_enabled = 1;
 int script_assert_enabled = 1;
@@ -261,7 +262,6 @@
         } 
         static char ret[PATH_MAX];
         strcpy(ret, files[chosen_item - numDirs]);
-        ui_print("File chosen: %s\n", ret);
         return ret;
     }
     return NULL;
@@ -335,24 +335,13 @@
     return 1;
 }
 
+// TODO : Separate file for Nandroid?
 int do_nandroid_backup(char* backup_name)
 {
     if (ensure_root_path_mounted("SDCARD:") != 0) {
         LOGE ("Can't mount /sdcard\n");
         return 1;
     }
-    if (ensure_root_path_mounted("SYSTEM:") != 0) {
-        LOGE ("Can't mount /system\n");
-        return 1;
-    }
-    if (ensure_root_path_mounted("DATA:") != 0) {
-        LOGE ("Can't mount /data\n");
-        return 1;
-    }
-    if (ensure_root_path_mounted("CACHE:") != 0) {
-        LOGE ("Can't mount /cache\n");
-        return 1;
-    }
 
     struct timeval tp;
     gettimeofday(&tp, NULL);
@@ -374,8 +363,12 @@
     if (0 != ret)
         return print_and_error("Error while dumping boot image!\n");
     
+    // TODO: Wrap this up in a loop?
+
     ui_print("Backing up system...\n");
     sprintf(tmp, "%s/%s", backupdir, "system.img");
+    if (ensure_root_path_mounted("SYSTEM:") != 0)
+        return print_and_error("Can't mount /system!\n");
     ret = mkyaffs2image("/system", tmp, 0, NULL);
     ensure_root_path_unmounted("SYSTEM:");
     if (0 != ret)
@@ -383,6 +376,8 @@
     
     ui_print("Backing up data...\n");
     sprintf(tmp, "%s/%s", backupdir, "data.img");
+    if (ensure_root_path_mounted("DATA:") != 0)
+        return print_and_error("Can't mount /data!\n");
     ret = mkyaffs2image("/data", tmp, 0, NULL);
     ensure_root_path_unmounted("DATA:");
     if (0 != ret)
@@ -390,6 +385,8 @@
     
     ui_print("Backing up cache...\n");
     sprintf(tmp, "%s/%s", backupdir, "cache.img");
+    if (ensure_root_path_mounted("CACHE:") != 0)
+        return print_and_error("Can't mount /cache!\n");
     ret = mkyaffs2image("/cache", tmp, 0, NULL);
     ensure_root_path_unmounted("CACHE:");
     if (0 != ret)
@@ -407,22 +404,57 @@
         LOGE ("Can't mount /sdcard\n");
         return 1;
     }
+    
+    char tmp[PATH_MAX];
 
-    char* command[PATH_MAX];
-    sprintf(command, "nandroid-mobile.sh restore %s", backup_path);
-    ui_print("Performing restore...\n");
-    int ret = system(command);
-    if (ret != 0)
-    {
-        ui_print("Error while restoring!\n");
-        return ret;
-    }
-    ui_print("Restore complete.\n");
-    return ret;
+    ui_print("Checking MD5 sums...\n");
+    sprintf(tmp, "md5sum -c %s/nandroid.md5", backup_path);
+    if (0 != system(tmp))
+        return print_and_error("MD5 mismatch!\n");
+    
+    ui_print("Restoring system...\n");
+    if (0 != ensure_root_path_unmounted("SYSTEM:")) 
+        return print_and_error("Can't unmount /system!\n");
+    if (0 != format_root_device("SYSTEM:"))
+        return print_and_error("Error while formatting /system!\n");
+    if (ensure_root_path_mounted("SYSTEM:") != 0)
+        return print_and_error("Can't mount /system!\n");
+    sprintf(tmp, "%s/system.img", backup_path);
+    if (0 != unyaffs(tmp, "/system", NULL))
+        return print_and_error("Error while restoring /system!\n");
+
+    ui_print("Restoring data...\n");
+    if (0 != ensure_root_path_unmounted("DATA:")) 
+        return print_and_error("Can't unmount /data!\n");
+    if (0 != format_root_device("DATA:"))
+        return print_and_error("Error while formatting /data!\n");
+    if (ensure_root_path_mounted("DATA:") != 0)
+        return print_and_error("Can't mount /data!\n");
+    sprintf(tmp, "%s/data.img", backup_path);
+    if (0 != unyaffs(tmp, "/data", NULL))
+        return print_and_error("Error while restoring /data!\n");
+
+    ui_print("Restoring cache...\n");
+    if (0 != ensure_root_path_unmounted("CACHE:")) 
+        return print_and_error("Can't unmount /cache!\n");
+    if (0 != format_root_device("CACHE:"))
+        return print_and_error("Error while formatting /cache!\n");
+    if (ensure_root_path_mounted("CACHE:") != 0)
+        return print_and_error("Can't mount /cache!\n");
+    sprintf(tmp, "%s/cache.img", backup_path);
+    if (0 != unyaffs(tmp, "/cache", NULL))
+        return print_and_error("Error while restoring /cache!\n");
+        
+    return 0;
 }
 
 void show_nandroid_restore_menu()
 {
+    if (ensure_root_path_mounted("SDCARD:") != 0) {
+        LOGE ("Can't mount /sdcard\n");
+        return 1;
+    }
+    
     static char* headers[] = {  "Choose an image to restore",
                                 "",
                                 NULL