diff --git a/autobuild.xml b/autobuild.xml
index c90ffe493cc8b6b16162145127868fb126301bc2..ca6f33a2c021c29ff2bcf51b933610be0d9eae4b 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -225,6 +225,48 @@
         <key>version</key>
         <string>1.57</string>
       </map>
+      <key>bugsplat</key>
+      <map>
+        <key>copyright</key>
+        <string>Copyright 2003-2017, BugSplat</string>
+        <key>description</key>
+        <string>Bugsplat crash reporting package</string>
+        <key>license</key>
+        <string>Proprietary</string>
+        <key>license_file</key>
+        <string>LICENSES/BUGSPLAT_LICENSE.txt</string>
+        <key>name</key>
+        <string>bugsplat</string>
+        <key>platforms</key>
+        <map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>2710e051eb1b12dba574f470834baa9e</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/9992/49191/bugsplat-3.5.0.5-windows-509980.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>f2bb37c69f35522e49aae547d3408fd8</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/9991/49185/bugsplat-3.5.0.5-windows64-509980.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
+        </map>
+        <key>version</key>
+        <string>3.5.0.5</string>
+      </map>
       <key>chardet</key>
       <map>
         <key>copyright</key>
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index ce9f005e9fdad3c99132c2293e2888783b215dbf..c98d806b98cb6211bbeb01c0c6ddfce880c5cc25 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -42,6 +42,18 @@ if(WINDOWS)
         libhunspell.dll
         )
 
+    # Filenames are different for 32/64 bit BugSplat file and we don't
+    # have any control over them so need to branch.
+    if(ADDRESS_SIZE EQUAL 32)
+        set(release_files ${release_files} BugSplat.dll)
+        set(release_files ${release_files} BugSplatRc.dll)
+        set(release_files ${release_files} BsSndRpt.exe)
+    else(ADDRESS_SIZE EQUAL 32)
+        set(release_files ${release_files} BugSplat64.dll)
+        set(release_files ${release_files} BugSplatRc64.dll)
+        set(release_files ${release_files} BsSndRpt64.exe)
+    endif(ADDRESS_SIZE EQUAL 32)
+
     if (FMODEX)
 
         if(ADDRESS_SIZE EQUAL 32)
diff --git a/indra/cmake/bugsplat.cmake b/indra/cmake/bugsplat.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..e9939799029f2fc3a0fd89c0b3a19c1033f2146d
--- /dev/null
+++ b/indra/cmake/bugsplat.cmake
@@ -0,0 +1,20 @@
+include(Prebuilt)
+
+set(BUGSPLAT_FIND_QUIETLY ON)
+set(BUGSPLAT_FIND_REQUIRED ON)
+
+if (USESYSTEMLIBS)
+  include(FindBUGSPLAT)
+else (USESYSTEMLIBS)
+  use_prebuilt_binary(bugsplat)
+  if (WINDOWS)
+    set(BUGSPLAT_LIBRARIES 
+      ${ARCH_PREBUILT_DIRS_RELEASE}/bugsplat.lib
+      )
+  elseif (DARWIN)
+
+  else (WINDOWS)
+
+  endif (WINDOWS)
+  set(BUGSPLAT_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/bugsplat)
+endif (USESYSTEMLIBS)
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index d9eb13d65a6ece0a5289a8d2d1c8a87da03aa0df..c8e44d7ba4e10276f9a691efce6ebe164022d716 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -13,6 +13,8 @@ include(GoogleBreakpad)
 include(Copy3rdPartyLibs)
 include(ZLIB)
 include(URIPARSER)
