diff --git a/indra/viewer_components/updater/llupdateinstaller.cpp b/indra/viewer_components/updater/llupdateinstaller.cpp
index 1bb2101df137cc1d709f221ac9a017815e2cc090..52744b0479848d0dfa09e733aaf79c5b2713b667 100644
--- a/indra/viewer_components/updater/llupdateinstaller.cpp
+++ b/indra/viewer_components/updater/llupdateinstaller.cpp
@@ -24,15 +24,53 @@
  */
 
 #include "linden_common.h"
+#include <apr_file_io.h>
+#include "llapr.h"
 #include "llprocesslauncher.h"
 #include "llupdateinstaller.h"
+#include "lldir.h"
 
 
-void ll_install_update(std::string const & script, std::string const & updatePath)
+namespace {
+	class RelocateError {};
+	
+	
+	std::string copy_to_temp(std::string const & path)
+	{
+		std::string scriptFile = gDirUtilp->getBaseFileName(path);
+		std::string newPath = gDirUtilp->getExpandedFilename(LL_PATH_TEMP, scriptFile);
+		apr_status_t status = apr_file_copy(path.c_str(), newPath.c_str(), APR_FILE_SOURCE_PERMS, gAPRPoolp);
+		if(status != APR_SUCCESS) throw RelocateError();
+		
+		return newPath;
+	}
+}
+
+
+int ll_install_update(std::string const & script, std::string const & updatePath, LLInstallScriptMode mode)
 {
+	std::string finalPath;
+	switch(mode) {
+		case LL_COPY_INSTALL_SCRIPT_TO_TEMP:
+			try {
+				finalPath = copy_to_temp(updatePath);
+			}
+			catch (RelocateError &) {
+				return -1;
+			}
+			break;
+		case LL_RUN_INSTALL_SCRIPT_IN_PLACE:
+			finalPath = updatePath;
+			break;
+		default:
+			llassert(!"unpossible copy mode");
+	}
+	
 	LLProcessLauncher launcher;
 	launcher.setExecutable(script);
-	launcher.addArgument(updatePath);
-	launcher.launch();
+	launcher.addArgument(finalPath);
+	int result = launcher.launch();
 	launcher.orphan();
+	
+	return result;
 }
diff --git a/indra/viewer_components/updater/llupdateinstaller.h b/indra/viewer_components/updater/llupdateinstaller.h
index 991fe2afe10e46e67118faa83dd6ee591830491b..310bfe43482caefcda16f8384726b511ed3891f9 100644
--- a/indra/viewer_components/updater/llupdateinstaller.h
+++ b/indra/viewer_components/updater/llupdateinstaller.h
@@ -30,13 +30,21 @@
 #include <string>
 
 
+enum LLInstallScriptMode {
+	LL_RUN_INSTALL_SCRIPT_IN_PLACE,
+	LL_COPY_INSTALL_SCRIPT_TO_TEMP
+};
+
 //
 // Launch the installation script.
 // 
 // The updater will overwrite the current installation, so it is highly recommended
 // that the current application terminate once this function is called.
 //
-void ll_install_update(std::string const & script, std::string const & updatePath);
+int ll_install_update(
+					   std::string const & script, // Script to execute.
+					   std::string const & updatePath, // Path to update file.
+					   LLInstallScriptMode mode=LL_COPY_INSTALL_SCRIPT_TO_TEMP); // Run in place or copy to temp?
 
 
 #endif