Backup of Froyo apps on external storage.
diff --git a/nandroid.c b/nandroid.c
index 763ce5b..00afbd9 100644
--- a/nandroid.c
+++ b/nandroid.c
@@ -75,7 +75,7 @@
     ui_show_progress(1, 0);
 }
 
-int nandroid_backup_partition(const char* backup_path, char* root) {
+int nandroid_backup_partition_extended(const char* backup_path, char* root, int umount_when_finished) {
     int ret = 0;
     char mount_point[PATH_MAX];
     translate_root_path(root, mount_point, PATH_MAX);
@@ -96,7 +96,9 @@
     char tmp[PATH_MAX];
     sprintf(tmp, "%s/%s.img", backup_path, name);
     ret = mkyaffs2image(mount_point, tmp, 0, callback);
-    ensure_root_path_unmounted(root);
+    if (umount_when_finished) {
+        ensure_root_path_unmounted(root);
+    }
     if (0 != ret) {
         ui_print("Error while making a yaffs2 image of %s!\n", mount_point);
         return ret;
@@ -104,6 +106,10 @@
     return 0;
 }
 
+int nandroid_backup_partition(const char* backup_path, char* root) {
+    return nandroid_backup_partition_extended(backup_path, root, 1);
+}
+
 int nandroid_backup(const char* backup_path)
 {
     ui_set_background(BACKGROUND_ICON_INSTALLING);
@@ -150,10 +156,20 @@
         return ret;
 #endif
 
-    if (0 != (ret = nandroid_backup_partition(backup_path, "CACHE:")))
+    struct stat st;
+    if (0 != stat("/sdcard/.android_secure", &st))
+    {
+        ui_print("No /sdcard/.android_secure found. Skipping backup of applications on external storage.\n");
+    }
+    else
+    {
+        if (0 != (ret = nandroid_backup_partition_extended(backup_path, "SDCARD:/.android_secure", 0)))
+            return ret;
+    }
+
+    if (0 != (ret = nandroid_backup_partition_extended(backup_path, "CACHE:", 0)))
         return ret;
 
-    struct stat st;
     if (0 != stat(SDEXT_DEVICE, &st))
     {
         ui_print("No sd-ext found. Skipping backup of sd-ext.\n");
@@ -165,7 +181,7 @@
         else if (0 != (ret = nandroid_backup_partition(backup_path, "SDEXT:")))
             return ret;
     }
-    
+
     ui_print("Generating md5 sum...\n");
     sprintf(tmp, "nandroid-md5.sh %s", backup_path);
     if (0 != (ret = __system(tmp))) {
@@ -182,7 +198,7 @@
 
 typedef int (*format_function)(char* root);
 
-int nandroid_restore_partition(const char* backup_path, const char* root) {
+int nandroid_restore_partition_extended(const char* backup_path, const char* root, int umount_when_finished) {
     int ret = 0;
     char mount_point[PATH_MAX];
     translate_root_path(root, mount_point, PATH_MAX);
@@ -216,12 +232,17 @@
         return ret;
     }
 
-    if (0 != strcmp(root, "CACHE")) {
+    if (umount_when_finished) {
         ensure_root_path_unmounted(root);
     }
+    
     return 0;
 }
 
+int nandroid_restore_partition(const char* backup_path, const char* root) {
+    return nandroid_restore_partition_extended(backup_path, root, 1);
+}
+
 int nandroid_restore(const char* backup_path, int restore_boot, int restore_system, int restore_data, int restore_cache, int restore_sdext)
 {
     ui_set_background(BACKGROUND_ICON_INSTALLING);
@@ -263,7 +284,23 @@
         return ret;
 #endif
 
-    if (restore_cache && 0 != (ret = nandroid_restore_partition(backup_path, "CACHE:")))
+    if (restore_data)
+    {
+        struct statfs s;
+        sprintf(tmp, "%s/.android_secure.img", backup_path);
+        if (0 != (ret = statfs(tmp, &s)))
+        {
+            ui_print(".android_secure.img not found. Skipping restore of applications on external storage.");
+        }
+        else
+        {
+            __system("mkdir -p /sdcard/.android_secure");
+            if (0 != (ret = nandroid_restore_partition_extended(backup_path, "SDCARD:/.android_secure", 0)))
+                return ret;
+        }
+    }
+
+    if (restore_cache && 0 != (ret = nandroid_restore_partition_extended(backup_path, "CACHE:", 0)))
         return ret;
 
     if (restore_sdext)