Index: scripts/setup.iss
===================================================================
diff -u -r6b464cfe96c1828308331ff3731db364db830576 -rf84eecda89d8734da9790a2b8d4a54d344e40c46
--- scripts/setup.iss	(.../setup.iss)	(revision 6b464cfe96c1828308331ff3731db364db830576)
+++ scripts/setup.iss	(.../setup.iss)	(revision f84eecda89d8734da9790a2b8d4a54d344e40c46)
@@ -169,6 +169,8 @@
 
 [Run]
 Filename: "{app}\{code:ExpandArch|ExeFilename}"; Flags: nowait postinstall skipifsilent; Description: "{cm:LaunchProgram,{#MyAppName}}"
+Filename: "Reg.exe"; Parameters: "delete ""SOFTWARE\Microsoft\Windows\CurrentVersion\Run"" /v ""Copy Handler"" /f"; Flags: runasoriginaluser;
+Filename: "Reg.exe"; Parameters: "add ""SOFTWARE\Microsoft\Windows\CurrentVersion\Run"" /v ""Copy Handler"" /t REG_SZ /d ""{app}\{code:ExpandArch|ExeFilename}"" /f"; Flags: runasoriginaluser postinstall; Tasks: startatboot
 
 [Registry]
 Root: "HKLM"; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; ValueType: none; ValueName: "Copy Handler"; Flags: deletevalue uninsdeletevalue
@@ -188,6 +190,9 @@
 [ThirdParty]
 CompileLogMethod=append
 
+[UninstallRun]
+Filename: "Reg.exe"; Parameters: "delete ""SOFTWARE\Microsoft\Windows\CurrentVersion\Run"" /v ""Copy Handler"" /f"; Flags: runasoriginaluser;
+
 [Code]
 function ExpandArch(ConstantStr: String): String;
 begin
@@ -206,16 +211,3 @@
 		end;
 	end;
 end;
