diff --git a/indra/cmake/BuildVersion.cmake b/indra/cmake/BuildVersion.cmake
index a291023577098eaa17b98db350d82a2253d369df..f44318ef5ad926b0be742f39cc8ae0c887cfc8c8 100644
--- a/indra/cmake/BuildVersion.cmake
+++ b/indra/cmake/BuildVersion.cmake
@@ -1,122 +1,139 @@
 # -*- cmake -*-
-#Construct the viewer channel from environment variables or defaults
-if (DEFINED ENV{VIEWER_CHANNEL_BASE})
-  set(VIEWER_CHANNEL_BASE $ENV{VIEWER_CHANNEL_BASE} CACHE STRING "Viewer Channel Base Name" FORCE)
-else()
-  set(VIEWER_CHANNEL_BASE "Alchemy" CACHE STRING "Viewer Channel Base Name")
-endif()
 
-if (DEFINED ENV{VIEWER_CHANNEL_TYPE})
-  set(VIEWER_CHANNEL_TYPE $ENV{VIEWER_CHANNEL_TYPE} CACHE STRING "Viewer Channel Type Name" FORCE)
-else()
-  set(VIEWER_CHANNEL_TYPE "Test" CACHE STRING "Viewer Channel Type Name")
-endif()
+option(REVISION_FROM_VCS "Get current revision from vcs" ON)
+find_package(Git)
 
-if("${VIEWER_CHANNEL_TYPE}" STREQUAL "Project")
-  if (DEFINED ENV{VIEWER_CHANNEL_CODENAME})
-    set(VIEWER_CHANNEL_CODENAME $ENV{VIEWER_CHANNEL_CODENAME} CACHE STRING "Viewer Channel Code Name for Project type" FORCE)
-  else()
-    set(VIEWER_VERSION_CODENAME_FILE "${CMAKE_CURRENT_SOURCE_DIR}/newview/VIEWER_PROJECT_CODENAME.txt")
+# Construct the viewer channel from environment variables or defaults
+if(NOT DEFINED VIEWER_CHANNEL)
+    if(DEFINED ENV{VIEWER_CHANNEL_BASE})
+        set(VIEWER_CHANNEL_BASE
+            $ENV{VIEWER_CHANNEL_BASE}
+            CACHE STRING "Viewer Channel Base Name" FORCE)
+    else()
+        set(VIEWER_CHANNEL_BASE
+            "Alchemy"
+            CACHE STRING "Viewer Channel Base Name")
+    endif()
 
-    if ( EXISTS ${VIEWER_VERSION_CODENAME_FILE} )
-      file(STRINGS ${VIEWER_VERSION_CODENAME_FILE} VIEWER_CHANNEL_CODENAME)
+    if(DEFINED ENV{VIEWER_CHANNEL_TYPE})
+        set(VIEWER_CHANNEL_TYPE
+            $ENV{VIEWER_CHANNEL_TYPE}
+            CACHE STRING "Viewer Channel Type Name" FORCE)
     else()
-      set(VIEWER_CHANNEL_CODENAME "Default" CACHE STRING "Viewer Channel Code Name for Project type")
+        set(VIEWER_CHANNEL_TYPE
+            "Test"
+            CACHE STRING "Viewer Channel Type Name")
+    endif()
+
+    if(DEFINED ENV{VIEWER_CHANNEL_CODENAME})
+        set(VIEWER_CHANNEL_CODENAME_INTERNAL $ENV{VIEWER_CHANNEL_CODENAME})
+    elseif(DEFINED VIEWER_CHANNEL_CODENAME)
+        set(VIEWER_CHANNEL_CODENAME_INTERNAL ${VIEWER_CHANNEL_CODENAME})
+    else()
+        set(VIEWER_CHANNEL_CODENAME_FILE "${CMAKE_SOURCE_DIR}/newview/VIEWER_PROJECT_CODENAME.txt")
+
+        if(EXISTS ${VIEWER_CHANNEL_CODENAME_FILE})
+            file(STRINGS ${VIEWER_CHANNEL_CODENAME_FILE} VIEWER_CHANNEL_CODENAME_INTERNAL)
+        else()
+            set(VIEWER_CHANNEL_CODENAME_INTERNAL "Default")
+        endif()
+    endif()
+    if("${VIEWER_CHANNEL_TYPE}" STREQUAL "Project")
+        set(VIEWER_CHANNEL "${VIEWER_CHANNEL_BASE} ${VIEWER_CHANNEL_TYPE} ${VIEWER_CHANNEL_CODENAME_INTERNAL}")
+    else()
+        set(VIEWER_CHANNEL "${VIEWER_CHANNEL_BASE} ${VIEWER_CHANNEL_TYPE}")
     endif()