+include(BUGSPLAT)
+include(BuildVersion)
 
 include_directories(
     ${EXPAT_INCLUDE_DIRS}
@@ -21,6 +23,7 @@ include_directories(
     ${ZLIB_INCLUDE_DIRS}
     ${BREAKPAD_INCLUDE_DIRECTORIES}
     ${URIPARSER_INCLUDE_DIRS}
+    ${BUGSPLAT_INCLUDE_DIR}
     )
 
 # add_executable(lltreeiterators lltreeiterators.cpp)
@@ -253,7 +256,14 @@ set(llcommon_HEADER_FILES
     )
 
 set_source_files_properties(${llcommon_HEADER_FILES}
-                            PROPERTIES HEADER_FILE_ONLY TRUE)
+                            PROPERTIES HEADER_FILE_ONLY TRUE
+                            )
+
+# bring in version information for BugSplat crash reporting
+set_source_files_properties(${llcommon_SOURCE_FILES}
+                            PROPERTIES
+                            COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # see BuildVersion.cmake
+                            )
 
 list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES})
 
@@ -291,6 +301,7 @@ target_link_libraries(
     ${BOOST_SYSTEM_LIBRARY}
     ${GOOGLE_PERFTOOLS_LIBRARIES}
     ${URIPARSER_LIBRARIES}
+    ${BUGSPLAT_LIBRARIES}
     )
 
 if (DARWIN)
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index 6cc9e804d4ac4558551247128e31980ea0decb62..3e652dbdb51f6a75ae398f4f8b8f49c3169ad504 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -49,6 +49,20 @@
 #include "google_breakpad/exception_handler.h"
 #include "stringize.h"
 #include "llcleanup.h"
+#include "BugSplat.h"
+
+// TESTING ONLY - REMOVE FOR PRODUCTION
+// (Want to only invoke BugSplat crash reporting in the same way we did for Breakpad - for Release viewers
+// but need to test here in a ReleaseWithDebugInfo environment)
+#if BUGSPLAT_ENABLED
+#define LL_SEND_CRASH_REPORTS 1
+#endif
+
+// BugSplat crash reporting tool - http://bugsplat.com
+#if BUGSPLAT_ENABLED
+bool BugSplatExceptionCallback(unsigned int nCode, void* lpVal1, void* lpVal2);
+MiniDmpSender *gBugSplatSender;
+#endif
 
 //
 // Signal handling
@@ -385,6 +399,26 @@ void EnableCrashingOnCrashes()
 }
 #endif
 
+#if BUGSPLAT_ENABLED
+bool BugSplatExceptionCallback(unsigned int nCode, void* lpVal1, void* lpVal2)
+{
+	switch (nCode)
+	{
+		case MDSCB_EXCEPTIONCODE:
+		{
+			// send the main viewer log file (Clearly a temporary hack since we don't have access to the gDir*** set of functions in newview
+			const std::string appdata = std::string(getenv("APPDATA"));
+			const std::string logfile = appdata + "\\SecondLife\\logs\\Secondlife.log";
+			const std::wstring wide_logfile(logfile.begin(), logfile.end());
+			gBugSplatSender->sendAdditionalFile((const __wchar_t *)wide_logfile.c_str());
+		}
+		break;
+	}
+
+	return false;
+}
+#endif
+
 void LLApp::setupErrorHandling(bool second_instance)
 {
 	// Error handling is done by starting up an error handling thread, which just sleeps and
@@ -393,6 +427,25 @@ void LLApp::setupErrorHandling(bool second_instance)
 #if LL_WINDOWS
 
 #if LL_SEND_CRASH_REPORTS
+
+#if BUGSPLAT_ENABLED
+	// TODOCP: populate these fields correctly
+	static const wchar_t *bugdb_name = L"second_life_callum_test";
+
+	// build (painfully) the app/channel name
+	#define stringize_inner(x) L#x
+	#define stringize_outer(x) stringize_inner(x)
+	std::wstring app_name(stringize_outer(LL_VIEWER_CHANNEL));
+
+	// build in real app version now we leveraged CMake to build in BuildVersion.cmake into LLCommon
+	wchar_t version_string[MAX_STRING];
+	wsprintf(version_string, L"%d.%d.%d.%d", LL_VIEWER_VERSION_MAJOR, LL_VIEWER_VERSION_MINOR, LL_VIEWER_VERSION_PATCH, LL_VIEWER_VERSION_BUILD);
+
+	gBugSplatSender = new MiniDmpSender((const __wchar_t *)bugdb_name, (const __wchar_t *)app_name.c_str(), (const __wchar_t *)version_string, NULL);
+
+	gBugSplatSender->setCallback(BugSplatExceptionCallback);
+#else
+
 	EnableCrashingOnCrashes();
 
 	// This sets a callback to handle w32 signals to the console window.
@@ -454,8 +507,9 @@ void LLApp::setupErrorHandling(bool second_instance)
 			mExceptionHandler->set_handle_debug_exceptions(true);
 		}
 	}