-
-procedure CurStepChanged(CurStep: TSetupStep);
-var
-  ResultCode: Integer;
-begin
-    if CurStep = ssPostInstall then
-    begin
-        if IsTaskSelected('startatboot') then
-            ExecAsOriginalUser(ExpandConstant('{app}\{code:ExpandArch|ExeFilename}'), '--EnableLaunchAtStartup=1', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
-        else
-            ExecAsOriginalUser(ExpandConstant('{app}\{code:ExpandArch|ExeFilename}'), '--EnableLaunchAtStartup=0', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
-    end;
-end;
Index: src/ch/AppHelper.cpp
===================================================================
diff -u -rd9527df01ee91b35d9a5fdccb80ded25a9c8265f -rf84eecda89d8734da9790a2b8d4a54d344e40c46
--- src/ch/AppHelper.cpp	(.../AppHelper.cpp)	(revision d9527df01ee91b35d9a5fdccb80ded25a9c8265f)
+++ src/ch/AppHelper.cpp	(.../AppHelper.cpp)	(revision f84eecda89d8734da9790a2b8d4a54d344e40c46)
@@ -112,6 +112,14 @@
 	return m_pathProcessor.GetProgramPath();
 }
 
+CString CAppHelper::GetFullProgramPath() const
+{
+	CString strKey;
+	strKey.Format(_T("%s\\%s"), (PCTSTR)m_pathProcessor.GetProgramPath(), m_pszProgramName);
+
+	return strKey;
+}
+
 bool CAppHelper::IsInPortableMode()
 {
 	if(!m_optPortableMode.is_initialized())
@@ -126,66 +134,3 @@
 
 	return m_optPortableMode.get();
 }
-
-bool CAppHelper::SetAutorun(bool bEnable)
-{
-	// check the current key value (to avoid irritating messages from some firewall software)
-	HKEY hkeyRun = nullptr;
-	CString strValue;
-	CString strKey;
-	DWORD dwType = REG_SZ;
-	DWORD dwCount = _MAX_PATH * sizeof(TCHAR);
-
-	LSTATUS lStatus = RegOpenKeyEx(HKEY_CURRENT_USER, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_QUERY_VALUE, &hkeyRun);
-	if(lStatus != ERROR_SUCCESS)
-		return false;
-
-	lStatus = RegQueryValueEx(hkeyRun, m_pszAppName, nullptr, &dwType, (BYTE*)strValue.GetBufferSetLength(_MAX_PATH), &dwCount);
-	RegCloseKey(hkeyRun);
-
-	if(lStatus != ERROR_SUCCESS && lStatus != ERROR_FILE_NOT_FOUND)
-	{
-		strValue.ReleaseBuffer(0);
-		return false;
-	}
-	if(lStatus == ERROR_FILE_NOT_FOUND)
-	{
-		strValue.ReleaseBuffer(0);
-
-		// if there is no key in registry and we don't want it, then return with ok status
-		if(!bEnable)
-			return true;
-
-		// format the data to be written to registry
-		strKey.Format(_T("%s\\%s"), (PCTSTR)m_pathProcessor.GetProgramPath(), m_pszProgramName);
-	}
-	else
-	{
-		// key found
-		strValue.ReleaseBuffer(dwCount / sizeof(TCHAR));
-
-		if(bEnable)
-		{
-			// key exists in registry, check if the value is correct
-			strKey.Format(_T("%s\\%s"), (PCTSTR)m_pathProcessor.GetProgramPath(), m_pszProgramName);
-
-			if(strValue.CompareNoCase(strKey) == 0)
-				return true;
-		}
-	}
-
-	// we want to write information to the registry
-	// storing key in registry
-	lStatus = RegOpenKeyEx(HKEY_CURRENT_USER, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_ALL_ACCESS, &hkeyRun);
-	if(lStatus != ERROR_SUCCESS)
-		return false;
-	
-	if(bEnable)
-		lStatus = RegSetValueEx(hkeyRun, m_pszAppName, 0, REG_SZ, (BYTE*)(PCTSTR)strKey, (DWORD)(strKey.GetLength() + 1) * sizeof(TCHAR));
-	else
-		lStatus = RegDeleteValue(hkeyRun, m_pszAppName);
-	
-	RegCloseKey(hkeyRun);
-
-	return lStatus == ERROR_SUCCESS;
-}
Index: src/ch/AppHelper.h
===================================================================
diff -u -r33b33baa373533d0cff8ea5d25154b370f2b2e05 -rf84eecda89d8734da9790a2b8d4a54d344e40c46
--- src/ch/AppHelper.h	(.../AppHelper.h)	(revision 33b33baa373533d0cff8ea5d25154b370f2b2e05)
+++ src/ch/AppHelper.h	(.../AppHelper.h)	(revision f84eecda89d8734da9790a2b8d4a54d344e40c46)
@@ -28,8 +28,6 @@
 	CAppHelper();
 	virtual ~CAppHelper();
 
-	bool SetAutorun(bool bState);		// changes state of "run with system" option
-
 	bool IsFirstInstance() const { return m_bFirstInstance; }
 
 	PCTSTR GetAppName() const { return m_pszAppName; }
@@ -42,6 +40,8 @@
 	CString ExpandPath(CString strPath);
 	CString GetProgramPath() const;
 
+	CString GetFullProgramPath() const;
+
 	bool IsInPortableMode();
 
 protected:
Index: src/ch/CfgProperties.h
===================================================================
diff -u -r0d5b67ee96b435d63f7bf075dc8e28603793b187 -rf84eecda89d8734da9790a2b8d4a54d344e40c46
--- src/ch/CfgProperties.h	(.../CfgProperties.h)	(revision 0d5b67ee96b435d63f7bf075dc8e28603793b187)
+++ src/ch/CfgProperties.h	(.../CfgProperties.h)	(revision f84eecda89d8734da9790a2b8d4a54d344e40c46)
@@ -29,7 +29,6 @@
 {
 	PP_PCLIPBOARDMONITORING = 0,
 	PP_PMONITORSCANINTERVAL,
-	PP_PRELOADAFTERRESTART,
 
 	PP_PCHECK_FOR_UPDATES_FREQUENCY,
 	PP_PUPDATECHANNEL,
@@ -200,7 +199,6 @@
 // General settings
 PROPERTY(PP_PCLIPBOARDMONITORING, bool, _T("CHConfig.General.Program.EnableClipboardMonitoring"), false);
 PROPERTY_MINMAX(PP_PMONITORSCANINTERVAL, unsigned int, _T("CHConfig.General.Program.ClipboardMonitorScanInterval"), 1000, 0, 3600UL*1000UL);
-PROPERTY(PP_PRELOADAFTERRESTART, bool, _T("CHConfig.General.Program.RunWithSystem"), false);
 
 PROPERTY_MINMAX(PP_PCHECK_FOR_UPDATES_FREQUENCY, unsigned int, _T("CHConfig.General.Program.Updates.Frequency"), eFreq_Weekly, eFreq_Never, eFreq_Max - 1);
 PROPERTY_MINMAX(PP_PUPDATECHANNEL, int, _T("CHConfig.General.Program.Updates.UpdateChannel"), UpdateVersionInfo::eReleaseCandidate, UpdateVersionInfo::eStable, UpdateVersionInfo::eMax - 1);
Index: src/ch/MainWnd.cpp
===================================================================
diff -u -r2e4eacb299f21d06196fe13140b4b0d095abdca9 -rf84eecda89d8734da9790a2b8d4a54d344e40c46
--- src/ch/MainWnd.cpp	(.../MainWnd.cpp)	(revision 2e4eacb299f21d06196fe13140b4b0d095abdca9)
+++ src/ch/MainWnd.cpp	(.../MainWnd.cpp)	(revision f84eecda89d8734da9790a2b8d4a54d344e40c46)
@@ -685,8 +685,6 @@
 
 	case WM_CONFIGNOTIFY:
 		{
-			GetApp().SetAutorun(GetPropValue<PP_PRELOADAFTERRESTART>(GetConfig()));
-
 			// set this process class
 			HANDLE hProcess=GetCurrentProcess();
 			::SetPriorityClass(hProcess, (DWORD)GetPropValue<PP_PPROCESSPRIORITYCLASS>(GetConfig()));
Index: src/ch/OptionsDlg.cpp
===================================================================
diff -u -r0d5b67ee96b435d63f7bf075dc8e28603793b187 -rf84eecda89d8734da9790a2b8d4a54d344e40c46
--- src/ch/OptionsDlg.cpp	(.../OptionsDlg.cpp)	(revision 0d5b67ee96b435d63f7bf075dc8e28603793b187)
+++ src/ch/OptionsDlg.cpp	(.../OptionsDlg.cpp)	(revision f84eecda89d8734da9790a2b8d4a54d344e40c46)
@@ -41,7 +41,8 @@
 
 COptionsDlg::COptionsDlg(CWnd* pParent /*=nullptr*/)
 	:ictranslate::CLanguageDialog(IDD_OPTIONS_DIALOG, pParent, &m_bLock),
-	m_spLog(logger::MakeLogger(GetLogFileData(), L"OptionsDlg"))
+	m_spLog(logger::MakeLogger(GetLogFileData(), L"OptionsDlg")),
+	m_autoRun(GetApp().GetAppName(), chcore::PathFromString(GetApp().GetFullProgramPath()))
 {
 }
 
@@ -237,8 +238,9 @@
 	PROP_SEPARATOR(IDS_PROGRAM_STRING);
 	PROP_BOOL(IDS_CLIPBOARDMONITORING_STRING, GetPropValue<PP_PCLIPBOARDMONITORING>(GetConfig()));
 	PROP_UINT(IDS_CLIPBOARDINTERVAL_STRING, GetPropValue<PP_PMONITORSCANINTERVAL>(GetConfig()));
-	PROP_BOOL(IDS_AUTORUNPROGRAM_STRING, GetPropValue<PP_PRELOADAFTERRESTART>(GetConfig()));
 
+	PROP_BOOL(IDS_AUTORUNPROGRAM_STRING, IsAutorunEnabled());
+
 	PROP_COMBO(IDS_CFG_CHECK_FOR_UPDATES_FREQUENCY, IDS_UPDATE_FREQUENCIES, GetPropValue<PP_PCHECK_FOR_UPDATES_FREQUENCY>(GetConfig()));
 	PROP_COMBO(IDS_CFG_UPDATECHANNEL, IDS_CFGUPDATECHANNELITEMS_STRING, GetPropValue<PP_PUPDATECHANNEL>(GetConfig()));
 	PROP_COMBO(IDS_CFG_USE_SECURE_CONNECTION, IDS_SECURE_CONNECTION_TYPES, GetPropValue<PP_PUPDATE_USE_SECURE_CONNECTION>(GetConfig()));
@@ -370,7 +372,7 @@
 	SKIP_SEPARATOR(iPosition);
 	SetPropValue<PP_PCLIPBOARDMONITORING>(rConfig, GetBoolProp(iPosition++));
 	SetPropValue<PP_PMONITORSCANINTERVAL>(rConfig, GetUintProp(iPosition++));
-	SetPropValue<PP_PRELOADAFTERRESTART>(rConfig, GetBoolProp(iPosition++));
+	EnableAutorun(GetBoolProp(iPosition++));
 
 	SetPropValue<PP_PCHECK_FOR_UPDATES_FREQUENCY>(rConfig, GetIndexProp(iPosition++));
 	SetPropValue<PP_PUPDATECHANNEL>(rConfig, GetBoolProp(iPosition++));
@@ -533,6 +535,33 @@
 	return strText;
 }
 
+bool COptionsDlg::IsAutorunEnabled() const
+{
+	try
+	{
+		return m_autoRun.IsAutorunEnabled();
+	}
+	catch (const std::exception& e)
+	{
+		LOG_ERROR(m_spLog) << L"Failed to determine if autorun is enabled. Assuming it is not. Error: " << e.what();
+		return false;
+	}
+}
+
+bool COptionsDlg::EnableAutorun(bool bEnable)
+{
+	try
+	{
+		m_autoRun.SetAutorun(bEnable);
+		return true;
+	}
+	catch (const std::exception& e)
+	{
+		LOG_ERROR(m_spLog) << L"Failed to change autorun to '" << bEnable << "'. Error: " << e.what();
+		return false;
+	}
+}
+
 bool COptionsDlg::GetBoolProp(int iPosition)
 {
 	int iSel = 0;
Index: src/ch/OptionsDlg.h
===================================================================
diff -u -r19b135b50b55b75d008526a799344bda9a62dc22 -rf84eecda89d8734da9790a2b8d4a54d344e40c46
--- src/ch/OptionsDlg.h	(.../OptionsDlg.h)	(revision 19b135b50b55b75d008526a799344bda9a62dc22)
+++ src/ch/OptionsDlg.h	(.../OptionsDlg.h)	(revision f84eecda89d8734da9790a2b8d4a54d344e40c46)
@@ -20,6 +20,7 @@
 #define __OPTIONSDLG_H__
 
 #include "PropertyListCtrl.h"
+#include "AppAutorun.h"
 
 #define WM_CONFIGNOTIFY		WM_USER+13
 
@@ -52,6 +53,9 @@
 	bool GetBoolProp(int iPosition);
 	CString MakeCompoundString(UINT uiBase, int iCount, LPCTSTR lpszSeparator);
 
+	bool IsAutorunEnabled() const;
+	bool EnableAutorun(bool bEnable);
+
 	// Generated message map functions
 	BOOL OnInitDialog() override;
 	void OnOK() override;
@@ -62,6 +66,7 @@
 
 private:
 	logger::TLoggerPtr m_spLog;
+	AppAutorun m_autoRun;
 	static bool m_bLock;				// locker
 
 	std::vector<CString> m_cvRecent;
Index: src/ch/TCommandLineParser.cpp
===================================================================
diff -u -rb165add706c4fab9d783f0564b1dd398492da491 -rf84eecda89d8734da9790a2b8d4a54d344e40c46
--- src/ch/TCommandLineParser.cpp	(.../TCommandLineParser.cpp)	(revision b165add706c4fab9d783f0564b1dd398492da491)
+++ src/ch/TCommandLineParser.cpp	(.../TCommandLineParser.cpp)	(revision f84eecda89d8734da9790a2b8d4a54d344e40c46)
@@ -43,8 +43,7 @@
 
 	po::options_description desc("");
 	desc.add_options()
-		("ImportTaskDefinition", po::wvalue< std::vector<std::wstring> >(), "")
-		("EnableLaunchAtStartup", po::wvalue<bool>(), "");
+		("ImportTaskDefinition", po::wvalue< std::vector<std::wstring> >(), "");
 
 	po::variables_map vm;
 	po::store(po::wcommand_line_parser(args).options(desc).run(), m_mapVariables);
@@ -74,14 +73,3 @@
 		}
 	}
 }
