diff --git a/doc/contributions.txt b/doc/contributions.txt
index 79ff7161f64dc02918d70647ed74c53d384ec5e1..5168bcd5fa47d9c99dc36d830a63d428c53e94f8 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -215,6 +215,7 @@ Ansariel Hiller
 	MAINT-7028
 	MAINT-7059
 	MAINT-6519
+	STORM-2105
 Aralara Rajal
 Arare Chantilly
 	CHUIBUG-191
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt
index 39f8697e8c21d1e55c2d04cd665320391de031d9..a40b2c084623870294b6f607df2fb0a54a700b7a 100644
--- a/indra/CMakeLists.txt
+++ b/indra/CMakeLists.txt
@@ -3,8 +3,8 @@
 # cmake_minimum_required should appear before any
 # other commands to guarantee full compatibility
 # with the version specified
-## prior to 2.8, the add_custom_target commands used in setting the version did not work correctly
-cmake_minimum_required(VERSION 2.8.8 FATAL_ERROR)
+## prior to 3.4, the Windows manifest handling was missing
+cmake_minimum_required(VERSION 3.4.0 FATAL_ERROR)
 
 set(ROOT_PROJECT_NAME "SecondLife" CACHE STRING
     "The root project/makefile/solution name. Defaults to SecondLife.")
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index fd1828b1cc537538d8339f159c377e685ae76e72..1ef6c538bae9df999aeceb377e966d9d95b8e578 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -61,6 +61,7 @@ using namespace llsd;
 #if LL_WINDOWS
 #	include "llwin32headerslean.h"
 #   include <psapi.h>               // GetPerformanceInfo() et al.
+#	include <VersionHelpers.h>
 #elif LL_DARWIN
 #	include <errno.h>
 #	include <sys/sysctl.h>
@@ -110,78 +111,6 @@ static const F32 MEM_INFO_THROTTLE = 20;
 // dropped below the login framerate, we'd have very little additional data.
 static const F32 MEM_INFO_WINDOW = 10*60;
 
-#if LL_WINDOWS
-// We cannot trust GetVersionEx function on Win8.1 , we should check this value when creating OS string
-static const U32 WINNT_WINBLUE = 0x0603;
-
-#ifndef DLLVERSIONINFO
-typedef struct _DllVersionInfo
-{
-    DWORD cbSize;
-    DWORD dwMajorVersion;
-    DWORD dwMinorVersion;
-    DWORD dwBuildNumber;
-    DWORD dwPlatformID;
-}DLLVERSIONINFO;
-#endif
-
-#ifndef DLLGETVERSIONPROC
-typedef int (FAR WINAPI *DLLGETVERSIONPROC) (DLLVERSIONINFO *);
-#endif
-
-bool get_shell32_dll_version(DWORD& major, DWORD& minor, DWORD& build_number)
-{
-	bool result = false;
-	const U32 BUFF_SIZE = 32767;
-	WCHAR tempBuf[BUFF_SIZE];
-	if(GetSystemDirectory((LPWSTR)&tempBuf, BUFF_SIZE))
-	{
-		
-		std::basic_string<WCHAR> shell32_path(tempBuf);
-
-		// Shell32.dll contains the DLLGetVersion function. 
-		// according to msdn its not part of the API
-		// so you have to go in and get it.
-		// http://msdn.microsoft.com/en-us/library/bb776404(VS.85).aspx
-		shell32_path += TEXT("\\shell32.dll");
-
-		HMODULE hDllInst = LoadLibrary(shell32_path.c_str());   //load the DLL
-		if(hDllInst) 
-		{  // Could successfully load the DLL
-			DLLGETVERSIONPROC pDllGetVersion;
-			/*
-			You must get this function explicitly because earlier versions of the DLL
-			don't implement this function. That makes the lack of implementation of the
-			function a version marker in itself.
-			*/
-			pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst, 
-																"DllGetVersion");
-
-			if(pDllGetVersion) 
-			{    
-				// DLL supports version retrieval function
-				DLLVERSIONINFO    dvi;
-
-				ZeroMemory(&dvi, sizeof(dvi));
-				dvi.cbSize = sizeof(dvi);
-				HRESULT hr = (*pDllGetVersion)(&dvi);
-
-				if(SUCCEEDED(hr)) 
-				{ // Finally, the version is at our hands
-					major = dvi.dwMajorVersion;
-					minor = dvi.dwMinorVersion;
-					build_number = dvi.dwBuildNumber;
-					result = true;
-				} 
-			} 
-
-			FreeLibrary(hDllInst);  // Release DLL
-		} 
-	}
-	return result;
-}
-#endif // LL_WINDOWS
-
 // Wrap boost::regex_match() with a function that doesn't throw.
 template <typename S, typename M, typename R>
 static bool regex_match_no_exc(const S& string, M& match, const R& regex)