-  endif()
-  set(VIEWER_CHANNEL "${VIEWER_CHANNEL_BASE} ${VIEWER_CHANNEL_TYPE} ${VIEWER_CHANNEL_CODENAME}")
-else()
-  set(VIEWER_CHANNEL "${VIEWER_CHANNEL_BASE} ${VIEWER_CHANNEL_TYPE}")
 endif()
 
+if(NOT DEFINED VIEWER_COMMIT_LONG_SHA)
+    if(DEFINED ENV{VIEWER_CHANNEL_TYPE})
+        set(VIEWER_COMMIT_SHORT_SHA $ENV{VIEWER_COMMIT_SHORT_SHA})
+    elseif(Git_FOUND)
+        execute_process(
+            COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
+            OUTPUT_VARIABLE GIT_COMMIT_SHA
+            WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+            OUTPUT_STRIP_TRAILING_WHITESPACE)
 
-# Construct the viewer version number based on the indra/VIEWER_VERSION file
-option(REVISION_FROM_VCS "Get current revision from vcs" ON)
-find_package(Git)
+        if(GIT_COMMIT_SHA)
+            set(VIEWER_COMMIT_LONG_SHA ${GIT_COMMIT_SHA})
+        else()
+            set(VIEWER_COMMIT_LONG_SHA 0)
+        endif()
+    else()
+        set(VIEWER_COMMIT_LONG_SHA 0)
+    endif()
+endif(NOT DEFINED VIEWER_COMMIT_LONG_SHA)
+
+if(NOT DEFINED VIEWER_COMMIT_SHORT_SHA)
+    if(DEFINED ENV{VIEWER_COMMIT_SHORT_SHA})
+        set(VIEWER_COMMIT_SHORT_SHA $ENV{VIEWER_COMMIT_SHORT_SHA})
+    elseif(Git_FOUND)
+        execute_process(
+            COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
+            OUTPUT_VARIABLE GIT_COMMIT_SHORT_SHA
+            WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+            OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+        if(GIT_COMMIT_SHORT_SHA)
+            set(VIEWER_COMMIT_SHORT_SHA ${GIT_COMMIT_SHORT_SHA})
+        else()
+            set(VIEWER_COMMIT_SHORT_SHA 0)
+        endif()
+    else()
+        set(VIEWER_COMMIT_SHORT_SHA 0)
+    endif()
+endif(NOT DEFINED VIEWER_COMMIT_SHORT_SHA)
 
-if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/newview/
-    set(VIEWER_VERSION_BASE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/newview/VIEWER_VERSION.txt")
+# Construct the viewer version number based on the indra/VIEWER_VERSION file
+if(NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/newview/
+    set(VIEWER_VERSION_BASE_FILE "${CMAKE_SOURCE_DIR}/newview/VIEWER_VERSION.txt")
 
-    if ( EXISTS ${VIEWER_VERSION_BASE_FILE} )
+    if(EXISTS ${VIEWER_VERSION_BASE_FILE})
         file(STRINGS ${VIEWER_VERSION_BASE_FILE} VIEWER_SHORT_VERSION REGEX "^[0-9]+\\.[0-9]+\\.[0-9]+")
         string(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" VIEWER_VERSION_MAJOR ${VIEWER_SHORT_VERSION})
         string(REGEX REPLACE "^[0-9]+\\.([0-9]+)\\.[0-9]+" "\\1" VIEWER_VERSION_MINOR ${VIEWER_SHORT_VERSION})
         string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" VIEWER_VERSION_PATCH ${VIEWER_SHORT_VERSION})
 
-        if ((NOT REVISION_FROM_VCS) AND DEFINED ENV{revision})
-           set(VIEWER_VERSION_REVISION $ENV{revision})
-           message(STATUS "Revision (from environment): ${VIEWER_VERSION_REVISION}")
-        elseif ((NOT REVISION_FROM_VCS) AND DEFINED ENV{AUTOBUILD_BUILD_ID})
-           set(VIEWER_VERSION_REVISION $ENV{AUTOBUILD_BUILD_ID})
-           message(STATUS "Revision (from autobuild environment): ${VIEWER_VERSION_REVISION}")
-        elseif (Git_FOUND)
-          execute_process(
-                       COMMAND ${GIT_EXECUTABLE} rev-list HEAD --count
-                       OUTPUT_VARIABLE GIT_REV_LIST_COUNT
-                       WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
-                       OUTPUT_STRIP_TRAILING_WHITESPACE
-                       )
+        if((NOT REVISION_FROM_VCS) AND DEFINED ENV{revision})
+            set(VIEWER_VERSION_REVISION $ENV{revision})
+            message(STATUS "Revision (from environment): ${VIEWER_VERSION_REVISION}")
+        elseif((NOT REVISION_FROM_VCS) AND DEFINED ENV{AUTOBUILD_BUILD_ID})
+            set(VIEWER_VERSION_REVISION $ENV{AUTOBUILD_BUILD_ID})
+            message(STATUS "Revision (from autobuild environment): ${VIEWER_VERSION_REVISION}")
+        elseif(Git_FOUND)
+            execute_process(
+                COMMAND ${GIT_EXECUTABLE} rev-list HEAD --count
+                OUTPUT_VARIABLE GIT_REV_LIST_COUNT
+                WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+                OUTPUT_STRIP_TRAILING_WHITESPACE)
 
             if(GIT_REV_LIST_COUNT)
-              set(VIEWER_VERSION_REVISION ${GIT_REV_LIST_COUNT})
+                set(VIEWER_VERSION_REVISION ${GIT_REV_LIST_COUNT})
             else(GIT_REV_LIST_COUNT)
-              set(VIEWER_VERSION_REVISION 0)
+                set(VIEWER_VERSION_REVISION 0)
             endif(GIT_REV_LIST_COUNT)
-        else ()
-          set(VIEWER_VERSION_REVISION 0)
-        endif ()
-        message("Building '${VIEWER_CHANNEL}' Version ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}")
-    else ( EXISTS ${VIEWER_VERSION_BASE_FILE} )
-        message(SEND_ERROR "Cannot get viewer version from '${VIEWER_VERSION_BASE_FILE}'") 
-    endif ( EXISTS ${VIEWER_VERSION_BASE_FILE} )
+        else()
+            set(VIEWER_VERSION_REVISION 0)
+        endif()
+        message("Building '${VIEWER_CHANNEL}' Version ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION} from commit '${VIEWER_COMMIT_SHORT_SHA}'")
+    else(EXISTS ${VIEWER_VERSION_BASE_FILE})
+        message(SEND_ERROR "Cannot get viewer version from '${VIEWER_VERSION_BASE_FILE}'")
+    endif(EXISTS ${VIEWER_VERSION_BASE_FILE})
 
-    if ("${VIEWER_VERSION_REVISION}" STREQUAL "")
-      message(STATUS "Ultimate fallback, revision was blank or not set: will use 0")
-      set(VIEWER_VERSION_REVISION 0)
-    endif ("${VIEWER_VERSION_REVISION}" STREQUAL "")
+    if("${VIEWER_VERSION_REVISION}" STREQUAL "")
+        message(STATUS "Ultimate fallback, revision was blank or not set: will use 0")
+        set(VIEWER_VERSION_REVISION 0)
+    endif("${VIEWER_VERSION_REVISION}" STREQUAL "")
 
     set(VIEWER_CHANNEL_VERSION_DEFINES
         "LL_VIEWER_CHANNEL=${VIEWER_CHANNEL}"
-        "LL_VIEWER_VERSION_MAJOR=${VIEWER_VERSION_MAJOR}"
+        "LL_VIEWER_CHANNEL_CODENAME=${VIEWER_CHANNEL_CODENAME_INTERNAL}"
+        "LL_VIEWER_COMMIT_SHA=${VIEWER_COMMIT_LONG_SHA}"
+        "LL_VIEWER_COMMIT_SHORT_SHA=${VIEWER_COMMIT_SHORT_SHA}"
+        "LL_VIEWER_VERSION_MAJOR=${VIEWER_VERSION_MAJOR}" 
         "LL_VIEWER_VERSION_MINOR=${VIEWER_VERSION_MINOR}"
-        "LL_VIEWER_VERSION_PATCH=${VIEWER_VERSION_PATCH}"
-        "LL_VIEWER_VERSION_BUILD=${VIEWER_VERSION_REVISION}"
-        "LLBUILD_CONFIG=\"${CMAKE_BUILD_TYPE}\""
-        )
-endif (NOT DEFINED VIEWER_SHORT_VERSION)
-
-if (NOT DEFINED VIEWER_COMMIT_LONG_SHA)
-  if(Git_FOUND)
-    execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
-                    OUTPUT_VARIABLE GIT_COMMIT_SHA
-                    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
-                    OUTPUT_STRIP_TRAILING_WHITESPACE
-                    )
-
-    if(GIT_COMMIT_SHA)
-      set(VIEWER_COMMIT_LONG_SHA ${GIT_COMMIT_SHA})
-    else()
-      set(VIEWER_COMMIT_LONG_SHA 0)
-    endif()
-  else()
-    set(VIEWER_COMMIT_LONG_SHA 0)
-  endif()
-endif (NOT DEFINED VIEWER_COMMIT_LONG_SHA)
-
-if (NOT DEFINED VIEWER_COMMIT_SHORT_SHA)
-  if(Git_FOUND)
-    execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
-                    OUTPUT_VARIABLE GIT_COMMIT_SHORT_SHA
-                    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
-                    OUTPUT_STRIP_TRAILING_WHITESPACE
-                    )
-
-    if(GIT_COMMIT_SHORT_SHA)
-      set(VIEWER_COMMIT_SHORT_SHA ${GIT_COMMIT_SHORT_SHA})
-    else()
-      set(VIEWER_COMMIT_SHORT_SHA 0)
-    endif()
-  else()
-    set(VIEWER_COMMIT_SHORT_SHA 0)
-  endif()
-endif (NOT DEFINED VIEWER_COMMIT_SHORT_SHA)
+        "LL_VIEWER_VERSION_PATCH=${VIEWER_VERSION_PATCH}" 
+        "LL_VIEWER_VERSION_BUILD=${VIEWER_VERSION_REVISION}" 
+        "LLBUILD_CONFIG=\"${CMAKE_BUILD_TYPE}\"")
+endif(NOT DEFINED VIEWER_SHORT_VERSION)
diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp
index 4720a989b0d4ddb741a7be344644a9b9673359aa..ee49c4bbdf11202536ebaa98b30e5c9164d18a0f 100644
--- a/indra/newview/llversioninfo.cpp
+++ b/indra/newview/llversioninfo.cpp
@@ -53,6 +53,9 @@ LLVersionInfo::LLVersionInfo():
 	// need to turn it into a quoted string. LL_TO_STRING() does that.
 	mWorkingChannelName(LL_TO_STRING(LL_VIEWER_CHANNEL)),
 	build_configuration(LLBUILD_CONFIG), // set in indra/cmake/BuildVersion.cmake
+	commit_sha(LL_TO_STRING(LL_VIEWER_COMMIT_SHA)),
+	commit_sha_short(LL_TO_STRING(LL_VIEWER_COMMIT_SHORT_SHA)),
+	codename(LL_TO_STRING(LL_VIEWER_CHANNEL_CODENAME)),
 	// instantiate an LLEventMailDrop with canonical name to listen for news
 	// from SLVersionChecker
 	mPump{new LLEventMailDrop("relnotes")},
@@ -96,17 +99,17 @@ S32 LLVersionInfo::getBuild()
 	return LL_VIEWER_VERSION_BUILD;
 }
 