-
-bool TCommandLineParser::HasSystemStartupOption() const
-{
-	return m_mapVariables.count("EnableLaunchAtStartup") == 1;
-}
-
-bool TCommandLineParser::IsSystemStartupEnabled() const
-{
-	bool bValue = m_mapVariables["EnableLaunchAtStartup"].as<bool>();
-	return bValue;
-}
Index: src/ch/TCommandLineParser.h
===================================================================
diff -u -r694e362bf3ce049a7bbba8b4cf442d07e6741901 -rf84eecda89d8734da9790a2b8d4a54d344e40c46
--- src/ch/TCommandLineParser.h	(.../TCommandLineParser.h)	(revision 694e362bf3ce049a7bbba8b4cf442d07e6741901)
+++ src/ch/TCommandLineParser.h	(.../TCommandLineParser.h)	(revision f84eecda89d8734da9790a2b8d4a54d344e40c46)
@@ -43,10 +43,6 @@
 	bool HasTaskDefinitionPath() const;
 	void GetTaskDefinitionPaths(chcore::TPathContainer& vPaths) const;
 
-	// enable run at system startup
-	bool HasSystemStartupOption() const;
-	bool IsSystemStartupEnabled() const;
-
 private:
 	boost::program_options::variables_map m_mapVariables;
 };