-#endif
-#else
+#endif  // BUGSPLAT_ENABLED
+#endif	// LL_SEND_CRASH_REPORTS
+#else	// not LL_WINDOWS
 	//
 	// Start up signal handling.
 	//
@@ -516,7 +570,7 @@ void LLApp::setupErrorHandling(bool second_instance)
 	}
 #endif
 
-#endif
+#endif // LL_WINDOWS
 	startErrorThread();
 }
 
diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h
index acd829d8649ae6a0883be66338014267ef3d82ee..5a4b7f13df59cce6b09fb1ce17094808c43f0df3 100644
--- a/indra/llcommon/llapp.h
+++ b/indra/llcommon/llapp.h
@@ -30,6 +30,7 @@
 #include <map>
 #include "llrun.h"
 #include "llsd.h"
+
 // Forward declarations
 template <typename Type> class LLAtomic32;
 typedef LLAtomic32<U32> LLAtomicU32;
@@ -39,6 +40,14 @@ class LLLiveFile;
 #include <signal.h>
 #endif
 
+// first version of Bugsplat (http://bugsplat.com) crash reporting tool
+// is only supported on Windows - macOS to follow.
+#define BUGSPLAT_ENABLED LL_WINDOWS
+
+#if BUGSPLAT_ENABLED
+class __declspec(dllexport) MiniDmpSender;
+#endif
+
 typedef void (*LLAppErrorHandler)();
 
 #if !LL_WINDOWS
@@ -316,7 +325,6 @@ class LL_COMMON_API LLApp
 	
 	google_breakpad::ExceptionHandler * mExceptionHandler;
 
-
 #if !LL_WINDOWS
 	friend void default_unix_signal_handler(int signum, siginfo_t *info, void *);
 #endif
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index e0c332681e3fcb2d45c5ffc6afe7f6231cb532f6..f0c9212e4921f7b2f6024067aaa71260350672f4 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -578,6 +578,16 @@ def construct(self):
             # Hunspell
             self.path("libhunspell.dll")
 
+            # BugSplat
+            if(self.address_size == 64):
+                self.path("BsSndRpt64.exe")
+                self.path("BugSplat64.dll")
+                self.path("BugSplatRc64.dll")
+            else:
+                self.path("BsSndRpt.exe")
+                self.path("BugSplat.dll")
+                self.path("BugSplatRc.dll")
+
             # For google-perftools tcmalloc allocator.
             try:
                 if self.args['configuration'].lower() == 'debug':
@@ -587,7 +597,6 @@ def construct(self):
             except:
                 print "Skipping libtcmalloc_minimal.dll"
 
-
         self.path(src="licenses-win32.txt", dst="licenses.txt")
         self.path("featuretable.txt")
         self.path("ca-bundle.crt")
@@ -689,10 +698,10 @@ def construct(self):
             self.path("zh-CN.pak")
             self.path("zh-TW.pak")
 
-        with self.prefix(src=os.path.join(pkgdir, 'bin', 'release'), dst="llplugin"):
-            self.path("libvlc.dll")
-            self.path("libvlccore.dll")
-            self.path("plugins/")
+            with self.prefix(src=os.path.join(pkgdir, 'bin', 'release'), dst="llplugin"):
+                self.path("libvlc.dll")
+                self.path("libvlccore.dll")
+                self.path("plugins/")
 
         # pull in the crash logger and updater from other projects
         # tag:"crash-logger" here as a cue to the exporter