-std::string LLVersionInfo::getVersion()
+const std::string& LLVersionInfo::getVersion()
 {
 	return version;
 }
 
-std::string LLVersionInfo::getShortVersion()
+const std::string& LLVersionInfo::getShortVersion()
 {
 	return short_version;
 }
 
-std::string LLVersionInfo::getChannelAndVersion()
+const std::string& LLVersionInfo::getChannelAndVersion()
 {
 	if (mVersionChannel.empty())
 	{
@@ -117,7 +120,7 @@ std::string LLVersionInfo::getChannelAndVersion()
 	return mVersionChannel;
 }
 
-std::string LLVersionInfo::getChannel()
+const std::string& LLVersionInfo::getChannel()
 {
 	return mWorkingChannelName;
 }
@@ -132,7 +135,7 @@ LLVersionInfo::ViewerMaturity LLVersionInfo::getViewerMaturity()
 {
     ViewerMaturity maturity;
     
-    std::string channel = getChannel();
+    const std::string& channel = mWorkingChannelName;
 
 	static const boost::regex is_test_channel("\\bTest\\b");
 	static const boost::regex is_beta_channel("\\bBeta\\b");
@@ -165,8 +168,22 @@ LLVersionInfo::ViewerMaturity LLVersionInfo::getViewerMaturity()
     return maturity;
 }
 
+const std::string& LLVersionInfo::getCodename()
+{
+	return codename;
+}
+
+const std::string& LLVersionInfo::getCommitSHA()
+{
+	return commit_sha;
+}
+
+const std::string& LLVersionInfo::getShortCommitSHA()
+{
+	return commit_sha_short;
+}
     
-std::string LLVersionInfo::getBuildConfig()
+const std::string& LLVersionInfo::getBuildConfig()
 {
     return build_configuration;
 }
diff --git a/indra/newview/llversioninfo.h b/indra/newview/llversioninfo.h
index b543ba7d146d5d220f68a6666f80541d5ccf0193..f4a2faefe681f8c73439883c93b044eda66f42f4 100644
--- a/indra/newview/llversioninfo.h
+++ b/indra/newview/llversioninfo.h
@@ -76,6 +76,15 @@ class LLVersionInfo final : public LLSingleton<LLVersionInfo>
 	/// return the channel name, e.g. "Second Life"
 	std::string getChannel();
 	
+	/// return the release codename e.g. "FeralFox"
+	std::string getCodename();
+
+	/// return the full commit sha
+	std::string getCommitSHA();
+
+	/// return the short commit sha;
+	std::string getShortCommitSHA();
+
     /// return the CMake build type
     std::string getBuildConfig();
 
@@ -110,6 +119,11 @@ class LLVersionInfo final : public LLSingleton<LLVersionInfo>
 	std::string mVersionChannel;
 	std::string build_configuration;
 	std::string mReleaseNotes;
+	// Storage for the commit sha.
+	std::string commit_sha;
+	std::string commit_sha_short;
+	// Storage for the build codename.
+	std::string codename;
 	// Store unique_ptrs to the next couple things so we don't have to explain
 	// to every consumer of this header file all the details of each.
 	// mPump is the LLEventMailDrop on which we listen for SLVersionChecker to