@@ -214,221 +143,139 @@ static bool regex_search_no_exc(const S& string, M& match, const R& regex)
     }
 }
 
-#if LL_WINDOWS
-// GetVersionEx should not works correct with Windows 8.1 and the later version. We need to check this case 
-static bool	check_for_version(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor)
-{
-    OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 };
-    DWORDLONG        const dwlConditionMask = VerSetConditionMask(
-        VerSetConditionMask(
-        VerSetConditionMask(
-            0, VER_MAJORVERSION, VER_GREATER_EQUAL),
-               VER_MINORVERSION, VER_GREATER_EQUAL),
-               VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
-
-    osvi.dwMajorVersion = wMajorVersion;
-    osvi.dwMinorVersion = wMinorVersion;
-    osvi.wServicePackMajor = wServicePackMajor;
-
-    return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
-}
-#endif
-
 
 LLOSInfo::LLOSInfo() :
 	mMajorVer(0), mMinorVer(0), mBuild(0), mOSVersionString("")	 
 {
 
 #if LL_WINDOWS
-	OSVERSIONINFOEX osvi;
-	BOOL bOsVersionInfoEx;
-	BOOL bShouldUseShellVersion = false;
 
-	// Try calling GetVersionEx using the OSVERSIONINFOEX structure.
-	ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
-	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
-	if(!(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *) &osvi)))
+	if (IsWindowsVersionOrGreater(10, 0, 0))
 	{
-		// If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
-		osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
-		if(!GetVersionEx( (OSVERSIONINFO *) &osvi))
-			return;
+		mMajorVer = 10;
+		mMinorVer = 0;
+		mOSStringSimple = "Microsoft Windows 10 ";
 	}
