diff --git a/Android.mk b/Android.mk
index 600f356..347af11 100644
--- a/Android.mk
+++ b/Android.mk
@@ -36,7 +36,8 @@
     partitionmanager.cpp \
     mtdutils/mtdutils.c \
     twinstall.cpp \
-    twrp-functions.cpp
+    twrp-functions.cpp \
+    openrecoveryscript.cpp
 
 ifeq ($(TARGET_RECOVERY_REBOOT_SRC),)
   LOCAL_SRC_FILES += reboot.c
diff --git a/gui/action.cpp b/gui/action.cpp
index bbcca23..80a582c 100644
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -20,6 +20,7 @@
 #include <sstream>
 #include "../partitions.hpp"
 #include "../twrp-functions.hpp"
+#include "../openrecoveryscript.hpp"
 
 #include "../ui.h"
 #include "../adb_install.h"
@@ -1028,10 +1029,9 @@
 
 					DataManager::SetValue(TW_IS_ENCRYPTED, 0);
 					DataManager::ReadSettingsFile();
-LOGE("TODO: Implement ORS support\n");
-					if (0/*check_for_script_file()*/) {
+					if (OpenRecoveryScript::check_for_script_file()) {
 						ui_print("Processing OpenRecoveryScript file...\n");
-						if (/*run_script_file() ==*/ 0) {
+						if (OpenRecoveryScript::run_script_file() == 0) {
 							usleep(2000000); // Sleep for 2 seconds before rebooting
 							tw_reboot(rb_system);
 							load_theme = 0;
diff --git a/openrecoveryscript.cpp b/openrecoveryscript.cpp
new file mode 100644
index 0000000..bcd4acb
--- /dev/null
+++ b/openrecoveryscript.cpp
@@ -0,0 +1,476 @@
+/* OpenRecoveryScript class for TWRP
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ * The code was written from scratch by Dees_Troy dees_troy at
+ * yahoo
+ *
+ * Copyright (c) 2012
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/vfs.h>
+#include <unistd.h>
+#include <vector>
+#include <dirent.h>
+#include <time.h>
+#include <errno.h>
+
+#include "twrp-functions.hpp"
+#include "partitions.hpp"
+#include "common.h"
+#include "openrecoveryscript.hpp"
+#include "variables.h"
+extern "C" {
+#include "data.h"
+#include "twinstall.h"
+int TWinstall_zip(const char* path, int* wipe_cache);
+}
+
+static const char *SCRIPT_FILE_CACHE = "/cache/recovery/openrecoveryscript";
+static const char *SCRIPT_FILE_TMP = "/tmp/openrecoveryscript";
+#define SCRIPT_COMMAND_SIZE 512
+
+int OpenRecoveryScript::check_for_script_file(void) {
+	char exec[512];
+
+	if (!PartitionManager.Mount_By_Path(SCRIPT_FILE_CACHE, false)) {
+		LOGE("Unable to mount /cache for OpenRecoveryScript support.\n");
+		return 0;
+	}
+	if (TWFunc::Path_Exists(SCRIPT_FILE_CACHE)) {
+		LOGI("Script file found: '%s'\n", SCRIPT_FILE_CACHE);
+		// Copy script file to /tmp
+		strcpy(exec, "cp ");
+		strcat(exec, SCRIPT_FILE_CACHE);
+		strcat(exec, " ");
+		strcat(exec, SCRIPT_FILE_TMP);
+		system(exec);
+		// Delete the file from /cache
+		strcpy(exec, "rm ");
+		strcat(exec, SCRIPT_FILE_CACHE);
+		system(exec);
+		return 1;
+	}
+	return 0;
+}
+
+int OpenRecoveryScript::run_script_file(void) {
+	FILE *fp = fopen(SCRIPT_FILE_TMP, "r");
+	int ret_val = 0, cindex, line_len, i, remove_nl;
+	char script_line[SCRIPT_COMMAND_SIZE], command[SCRIPT_COMMAND_SIZE],
+		 value[SCRIPT_COMMAND_SIZE], mount[SCRIPT_COMMAND_SIZE],
+		 value1[SCRIPT_COMMAND_SIZE], value2[SCRIPT_COMMAND_SIZE];
+	char *val_start, *tok;
+
+	if (fp != NULL) {
+		while (fgets(script_line, SCRIPT_COMMAND_SIZE, fp) != NULL && ret_val == 0) {
+			cindex = 0;
+			line_len = strlen(script_line);
+			if (line_len < 2)
+				continue; // there's a blank line or line is too short to contain a command
+			//ui_print("script line: '%s'\n", script_line);
+			for (i=0; i<line_len; i++) {
+				if ((int)script_line[i] == 32) {
+					cindex = i;
+					i = line_len;
+				}
+			}
+			memset(command, 0, sizeof(command));
+			memset(value, 0, sizeof(value));
+			if ((int)script_line[line_len - 1] == 10)
+					remove_nl = 2;
+				else
+					remove_nl = 1;
+			if (cindex != 0) {
+				strncpy(command, script_line, cindex);
+				LOGI("command is: '%s' and ", command);
+				val_start = script_line;
+				val_start += cindex + 1;
+				strncpy(value, val_start, line_len - cindex - remove_nl);
+				LOGI("value is: '%s'\n", value);
+			} else {
+				strncpy(command, script_line, line_len - remove_nl + 1);
+				ui_print("command is: '%s' and there is no value\n", command);
+			}
+			if (strcmp(command, "install") == 0) {
+				// Install zip
+				string ret_string;
+
+				PartitionManager.Mount_All_Storage();
+				if (value[0] != '/') {
+					// Relative path given
+					char full_path[SCRIPT_COMMAND_SIZE];
+
+					sprintf(full_path, "%s/%s", DataManager_GetCurrentStoragePath(), value);
+					LOGI("Full zip path: '%s'\n", full_path);
+					if (!TWFunc::Path_Exists(full_path)) {
+						ret_string = Locate_Zip_File(full_path, DataManager_GetCurrentStoragePath());
+						if (!ret_string.empty()) {
+							strcpy(full_path, ret_string.c_str());
+						} else if (DataManager_GetIntValue(TW_HAS_DUAL_STORAGE)) {
+							if (DataManager_GetIntValue(TW_USE_EXTERNAL_STORAGE)) {
+								LOGI("Zip file not found on external storage, trying internal...\n");
+								DataManager_SetIntValue(TW_USE_EXTERNAL_STORAGE, 0);
+							} else {
+								LOGI("Zip file not found on internal storage, trying external...\n");
+								DataManager_SetIntValue(TW_USE_EXTERNAL_STORAGE, 1);
+							}
+							sprintf(full_path, "%s/%s", DataManager_GetCurrentStoragePath(), value);
+							LOGI("Full zip path: '%s'\n", full_path);
+							ret_string = Locate_Zip_File(full_path, DataManager_GetCurrentStoragePath());
+							if (!ret_string.empty())
+								strcpy(full_path, ret_string.c_str());
+						}
+					}
+					strcpy(value, full_path);
+				} else {
+					// Full path given
+					if (!TWFunc::Path_Exists(value)) {
+						ret_string = Locate_Zip_File(value, DataManager_GetCurrentStoragePath());
+						if (!ret_string.empty())
+							strcpy(value, ret_string.c_str());
+					}
+				}
+				int wipe_cache = 0;
+				if (!TWFunc::Path_Exists(value)) {
+					// zip file doesn't exist
+					ui_print("Unable to locate zip file '%s'.\n", value);
+					ret_val = 1;
+				} else {
+					ui_print("Installing zip file '%s'\n", value);
+					ret_val = TWinstall_zip(value, &wipe_cache);
+				}
+				if (ret_val != 0) {
+					LOGE("Error installing zip file '%s'\n", value);
+					ret_val = 1;
+				} else if (wipe_cache)
+					PartitionManager.Wipe_By_Path("/cache");
+			} else if (strcmp(command, "wipe") == 0) {
+				// Wipe
+				if (strcmp(value, "cache") == 0 || strcmp(value, "/cache") == 0) {
+					ui_print("-- Wiping Cache Partition...\n");
+					PartitionManager.Wipe_By_Path("/cache");
+					ui_print("-- Cache Partition Wipe Complete!\n");
+				} else if (strcmp(value, "dalvik") == 0 || strcmp(value, "dalvick") == 0 || strcmp(value, "dalvikcache") == 0 || strcmp(value, "dalvickcache") == 0) {
+					ui_print("-- Wiping Dalvik Cache...\n");
+					PartitionManager.Wipe_Dalvik_Cache();
+					ui_print("-- Dalvik Cache Wipe Complete!\n");
+				} else if (strcmp(value, "data") == 0 || strcmp(value, "/data") == 0 || strcmp(value, "factory") == 0 || strcmp(value, "factoryreset") == 0) {
+					ui_print("-- Wiping Data Partition...\n");
+					PartitionManager.Factory_Reset();
+					ui_print("-- Data Partition Wipe Complete!\n");
+				} else {
+					LOGE("Error with wipe command value: '%s'\n", value);
+					ret_val = 1;
+				}
+			} else if (strcmp(command, "backup") == 0) {
+				// Backup
+				tok = strtok(value, " ");
+				strcpy(value1, tok);
+				tok = strtok(NULL, " ");
+				if (tok != NULL) {
+					memset(value2, 0, sizeof(value2));
+					strcpy(value2, tok);
+					line_len = strlen(tok);
+					if ((int)value2[line_len - 1] == 10 || (int)value2[line_len - 1] == 13) {
+						if ((int)value2[line_len - 1] == 10 || (int)value2[line_len - 1] == 13)
+							remove_nl = 2;
+						else
+							remove_nl = 1;
+					} else
+						remove_nl = 0;
+					strncpy(value2, tok, line_len - remove_nl);
+					DataManager_SetStrValue(TW_BACKUP_NAME, value2);
+					ui_print("Backup folder set to '%s'\n", value2);
+				} else {
+					char empt[50];
+					strcpy(empt, "(Current Date)");
+					DataManager_SetStrValue(TW_BACKUP_NAME, empt);
+				}
+
+				DataManager_SetIntValue(TW_BACKUP_SYSTEM_VAR, 0);
+				DataManager_SetIntValue(TW_BACKUP_DATA_VAR, 0);
+				DataManager_SetIntValue(TW_BACKUP_CACHE_VAR, 0);
+				DataManager_SetIntValue(TW_BACKUP_RECOVERY_VAR, 0);
+				DataManager_SetIntValue(TW_BACKUP_SP1_VAR, 0);
+				DataManager_SetIntValue(TW_BACKUP_SP2_VAR, 0);
+				DataManager_SetIntValue(TW_BACKUP_SP3_VAR, 0);
+				DataManager_SetIntValue(TW_BACKUP_BOOT_VAR, 0);
+				DataManager_SetIntValue(TW_BACKUP_ANDSEC_VAR, 0);
+				DataManager_SetIntValue(TW_BACKUP_SDEXT_VAR, 0);
+				DataManager_SetIntValue(TW_BACKUP_SDEXT_VAR, 0);
+				DataManager_SetIntValue(TW_USE_COMPRESSION_VAR, 0);
+				DataManager_SetIntValue(TW_SKIP_MD5_GENERATE_VAR, 0);
+
+				ui_print("Setting backup options:\n");
+				line_len = strlen(value1);
+				for (i=0; i<line_len; i++) {
+					if (value1[i] == 'S' || value1[i] == 's') {
+						DataManager_SetIntValue(TW_BACKUP_SYSTEM_VAR, 1);
+						ui_print("System\n");
+					} else if (value1[i] == 'D' || value1[i] == 'd') {
+						DataManager_SetIntValue(TW_BACKUP_DATA_VAR, 1);
+						ui_print("Data\n");
+					} else if (value1[i] == 'C' || value1[i] == 'c') {
+						DataManager_SetIntValue(TW_BACKUP_CACHE_VAR, 1);
+						ui_print("Cache\n");
+					} else if (value1[i] == 'R' || value1[i] == 'r') {
+						DataManager_SetIntValue(TW_BACKUP_RECOVERY_VAR, 1);
+						ui_print("Recovery\n");
+					} else if (value1[i] == '1') {
+						DataManager_SetIntValue(TW_BACKUP_SP1_VAR, 1);
+						ui_print("%s\n", "Special1");
+					} else if (value1[i] == '2') {
+						DataManager_SetIntValue(TW_BACKUP_SP2_VAR, 1);
+						ui_print("%s\n", "Special2");
+					} else if (value1[i] == '3') {
+						DataManager_SetIntValue(TW_BACKUP_SP3_VAR, 1);
+						ui_print("%s\n", "Special3");
+					} else if (value1[i] == 'B' || value1[i] == 'b') {
+						DataManager_SetIntValue(TW_BACKUP_BOOT_VAR, 1);
+						ui_print("Boot\n");
+					} else if (value1[i] == 'A' || value1[i] == 'a') {
+						DataManager_SetIntValue(TW_BACKUP_ANDSEC_VAR, 1);
+						ui_print("Android Secure\n");
+					} else if (value1[i] == 'E' || value1[i] == 'e') {
+						DataManager_SetIntValue(TW_BACKUP_SDEXT_VAR, 1);
+						ui_print("SD-Ext\n");
+					} else if (value1[i] == 'O' || value1[i] == 'o') {
+						DataManager_SetIntValue(TW_USE_COMPRESSION_VAR, 1);
+						ui_print("Compression is on\n");
+					} else if (value1[i] == 'M' || value1[i] == 'm') {
+						DataManager_SetIntValue(TW_SKIP_MD5_GENERATE_VAR, 1);
+						ui_print("MD5 Generation is off\n");
+					}
+				}
+				if (!PartitionManager.Run_Backup()) {
+					ret_val = 1;
+					LOGE("Backup failed!\n");
+				} else
+					ui_print("Backup complete!\n");
+			} else if (strcmp(command, "restore") == 0) {
+				// Restore
+				PartitionManager.Mount_All_Storage();
+				DataManager_SetIntValue(TW_SKIP_MD5_CHECK_VAR, 0);
+
+				string val = value, restore_folder, restore_partitions;
+				size_t pos = val.find_last_of(" ");
+				if (pos == string::npos) {
+					ui_print("Malformed restore parameter: '%s'\n", value1);
+					ret_val = 1;
+					continue;
+				}
+				restore_folder = val.substr(0, pos);
+				char folder_path[512], partitions[512];
+				strcpy(folder_path, restore_folder.c_str());
+				restore_partitions = val.substr(pos + 1, val.size() - pos - 1);
+				strcpy(partitions, restore_partitions.c_str());
+				LOGI("Restore folder is: '%s' and partitions: '%s'\n", folder_path, partitions);
+				ui_print("Restoring '%s'\n", folder_path);
+
+				if (folder_path[0] != '/') {
+					char backup_folder[512];
+					sprintf(backup_folder, "%s/%s", DataManager_GetStrValue(TW_BACKUPS_FOLDER_VAR), folder_path);
+					LOGI("Restoring relative path: '%s'\n", backup_folder);
+					if (!TWFunc::Path_Exists(backup_folder)) {
+						if (DataManager_GetIntValue(TW_HAS_DUAL_STORAGE)) {
+							if (DataManager_GetIntValue(TW_USE_EXTERNAL_STORAGE)) {
+								LOGI("Backup folder '%s' not found on external storage, trying internal...\n", folder_path);
+								DataManager_SetIntValue(TW_USE_EXTERNAL_STORAGE, 0);
+							} else {
+								LOGI("Backup folder '%s' not found on internal storage, trying external...\n", folder_path);
+								DataManager_SetIntValue(TW_USE_EXTERNAL_STORAGE, 1);
+							}
+							sprintf(backup_folder, "%s/%s", DataManager_GetStrValue(TW_BACKUPS_FOLDER_VAR), folder_path);
+							LOGI("2Restoring relative path: '%s'\n", backup_folder);
+						}
+					}
+					strcpy(folder_path, backup_folder);
+				} else {
+					if (folder_path[strlen(folder_path) - 1] == '/')
+						strcat(folder_path, ".");
+					else
+						strcat(folder_path, "/.");
+				}
+				if (!TWFunc::Path_Exists(folder_path)) {
+					ui_print("Unable to locate backup '%s'\n", folder_path);
+					ret_val = 1;
+					continue;
+				}
+				DataManager_SetStrValue("tw_restore", folder_path);
+
+				PartitionManager.Set_Restore_Files(folder_path);
+				if (strlen(partitions) != 0) {
+					int tw_restore_system = 0;
+					int tw_restore_data = 0;
+					int tw_restore_cache = 0;
+					int tw_restore_recovery = 0;
+					int tw_restore_boot = 0;
+					int tw_restore_andsec = 0;
+					int tw_restore_sdext = 0;
+					int tw_restore_sp1 = 0;
+					int tw_restore_sp2 = 0;
+					int tw_restore_sp3 = 0;
+
+					memset(value2, 0, sizeof(value2));
+					strcpy(value2, partitions);
+					ui_print("Setting restore options: '%s':\n", value2);
+					line_len = strlen(value2);
+					for (i=0; i<line_len; i++) {
+						if ((value2[i] == 'S' || value2[i] == 's') && DataManager_GetIntValue(TW_RESTORE_SYSTEM_VAR) > 0) {
+							tw_restore_system = 1;
+							ui_print("System\n");
+						} else if ((value2[i] == 'D' || value2[i] == 'd') && DataManager_GetIntValue(TW_RESTORE_DATA_VAR) > 0) {
+							tw_restore_data = 1;
+							ui_print("Data\n");
+						} else if ((value2[i] == 'C' || value2[i] == 'c') && DataManager_GetIntValue(TW_RESTORE_CACHE_VAR) > 0) {
+							tw_restore_cache = 1;
+							ui_print("Cache\n");
+						} else if ((value2[i] == 'R' || value2[i] == 'r') && DataManager_GetIntValue(TW_RESTORE_RECOVERY_VAR) > 0) {
+							tw_restore_recovery = 1;
+							ui_print("Recovery\n");
+						} else if (value2[i] == '1' && DataManager_GetIntValue(TW_RESTORE_SP1_VAR) > 0) {
+							tw_restore_sp1 = 1;
+							ui_print("%s\n", "Special1");
+						} else if (value2[i] == '2' && DataManager_GetIntValue(TW_RESTORE_SP2_VAR) > 0) {
+							tw_restore_sp2 = 1;
+							ui_print("%s\n", "Special2");
+						} else if (value2[i] == '3' && DataManager_GetIntValue(TW_RESTORE_SP3_VAR) > 0) {
+							tw_restore_sp3 = 1;
+							ui_print("%s\n", "Special3");
+						} else if ((value2[i] == 'B' || value2[i] == 'b') && DataManager_GetIntValue(TW_RESTORE_BOOT_VAR) > 0) {
+							tw_restore_boot = 1;
+							ui_print("Boot\n");
+						} else if ((value2[i] == 'A' || value2[i] == 'a') && DataManager_GetIntValue(TW_RESTORE_ANDSEC_VAR) > 0) {
+							tw_restore_andsec = 1;
+							ui_print("Android Secure\n");
+						} else if ((value2[i] == 'E' || value2[i] == 'e') && DataManager_GetIntValue(TW_RESTORE_SDEXT_VAR) > 0) {
+							tw_restore_sdext = 1;
+							ui_print("SD-Ext\n");
+						} else if (value2[i] == 'M' || value2[i] == 'm') {
+							DataManager_SetIntValue(TW_SKIP_MD5_CHECK_VAR, 1);
+							ui_print("MD5 check skip is on\n");
+						}
+					}
+
+					if (DataManager_GetIntValue(TW_RESTORE_SYSTEM_VAR) && !tw_restore_system)
+						DataManager_SetIntValue(TW_RESTORE_SYSTEM_VAR, 0);
+					if (DataManager_GetIntValue(TW_RESTORE_DATA_VAR) && !tw_restore_data)
+						DataManager_SetIntValue(TW_RESTORE_DATA_VAR, 0);
+					if (DataManager_GetIntValue(TW_RESTORE_CACHE_VAR) && !tw_restore_cache)
+						DataManager_SetIntValue(TW_RESTORE_CACHE_VAR, 0);
+					if (DataManager_GetIntValue(TW_RESTORE_RECOVERY_VAR) && !tw_restore_recovery)
+						DataManager_SetIntValue(TW_RESTORE_RECOVERY_VAR, 0);
+					if (DataManager_GetIntValue(TW_RESTORE_BOOT_VAR) && !tw_restore_boot)
+						DataManager_SetIntValue(TW_RESTORE_BOOT_VAR, 0);
+					if (DataManager_GetIntValue(TW_RESTORE_ANDSEC_VAR) && !tw_restore_andsec)
+						DataManager_SetIntValue(TW_RESTORE_ANDSEC_VAR, 0);
+					if (DataManager_GetIntValue(TW_RESTORE_SDEXT_VAR) && !tw_restore_sdext)
+						DataManager_SetIntValue(TW_RESTORE_SDEXT_VAR, 0);
+					if (DataManager_GetIntValue(TW_RESTORE_SP1_VAR) && !tw_restore_sp1)
+						DataManager_SetIntValue(TW_RESTORE_SP1_VAR, 0);
+					if (DataManager_GetIntValue(TW_RESTORE_SP2_VAR) && !tw_restore_sp2)
+						DataManager_SetIntValue(TW_RESTORE_SP2_VAR, 0);
+					if (DataManager_GetIntValue(TW_RESTORE_SP3_VAR) && !tw_restore_sp3)
+						DataManager_SetIntValue(TW_RESTORE_SP3_VAR, 0);
+				} else {
+					ui_print("No restore options set.\n");
+					ret_val = 1;
+					continue;
+				}
+				PartitionManager.Run_Restore(folder_path);
+				ui_print("Restore complete!\n");
+			} else if (strcmp(command, "mount") == 0) {
+				// Mount
+				if (value[0] != '/') {
+					strcpy(mount, "/");
+					strcat(mount, value);
+				} else
+					strcpy(mount, value);
+				if (PartitionManager.Mount_By_Path(mount, true))
+					ui_print("Mounted '%s'\n", mount);
+			} else if (strcmp(command, "unmount") == 0 || strcmp(command, "umount") == 0) {
+				// Unmount
+				if (value[0] != '/') {
+					strcpy(mount, "/");
+					strcat(mount, value);
+				} else
+					strcpy(mount, value);
+				if (PartitionManager.UnMount_By_Path(mount, true))
+					ui_print("Unmounted '%s'\n", mount);
+			} else if (strcmp(command, "set") == 0) {
+				// Set value
+				tok = strtok(value, " ");
+				strcpy(value1, tok);
+				tok = strtok(NULL, " ");
+				strcpy(value2, tok);
+				ui_print("Setting '%s' to '%s'\n", value1, value2);
+				DataManager_SetStrValue(value1, value2);
+			} else if (strcmp(command, "mkdir") == 0) {
+				// Make directory (recursive)
+				ui_print("Making directory (recursive): '%s'\n", value);
+				if (TWFunc::Recursive_Mkdir(value)) {
+					LOGE("Unable to create folder: '%s'\n", value);
+					ret_val = 1;
+				}
+			} else if (strcmp(command, "reboot") == 0) {
+				// Reboot
+			} else if (strcmp(command, "cmd") == 0) {
+				if (cindex != 0) {
+					system(value);
+				} else {
+					LOGE("No value given for cmd\n");
+				}
+			} else if (strcmp(command, "print") == 0) {
+				ui_print("%s\n", value);
+			} else {
+				LOGE("Unrecognized script command: '%s'\n", command);
+				ret_val = 1;
+			}
+		}
+		fclose(fp);
+		ui_print("Done processing script file\n");
+	} else {
+		LOGE("Error opening script file '%s'\n", SCRIPT_FILE_TMP);
+		return 1;
+	}
+	return ret_val;
+}
+
+string OpenRecoveryScript::Locate_Zip_File(string Zip, string Storage_Root) {
+	string Path = TWFunc::Get_Path(Zip);
+	string File = TWFunc::Get_Filename(Zip);
+	string pathCpy = Path;
+	string wholePath;
+	size_t pos = Path.find("/", 1);
+
+	while (pos != string::npos)
+	{
+		pathCpy = Path.substr(pos, Path.size() - pos);
+		wholePath = pathCpy + "/" + File;
+		if (TWFunc::Path_Exists(wholePath))
+			return wholePath;
+		wholePath = Storage_Root + "/" + wholePath;
+		if (TWFunc::Path_Exists(wholePath))
+			return wholePath;
+
+		pos = Path.find("/", pos + 1);
+	}
+	return "";
+}
\ No newline at end of file
diff --git a/openrecoveryscript.hpp b/openrecoveryscript.hpp
new file mode 100644
index 0000000..6b21054
--- /dev/null
+++ b/openrecoveryscript.hpp
@@ -0,0 +1,42 @@
+/* OpenRecoveryScript class for TWRP
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ * The code was written from scratch by Dees_Troy dees_troy at
+ * yahoo
+ *
+ * Copyright (c) 2012
+ */
+
+#ifndef _OPENRECOVERYSCRIPT_HPP
+#define _OPENRECOVERYSCRIPT_HPP
+
+#include <string>
+
+using namespace std;
+
+// Partition class
+class OpenRecoveryScript
+{
+public:
+	static int check_for_script_file();                                            // Checks to see if the ORS file is present in /cache
+	static int run_script_file();                                                  // Executes the commands in the ORS file
+
+private:
+	static string Locate_Zip_File(string Path, string File);                       // Attempts to locate the zip file in storage
+
+};
+
+#endif // _OPENRECOVERYSCRIPT_HPP
diff --git a/partitionmanager.cpp b/partitionmanager.cpp
index b2bbf8e..67ec84e 100644
--- a/partitionmanager.cpp
+++ b/partitionmanager.cpp
@@ -1497,4 +1497,13 @@
 	Mount_By_Path(DataManager::GetSettingsStoragePath(), true);
 	Mount_By_Path(DataManager::GetCurrentStoragePath(), true);
 	return true;
+}
+
+void TWPartitionManager::Mount_All_Storage(void) {
+	std::vector<TWPartition*>::iterator iter;
+
+	for (iter = Partitions.begin(); iter != Partitions.end(); iter++) {
+		if ((*iter)->Is_Storage)
+			(*iter)->Mount(false);
+	}
 }
\ No newline at end of file
diff --git a/partitions.hpp b/partitions.hpp
index 32c4f45..c253d3b 100644
--- a/partitions.hpp
+++ b/partitions.hpp
@@ -173,6 +173,7 @@
 	virtual int Fix_Permissions();                                            // Fixes permissions in /system and /data
 	virtual int usb_storage_enable(void);                                     // Enable USB storage mode
 	virtual int usb_storage_disable(void);                                    // Disable USB storage mode
+	virtual void Mount_All_Storage(void);                                     // Mounts all storage locations
 
 private:
 	bool Make_MD5(bool generate_md5, string Backup_Folder, string Backup_Filename); // Generates an MD5 after a backup is made
diff --git a/recovery.cpp b/recovery.cpp
index 2d89014..8cf3106 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -56,6 +56,7 @@
 }
 #include "partitions.hpp"
 #include "variables.h"
+#include "openrecoveryscript.hpp"
 
 TWPartitionManager PartitionManager;
 
@@ -924,8 +925,19 @@
 
     //if (status != INSTALL_SUCCESS) ui->SetBackground(RecoveryUI::ERROR);
     if (status != INSTALL_SUCCESS /*|| ui->IsTextVisible()*/) {
+		finish_recovery(NULL);
 		DataManager_ReadSettingsFile();
-        gui_start();
+		if (DataManager_GetIntValue(TW_IS_ENCRYPTED) == 0 && OpenRecoveryScript::check_for_script_file()) {
+			gui_console_only();
+			OpenRecoveryScript::run_script_file();
+			if (1 || OpenRecoveryScript::run_script_file() != 0) {
+				// There was an error, boot the recovery
+				gui_start();
+			} else {
+				usleep(2000000); // Sleep for 2 seconds before rebooting
+			}
+		} else
+			gui_start();
 		//prompt_and_wait(device);
     }
 
