diff --git a/data.cpp b/data.cpp
index ab240a7..f7ad57a 100644
--- a/data.cpp
+++ b/data.cpp
@@ -39,6 +39,7 @@
 #include "variables.h"
 #include "data.hpp"
 #include "partitions.hpp"
+#include "twrp-functions.hpp"
 
 extern "C"
 {
@@ -814,6 +815,32 @@
     return -1;
 }
 
+void DataManager::Output_Version(void) {
+	string Path, Command;
+	char version[255];
+
+	Path = DataManager::GetSettingsStoragePath();
+	if (!PartitionManager.Mount_By_Path(Path, false)) {
+		LOGI("Unable to mount '%s' to write version number.\n", Path.c_str());
+		return;
+	}
+	Path += "/TWRP/.version";
+	if (TWFunc::Path_Exists(Path)) {
+		Command = "rm -f " + Path;
+		system(Command.c_str());
+	}
+	FILE *fp = fopen(Path.c_str(), "w");
+	if (fp == NULL) {
+		LOGE("Unable to open '%s'.\n", Path.c_str());
+		return;
+	}
+	strcpy(version, TW_VERSION_STR);
+	fwrite(version, sizeof(version[0]), strlen(version) / sizeof(version[0]), fp);
+	fclose(fp);
+	sync();
+	LOGI("Version number saved to '%s'\n", Path.c_str());
+}
+
 void DataManager::ReadSettingsFile(void)
 {
 	// Load up the values for TWRP - Sleep to let the card be ready
@@ -843,11 +870,12 @@
 
 	LOGI("Attempt to load settings from settings file...\n");
 	LoadValues(settings_file);
+	Output_Version();
 	GetValue(TW_HAS_DUAL_STORAGE, has_dual);
 	GetValue(TW_USE_EXTERNAL_STORAGE, use_ext);
 	GetValue(TW_HAS_EXTERNAL, has_ext);
 	if (has_dual != 0 && use_ext == 1) {
-		// Attempt to sdcard using external storage
+		// Attempt to switch to using external storage
 		if (!PartitionManager.Mount_Current_Storage(false)) {
 			LOGE("Failed to mount external storage, using internal storage.\n");
 			// Remount failed, default back to internal storage
diff --git a/data.hpp b/data.hpp
index ecf4d70..98c40fe 100644
--- a/data.hpp
+++ b/data.hpp
@@ -49,6 +49,7 @@
     static void DumpValues();
 	static void update_tz_environment_variables();
 	static void SetDefaultValues();
+	static void Output_Version(void); // Outputs the version to a file in the TWRP folder
 	static void ReadSettingsFile(void);
 	
 	static string GetCurrentStoragePath(void);
diff --git a/gui/action.cpp b/gui/action.cpp
index 771c5e7..afa52d1 100644
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -981,7 +981,6 @@
 
 					DataManager::SetValue(TW_IS_ENCRYPTED, 0);
 					DataManager::ReadSettingsFile();
-					TWFunc::Output_Version();
 					if (OpenRecoveryScript::check_for_script_file()) {
 						ui_print("Processing OpenRecoveryScript file...\n");
 						if (OpenRecoveryScript::run_script_file() == 0) {
diff --git a/recovery.cpp b/recovery.cpp
index f6bfd45..1e1d9a9 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -928,7 +928,6 @@
 		finish_recovery(NULL);
 		DataManager_ReadSettingsFile();
 		if (DataManager_GetIntValue(TW_IS_ENCRYPTED) == 0 && OpenRecoveryScript::check_for_script_file()) {
-			TWFunc::Output_Version();
 			gui_console_only();
 			OpenRecoveryScript::run_script_file();
 			if (1 || OpenRecoveryScript::run_script_file() != 0) {
diff --git a/twrp-functions.cpp b/twrp-functions.cpp
index 01f8541..b121c8a 100644
--- a/twrp-functions.cpp
+++ b/twrp-functions.cpp
@@ -387,28 +387,3 @@
 		ui_print("\nFinished running %s script.\n", display_name);
 	}
 }
-
-void TWFunc::Output_Version(void) {
-	string Path, Command;
-	char version[255];
-
-	Path = DataManager::GetSettingsStoragePath();
-	if (!PartitionManager.Mount_By_Path(Path, false)) {
-		LOGI("Unable to mount '%s' to write version number.\n", Path.c_str());
-		return;
-	}
-	Path += "/TWRP/.version";
-	if (Path_Exists(Path)) {
-		Command = "rm -f " + Path;
-		system(Command.c_str());
-	}
-	FILE *fp = fopen(Path.c_str(), "w");
-	if (fp == NULL) {
-		LOGE("Unable to open '%s'.\n", Path.c_str());
-		return;
-	}
-	strcpy(version, TW_VERSION_STR);
-	fwrite(version, sizeof(version[0]), strlen(version) / sizeof(version[0]), fp);
-	fclose(fp);
-	sync();
-}
\ No newline at end of file
diff --git a/twrp-functions.hpp b/twrp-functions.hpp
index da17e3c..b28d04b 100644
--- a/twrp-functions.hpp
+++ b/twrp-functions.hpp
@@ -36,7 +36,6 @@
 	static void twfinish_recovery(const char *send_intent);                     // Writes the log to last_log
 	static int tw_reboot(RebootCommand command);                                // Prepares the device for rebooting
 	static void check_and_run_script(const char* script_file, const char* display_name); // checks for the existence of a script, chmods it to 755, then runs it
-	static void Output_Version(void);                                           // Outputs the version to a file in the TWRP folder
 
 private:
 	static void check_and_fclose(FILE *fp, const char *name);