-	mMajorVer = osvi.dwMajorVersion;
-	mMinorVer = osvi.dwMinorVersion;
-	mBuild = osvi.dwBuildNumber;
-
-	DWORD shell32_major, shell32_minor, shell32_build;
-	bool got_shell32_version = get_shell32_dll_version(shell32_major, 
-													   shell32_minor, 
-													   shell32_build);
-
-	switch(osvi.dwPlatformId)
+	else if (IsWindows8Point1OrGreater())
 	{
-	case VER_PLATFORM_WIN32_NT:
+		mMajorVer = 6;
+		mMinorVer = 3;
+		if (IsWindowsServer())
 		{
-			// Test for the product.
-			if(osvi.dwMajorVersion <= 4)
-			{
-				mOSStringSimple = "Microsoft Windows NT ";
-			}
-			else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
-			{
-				mOSStringSimple = "Microsoft Windows 2000 ";
-			}
-			else if(osvi.dwMajorVersion ==5 && osvi.dwMinorVersion == 1)
-			{
-				mOSStringSimple = "Microsoft Windows XP ";
-			}
-			else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
-			{
-				 if(osvi.wProductType == VER_NT_WORKSTATION)
-					mOSStringSimple = "Microsoft Windows XP x64 Edition ";
-				 else
-					mOSStringSimple = "Microsoft Windows Server 2003 ";
-			}
-			else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 2)
-			{
-				if(osvi.dwMinorVersion == 0)
-				{
-					if(osvi.wProductType == VER_NT_WORKSTATION)
-						mOSStringSimple = "Microsoft Windows Vista ";
-					else
-						mOSStringSimple = "Windows Server 2008 ";
-				}
-				else if(osvi.dwMinorVersion == 1)
-				{
-					if(osvi.wProductType == VER_NT_WORKSTATION)
-						mOSStringSimple = "Microsoft Windows 7 ";
-					else
-						mOSStringSimple = "Windows Server 2008 R2 ";
-				}
-				else if(osvi.dwMinorVersion == 2)
-				{
-					if (check_for_version(HIBYTE(WINNT_WINBLUE), LOBYTE(WINNT_WINBLUE), 0))
-					{
-						mOSStringSimple = "Microsoft Windows 8.1 ";
-						bShouldUseShellVersion = true; // GetVersionEx failed, going to use shell version
-					}
-					else
-					{
-					if(osvi.wProductType == VER_NT_WORKSTATION)
-						mOSStringSimple = "Microsoft Windows 8 ";
-					else
-						mOSStringSimple = "Windows Server 2012 ";
-				}
-				}
-
-				///get native system info if available..
-				typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); ///function pointer for loading GetNativeSystemInfo
-				SYSTEM_INFO si; //System Info object file contains architecture info
-				PGNSI pGNSI; //pointer object
-				ZeroMemory(&si, sizeof(SYSTEM_INFO)); //zero out the memory in information
-				pGNSI = (PGNSI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),  "GetNativeSystemInfo"); //load kernel32 get function
-				if(NULL != pGNSI) //check if it has failed
-					pGNSI(&si); //success
-				else 
-					GetSystemInfo(&si); //if it fails get regular system info 
-				//(Warning: If GetSystemInfo it may result in incorrect information in a WOW64 machine, if the kernel fails to load)
-
-				//msdn microsoft finds 32 bit and 64 bit flavors this way..
-				//http://msdn.microsoft.com/en-us/library/ms724429(VS.85).aspx (example code that contains quite a few more flavors
-				//of windows than this code does (in case it is needed for the future)
-				if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) //check for 64 bit
-				{
-					mOSStringSimple += "64-bit ";
-				}
-				else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
-				{
-					mOSStringSimple += "32-bit ";
-				}
-			}
-			else   // Use the registry on early versions of Windows NT.
-			{
-				mOSStringSimple = "Microsoft Windows (unrecognized) ";
-
-				HKEY hKey;
-				WCHAR szProductType[80];
-				DWORD dwBufLen;
-				RegOpenKeyEx( HKEY_LOCAL_MACHINE,
-							L"SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
-							0, KEY_QUERY_VALUE, &hKey );
-				RegQueryValueEx( hKey, L"ProductType", NULL, NULL,
-								(LPBYTE) szProductType, &dwBufLen);
-				RegCloseKey( hKey );
-				if ( lstrcmpi( L"WINNT", szProductType) == 0 )
-				{
-					mOSStringSimple += "Professional ";
-				}
-				else if ( lstrcmpi( L"LANMANNT", szProductType) == 0 )
-				{
-					mOSStringSimple += "Server ";
-				}
-				else if ( lstrcmpi( L"SERVERNT", szProductType) == 0 )
-				{
-					mOSStringSimple += "Advanced Server ";
-				}
-			}
-
-			std::string csdversion = utf16str_to_utf8str(osvi.szCSDVersion);
-			// Display version, service pack (if any), and build number.
-			std::string tmpstr;
-			if(osvi.dwMajorVersion <= 4)
-			{
-				tmpstr = llformat("version %d.%d %s (Build %d)",
-								  osvi.dwMajorVersion,
-								  osvi.dwMinorVersion,
-								  csdversion.c_str(),
-								  (osvi.dwBuildNumber & 0xffff));
-			}
-			else
-			{
-				tmpstr = !bShouldUseShellVersion ?  llformat("%s (Build %d)", csdversion.c_str(), (osvi.dwBuildNumber & 0xffff)):
-					llformat("%s (Build %d)", csdversion.c_str(), shell32_build);
-			}
-
-			mOSString = mOSStringSimple + tmpstr;
+			mOSStringSimple = "Windows Server 2012 R2 ";
 		}
-		break;
-
-	case VER_PLATFORM_WIN32_WINDOWS:
-		// Test for the Windows 95 product family.
-		if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
+		else
 		{
-			mOSStringSimple = "Microsoft Windows 95 ";
-			if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' )
-			{
-                mOSStringSimple += "OSR2 ";
-			}
-		} 
-		if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
+			mOSStringSimple = "Microsoft Windows 8.1 ";
+		}
+	}
+	else if (IsWindows8OrGreater())
+	{
+		mMajorVer = 6;
+		mMinorVer = 2;
+		if (IsWindowsServer())
 		{
-			mOSStringSimple = "Microsoft Windows 98 ";
-			if ( osvi.szCSDVersion[1] == 'A' )
-			{
-                mOSStringSimple += "SE ";
-			}
-		} 
-		if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
+			mOSStringSimple = "Windows Server 2012 ";
+		}
+		else
 		{
-			mOSStringSimple = "Microsoft Windows Millennium Edition ";
+			mOSStringSimple = "Microsoft Windows 8 ";
+		}
+	}
+	else if (IsWindows7SP1OrGreater())
+	{
+		mMajorVer = 6;
+		mMinorVer = 1;
+		if (IsWindowsServer())
+		{
+			mOSStringSimple = "Windows Server 2008 R2 SP1 ";
+		}
+		else
+		{
+			mOSStringSimple = "Microsoft Windows 7 SP1 ";
+		}
+	}
+	else if (IsWindows7OrGreater())
+	{
+		mMajorVer = 6;
+		mMinorVer = 1;
+		if (IsWindowsServer())
+		{
+			mOSStringSimple = "Windows Server 2008 R2 ";
+		}
+		else
+		{
+			mOSStringSimple = "Microsoft Windows 7 ";
 		}
-		mOSString = mOSStringSimple;
-		break;
 	}