Index: src/ch/ch.cpp
===================================================================
diff -u -r2e4eacb299f21d06196fe13140b4b0d095abdca9 -rf84eecda89d8734da9790a2b8d4a54d344e40c46
--- src/ch/ch.cpp	(.../ch.cpp)	(revision 2e4eacb299f21d06196fe13140b4b0d095abdca9)
+++ src/ch/ch.cpp	(.../ch.cpp)	(revision f84eecda89d8734da9790a2b8d4a54d344e40c46)
@@ -325,17 +325,6 @@
 
 	EnableHtmlHelp();
 
-	// ================================= Handle early command line options ========================================
-	if(m_cmdLineParser.HasCommandLineParams() && m_cmdLineParser.HasSystemStartupOption())
-	{
-		SetPropValue<PP_PRELOADAFTERRESTART>(rCfg, m_cmdLineParser.IsSystemStartupEnabled());
-		rCfg.Write();
-
-		SetAutorun(GetPropValue<PP_PRELOADAFTERRESTART>(rCfg));
-
-		return FALSE;
-	}
-
 	// ================================= Checking for running instances of CH ========================================
 	// check instance - return false if it's the second one
 	LOG_INFO(m_spLog) << _T("Checking for other running instances of Copy Handler");
Index: src/ch/ch.vc140.vcxproj
===================================================================
diff -u -rf981afc8ac2d761719c05ab88ebb32d7ca2db54a -rf84eecda89d8734da9790a2b8d4a54d344e40c46
--- src/ch/ch.vc140.vcxproj	(.../ch.vc140.vcxproj)	(revision f981afc8ac2d761719c05ab88ebb32d7ca2db54a)
+++ src/ch/ch.vc140.vcxproj	(.../ch.vc140.vcxproj)	(revision f84eecda89d8734da9790a2b8d4a54d344e40c46)
@@ -522,6 +522,7 @@
     <ClInclude Include="..\common\TShellExtIpcConfigDataProvider.h" />
     <ClInclude Include="..\common\TShellExtMenuConfig.h" />
     <ClInclude Include="..\common\version.h" />