+	else if (IsWindowsVistaSP2OrGreater())
+	{
+		mMajorVer = 6;
+		mMinorVer = 0;
+		if (IsWindowsServer())
+		{
+			mOSStringSimple = "Windows Server 2008 SP2 ";
+		}
+		else
+		{
+			mOSStringSimple = "Microsoft Windows Vista SP2 ";
+		}
+	}
+	else
+	{
+		mOSStringSimple = "Unsupported Windows version ";
+	}
+
+	///get native system info if available..
+	typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); ///function pointer for loading GetNativeSystemInfo
+	SYSTEM_INFO si; //System Info object file contains architecture info
+	PGNSI pGNSI; //pointer object
+	ZeroMemory(&si, sizeof(SYSTEM_INFO)); //zero out the memory in information
+	pGNSI = (PGNSI)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo"); //load kernel32 get function
+	if (NULL != pGNSI) //check if it has failed
+		pGNSI(&si); //success
+	else
+		GetSystemInfo(&si); //if it fails get regular system info 
+	//(Warning: If GetSystemInfo it may result in incorrect information in a WOW64 machine, if the kernel fails to load)
 
-	std::string compatibility_mode;
-	if(got_shell32_version)
+	//msdn microsoft finds 32 bit and 64 bit flavors this way..
+	//http://msdn.microsoft.com/en-us/library/ms724429(VS.85).aspx (example code that contains quite a few more flavors
+	//of windows than this code does (in case it is needed for the future)
+	if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) //check for 64 bit
 	{
-		if((osvi.dwMajorVersion != shell32_major || osvi.dwMinorVersion != shell32_minor) && !bShouldUseShellVersion)
+		mOSStringSimple += "64-bit ";
+	}
+	else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
+	{
+		mOSStringSimple += "32-bit ";
+	}
+
+	// Try calling GetVersionEx using the OSVERSIONINFOEX structure.
+	OSVERSIONINFOEX osvi;
+	ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
+	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+	if (GetVersionEx((OSVERSIONINFO *)&osvi))
+	{
+		mBuild = osvi.dwBuildNumber & 0xffff;
+	}
+	else
+	{
+		// If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
+		osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+		if (GetVersionEx((OSVERSIONINFO *)&osvi))
 		{
-			compatibility_mode = llformat(" compatibility mode. real ver: %d.%d (Build %d)", 
-											shell32_major,
-											shell32_minor,
-											shell32_build);
+			mBuild = osvi.dwBuildNumber & 0xffff;
 		}
 	}
-	mOSString += compatibility_mode;
+
+	mOSString = mOSStringSimple;
+	if (mBuild > 0)
+	{
+		mOSString += llformat("(Build %d)", mBuild);
+	}
+
+	LLStringUtil::trim(mOSStringSimple);
+	LLStringUtil::trim(mOSString);
 
 #elif LL_DARWIN
 	
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 266de7277d6d950ede02758e26eed99786835d43..f353109debb2da964f0428c472a504e6159233ca 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1561,6 +1561,15 @@ if (WINDOWS)
     if (INTEL_MEMOPS_LIBRARY)
       list(APPEND viewer_LIBRARIES ${INTEL_MEMOPS_LIBRARY})
     endif (INTEL_MEMOPS_LIBRARY)
+
+    if (ADDRESS_SIZE EQUAL 64)
+        # We deliberately omit this from the 32bit build because it declares that
+        # the viewer is compatible with Windows 10; we need that to properly detect
+        # the Windows version, but doing so causes systems with certain HD video
+        # cards to fail because Windows 10 does not support them.  Leaving this out
+        # causes those systems to run in a Windows 8 compatibility mode, which works.
+        LIST(APPEND viewer_SOURCE_FILES windows.manifest)
+    endif (ADDRESS_SIZE EQUAL 64)
 endif (WINDOWS)
 
 # Add the xui files. This is handy for searching for xui elements
diff --git a/indra/newview/windows.manifest b/indra/newview/windows.manifest
new file mode 100644
index 0000000000000000000000000000000000000000..8321ac5337ae4286d5f2fb604232ac9a2e1ffb45
--- /dev/null
+++ b/indra/newview/windows.manifest
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
+  <asmv3:application>
+    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
+      <dpiAware>True/PM</dpiAware>
+    </asmv3:windowsSettings>
+  </asmv3:application>
+  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
+    <application> 
+      <!-- Windows 7 -->
+      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+      <!-- Windows 8 -->
+      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
+      <!-- Windows 8.1 -->
+      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
+      <!-- Windows 10 -->
+      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
+    </application> 
+  </compatibility>
+</assembly>