+    <ClInclude Include="AppAutorun.h" />
     <ClInclude Include="AsyncHttpFile.h" />
     <ClInclude Include="CDragDropComboEx.h" />
     <ClInclude Include="CDragDropListCtrl.h" />
@@ -776,6 +777,7 @@
     <ClCompile Include="..\common\TRegistry.cpp" />
     <ClCompile Include="..\common\TShellExtIpcConfigDataProvider.cpp" />
     <ClCompile Include="..\common\TShellExtMenuConfig.cpp" />
+    <ClCompile Include="AppAutorun.cpp" />
     <ClCompile Include="AsyncHttpFile.cpp" />
     <ClCompile Include="CDragDropComboEx.cpp" />
     <ClCompile Include="CDragDropListCtrl.cpp" />
Index: src/ch/ch.vc140.vcxproj.filters
===================================================================
diff -u -r6609ba39811176f4803f0556db3da30e9e457b9d -rf84eecda89d8734da9790a2b8d4a54d344e40c46
--- src/ch/ch.vc140.vcxproj.filters	(.../ch.vc140.vcxproj.filters)	(revision 6609ba39811176f4803f0556db3da30e9e457b9d)
+++ src/ch/ch.vc140.vcxproj.filters	(.../ch.vc140.vcxproj.filters)	(revision f84eecda89d8734da9790a2b8d4a54d344e40c46)
@@ -257,6 +257,9 @@
     <ClInclude Include="..\common\TRegistry.h">
       <Filter>Source Files\Shared</Filter>
     </ClInclude>
+    <ClInclude Include="AppAutorun.h">
+      <Filter>Source Files\Tools</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\common\TShellExtMenuConfig.cpp">
@@ -436,6 +439,9 @@
     <ClCompile Include="..\common\TRegistry.cpp">
       <Filter>Source Files\Shared</Filter>
     </ClCompile>
+    <ClCompile Include="AppAutorun.cpp">
+      <Filter>Source Files\Tools</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="res\ch.rc2">