diff --git a/.hgignore b/.hgignore
index 1b7a9019a265cfc9fb6ba03a1e7a9d6aa8ee2120..0d672e6ebc35bdc7399b31425ae4bc65feb5a0b2 100755
--- a/.hgignore
+++ b/.hgignore
@@ -17,6 +17,8 @@ build-darwin-*
 build-vc80/
 build-vc100/
 build-vc120/
+build-vc120-32/
+build-vc120-64/
 indra/build-vc[0-9]*
 indra/CMakeFiles
 indra/lib/mono/1.0/*.dll
diff --git a/BuildParams b/BuildParams
index 09cc06e83a8e1f8c91fd102f6cf2f60b380f5ae4..a5edfadbd655ca86639239e039b550ad039624e7 100755
--- a/BuildParams
+++ b/BuildParams
@@ -3,36 +3,18 @@
 # Please refer to:
 #  https://wiki.secondlife.com/wiki/Automated_Build_System
 
-
-# Global setting for now....
-Darwin.symbolfiles = "newview/Release/secondlife-symbols-darwin.tar.bz2"
-CYGWIN.symbolfiles = "newview/Release/secondlife-symbols-windows.tar.bz2"
-Linux.symbolfiles = "newview/secondlife-symbols-linux.tar.bz2"
+# Variants (NOTE: 'Release' must be last for uploads to work correctly)
+variants = "RelWithDebInfo Release"
 
 # Use Public Upload Locations
 public_build = true
 build_docs = true
 
-# disable all Debug builds (RelWithDebInfo is sufficient)
-build_CYGWIN_Debug = false
-build_Linux_Debug = false
-build_Darwin_Debug = false
-build_Debug = false
-
 # enable Doxygen building on Linux for TeamCity (it can be done manually on any platform)
 build_Linux_Doxygen = true
 
-# Update Public Inworld Build Status Indicators (setting should mirror "public_build")
-email_status_this_is_os = true
-
-# Limit extent of codeticket updates to revisions after...
-codeticket_since = 3.3.0-release
-
-# Override build system default toolchain
-# Note that this will only affect automated builds.
-Linux.distcc_version = 
-Linux.gcc_version = /usr/bin/gcc-4.6
-Linux.cxx_version = /usr/bin/g++-4.6
+# Need viewer-build-variables as well as other shared repositories
+buildscripts_shared_more_NAMEs="build_variables"
 
 ################################################################
 ####      Examples of how to set the viewer_channel         ####
@@ -88,5 +70,5 @@ EDU_viewer_channel_suffix = "edu"
 # Notifications - to configure email notices use the TeamCity parameter
 # setting screen for your project or build configuration to set the
 # environment variable 'email' to a space-separated list of email addresses
-
+email=""
 
diff --git a/README.md b/README.md
index 6eddb9aa9ed727c28b7cea1e33e0a35a9ff6822f..b80277370a27e5ed3161490aeaf13bf9b824bdf8 100644
--- a/README.md
+++ b/README.md
@@ -14,4 +14,3 @@ To download the current default version, visit
 [the download page](https://secondlife.com/support/downloads). For
 even newer versions try
 [the Alternate Viewers page](https://wiki.secondlife.com/wiki/Linden_Lab_Official:Alternate_Viewers)
-
diff --git a/autobuild.xml b/autobuild.xml
index f485aa0cb7d29461f22bd76649874f0ade38cb60..7f81064379dd9c33c335772ac61d4b6cb54ce46a 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -29,6 +29,18 @@
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>7ea2df03bfc35c06acf23dd9e734adac</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1103/2554/SDL-1.2.15-linux64-501092.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
         </map>
         <key>version</key>
         <string>1.2.15</string>
@@ -59,33 +71,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>f65774ebabb256f2d217a872b0cf2b5b</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/4812/15284/apr_suite-1.4.5.504800-darwin64-504800.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>402552cf158e2fe953b7224f4615a957</string>
+              <string>1aa2e5355bb9df09f9196d14a72b6705</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/apr_3p-update-apr/rev/297252/arch/Linux/installer/apr_suite-1.4.5.297252-linux-297252.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-apr/rev/314241/arch/Linux/installer/apr_suite-1.4.5.314241-linux-314241.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>84a1a140f20b25d714949185e854d14b</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/4811/15302/apr_suite-1.4.5.504800-linux64-504800.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>8f865b509bb5011caf3dd95a22a4589d</string>
+              <string>dc80eca3d113b038b469003da8cd6638</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/apr_3p-update-apr/rev/297252/arch/CYGWIN/installer/apr_suite-1.4.5.297252-windows-297252.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/4813/15290/apr_suite-1.4.5.504800-windows-504800.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>63146d3d3d5fe7aa6be1a1b0afed36dd</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/4814/15296/apr_suite-1.4.5.504800-windows64-504800.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>1.4.5.297252</string>
+        <string>1.4.5.504800</string>
       </map>
       <key>boost</key>
       <map>
@@ -113,30 +161,66 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>d318c25353e41215f1f523d58cacfd44</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/893/1984/boost-1.57-darwin64-500883.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>fb1537f7ad0b490fcb4f096c15dce9cd</string>
+              <string>f1fdb548fd6c09a083c86f3a23d7f041</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/boost_3p-update-boost/rev/297445/arch/Linux/installer/boost-1.57-linux-297445.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-boost/rev/317807/arch/Linux/installer/boost-1.57-linux-317807.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>8e7ee97c3083f44385b09420655ebd04</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/892/1989/boost-1.57-linux64-500883.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>76a607d8a625062b9a63a88b62819894</string>
+              <string>80b1963d635e883cb5ed223e94406adb</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/boost_3p-update-boost/rev/297445/arch/CYGWIN/installer/boost-1.57-windows-297445.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/894/1976/boost-1.57-windows-500883.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>3d6a6373ed0daa490cdb4f92db45de52</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/895/1979/boost-1.57-windows64-500883.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
         <string>1.57</string>
@@ -165,33 +249,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>fa93a9a10fa379091e3e7b85665690d9</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/913/2026/colladadom-2.3.500902-darwin64-500902.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>d627c2a679f3afb8d3e090d42f53cd2e</string>
+              <string>78b9a6506fb7d53da166f7a65f2278f4</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/colladadom_3p-update-colladadom/rev/297450/arch/Linux/installer/colladadom-2.3.297450-linux-297450.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-colladadom/rev/317826/arch/Linux/installer/colladadom-2.3.317826-linux-317826.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>868127582794d6fd32fa69c9be4e83e4</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/912/2031/colladadom-2.3.500902-linux64-500902.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>220897a1893a188aa9d31efb48909878</string>
+              <string>5bd7875e16e7f88e21f4c44fe7c6433f</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/colladadom_3p-update-colladadom/rev/297450/arch/CYGWIN/installer/colladadom-2.3.297450-windows-297450.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/915/2035/colladadom-2.3.500902-windows-500902.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>8a647129a0a0a31594557785ea85f840</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/914/2034/colladadom-2.3.500902-windows64-500902.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>2.3.297450</string>
+        <string>2.3.500902</string>
       </map>
       <key>curl</key>
       <map>
@@ -219,35 +339,71 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>99fbc15f514be77c36280f300d257d5a</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1077/2495/curl-7.47.0.501064-darwin64-501064.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>f49d4ed203b03852a3f6b01b18319f7a</string>
+              <string>9430c08954c00736117099046694e1b1</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/312763/arch/Linux/installer/curl-7.47.0.312763-linux-312763.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-curl/rev/314230/arch/Linux/installer/curl-7.47.0.314230-linux-314230.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>e5d1b0439235f5f3829662a45e566743</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1075/2484/curl-7.47.0.501064-linux64-501064.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>5e0d4f4a5a5bbcba610aafbb91c30b2b</string>
+              <string>bda9f237d3e8238440bc5bedc2657547</string>
               <key>hash_algorithm</key>
               <string>md5</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/312763/arch/CYGWIN/installer/curl-7.47.0.312763-windows-312763.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1078/2487/curl-7.47.0.501064-windows-501064.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>f7fa42c7157cd5007283ae7a5d97393d</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1079/2490/curl-7.47.0.501064-windows64-501064.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>7.47.0.312763</string>
+        <string>7.47.0.501064</string>
       </map>
       <key>db</key>
       <map>
@@ -298,13 +454,25 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>c11ff7e2e0bd59e6e59628f24902bbcd</string>
+              <string>6d676abd9ad8d2883b855dbe397d9034</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/dbus-glib_3p-update-dbus-glib/rev/297768/arch/Linux/installer/dbus_glib-0.76-linux-297768.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-dbus-glib/rev/314266/arch/Linux/installer/dbus_glib-0.76-linux-314266.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>7ee7b9aed3c0c8c09e7bf26bba7af8e1</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-dbus-glib/rev/314266/arch/Linux/installer/dbus_glib-0.76-linux64-314266.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
         </map>
         <key>version</key>
         <string>0.76</string>
@@ -328,16 +496,70 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>a62723a6deea8187702a2f926e98a35f</string>
+              <string>2fa9e9e89a81ed2ed686a170681f6bbc</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/dictionaries_3p-update-dictionaries/rev/297347/arch/Linux/installer/dictionaries-1.297347-common-297347.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/571/1225/dictionaries-1.500564-common-500564.tar.bz2</string>
             </map>
             <key>name</key>
             <string>common</string>
           </map>
         </map>
         <key>version</key>
-        <string>1.297347</string>
+        <string>1.500564</string>
+      </map>
+      <key>dullahan</key>
+      <map>
+        <key>copyright</key>
+        <string>Copyright (c) 2017, Linden Research, Inc.</string>
+        <key>description</key>
+        <string>A headless browser SDK that uses the Chromium Embedded Framework (CEF). It is designed to make it easier to write applications that render modern web content directly to a memory buffer, inject synthesized mouse and keyboard events as well as interact with web based features like JavaScript or cookies.</string>
+        <key>license</key>
+        <string>MPL</string>
+        <key>license_file</key>
+        <string>LICENSES/LICENSE.txt</string>
+        <key>name</key>
+        <string>dullahan</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>da5c705fa4fae169cba26fba92dba1ef</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/4835/15404/dullahan-1.1.800_3.3029.1611.g44e39a8-darwin64-504824.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>17cd8f6e8f95df877d0c9c234f860324</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/4836/15410/dullahan-1.1.800_3.3029.1611.g44e39a8-windows-504824.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>7a478f8f0e13f5f81cab657a8c351186</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/4837/15415/dullahan-1.1.800_3.3029.1611.g44e39a8-windows64-504824.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
+        </map>
+        <key>version</key>
+        <string>1.1.800_3.3029.1611.g44e39a8</string>
       </map>
       <key>elfio</key>
       <map>
@@ -389,33 +611,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>fd182ab5bed66c94899dec3035310945</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/384/954/expat-2.1.1.500375-darwin64-500375.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>f546615d76bc0f9e8bc2b9ef89f0ca86</string>
+              <string>387c90b9bb5ec412587fbe7a56261dd1</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/expat_3p-update-expat/rev/297014/arch/Linux/installer/expat-2.0.1.297014-linux-297014.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-expat/rev/314211/arch/Linux/installer/expat-2.1.1.314211-linux-314211.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>5e1f025d1cebd12db542080aa755257f</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/380/943/expat-2.1.1.500375-linux64-500375.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>c70c72a8a0a1e508691a9b35739b373f</string>
+              <string>09ece3f04ec0bd21dd0d401235aa20f7</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/expat_3p-update-expat/rev/297014/arch/CYGWIN/installer/expat-2.0.1.297014-windows-297014.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/383/949/expat-2.1.1.500375-windows-500375.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>5c82a3482799fe22b3c8fcb317f87bbb</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/382/946/expat-2.1.1.500375-windows64-500375.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>2.0.1.297014</string>
+        <string>2.1.1.500375</string>
       </map>
       <key>fmodex</key>
       <map>
@@ -441,33 +699,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>93257fce19120c01751362775a01b925</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/1545/3481/fmodex-4.44.64.501533-darwin64-501533.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>dd0135d53706a4040d65974f7e804d6f</string>
+              <string>b847ec838da1ad1dd646df9d74e9b395</string>
               <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/fmodex_3p-update-fmodex/rev/297261/arch/Linux/installer/fmodex-4.44.31.297261-linux-297261.tar.bz2</string>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/p64_3p-fmodex/rev/314207/arch/Linux/installer/fmodex-4.44.61.314207-linux-314207.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>89a75d8719f7b2cbe1e54cd8407bb992</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/1544/3476/fmodex-4.44.64.501533-linux64-501533.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>5aa7b826e7c1cf95e9cd3ef77e314f35</string>
+              <string>601c2fc41a18812a45678ef9a87ef772</string>
               <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/fmodex_3p-update-fmodex/rev/297261/arch/CYGWIN/installer/fmodex-4.44.31.297261-windows-297261.tar.bz2</string>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/1546/3486/fmodex-4.44.64.501533-windows-501533.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>e5cde35ae26ebfa256cfe670986e152e</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/1547/3487/fmodex-4.44.64.501533-windows64-501533.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>4.44.31.297261</string>
+        <string>4.44.64.501533</string>
       </map>
       <key>fontconfig</key>
       <map>
@@ -488,46 +782,28 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>864f9361661748ecf0e2cec7110d70b3</string>
+              <string>a20a3d0ab7fc3401bc2ca81e9309f630</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/fontconfig_3p-update-fontconfig/rev/297551/arch/Linux/installer/fontconfig-2.11.0-linux-297551.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-fontconfig/rev/314281/arch/Linux/installer/fontconfig-2.11.0-linux-314281.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
-        </map>
-        <key>version</key>
-        <string>2.11.0</string>
-      </map>
-      <key>freeglut</key>
-      <map>
-        <key>copyright</key>
-        <string>Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.</string>
-        <key>description</key>
-        <string>freeglut is a completely OpenSourced alternative to the OpenGL Utility Toolkit (GLUT) library.</string>
-        <key>license</key>
-        <string>freeglut</string>
-        <key>license_file</key>
-        <string>LICENSES/freeglut.txt</string>
-        <key>name</key>
-        <string>freeglut</string>
-        <key>platforms</key>
-        <map>
-          <key>windows</key>
+          <key>linux64</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>58e328a8b2f3788f932c57ad77e3e117</string>
+              <string>e2419d56960c160670051fbb055fb729</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/freeglut_3p-update-freeglut/rev/295926/arch/CYGWIN/installer/freeglut-2.6.0.295926-windows-295926.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-fontconfig/rev/314281/arch/Linux/installer/fontconfig-2.11.0-linux64-314281.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>windows</string>
+            <string>linux64</string>
           </map>
         </map>
         <key>version</key>
-        <string>2.6.0.295926</string>
+        <string>2.11.0</string>
       </map>
       <key>freetype</key>
       <map>
@@ -555,33 +831,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>3f0698d53acf14b3f0a11dba889d67f3</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/875/1919/freetype-2.4.4.500865-darwin64-500865.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>1ac3152b440287c58509d8af0a50326d</string>
+              <string>1b401394106cedc86926bd488f5aa45e</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/freetype_3p-update-freetype/rev/297053/arch/Linux/installer/freetype-2.4.4.297053-linux-297053.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-freetype/rev/314215/arch/Linux/installer/freetype-2.4.4.314215-linux-314215.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>94cf61dfdbc86aae5bbaf0b5cb8a366c</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/874/1914/freetype-2.4.4.500865-linux64-500865.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>207aa1a29bfe4ba63edbca38170970a1</string>
+              <string>b7a8df22cfc910180c66bb1c1ed89cd4</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/freetype_3p-update-freetype/rev/297053/arch/CYGWIN/installer/freetype-2.4.4.297053-windows-297053.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/876/1922/freetype-2.4.4.500865-windows-500865.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>ff72a895012ed603935083496b0a7bc9</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/877/1925/freetype-2.4.4.500865-windows64-500865.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>2.4.4.297053</string>
+        <string>2.4.4.500865</string>
       </map>
       <key>glext</key>
       <map>
@@ -602,30 +914,54 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>4bf4f9e65168138eebbc769e9e12230b</string>
+              <string>baf1fd13e1fe6aef586200fc87a70f53</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/glext_3p-update-glext/rev/296893/arch/Linux/installer/glext-68-linux-296893.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-glext/rev/314200/arch/Linux/installer/glext-68-linux-314200.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>5f3c9d61b620f949b199ebd8885218ed</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-glext/rev/314200/arch/Linux/installer/glext-68-linux64-314200.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>6eb51c6f17e717a5617b112858d41c80</string>
+              <string>731d4adecfcbd9f7d20c4bbd2c183962</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/glext_3p-update-glext/rev/296893/arch/CYGWIN/installer/glext-68-windows-296893.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-glext/rev/314200/arch/CYGWIN/installer/glext-68-windows-314200.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>9635e7e6fded468dfc0874a2ead54123</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-glext/rev/314200/arch/CYGWIN/installer/glext-68-windows64-314200.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
         <string>68</string>
       </map>
-      <key>glh-linear</key>
+      <key>glh_linear</key>
       <map>
         <key>copyright</key>
         <string>Copyright (c) 2000 Cass Everitt</string>
@@ -636,7 +972,7 @@
         <key>license_file</key>
         <string>LICENSES/glh-linear.txt</string>
         <key>name</key>
-        <string>glh-linear</string>
+        <string>glh_linear</string>
         <key>platforms</key>
         <map>
           <key>common</key>
@@ -644,9 +980,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>44c596c659d32a86972ac9c6f206cb68</string>
+              <string>fa41756977ad8b9fd2d1465dadd4f956</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/glh-linear_3p-glh-linear/rev/303446/arch/Linux/installer/glh_linear-0.0.0-common-303446.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/529/1139/glh_linear-0.0.0-common-500522.tar.bz2</string>
             </map>
             <key>name</key>
             <string>common</string>
@@ -681,91 +1017,73 @@
             <key>name</key>
             <string>darwin</string>
           </map>
-          <key>linux</key>
+          <key>darwin64</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>fffd130f17cbbe2b93cc241b27262647</string>
-              <key>hash_algorithm</key>
-              <string>md5</string>
+              <string>017ef34ddf14293099a90c6eaa3615ca</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/glod_3p-update-glod/rev/296895/arch/Linux/installer/glod-1.0pre4.296895-linux-296895.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1626/3627/glod-1.0pre3.501614-darwin64-501614.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>linux</string>
+            <string>darwin64</string>
           </map>
-          <key>windows</key>
+          <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>b0b32155319c6441997c034bdae28a22</string>
+              <string>58113bcbbacbaeb2d278f745867ae6f0</string>
               <key>hash_algorithm</key>
               <string>md5</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/glod_3p-update-glod/rev/296895/arch/CYGWIN/installer/glod-1.0pre4.296895-windows-296895.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-glod/rev/314201/arch/Linux/installer/glod-1.0pre4.314201-linux-314201.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>windows</string>
+            <string>linux</string>
           </map>
-        </map>
-        <key>version</key>
-        <string>1.0pre4.296895</string>
-      </map>
-      <key>glui</key>
-      <map>
-        <key>copyright</key>
-        <string>Copyright 2006 Paul Rademacher</string>
-        <key>description</key>
-        <string>GLUI is a GLUT-based C++ user interface library which provides controls such as buttons, checkboxes, radio buttons, and spinners to OpenGL applications.</string>
-        <key>license</key>
-        <string>ZLIB</string>
-        <key>license_file</key>
-        <string>LICENSES/glui.txt</string>
-        <key>name</key>
-        <string>glui</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
+          <key>linux64</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>9b7e2ab9b208b3001803294f83d2b610</string>
+              <string>9aef5cd576ace19568da01d9bc3db29c</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/glui_3p-update-glui/rev/297273/arch/Darwin/installer/glui-2.36.297273-darwin-297273.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1625/3628/glod-1.0pre3.501614-linux64-501614.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>darwin</string>
+            <string>linux64</string>
           </map>
-          <key>linux</key>
+          <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>f330b3acd03526d827030eefeeb06240</string>
+              <string>573e68f46f825a1c040daa4994ee2a61</string>
+              <key>hash_algorithm</key>
+              <string>md5</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/glui_3p-update-glui/rev/297273/arch/Linux/installer/glui-2.36.297273-linux-297273.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1627/3633/glod-1.0pre3.501614-windows-501614.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>linux</string>
+            <string>windows</string>
           </map>
-          <key>windows</key>
+          <key>windows64</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>75b16a5a606c78aaeb2f8e6046310a58</string>
+              <string>f8362e1a2f4d03d99c6231101d3d472e</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/glui_3p-update-glui/rev/297273/arch/CYGWIN/installer/glui-2.36.297273-windows-297273.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1628/3638/glod-1.0pre3.501614-windows64-501614.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>windows</string>
+            <string>windows64</string>
           </map>
         </map>
         <key>version</key>
-        <string>2.36.297273</string>
+        <string>1.0pre3.501614</string>
       </map>
       <key>google_breakpad</key>
       <map>
@@ -793,33 +1111,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>2d43c6a149cd9c89ba19e884579b1e25</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1836/4096/google_breakpad-1413.501824-darwin64-501824.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>0bf69fbc829d964820b798a0494278c9</string>
+              <string>352e673897e8f36f8470150b8ace6ce9</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/google-breakpad_3p-update-google-breakpad/rev/298033/arch/Linux/installer/google_breakpad-1413.298033-linux-298033.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-google-breakpad/rev/314225/arch/Linux/installer/google_breakpad-1413.314225-linux-314225.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>6bddcc1ac470dd5eab459220102df9e9</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1835/4114/google_breakpad-1413.501824-linux64-501824.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>c73a7c9aa53a4e266df2d5230a650fbf</string>
+              <string>6a7929c7280a5c9b528fdd334da5c2d1</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/google-breakpad_3p-update-google-breakpad/rev/298127/arch/CYGWIN/installer/google_breakpad-1413.298127-windows-298127.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1838/4108/google_breakpad-1413.501824-windows-501824.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>4fb761717f3ce6ccabdaeb009272b7ca</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1837/4103/google_breakpad-1413.501824-windows64-501824.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>1413.298127</string>
+        <string>1413.501824</string>
       </map>
       <key>googlemock</key>
       <map>
@@ -847,87 +1201,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
-          <key>linux</key>
+          <key>darwin64</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>e08b0e9e269b80b549f6044c4e608fb5</string>
+              <string>1a8081953bdf1bbbc9b8a8e6e062c02d</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/googlemock_3p-update-googlemock/rev/297460/arch/Linux/installer/googlemock-1.7.0.297460-linux-297460.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/919/2048/googlemock-1.7.0.500908-darwin64-500908.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>linux</string>
+            <string>darwin64</string>
           </map>
-          <key>windows</key>
+          <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>f30de5bf36e8ca8681883fe8fd8e0092</string>
+              <string>ad51f68702f25ba245fff312c50c8876</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/googlemock_3p-update-googlemock/rev/297460/arch/CYGWIN/installer/googlemock-1.7.0.297460-windows-297460.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-googlemock/rev/317828/arch/Linux/installer/googlemock-1.7.0.317828-linux-317828.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>windows</string>
+            <string>linux</string>
           </map>
-        </map>
-        <key>version</key>
-        <string>1.7.0.297460</string>
-      </map>
-      <key>gperftools</key>
-      <map>
-        <key>copyright</key>
-        <string>Copyright (c) 2005, Google Inc.</string>
-        <key>description</key>
-        <string>Fast, multi-threaded malloc() and nifty performance analysis tools</string>
-        <key>license</key>
-        <string>BSD</string>
-        <key>license_file</key>
-        <string>LICENSES/gperftools.txt</string>
-        <key>name</key>
-        <string>gperftools</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
+          <key>linux64</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>0137e450bf24cff7e78634bb9a1c85e4</string>
+              <string>0f606bf01f933f00edeb9bf9a2530930</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/google-perftools_3p-update-google-perftools/rev/297263/arch/Darwin/installer/gperftools-2.0.297263-darwin-297263.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/918/2056/googlemock-1.7.0.500908-linux64-500908.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>darwin</string>
+            <string>linux64</string>
           </map>
-          <key>linux</key>
+          <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>0c252bcaa1cb852f5c4e46a13ed459c5</string>
+              <string>d01c9b12be6c5bb0749441495d45cba3</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/google-perftools_3p-update-google-perftools/rev/297263/arch/Linux/installer/gperftools-2.0.297263-linux-297263.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/920/2051/googlemock-1.7.0.500908-windows-500908.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>linux</string>
+            <string>windows</string>
           </map>
-          <key>windows</key>
+          <key>windows64</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>2946f9bbf227dee8881af43856ebb3a1</string>
+              <string>e508a2ac7900853cc551666d0cf06541</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/google-perftools_3p-update-google-perftools/rev/297263/arch/CYGWIN/installer/gperftools-2.0.297263-windows-297263.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/921/2059/googlemock-1.7.0.500908-windows64-500908.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>windows</string>
+            <string>windows64</string>
           </map>
         </map>
         <key>version</key>
-        <string>2.0.297263</string>
+        <string>1.7.0.500908</string>
       </map>
       <key>gstreamer</key>
       <map>
@@ -946,16 +1282,28 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>fb1479533a7699b44d34e3a550037eb7</string>
+              <string>5017b3e95d2c6f47bb111c3f9c075522</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/gstreamer_3p-update-gstreamer/rev/294903/arch/Linux/installer/gstreamer-0.10.6.294903-linux-294903.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-gstreamer/rev/314267/arch/Linux/installer/gstreamer-0.10.6.314267-linux-314267.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>7c9d7cc88add7831a6afeedc20cad2fe</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-gstreamer/rev/314267/arch/Linux/installer/gstreamer-0.10.6.314267-linux64-314267.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>0.10.6.294903</string>
+        <string>0.10.6.314267</string>
       </map>
       <key>gtk-atk-pango-glib</key>
       <map>
@@ -974,16 +1322,28 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>15af375116f5c943ea6f4190bc764224</string>
+              <string>a6431df705526501684d9050e04bfa5b</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/gtk_3p-gtk-atk-pango-glib/rev/294804/arch/Linux/installer/gtk_atk_pango_glib-0.1-linux-294804.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-gtk-atk-pango-glib/rev/314220/arch/Linux/installer/gtk_atk_pango_glib-0.1-linux-314220.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>de7bba8fd2275a11b077b124413065d0</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-gtk-atk-pango-glib/rev/314220/arch/Linux/installer/gtk_atk_pango_glib-0.1-linux64-314220.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>0.0</string>
+        <string>0.1</string>
       </map>
       <key>havok-source</key>
       <map>
@@ -1011,33 +1371,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>a0c4405c9e44d4a0135fe20ba8cfbace</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/4693/14627/havok_source-2012.1-2-darwin64-504680.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>6b0f41ddddfa60d8424d8a2e0bc2077d</string>
+              <string>03c1c5f7c3e93e905f635ca22b607494</string>
               <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/havok-source_3p-update-havok-source/rev/296959/arch/Linux/installer/havok_source-2012.1-linux-296959.tar.bz2</string>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/p64_3p-havok-source/rev/314226/arch/Linux/installer/havok_source-2012.1-2-linux-314226.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>00d0333936a67059a43a6ec8ac38d564</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/748/1563/havok_source-2012.1-2-linux64-500739.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>ab30ae74a665950d73ea559f019ff358</string>
+              <string>035572a1929be66f6c56468e0ef7fe74</string>
               <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/havok-source_3p-update-havok-source/rev/297566/arch/CYGWIN/installer/havok_source-2012.1-windows-297566.tar.bz2</string>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/4695/14637/havok_source-2012.1-2-windows-504680.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>d8525d2fbb9e0f7bc31427b47350e468</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/4694/14634/havok_source-2012.1-2-windows64-504680.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>2012.1</string>
+        <string>2012.1-2</string>
       </map>
       <key>jpeglib</key>
       <map>
@@ -1065,33 +1461,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>4e7fef9c6ae9b7ccf19b7fdb96912b9c</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/3152/7571/jpeglib-8c.503140-darwin64-503140.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>0a6641f030e173a7bc0dc8a3087b6c7d</string>
+              <string>32560d3200da72fea2922371fcef25f5</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/jpeglib_3p-update-jpeglib/rev/296854/arch/Linux/installer/jpeglib-8c.296854-linux-296854.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-jpeglib/rev/314202/arch/Linux/installer/jpeglib-8c.314202-linux-314202.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>ba9c62863ec338a049de83c24639f57c</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/3151/7568/jpeglib-8c.503140-linux64-503140.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>98d3dc8d107d04b572fe47bd43a56e74</string>
+              <string>00523662f6a7388377166e9415e113e9</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/jpeglib_3p-update-jpeglib/rev/296854/arch/CYGWIN/installer/jpeglib-8c.296854-windows-296854.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/3153/7557/jpeglib-8c.503140-windows-503140.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>70ed49ed2317b6dba9af1f186956ac79</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/3154/7558/jpeglib-8c.503140-windows64-503140.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>8c.296854</string>
+        <string>8c.503140</string>
       </map>
       <key>jsoncpp</key>
       <map>
@@ -1119,33 +1551,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>3564da2ab285a8652d2ee157d1f167e2</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1478/3283/jsoncpp-0.5.0.501464-darwin64-501464.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>5b3b5dbf0c82c1046482a74ce9e11c38</string>
+              <string>9d5d9fec28cbbb1651b95728173f8af7</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/jsoncpp_3p-update-jsoncpp/rev/297281/arch/Linux/installer/jsoncpp-0.5.0.297281-linux-297281.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-jsoncpp/rev/314229/arch/Linux/installer/jsoncpp-0.5.0.314229-linux-314229.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>9a658ae561c75e60bd9c0cee56731d21</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1475/3274/jsoncpp-0.5.0.501464-linux64-501464.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>e5a832cffe307a1e814ca0664be30b10</string>
+              <string>ed25115f3e53e59d4d26e0953c273648</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/jsoncpp_3p-update-jsoncpp/rev/297580/arch/CYGWIN/installer/jsoncpp-0.5.0.297580-windows-297580.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1476/3277/jsoncpp-0.5.0.501464-windows-501464.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>b328db840fd28532be39556d130c9439</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1477/3284/jsoncpp-0.5.0.501464-windows64-501464.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>0.5.0.297580</string>
+        <string>0.5.0.501464</string>
       </map>
       <key>kdu</key>
       <map>
@@ -1166,13 +1634,25 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>e62f2fc1ee9ab791d603c5b717b46119</string>
+              <string>7b769c4284bdbd5fce536395d1eab695</string>
               <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/kdu_3p-update-kdu/rev/296932/arch/Darwin/installer/kdu-7.2.296932-darwin-296932.tar.bz2</string>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/4054/11304/kdu-7.9.1.504041-darwin-504041.tar.bz2</string>
             </map>
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>a48db5cf79a4631090bfc968572d9953</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/4052/11292/kdu-7.9.1.504041-darwin64-504041.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
@@ -1185,21 +1665,45 @@
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>99b0b22f87cebdd02c4cc954a7b3b465</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/4053/11298/kdu-7.9.1.504041-linux64-504041.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>a0e5c050a4975c81611d9f1862ac57fb</string>
+              <string>f3ff5982b3b5f02738044432dd77a2c1</string>
               <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/kdu_3p-update-kdu/rev/296932/arch/CYGWIN/installer/kdu-7.2.296932-windows-296932.tar.bz2</string>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/4055/11310/kdu-7.9.1.504041-windows-504041.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>3010fa35f412b36296342b07de06f1ca</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/4056/11316/kdu-7.9.1.504041-windows64-504041.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>7.2.296932</string>
+        <string>7.9.1.504041</string>
       </map>
       <key>libhunspell</key>
       <map>
@@ -1227,33 +1731,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>4b238300cf9c405cdcab18030372832f</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/534/1149/libhunspell-1.3.2.500526-darwin64-500526.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>988deae5c63ec638ad222b400a431f5b</string>
+              <string>0d8009c3b6c1eb510593476dd1d821b5</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/hunspell_3p-update-hunspell/rev/296916/arch/Linux/installer/libhunspell-1.3.2.296916-linux-296916.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-hunspell/rev/314217/arch/Linux/installer/libhunspell-1.3.2.314217-linux-314217.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>ffbdd109356d66ddfefd8a5d57f63f1f</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/533/1144/libhunspell-1.3.2.500526-linux64-500526.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>ada0ad726842d902c09ab20a7ad5ac8f</string>
+              <string>a2025f748a6311ab390f89068b22c702</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/hunspell_3p-update-hunspell/rev/296916/arch/CYGWIN/installer/libhunspell-1.3.2.296916-windows-296916.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/535/1152/libhunspell-1.3.2.500526-windows-500526.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>233d86906ef88fa331263162a53e29f2</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/536/1155/libhunspell-1.3.2.500526-windows64-500526.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>1.3.2.296916</string>
+        <string>1.3.2.500526</string>
       </map>
       <key>libndofdev</key>
       <map>
@@ -1281,21 +1821,45 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>840bb6219f63a789749f5f6583c44eee</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/704/1420/libndofdev-0.1.500695-darwin64-500695.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>1c40c22fb7b84ccccefbf797e2478ec4</string>
+              <string>fdbebbbde3b289d93c0c8c294cf859cb</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libndofdev_3p-update-libndofdev/rev/297264/arch/CYGWIN/installer/libndofdev-0.1.297264-windows-297264.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/708/1426/libndofdev-0.1.500695-windows-500695.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>15cef2cec6c8d1980011e26249bd4e90</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/707/1423/libndofdev-0.1.500695-windows64-500695.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>0.1.297264</string>
+        <string>0.1.500695</string>
       </map>
       <key>libpng</key>
       <map>
@@ -1323,33 +1887,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>537b59a75709bd9abe0abe0c7309add4</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/883/1951/libpng-1.6.8.500873-darwin64-500873.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>6dec32fc2527f8cafd616f9271ff3478</string>
+              <string>0758f3cb4c02ebab61854b811b0894e9</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libpng_3p-update-libpng/rev/297051/arch/Linux/installer/libpng-1.6.8.297051-linux-297051.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-libpng/rev/314214/arch/Linux/installer/libpng-1.6.8.314214-linux-314214.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>13de93ea11544051b69f238eeb644fd3</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/882/1946/libpng-1.6.8.500873-linux64-500873.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>09eb65e66e0230ab01e57e643647a4f1</string>
+              <string>9c2950f9d16566979dcd6ca6336778b3</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libpng_3p-update-libpng/rev/297708/arch/CYGWIN/installer/libpng-1.6.8.297708-windows-297708.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/885/1957/libpng-1.6.8.500873-windows-500873.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>18fe233471e91d5d3ac6d08a296b79ba</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/884/1954/libpng-1.6.8.500873-windows64-500873.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>1.6.8.297708</string>
+        <string>1.6.8.500873</string>
       </map>
       <key>libuuid</key>
       <map>
@@ -1370,13 +1970,25 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>f231b6ec8bc2f050cfb1ee20bd83190d</string>
+              <string>a2eaf9515cd129f3e21a08e92689006b</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libuuid_3p-update-libuuid/rev/295209/arch/Linux/installer/libuuid-1.6.2-linux-295209.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-libuuid/rev/314269/arch/Linux/installer/libuuid-1.6.2-linux-314269.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>fb89f1281dd54d8b99b339fc5b712b27</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-libuuid/rev/314269/arch/Linux/installer/libuuid-1.6.2-linux64-314269.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
         </map>
         <key>version</key>
         <string>1.6.2</string>
@@ -1407,109 +2019,99 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>89a71a652a5ecd7cf6142ff56f40f018</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/891/1973/libxml2-2.9.4.500877-darwin64-500877.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>b8b584853dc1344bb3571c13b06ec39e</string>
+              <string>6954173a141d928f2614076577d952de</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libxml_3p-update-libxml/rev/297050/arch/Linux/installer/libxml2-2.9.1.297050-linux-297050.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-libxml/rev/314197/arch/Linux/installer/libxml2-2.9.1.314197-linux-314197.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>740fc93f195c77b3a0c0800b31878ecb</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/890/1968/libxml2-2.9.4.500877-linux64-500877.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>37fa0e86e54f5f283aa653d770fc8ed5</string>
+              <string>c2461ba7629c4cef5af623464aded3c6</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libxml_3p-update-libxml/rev/297050/arch/CYGWIN/installer/libxml2-2.9.1.297050-windows-297050.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/888/1960/libxml2-2.9.4.500877-windows-500877.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
-        </map>
-        <key>version</key>
-        <string>2.9.1.297050</string>
-      </map>
-      <key>llappearance_utility</key>
-      <map>
-        <key>copyright</key>
-        <string>Copyright (c) 2000-2012, Linden Research, Inc.</string>
-        <key>description</key>
-        <string>Linden Lab appearance utility for server-side avatar baking services.</string>
-        <key>license</key>
-        <string>Proprietary</string>
-        <key>license_file</key>
-        <string>LICENSES/llappearanceutility.txt</string>
-        <key>name</key>
-        <string>llappearance_utility</string>
-        <key>platforms</key>
-        <map>
-          <key>linux</key>
+          <key>windows64</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>fddd634dec5ec03924d62cc774f7f8ea</string>
+              <string>8ec25000f5d72e26c2e7555c73898fbb</string>
               <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/p64_viewer-llappearance-utility/rev/317266/arch/Linux/installer/llappearance_utility-0.0.1-linux-317266.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/889/1963/libxml2-2.9.4.500877-windows64-500877.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>linux</string>
+            <string>windows64</string>
           </map>
         </map>
         <key>version</key>
-        <string>0.0.1</string>
+        <string>2.9.4.500877</string>
       </map>
-      <key>llceflib</key>
+      <key>llappearance_utility</key>
       <map>
         <key>copyright</key>
-        <string>Copyright (c) 2014, Linden Research, Inc.</string>
+        <string>Copyright (c) 2000-2012, Linden Research, Inc.</string>
         <key>description</key>
-        <string>LLCefLib implements a headless web browser, rendering modern web content to a memory buffer and providing an API for injecting mouse and keyboard events. It uses the Chromium Embedded Framework (https://bitbucket.org/chromiumembedded/cef)</string>
+        <string>Linden Lab appearance utility for server-side avatar baking services.</string>
         <key>license</key>
-        <string>LGPL</string>
+        <string>Proprietary</string>
         <key>license_file</key>
-        <string>LICENSES/LICENSE-source.txt</string>
+        <string>LICENSES/llappearanceutility.txt</string>
         <key>name</key>
-        <string>llceflib</string>
+        <string>llappearance_utility</string>
         <key>platforms</key>
         <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>2845033912eb947a1401847ece1469ce</string>
-              <key>hash_algorithm</key>
-              <string>md5</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llceflib_3p-llceflib/rev/321153/arch/Darwin/installer/llceflib-1.5.3.321153-darwin-321153.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>windows</key>
+          <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>1156121b4ccbb4aa29bc01f15c589f98</string>
-              <key>hash_algorithm</key>
-              <string>md5</string>
+              <string>fddd634dec5ec03924d62cc774f7f8ea</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llceflib_3p-llceflib/rev/321153/arch/CYGWIN/installer/llceflib-1.5.3.321153-windows-321153.tar.bz2</string>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/p64_viewer-llappearance-utility/rev/317266/arch/Linux/installer/llappearance_utility-0.0.1-linux-317266.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>windows</string>
+            <string>linux</string>
           </map>
         </map>
         <key>version</key>
-        <string>1.5.3.317959</string>
+        <string>0.0.1</string>
       </map>
       <key>llphysicsextensions_source</key>
       <map>
@@ -1523,47 +2125,45 @@
         <string>llphysicsextensions_source</string>
         <key>platforms</key>
         <map>
-          <key>darwin</key>
+          <key>darwin64</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>01a7cc9d0e56238a9abedd7a41ccd0a3</string>
-              <key>hash_algorithm</key>
-              <string>md5</string>
+              <string>162a3fc9b66626072ec8679361b174f5</string>
               <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llphysicsextensions/rev/313564/arch/Darwin/installer/llphysicsextensions_source-1.0.313564-darwin-313564.tar.bz2</string>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/4722/14837/llphysicsextensions_source-1.0.504710-darwin64-504710.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>darwin</string>
+            <string>darwin64</string>
           </map>
-          <key>linux</key>
+          <key>linux64</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>c94dc7ab6efe59c0d5d04fc447257c57</string>
+              <string>c1b43e99c5ddccc18b0e9cb288bf75e1</string>
               <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llphysicsextensions/rev/313564/arch/Linux/installer/llphysicsextensions_source-1.0.313564-linux-313564.tar.bz2</string>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/4721/14828/llphysicsextensions_source-1.0.504710-linux64-504710.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>linux</string>
+            <string>linux64</string>
           </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>e760be34addeb0cd6e2ec43394834bac</string>
+              <string>dd85c9e0f5fa3ce483ea183db008c4bc</string>
               <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llphysicsextensions/rev/313564/arch/CYGWIN/installer/llphysicsextensions_source-1.0.313564-windows-313564.tar.bz2</string>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/4726/14858/llphysicsextensions_source-1.0.504710-windows-504710.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
         </map>
         <key>version</key>
-        <string>1.0.313564</string>
+        <string>1.0.504710</string>
       </map>
       <key>llphysicsextensions_stub</key>
       <map>
@@ -1577,47 +2177,45 @@
         <string>llphysicsextensions_stub</string>
         <key>platforms</key>
         <map>
-          <key>darwin</key>
+          <key>darwin64</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>c8c6e5867d1ead7ad452a3359b22cf44</string>
-              <key>hash_algorithm</key>
-              <string>md5</string>
+              <string>566aa2c6f5b2f40a8b0bedf90d9c6beb</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions/rev/313563/arch/Darwin/installer/llphysicsextensions_stub-1.0.313563-darwin-313563.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/4723/14838/llphysicsextensions_stub-1.0.504712-darwin64-504712.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>darwin</string>
+            <string>darwin64</string>
           </map>
-          <key>linux</key>
+          <key>linux64</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>e99afb25a4fd5b08c5cd3060ae9c1d59</string>
+              <string>711f4ec769e4b5f59ba25ee43c11bcbc</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions/rev/313563/arch/Linux/installer/llphysicsextensions_stub-1.0.313563-linux-313563.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/4724/14846/llphysicsextensions_stub-1.0.504712-linux64-504712.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>linux</string>
+            <string>linux64</string>
           </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>6f4307a35c692e44b872125d7932df8e</string>
+              <string>d830aca10ea9396557b1e613c2736e49</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions/rev/313563/arch/CYGWIN/installer/llphysicsextensions_stub-1.0.313563-windows-313563.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/4725/14853/llphysicsextensions_stub-1.0.504712-windows-504712.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
         </map>
         <key>version</key>
-        <string>1.0.313563</string>
+        <string>1.0.504712</string>
       </map>
       <key>mesa</key>
       <map>
@@ -1664,16 +2262,28 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>9e30c9e228d6a825b6774b97ff052973</string>
+              <string>22c7be12c1d2ee87b059be903d7f2fbd</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/nvapi_3p-update-nvapi/rev/295118/arch/CYGWIN/installer/nvapi-304-windows-295118.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-nvapi/rev/314405/arch/CYGWIN/installer/nvapi-352.314405-windows-314405.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>90e32843a0e21037001dc88240008e1f</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-nvapi/rev/314405/arch/CYGWIN/installer/nvapi-352.314405-windows64-314405.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>304</string>
+        <string>352.314405</string>
       </map>
       <key>ogg_vorbis</key>
       <map>
@@ -1701,33 +2311,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>bb8bed08fd5973a040c509ef8b545ec8</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/490/1046/ogg_vorbis-1.2.2-1.3.2.500397-darwin64-500397.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>b0cd31d5b07a9fc25c4d69ba2f95eace</string>
+              <string>5c9d94dce4551b19790057766ff939ea</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/oggvorbis_3p-update-oggvorbis/rev/296878/arch/Linux/installer/ogg_vorbis-1.2.2-1.3.2.296878-linux-296878.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-oggvorbis/rev/314224/arch/Linux/installer/ogg_vorbis-1.2.2-1.3.2.314224-linux-314224.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>45ebd074053dc9cae8c5c74b52085d4b</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/465/990/ogg_vorbis-1.2.2-1.3.2.500397-linux64-500397.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>f358717739c288ec7401d6d1936ef878</string>
+              <string>f7edf86dcf2d9be7bee98c91256fa569</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/oggvorbis_3p-update-oggvorbis/rev/296878/arch/CYGWIN/installer/ogg_vorbis-1.2.2-1.3.2.296878-windows-296878.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/512/1108/ogg_vorbis-1.2.2-1.3.2.500397-windows-500397.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>497ec6ac26c2e136ee65acbed86cb2ef</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/511/1105/ogg_vorbis-1.2.2-1.3.2.500397-windows64-500397.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>1.2.2-1.3.2.296878</string>
+        <string>1.2.2-1.3.2.500397</string>
       </map>
       <key>open-libndofdev</key>
       <map>
@@ -1778,37 +2424,61 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>15ebe611213c9577691ffbade081549d</string>
+              <string>24b91eda3831a51c7774644016c4cb09</string>
               <key>hash_algorithm</key>
               <string>md5</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/openal_3p-update-openal/rev/297677/arch/Linux/installer/openal-1.12.854-1.1.0.297677-linux-297677.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-openal/rev/314223/arch/Linux/installer/openal-1.12.854-1.1.0.314223-linux-314223.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>7530fab3979312da75a903d87b73e3a9</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-openal/rev/314223/arch/Linux/installer/openal-1.12.854-1.1.0.314223-linux64-314223.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>3bf6e26aeec71f36c8b6e20c6b883fe9</string>
+              <string>d9c86f79a6bb56a670e2801c33fd2dd1</string>
               <key>hash_algorithm</key>
               <string>md5</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/openal_3p-update-openal/rev/297677/arch/CYGWIN/installer/openal-1.12.854-1.1.0.297677-windows-297677.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-openal/rev/314223/arch/CYGWIN/installer/openal-1.12.854-1.1.0.314223-windows-314223.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>e0fdd9394a8cd8c6360b922f6f237e57</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-openal/rev/314223/arch/CYGWIN/installer/openal-1.12.854-1.1.0.314223-windows64-314223.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>1.12.854-1.1.0.297677</string>
+        <string>1.12.854-1.1.0.314223</string>
       </map>
       <key>openjpeg</key>
       <map>
         <key>copyright</key>
-        <string>Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium, Copyright (c) 2002-2007, Professor Benoit Macq, Copyright (c) 2001-2003, David Janssens, Copyright (c) 2002-2003, Yannick Verschueren, Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe, Copyright (c) 2005, Herve Drolon, FreeImage Team</string>
+        <string>Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium; Copyright (c) 2002-2007, Professor Benoit Macq; Copyright (c) 2001-2003, David Janssens; Copyright (c) 2002-2003, Yannick Verschueren; Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe; Copyright (c) 2005, Herve Drolon, FreeImage Team; Copyright (c) 2006-2007, Parvatha Elangovan; Copyright (c) 2008, Jerome Fimes, Communications &amp; Systemes &lt;jerome.fimes@c-s.fr&gt;; Copyright (c) 2010-2011, Kaori Hagihara; Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France; Copyright (c) 2012, CS Systemes d'Information, France;</string>
         <key>description</key>
         <string>The OpenJPEG library is an open-source JPEG 2000 codec written in C language.</string>
         <key>license</key>
@@ -1831,33 +2501,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>f7013e1f0b6a877090622fd73ec72cbc</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1114/2576/openjpeg-1.5.1.501102-darwin64-501102.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>675c283030879d3d9c49082bfa2192eb</string>
+              <string>e82317482647559d46a818ba48e9423a</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/openjpeg_3p-update-openjpeg/rev/297018/arch/Linux/installer/openjpeg-1.4.297018-linux-297018.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-openjpeg/rev/314205/arch/Linux/installer/openjpeg-2.0.0.314205-linux-314205.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>ac66f3197010b1549a5e4467aebbc27d</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1113/2571/openjpeg-1.5.1.501102-linux64-501102.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>b35adcf74d22c128045aa87aade74736</string>
+              <string>8a7f0be5647e07235d205ac00805fb78</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/openjpeg_3p-update-openjpeg/rev/297018/arch/CYGWIN/installer/openjpeg-1.4.297018-windows-297018.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1116/2586/openjpeg-1.5.1.501102-windows-501102.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>398544058036bc27097fcff208934d11</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1115/2581/openjpeg-1.5.1.501102-windows64-501102.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>1.4.297018</string>
+        <string>1.5.1.501102</string>
       </map>
       <key>openssl</key>
       <map>
@@ -1885,33 +2591,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>7011482b07b32b375ecc3e891c37f469</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1063/2462/openssl-1.0.1u.501051-darwin64-501051.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>c310ba9971cbd796b303c3be67fb11c6</string>
+              <string>f46a601d60b7dbcfde32afc0cb64453e</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/openssl_3p-update-openssl/rev/297168/arch/Linux/installer/openssl-1.0.1h.297168-linux-297168.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-openssl/rev/314227/arch/Linux/installer/openssl-1.0.1h.314227-linux-314227.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>50bb9aca605a599cb1a46da3c45f78ac</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1062/2473/openssl-1.0.1u.501051-linux64-501051.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>398743f47578cbb44f5504128780369f</string>
+              <string>7d9801f9ce049ffd30fbe06b6bac4c91</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/openssl_3p-update-openssl/rev/297168/arch/CYGWIN/installer/openssl-1.0.1h.297168-windows-297168.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1064/2465/openssl-1.0.1u.501051-windows-501051.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>c3e404a9cc51d64c71ec13dbd44b8409</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1065/2468/openssl-1.0.1u.501051-windows64-501051.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>1.0.1h.297168</string>
+        <string>1.0.1u.501051</string>
       </map>
       <key>pcre</key>
       <map>
@@ -1939,63 +2681,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>addfbc0635b0ea65d7a151dd7ec5ef85</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/909/2015/pcre-8.35.500898-darwin64-500898.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>b82817bcc2f63094d9c915d018d0b036</string>
+              <string>24a119b18e63017ad932ad54df8161bc</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/pcre_3p-update-pcre/rev/297155/arch/Linux/installer/pcre-8.35.-linux-297155.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-pcre/rev/314136/arch/Linux/installer/pcre-8.35.314136-linux-314136.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>0f058ca2176e7d02d51e54c66a96f336</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/908/2010/pcre-8.35.500898-linux64-500898.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>96ed836c89a99dfc22f9c16a0d7272d3</string>
+              <string>150220f39f0aa5a8d9e609b450a9b147</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/pcre_3p-update-pcre/rev/297155/arch/CYGWIN/installer/pcre-8.35.-windows-297155.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/911/2021/pcre-8.35.500898-windows-500898.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
-        </map>
-        <key>version</key>
-        <string>8.35.</string>
-      </map>
-      <key>quicktime</key>
-      <map>
-        <key>copyright</key>
-        <string>2010 Apple</string>
-        <key>description</key>
-        <string>QuickTime 7.3 SDK for Windows</string>
-        <key>license</key>
-        <string>unknown</string>
-        <key>license_file</key>
-        <string>LICENSES/quicktime.txt</string>
-        <key>name</key>
-        <string>quicktime</string>
-        <key>platforms</key>
-        <map>
-          <key>windows</key>
+          <key>windows64</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>78650a79bda6435e623a940ad425a593</string>
+              <string>eaebfb4a96a6306ee8e0b18434d125f9</string>
               <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/quicktime_3p-update-quicktime/rev/300073/arch/CYGWIN/installer/quicktime-7.3-windows-300073.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/910/2018/pcre-8.35.500898-windows64-500898.tar.bz2</string>
             </map>
             <key>name</key>
-            <string>windows</string>
+            <string>windows64</string>
           </map>
         </map>
         <key>version</key>
-        <string>7.3</string>
+        <string>8.35.500898</string>
       </map>
       <key>slvoice</key>
       <map>
@@ -2016,40 +2764,76 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>3dd9bf4185bf2df413d890ca9eeab76c</string>
+              <string>8c2f921001a8ee29b826a45181465735</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/vivox_3p-slvoice/rev/302004/arch/Darwin/installer/slvoice-4.6.0017.22050.302004-darwin-302004.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-slvoice/rev/314209/arch/Darwin/installer/slvoice-4.6.0017.21209.314209-darwin-314209.tar.bz2</string>
             </map>
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>c9b0d816cf14bebba138ea6f9f463553</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/614/1294/slvoice-4.6.0017.21209.500605-darwin64-500605.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>06c3a9b1005249f0c94a8b9f3775f3d3</string>
+              <string>e5832a68562c3409a56a3583d101864b</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/vivox_3p-slvoice/rev/302004/arch/Linux/installer/slvoice-3.2.0002.10426.302004-linux-302004.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-slvoice/rev/314209/arch/Linux/installer/slvoice-3.2.0002.10426.314209-linux-314209.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>92b0ae08832bd0e99c34ef8f3e6346ad</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/613/1289/slvoice-3.2.0002.10426.500605-linux64-500605.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>47a3316dae47cc4e7c1ea7b74ba8dd1e</string>
+              <string>3ce62e3696f26a1e09e0c769280e5608</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/vivox_3p-slvoice/rev/302004/arch/CYGWIN/installer/slvoice-4.6.0017.22050.302004-windows-302004.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/616/1300/slvoice-4.6.0017.21209.500605-windows-500605.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>61c41dd565e2caa38bd0056970094749</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/615/1297/slvoice-4.6.0017.21209.500605-windows64-500605.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>3.2.0002.10426.302004</string>
+        <string>4.6.0017.21209.500605</string>
       </map>
       <key>tut</key>
       <map>
@@ -2070,9 +2854,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>2f32faa00e600911f838a7d82da5a8db</string>
+              <string>722563bd6e2ae0c7e53c027d267154f7</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/tut_3p-update-tut/rev/297257/arch/Linux/installer/tut-2008.11.30-common-297257.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/496/1054/tut-2008.11.30-common-500403.tar.bz2</string>
             </map>
             <key>name</key>
             <string>common</string>
@@ -2107,6 +2891,18 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>5b9cd1d6fac519aad59f6d53a54229c5</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/347/872/uriparser-0.8.0.1-darwin64-500342.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
@@ -2119,18 +2915,42 @@
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>087375378f104cdac0cb0fe0ca43dd4d</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/346/880/uriparser-0.8.0.1-linux64-500342.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>e4520158dda88453e46942eab6f9c0a8</string>
+              <string>1becd11c19dd1763f0322ba4d1a5ee06</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/uriparser_3p-update-uriparser/rev/299435/arch/CYGWIN/installer/uriparser-0.8.0.1-windows-299435.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/521/1129/uriparser-0.8.0.1-windows-500342.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>587db55a2a3ce57628374b5e27b3272e</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/349/875/uriparser-0.8.0.1-windows64-500342.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
         <string>0.8.0.1</string>
@@ -2147,6 +2967,18 @@
         <string>vlc-bin</string>
         <key>platforms</key>
         <map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>c5e6d9440e3a4a12102dd2bbb703963e</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/2225/4736/vlc_bin-2.2.4.502214-darwin64-502214.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
@@ -2164,16 +2996,28 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>04cff37070a5f65f3652b4ddcec7183f</string>
+              <string>dc37f7cc77a62891bb9ae46c9e19f95e</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-vlc-bin/rev/317935/arch/CYGWIN/installer/vlc_bin-2.2.4.317935-windows-317935.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1219/2834/vlc_bin-2.2.4.501207-windows-501207.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>148ee599afeba9794de14ca433389504</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1218/2829/vlc_bin-2.2.4.501207-windows64-501207.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>2.2.4.317935</string>
+        <string>2.2.4.502214</string>
       </map>
       <key>xmlrpc-epi</key>
       <map>
@@ -2201,33 +3045,69 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>b2d31df56a10c634657eed856c8d7895</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/728/1494/xmlrpc_epi-0.54.1.500719-darwin64-500719.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>30bb26d6cc78c16047fc85a63f48fcdb</string>
+              <string>b63f828e798287d475991134cdcfbca3</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/xmlrpc-emi_3p-update-xmlrpc-epi/rev/297075/arch/Linux/installer/xmlrpc_epi-0.54.1.297075-linux-297075.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-xmlrpc-epi/rev/314240/arch/Linux/installer/xmlrpc_epi-0.54.1.314240-linux-314240.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>35df17c3eb673030dea4bde9191aa506</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/727/1489/xmlrpc_epi-0.54.1.500719-linux64-500719.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>a7e1a8369a5afd52e1b6fc1f14155033</string>
+              <string>6c16f020bf01155e6746487af0b26173</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/xmlrpc-emi_3p-update-xmlrpc-epi/rev/297075/arch/CYGWIN/installer/xmlrpc_epi-0.54.1.297075-windows-297075.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/729/1497/xmlrpc_epi-0.54.1.500719-windows-500719.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>a9dda7caa8835c52b3735711cfee4eb9</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/730/1500/xmlrpc_epi-0.54.1.500719-windows64-500719.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>0.54.1.297075</string>
+        <string>0.54.1.500719</string>
       </map>
       <key>zlib</key>
       <map>
@@ -2255,35 +3135,71 @@
             <key>name</key>
             <string>darwin</string>
           </map>
+          <key>darwin64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>e204dee29902549f50af1af2bb098df5</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/867/1903/zlib-1.2.8.500857-darwin64-500857.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin64</string>
+          </map>
           <key>linux</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>2eb8e59b6464222dcf4435016ad5f618</string>
+              <string>98a8c775c581ca80bb559e8b4e8eaae7</string>
               <key>hash_algorithm</key>
               <string>md5</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/zlib_3p-update-zlib/rev/296881/arch/Linux/installer/zlib-1.2.8.296881-linux-296881.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-zlib/rev/314131/arch/Linux/installer/zlib-1.2.8.314131-linux-314131.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
           </map>
+          <key>linux64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>dab6be8b0596c1e3354f2b6d41335131</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/866/1898/zlib-1.2.8.500857-linux64-500857.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux64</string>
+          </map>
           <key>windows</key>
           <map>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>ae420ec6d30411c07aac2502d7bbc0f3</string>
+              <string>f92cbb0ab5e5d20789bf6102f9a27aa6</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/zlib_3p-update-zlib/rev/296881/arch/CYGWIN/installer/zlib-1.2.8.296881-windows-296881.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/868/1906/zlib-1.2.8.500857-windows-500857.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
           </map>
+          <key>windows64</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>70a56767f6a109af412838875d0b5f1b</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/869/1909/zlib-1.2.8.500857-windows64-500857.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows64</string>
+          </map>
         </map>
         <key>version</key>
-        <string>1.2.8.296881</string>
+        <string>1.2.8.500857</string>
       </map>
     </map>
     <key>package_description</key>
@@ -2316,7 +3232,7 @@
                 <key>options</key>
                 <array>
                   <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string>
-                  <string>-DWORD_SIZE:STRING=32</string>
+                  <string>-DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE</string>
                   <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
                   <string>-DINSTALL_PROPRIETARY=TRUE</string>
                 </array>
@@ -2337,7 +3253,7 @@
                 <key>options</key>
                 <array>
                   <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string>
-                  <string>-DWORD_SIZE:STRING=32</string>
+                  <string>-DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE</string>
                   <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
                   <string>-DINSTALL_PROPRIETARY=FALSE</string>
                 </array>
@@ -2357,7 +3273,7 @@
                 <key>options</key>
                 <array>
                   <string>-DCMAKE_BUILD_TYPE:STRING=Release</string>
-                  <string>-DWORD_SIZE:STRING=32</string>
+                  <string>-DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE</string>
                   <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
                   <string>-DINSTALL_PROPRIETARY=TRUE</string>
                 </array>
@@ -2378,7 +3294,7 @@
                 <key>options</key>
                 <array>
                   <string>-DCMAKE_BUILD_TYPE:STRING=Release</string>
-                  <string>-DWORD_SIZE:STRING=32</string>
+                  <string>-DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE</string>
                   <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
                   <string>-DINSTALL_PROPRIETARY=FALSE</string>
                 </array>
@@ -2390,10 +3306,10 @@
           <key>name</key>
           <string>common</string>
         </map>
-        <key>darwin</key>
+        <key>darwin64</key>
         <map>
           <key>build_directory</key>
-          <string>build-darwin-i386</string>
+          <string>build-darwin-x86_64</string>
           <key>configurations</key>
           <map>
             <key>RelWithDebInfo</key>
@@ -2408,8 +3324,10 @@
                 </array>
                 <key>options</key>
                 <array>
-                  <string>-configuration RelWithDebInfo</string>
-                  <string>-project SecondLife.xcodeproj</string>
+                  <string>-configuration</string>
+                  <string>RelWithDebInfo</string>
+                  <string>-project</string>
+                  <string>SecondLife.xcodeproj</string>
                 </array>
               </map>
               <key>configure</key>
@@ -2421,7 +3339,7 @@
                 <key>options</key>
                 <array>
                   <string>-G</string>
-                  <string>'Xcode'</string>
+                  <string>Xcode</string>
                 </array>
               </map>
               <key>default</key>
@@ -2437,8 +3355,10 @@
                 <string>xcodebuild</string>
                 <key>options</key>
                 <array>
-                  <string>-configuration RelWithDebInfo</string>
-                  <string>-project SecondLife.xcodeproj</string>
+                  <string>-configuration</string>
+                  <string>RelWithDebInfo</string>
+                  <string>-project</string>
+                  <string>SecondLife.xcodeproj</string>
                 </array>
               </map>
               <key>configure</key>
@@ -2446,7 +3366,7 @@
                 <key>options</key>
                 <array>
                   <string>-G</string>
-                  <string>'Xcode'</string>
+                  <string>Xcode</string>
                 </array>
               </map>
               <key>name</key>
@@ -2464,10 +3384,10 @@
                 </array>
                 <key>options</key>
                 <array>
-                  <string>-configuration Release</string>
-                  <string>-project SecondLife.xcodeproj</string>
-                  <string>-DENABLE_SIGNING:BOOL=YES</string>
-                  <string>-DSIGNING_IDENTITY:STRING="Developer ID Application: Linden Research, Inc."</string>
+                  <string>-configuration</string>
+                  <string>Release</string>
+                  <string>-project</string>
+                  <string>SecondLife.xcodeproj</string>
                 </array>
               </map>
               <key>configure</key>
@@ -2479,7 +3399,7 @@
                 <key>options</key>
                 <array>
                   <string>-G</string>
-                  <string>'Xcode'</string>
+                  <string>Xcode</string>
                 </array>
               </map>
               <key>name</key>
@@ -2493,10 +3413,10 @@
                 <string>xcodebuild</string>
                 <key>options</key>
                 <array>
-                  <string>-configuration Release</string>
-                  <string>-project SecondLife.xcodeproj</string>
-                  <string>-DENABLE_SIGNING:BOOL=YES</string>
-                  <string>-DSIGNING_IDENTITY:STRING="Developer ID Application: Linden Research, Inc."</string>
+                  <string>-configuration</string>
+                  <string>Release</string>
+                  <string>-project</string>
+                  <string>SecondLife.xcodeproj</string>
                 </array>
               </map>
               <key>configure</key>
@@ -2504,7 +3424,7 @@
                 <key>options</key>
                 <array>
                   <string>-G</string>
-                  <string>'Xcode'</string>
+                  <string>Xcode</string>
                 </array>
               </map>
               <key>name</key>
@@ -2512,7 +3432,7 @@
             </map>
           </map>
           <key>name</key>
-          <string>darwin</string>
+          <string>darwin64</string>
         </map>
         <key>linux</key>
         <map>
@@ -2528,7 +3448,8 @@
                 <string>make</string>
                 <key>options</key>
                 <array>
-                  <string>-j 12</string>
+                  <string>-j</string>
+                  <string>12</string>
                 </array>
               </map>
               <key>configure</key>
@@ -2540,7 +3461,7 @@
                 <key>options</key>
                 <array>
                   <string>-G</string>
-                  <string>'Unix Makefiles'</string>
+                  <string>Unix Makefiles</string>
                 </array>
               </map>
               <key>default</key>
@@ -2556,7 +3477,8 @@
                 <string>make</string>
                 <key>options</key>
                 <array>
-                  <string>-j 7</string>
+                  <string>-j</string>
+                  <string>7</string>
                 </array>
               </map>
               <key>configure</key>
@@ -2564,7 +3486,7 @@
                 <key>options</key>
                 <array>
                   <string>-G</string>
-                  <string>'Unix Makefiles'</string>
+                  <string>Unix Makefiles</string>
                 </array>
               </map>
               <key>name</key>
@@ -2578,7 +3500,8 @@
                 <string>make</string>
                 <key>options</key>
                 <array>
-                  <string>-j 12</string>
+                  <string>-j</string>
+                  <string>12</string>
                 </array>
               </map>
               <key>configure</key>
@@ -2590,7 +3513,7 @@
                 <key>options</key>
                 <array>
                   <string>-G</string>
-                  <string>'Unix Makefiles'</string>
+                  <string>Unix Makefiles</string>
                 </array>
               </map>
               <key>name</key>
@@ -2604,7 +3527,8 @@
                 <string>make</string>
                 <key>options</key>
                 <array>
-                  <string>-j 7</string>
+                  <string>-j</string>
+                  <string>7</string>
                 </array>
               </map>
               <key>configure</key>
@@ -2612,7 +3536,7 @@
                 <key>options</key>
                 <array>
                   <string>-G</string>
-                  <string>'Unix Makefiles'</string>
+                  <string>Unix Makefiles</string>
                 </array>
               </map>
               <key>name</key>
@@ -2633,7 +3557,7 @@
         <key>windows</key>
         <map>
           <key>build_directory</key>
-          <string>build-vc120</string>
+          <string>build-vc120-$AUTOBUILD_ADDRSIZE</string>
           <key>configurations</key>
           <map>
             <key>RelWithDebInfo</key>
@@ -2649,7 +3573,7 @@
                 <key>options</key>
                 <array>
                   <string>/build</string>
-                  <string>"RelWithDebInfo|Win32"</string>
+                  <string>RelWithDebInfo|${AUTOBUILD_WIN_VSPLATFORM|NOTWIN}</string>
                 </array>
               </map>
               <key>configure</key>
@@ -2661,7 +3585,7 @@
                 <key>options</key>
                 <array>
                   <string>-G</string>
-                  <string>"Visual Studio 12"</string>
+                  <string>${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN}</string>
                 </array>
               </map>
               <key>default</key>
@@ -2682,12 +3606,12 @@
                 <key>options</key>
                 <array>
                   <string>/p:Configuration=RelWithDebInfo</string>
-                  <string>/p:Platform=Win32</string>
+                  <string>/p:Platform=${AUTOBUILD_WIN_VSPLATFORM|NOTWIN}</string>
                   <string>/t:Build</string>
                   <string>/p:useenv=true</string>
                   <string>/verbosity:minimal</string>
                   <string>/toolsversion:4.0</string>
-                  <string>/p:"VCBuildAdditionalOptions= /incremental"</string>
+                  <string>/p:VCBuildAdditionalOptions= /incremental</string>
                 </array>
               </map>
               <key>configure</key>
@@ -2699,7 +3623,8 @@
                 <key>options</key>
                 <array>
                   <string>-G</string>
-                  <string>"Visual Studio 12"</string>
+                  <string>${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN}</string>
+                  <string>-DUNATTENDED:BOOL=ON</string>
                   <string>-DINSTALL_PROPRIETARY=FALSE</string>
                   <string>-DUSE_KDU=FALSE</string>
                 </array>
@@ -2720,7 +3645,7 @@
                 <key>options</key>
                 <array>
                   <string>/build</string>
-                  <string>"Release|Win32"</string>
+                  <string>Release|${AUTOBUILD_WIN_VSPLATFORM|NOTWIN}</string>
                 </array>
               </map>
               <key>configure</key>
@@ -2732,7 +3657,7 @@
                 <key>options</key>
                 <array>
                   <string>-G</string>
-                  <string>"Visual Studio 12"</string>
+                  <string>${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN}</string>
                 </array>
               </map>
               <key>name</key>
@@ -2751,12 +3676,12 @@
                 <key>options</key>
                 <array>
                   <string>/p:Configuration=Release</string>
-                  <string>/p:Platform=Win32</string>
+                  <string>/p:Platform=${AUTOBUILD_WIN_VSPLATFORM|NOTWIN}</string>
                   <string>/t:Build</string>
                   <string>/p:useenv=true</string>
                   <string>/verbosity:minimal</string>
                   <string>/toolsversion:4.0</string>
-                  <string>/p:"VCBuildAdditionalOptions= /incremental"</string>
+                  <string>/p:VCBuildAdditionalOptions= /incremental</string>
                 </array>
               </map>
               <key>configure</key>
@@ -2768,7 +3693,8 @@
                 <key>options</key>
                 <array>
                   <string>-G</string>
-                  <string>"Visual Studio 12"</string>
+                  <string>${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN}</string>
+                  <string>-DUNATTENDED:BOOL=ON</string>
                   <string>-DINSTALL_PROPRIETARY=FALSE</string>
                   <string>-DUSE_KDU=FALSE</string>
                 </array>
diff --git a/build.sh b/build.sh
index ab7a1faa37fe89a07627ed51ffa7677576b32d2b..1d39ccf664d638aaff72849b8c2143b086cd3361 100755
--- a/build.sh
+++ b/build.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/usr/bin/env bash
 
 # This is the custom build script for the viewer
 #
@@ -18,7 +18,7 @@
 
 build_dir_Darwin()
 {
-  echo build-darwin-i386
+  echo build-darwin-x86_64
 }
 
 build_dir_Linux()
@@ -28,7 +28,7 @@ build_dir_Linux()
 
 build_dir_CYGWIN()
 {
-  echo build-vc120
+  echo build-vc120-${AUTOBUILD_ADDRSIZE}
 }
 
 viewer_channel_suffix()
@@ -47,8 +47,8 @@ viewer_channel_suffix()
 installer_Darwin()
 {
   local package_name="$1"
-  local package_dir="$(build_dir_Darwin ${last_built_variant:-Release})/newview/"
-  local pattern=".*$(viewer_channel_suffix ${package_name})_[0-9]+_[0-9]+_[0-9]+_[0-9]+_i386\\.dmg\$"
+  local package_dir="$(build_dir_Darwin)/newview/"
+  local pattern=".*$(viewer_channel_suffix ${package_name})_[0-9]+_[0-9]+_[0-9]+_[0-9]+_x86_64\\.dmg\$"
   # since the additional packages are built after the base package,
   # sorting oldest first ensures that the unqualified package is returned
   # even if someone makes a qualified name that duplicates the last word of the base name
@@ -59,7 +59,7 @@ installer_Darwin()
 installer_Linux()
 {
   local package_name="$1"
-  local package_dir="$(build_dir_Linux ${last_built_variant:-Release})/newview/"
+  local package_dir="$(build_dir_Linux)/newview/"
   local pattern=".*$(viewer_channel_suffix ${package_name})_[0-9]+_[0-9]+_[0-9]+_[0-9]+_i686\\.tar\\.bz2\$"
   # since the additional packages are built after the base package,
   # sorting oldest first ensures that the unqualified package is returned
@@ -95,14 +95,28 @@ pre_build()
     && [ -r "$master_message_template_checkout/message_template.msg" ] \
     && template_verifier_master_url="-DTEMPLATE_VERIFIER_MASTER_URL=file://$master_message_template_checkout/message_template.msg"
 
+    # nat 2016-12-20: disable HAVOK on Mac until we get a 64-bit Mac build.
+    RELEASE_CRASH_REPORTING=ON
+    HAVOK=ON
+    SIGNING=()
+    if [ "$arch" == "Darwin" ]
+    then
+         if [ "$variant" == "Release" ]
+         then SIGNING=("-DENABLE_SIGNING:BOOL=YES" \
+                       "-DSIGNING_IDENTITY:STRING=Developer ID Application: Linden Research, Inc.")
+         fi
+    fi
+
     "$autobuild" configure --quiet -c $variant -- \
      -DPACKAGE:BOOL=ON \
      -DUNATTENDED:BOOL=ON \
-     -DRELEASE_CRASH_REPORTING:BOOL=ON \
-     -DVIEWER_CHANNEL:STRING="\"$viewer_channel\"" \
+     -DHAVOK:BOOL="$HAVOK" \
+     -DRELEASE_CRASH_REPORTING:BOOL="$RELEASE_CRASH_REPORTING" \
+     -DVIEWER_CHANNEL:STRING="${viewer_channel}" \
      -DGRID:STRING="\"$viewer_grid\"" \
      -DLL_TESTS:BOOL="$run_tests" \
      -DTEMPLATE_VERIFIER_OPTIONS:STRING="$template_verifier_options" $template_verifier_master_url \
+     "${SIGNING[@]}" \
     || fatal "$variant configuration failed"
 
   end_section "Configure $variant"
@@ -112,21 +126,21 @@ package_llphysicsextensions_tpv()
 {
   begin_section "PhysicsExtensions_TPV"
   tpv_status=0
-  if [ "$variant" = "Release" ]
+  # nat 2016-12-21: without HAVOK, can't build PhysicsExtensions_TPV.
+  if [ "$variant" = "Release" -a "${HAVOK:-}" != "OFF" ]
   then 
-      llpetpvcfg=$build_dir/packages/llphysicsextensions/autobuild-tpv.xml
-      "$autobuild" build --quiet --config-file $llpetpvcfg -c Tpv
+      test -r  "$build_dir/packages/llphysicsextensions/autobuild-tpv.xml" || fatal "No llphysicsextensions_tpv autobuild configuration found"
+      tpvconfig=$(native_path "$build_dir/packages/llphysicsextensions/autobuild-tpv.xml")
+      "$autobuild" build --quiet --config-file "$tpvconfig" -c Tpv || fatal "failed to build llphysicsextensions_tpv"
       
       # capture the package file name for use in upload later...
       PKGTMP=`mktemp -t pgktpv.XXXXXX`
       trap "rm $PKGTMP* 2>/dev/null" 0
-      "$autobuild" package --quiet --config-file $llpetpvcfg --results-file "$(native_path $PKGTMP)"
+      "$autobuild" package --quiet --config-file "$tpvconfig" --results-file "$(native_path $PKGTMP)" || fatal "failed to package llphysicsextensions_tpv"
       tpv_status=$?
       if [ -r "${PKGTMP}" ]
       then
-          cat "${PKGTMP}" >> "$build_log"
-          eval $(cat "${PKGTMP}") # sets autobuild_package_{name,filename,md5}
-          autobuild_package_filename="$(shell_path "${autobuild_package_filename}")"
+          . "${PKGTMP}" # sets autobuild_package_{name,filename,md5}
           echo "${autobuild_package_filename}" > $build_dir/llphysicsextensions_package
       fi
   else
@@ -142,10 +156,14 @@ build()
   local variant="$1"
   if $build_viewer
   then
+    begin_section "autobuild $variant"
     "$autobuild" build --no-configure -c $variant || fatal "failed building $variant"
+    echo true >"$build_dir"/build_ok
+    end_section "autobuild $variant"
     
+    begin_section "extensions $variant"
     # Run build extensions
-    if [ $build_ok -eq 0 -a -d ${build_dir}/packages/build-extensions ]
+    if [ -d ${build_dir}/packages/build-extensions ]
     then
         for extension in ${build_dir}/packages/build-extensions/*.sh
         do
@@ -157,10 +175,10 @@ build()
 
     # *TODO: Make this a build extension.
     package_llphysicsextensions_tpv || fatal "failed building llphysicsextensions packages"
+    end_section "extensions $variant"
 
-    echo true >"$build_dir"/build_ok
   else
-      echo "Skipping build due to configuration build_viewer=${build_viewer}"
+      record_event "Skipping build due to configuration build_viewer=${build_viewer}"
       echo true >"$build_dir"/build_ok
   fi
 }
@@ -176,13 +194,9 @@ then
     exit 1
 fi
 
-# Check to see if we're skipping the platform
-if ! eval '$build_'"$arch"
-then
-    record_event "building on architecture $arch is disabled"
-    pass
-fi
+initialize_build # provided by master buildscripts build.sh
 
+begin_section "autobuild initialize"
 # ensure AUTOBUILD is in native path form for child processes
 AUTOBUILD="$(native_path "$AUTOBUILD")"
 # set "$autobuild" to cygwin path form for use locally in this script
@@ -194,7 +208,16 @@ then
 fi
 
 # load autobuild provided shell functions and variables
-eval "$("$autobuild" --quiet source_environment)"
+"$autobuild" --quiet source_environment > "$build_log_dir/source_environment"
+begin_section "dump source environment commands"
+cat "$build_log_dir/source_environment"
+end_section "dump source environment commands"
+
+begin_section "execute source environment commands"
+. "$build_log_dir/source_environment"
+end_section "execute source environment commands"
+
+end_section "autobuild initialize"
 
 # something about the additional_packages mechanism messes up buildscripts results.py on Linux
 # since we don't care about those packages on Linux, just zero it out, yes - a HACK
@@ -203,10 +226,9 @@ then
     export additional_packages=
 fi
 
-# dump environment variables for debugging
-begin_section "Environment"
-env|sort
-end_section "Environment"
+python_cmd "$helpers/codeticket.py" addinput "Viewer Channel" "${viewer_channel}"
+
+initialize_version # provided by buildscripts build.sh; sets version id
 
 # Now run the build
 succeeded=true
@@ -214,9 +236,6 @@ build_processes=
 last_built_variant=
 for variant in $variants
 do
-  eval '$build_'"$variant" || continue
-  eval '$build_'"$arch"_"$variant" || continue
-
   # Only the last built arch is available for upload
   last_built_variant="$variant"
 
@@ -232,6 +251,9 @@ do
   then
       begin_section "Build $variant"
       build "$variant" "$build_dir"
+      end_section "Build $variant"
+
+      begin_section "post-build $variant"
       if `cat "$build_dir/build_ok"`
       then
           case "$variant" in
@@ -239,10 +261,11 @@ do
               if [ -r "$build_dir/autobuild-package.xml" ]
               then
                   begin_section "Autobuild metadata"
-                  upload_item docs "$build_dir/autobuild-package.xml" text/xml
+                  python_cmd "$helpers/codeticket.py" addoutput "Autobuild Metadata" "$build_dir/autobuild-package.xml" --mimetype text/xml \
+                      || fatal "Upload of autobuild metadata failed"
                   if [ "$arch" != "Linux" ]
                   then
-                      record_dependencies_graph # defined in buildscripts/hg/bin/build.sh
+                      record_dependencies_graph "$build_dir/autobuild-package.xml" # defined in buildscripts/hg/bin/build.sh
                   else
                       record_event "TBD - no dependency graph for linux (probable python version dependency)"
                   fi
@@ -250,17 +273,25 @@ do
               else
                   record_event "no autobuild metadata at '$build_dir/autobuild-package.xml'"
               fi
+              if [ -r "$build_dir/newview/viewer_version.txt" ]
+              then
+                  begin_section "Viewer Version"
+                  python_cmd "$helpers/codeticket.py" addoutput "Viewer Version" "$(<"$build_dir/newview/viewer_version.txt")" --mimetype inline-text \
+                      || fatal "Upload of viewer version failed"
+                  end_section "Viewer Version"
+              fi
               ;;
             Doxygen)
               if [ -r "$build_dir/doxygen_warnings.log" ]
               then
                   record_event "Doxygen warnings generated; see doxygen_warnings.log"
-                  upload_item log "$build_dir/doxygen_warnings.log" text/plain
+                  python_cmd "$helpers/codeticket.py" addoutput "Doxygen Log" "$build_dir/doxygen_warnings.log" --mimetype text/plain ## TBD
               fi
               if [ -d "$build_dir/doxygen/html" ]
               then
                   tar -c -f "$build_dir/viewer-doxygen.tar.bz2" --strip-components 3  "$build_dir/doxygen/html"
-                  upload_item docs "$build_dir/viewer-doxygen.tar.bz2" binary/octet-stream
+                  python_cmd "$helpers/codeticket.py" addoutput "Doxygen Tarball" "$build_dir/viewer-doxygen.tar.bz2" \
+                      || fatal "Upload of doxygen tarball failed"
               fi
               ;;
             *)
@@ -270,7 +301,8 @@ do
       else
           record_failure "Build of \"$variant\" failed."
       fi
-      end_section "Build $variant"
+      end_section "post-build $variant"
+
   else
       record_event "configure for $variant failed: build skipped"
   fi
@@ -290,7 +322,7 @@ then
     if $build_viewer_deb && [ "$last_built_variant" == "Release" ]
     then
       begin_section "Build Viewer Debian Package"
-      have_private_repo=false
+
       # mangle the changelog
       dch --force-bad-version \
           --distribution unstable \
@@ -320,11 +352,14 @@ then
       # upload debian package and create repository
       begin_section "Upload Debian Repository"
       for deb_file in `/bin/ls ../packages_public/*.deb ../*.deb 2>/dev/null`; do
-        upload_item debian $deb_file binary/octet-stream
+        deb_pkg=$(basename "$deb_file" | sed 's,_.*,,')
+        python_cmd "$helpers/codeticket.py" addoutput "Debian $deb_pkg" $deb_file \
+            || fatal "Upload of debian $deb_pkg failed"
       done
       for deb_file in `/bin/ls ../packages_private/*.deb 2>/dev/null`; do
-        upload_item debian_private $deb_file binary/octet-stream
-        have_private_repo=true
+        deb_pkg=$(basename "$deb_file" | sed 's,_.*,,')
+        python_cmd "$helpers/codeticket.py" addoutput "Debian $deb_pkg" "$deb_file" --private \
+            || fatal "Upload of debian $deb_pkg failed"
       done
 
       create_deb_repo
@@ -336,14 +371,6 @@ then
           mv $build_log_dir/$debian_repo_type $build_log_dir/${debian_repo_type}_pushed
         fi
       done
-
-      if [ $have_private_repo = true ]; then
-        eval "$python_command \"$redirect\" '\${private_S3PROXY_URL}${S3PREFIX}repo/$repo/rev/$revision/index.html'"\
-            >"$build_log_dir/private.html" || fatal generating redirect
-        upload_item global_redirect "$build_log_dir/private.html" text/html
-        
-      fi
-
       end_section "Upload Debian Repository"
       
     else
@@ -359,18 +386,17 @@ if $succeeded
 then
   if $build_viewer
   then
-    begin_section Upload Installer
+    begin_section "Uploads"
     # Upload installer
     package=$(installer_$arch)
     if [ x"$package" = x ] || test -d "$package"
     then
-      record_event "??? mystery event $package // $build_coverity"
+      fatal "No installer found from `pwd`"
       succeeded=$build_coverity
     else
       # Upload base package.
-      upload_item installer "$package" binary/octet-stream
-      upload_item quicklink "$package" binary/octet-stream
-      [ -f $build_dir/summary.json ] && upload_item installer $build_dir/summary.json text/plain
+      python_cmd "$helpers/codeticket.py" addoutput Installer "$package"  \
+          || fatal "Upload of installer failed"
 
       # Upload additional packages.
       for package_id in $additional_packages
@@ -378,32 +404,44 @@ then
         package=$(installer_$arch "$package_id")
         if [ x"$package" != x ]
         then
-          upload_item installer "$package" binary/octet-stream
-          upload_item quicklink "$package" binary/octet-stream
+          python_cmd "$helpers/codeticket.py" addoutput "Installer $package_id" "$package" \
+              || fatal "Upload of installer $package_id failed"
         else
           record_failure "Failed to find additional package for '$package_id'."
         fi
       done
 
-      case "$last_built_variant" in
-      Release)
-        # Upload crash reporter files
-        for symbolfile in $symbolfiles
-        do
-          upload_item symbolfile "$build_dir/$symbolfile" binary/octet-stream
-        done
-
-        # Upload the llphysicsextensions_tpv package, if one was produced
-        # *TODO: Make this an upload-extension
-        if [ -r "$build_dir/llphysicsextensions_package" ]
-        then
-            llphysicsextensions_package=$(cat $build_dir/llphysicsextensions_package)
-            upload_item private_artifact "$llphysicsextensions_package" binary/octet-stream
-        fi
-        ;;
-      *)
-        ;;
-      esac
+      if [ "$last_built_variant" = "Release" ]
+      then
+          # nat 2016-12-22: without RELEASE_CRASH_REPORTING, we have no symbol file.
+          if [ "${RELEASE_CRASH_REPORTING:-}" != "OFF" ]
+          then
+              # Upload crash reporter file
+              # These names must match the set of VIEWER_SYMBOL_FILE in indra/newview/CMakeLists.txt
+              case "$arch" in
+                  CYGWIN)
+                      symbolfile="$build_dir/newview/Release/secondlife-symbols-windows-${AUTOBUILD_ADDRSIZE}.tar.bz2"
+                      ;;
+                  Darwin)
+                      symbolfile="$build_dir/newview/Release/secondlife-symbols-darwin-${AUTOBUILD_ADDRSIZE}.tar.bz2"
+                      ;;
+                  Linux)
+                      symbolfile="$build_dir/newview/Release/secondlife-symbols-linux-${AUTOBUILD_ADDRSIZE}.tar.bz2"
+                      ;;
+              esac
+              python_cmd "$helpers/codeticket.py" addoutput "Symbolfile" "$symbolfile" \
+                  || fatal "Upload of symbolfile failed"
+          fi
+
+          # Upload the llphysicsextensions_tpv package, if one was produced
+          # *TODO: Make this an upload-extension
+          if [ -r "$build_dir/llphysicsextensions_package" ]
+          then
+              llphysicsextensions_package=$(cat $build_dir/llphysicsextensions_package)
+              python_cmd "$helpers/codeticket.py" addoutput "Physics Extensions Package" "$llphysicsextensions_package" --private \
+                  || fatal "Upload of physics extensions package failed"
+          fi
+      fi
 
       # Run upload extensions
       if [ -d ${build_dir}/packages/upload-extensions ]; then
@@ -414,7 +452,7 @@ then
           done
       fi
     fi
-    end_section Upload Installer
+    end_section "Uploads"
   else
     record_event "skipping upload of installer"
   fi
diff --git a/indra/cmake/00-COMPILE-LINK-RUN.txt b/indra/cmake/00-COMPILE-LINK-RUN.txt
index 162b22865ca4b9723ded9fc868601a3f8be2be24..1933072a6d3ea3bb0b0e16d0b51f6f9313591d48 100644
--- a/indra/cmake/00-COMPILE-LINK-RUN.txt
+++ b/indra/cmake/00-COMPILE-LINK-RUN.txt
@@ -48,8 +48,8 @@ Compilation
                    LL_WINDOWS=1                  "                   "
                    UNICODE                       "                   "
                    _UNICODE                      "                   "
-                   WINVER=0x0501                 "                   "
-                   _WIN32_WINNT=0x0501           "                   "
+                   WINVER=0x0600                 "                   "
+                   _WIN32_WINNT=0x0600           "                   "
                    LL_OS_DRAGDROP_ENABLED=1      "                   "
                    LIB_NDOF=1                    "                   "
 
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index adc134c48cc787495471cdc9ccd20688794ad784..b582b47f1537525216e198631530408056bdb4aa 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -2,18 +2,34 @@
 #
 # Compilation options shared by all Second Life components.
 
+#*****************************************************************************
+#   It's important to realize that CMake implicitly concatenates
+#   CMAKE_CXX_FLAGS with (e.g.) CMAKE_CXX_FLAGS_RELEASE for Release builds. So
+#   set switches in CMAKE_CXX_FLAGS that should affect all builds, but in
+#   CMAKE_CXX_FLAGS_RELEASE or CMAKE_CXX_FLAGS_RELWITHDEBINFO for switches
+#   that should affect only that build variant.
+#
+#   Also realize that CMAKE_CXX_FLAGS may already be partially populated on
+#   entry to this file.
+#*****************************************************************************
+
 if(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED)
 set(${CMAKE_CURRENT_LIST_FILE}_INCLUDED "YES")
 
 include(Variables)
 
-# Portable compilation flags.
-set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG -DLL_DEBUG=1")
-set(CMAKE_CXX_FLAGS_RELEASE
-    "-DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 -DNDEBUG") 
+# We go to some trouble to set LL_BUILD to the set of relevant compiler flags.
+set(CMAKE_CXX_FLAGS_RELEASE "$ENV{LL_BUILD_RELEASE}")
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "$ENV{LL_BUILD_RELWITHDEBINFO}")
+set(CMAKE_CXX_FLAGS_DEBUG "$ENV{LL_BUILD_DEBUG}")
+# Given that, all the flags you see added below are flags NOT present in
+# https://bitbucket.org/lindenlab/viewer-build-variables/src/tip/variables.
+# Before adding new ones here, it's important to ask: can this flag really be
+# applied to the viewer only, or should/must it be applied to all 3p libraries
+# as well?
 
-set(CMAKE_CXX_FLAGS_RELWITHDEBINFO 
-    "-DLL_RELEASE=1 -DNDEBUG -DLL_RELEASE_WITH_DEBUG_INFO=1")
+# Portable compilation flags.
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DADDRESS_SIZE=${ADDRESS_SIZE}")
 
 # Configure crash reporting
 set(RELEASE_CRASH_REPORTING OFF CACHE BOOL "Enable use of crash reporting in release builds")
@@ -46,26 +62,25 @@ if (WINDOWS)
   # http://www.cmake.org/pipermail/cmake/2009-September/032143.html
   string(REPLACE "/Zm1000" " " CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
 
-  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP -D_SCL_SECURE_NO_WARNINGS=1"
-      CACHE STRING "C++ compiler debug options" FORCE)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
+
   set(CMAKE_CXX_FLAGS_RELWITHDEBINFO 
-      "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /Zo /MD /MP /Ob0 -D_SECURE_STL=0"
+      "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Zo"
       CACHE STRING "C++ compiler release-with-debug options" FORCE)
   set(CMAKE_CXX_FLAGS_RELEASE
-      "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /Zo /MD /MP /Ob2 -D_SECURE_STL=0 -D_HAS_ITERATOR_DEBUGGING=0"
+      "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /Zo"
       CACHE STRING "C++ compiler release options" FORCE)
   # zlib has assembly-language object files incompatible with SAFESEH
-  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE /SAFESEH:NO /NODEFAULTLIB:LIBCMT")
+  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE /SAFESEH:NO /NODEFAULTLIB:LIBCMT /IGNORE:4099")
 
   set(CMAKE_CXX_STANDARD_LIBRARIES "")
   set(CMAKE_C_STANDARD_LIBRARIES "")
 
   add_definitions(
-      /DLL_WINDOWS=1
       /DNOMINMAX
 #      /DDOM_DYNAMIC            # For shared library colladadom
-      /DUNICODE
-      /D_UNICODE 
+      )
+  add_compile_options(
       /GS
       /TP
       /W3
@@ -73,94 +88,41 @@ if (WINDOWS)
       /Zc:forScope
       /nologo
       /Oy-
-      /Zc:wchar_t-
-      /arch:SSE2
+#      /arch:SSE2
       /fp:fast
       )
+
+  # Nicky: x64 implies SSE2
+  if( ADDRESS_SIZE EQUAL 32 )
+    add_definitions( /arch:SSE2 )
+  endif()
      
   # Are we using the crummy Visual Studio KDU build workaround?
   if (NOT VS_DISABLE_FATAL_WARNINGS)
     add_definitions(/WX)
   endif (NOT VS_DISABLE_FATAL_WARNINGS)
-
-  # configure Win32 API for Windows Vista+ compatibility
-  set(WINVER "0x0600" CACHE STRING "Win32 API Target version (see http://msdn.microsoft.com/en-us/library/aa383745%28v=VS.85%29.aspx)")
-  add_definitions("/DWINVER=${WINVER}" "/D_WIN32_WINNT=${WINVER}")
 endif (WINDOWS)
 
 
 if (LINUX)
   set(CMAKE_SKIP_RPATH TRUE)
 
-  # Here's a giant hack for Fedora 8, where we can't use
-  # _FORTIFY_SOURCE if we're using a compiler older than gcc 4.1.
-
-  find_program(GXX g++)
-  mark_as_advanced(GXX)
-
-  if (GXX)
-    execute_process(
-        COMMAND ${GXX} --version
-        COMMAND sed "s/^[gc+ ]*//"
-        COMMAND head -1
-        OUTPUT_VARIABLE GXX_VERSION
-        OUTPUT_STRIP_TRAILING_WHITESPACE
-        )
-  else (GXX)
-    set(GXX_VERSION x)
-  endif (GXX)
-
-  # The quoting hack here is necessary in case we're using distcc or
-  # ccache as our compiler.  CMake doesn't pass the command line
-  # through the shell by default, so we end up trying to run "distcc"
-  # " g++" - notice the leading space.  Ugh.
-
-  execute_process(
-      COMMAND sh -c "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} --version"
-      COMMAND sed "s/^[gc+ ]*//"
-      COMMAND head -1
-      OUTPUT_VARIABLE CXX_VERSION
-      OUTPUT_STRIP_TRAILING_WHITESPACE)
-
-  if (${GXX_VERSION} STREQUAL ${CXX_VERSION})
-    add_definitions(-D_FORTIFY_SOURCE=2)
-  else (${GXX_VERSION} STREQUAL ${CXX_VERSION})
-    if (NOT ${GXX_VERSION} MATCHES " 4.1.*Red Hat")
-      add_definitions(-D_FORTIFY_SOURCE=2)
-    endif (NOT ${GXX_VERSION} MATCHES " 4.1.*Red Hat")
-  endif (${GXX_VERSION} STREQUAL ${CXX_VERSION})
-
-  # Let's actually get a numerical version of gxx's version
-  STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION_NUMBER ${CXX_VERSION})
-
-  # Hacks to work around gcc 4.1 TC build pool machines which can't process pragma warning disables
-  # This is pure rubbish; I wish there was another way.
-  #
-  if(${CXX_VERSION_NUMBER} LESS 420)
-    set(CMAKE_CXX_FLAGS "-Wno-deprecated -Wno-uninitialized -Wno-unused-variable -Wno-unused-function ${CMAKE_CXX_FLAGS}")
-  endif (${CXX_VERSION_NUMBER} LESS 420)
-
-  if(${CXX_VERSION_NUMBER} GREATER 459)
-    set(CMAKE_CXX_FLAGS "-Wno-deprecated -Wno-unused-but-set-variable -Wno-unused-variable ${CMAKE_CXX_FLAGS}")
-  endif (${CXX_VERSION_NUMBER} GREATER 459)
+  add_definitions(-D_FORTIFY_SOURCE=2)
+
+  set(CMAKE_CXX_FLAGS "-Wno-deprecated -Wno-unused-but-set-variable -Wno-unused-variable ${CMAKE_CXX_FLAGS}")
 
   # gcc 4.3 and above don't like the LL boost and also
   # cause warnings due to our use of deprecated headers
-  if(${CXX_VERSION_NUMBER} GREATER 429)
-    add_definitions(-Wno-parentheses)
-    set(CMAKE_CXX_FLAGS "-Wno-deprecated ${CMAKE_CXX_FLAGS}")
-  endif (${CXX_VERSION_NUMBER} GREATER 429)
-
-  # End of hacks.
+  add_definitions(-Wno-parentheses)
 
   add_definitions(
-      -DLL_LINUX=1
       -D_REENTRANT
+      )
+  add_compile_options(
       -fexceptions
       -fno-math-errno
       -fno-strict-aliasing
       -fsigned-char
-      -g
       -msse2
       -mfpmath=sse
       -pthread
@@ -170,39 +132,43 @@ if (LINUX)
   add_definitions(-DEXTERNAL_TOS)
 
   add_definitions(-DAPPID=secondlife)
-  add_definitions(-fvisibility=hidden)
-  # don't catch SIGCHLD in our base application class for the viewer - some of our 3rd party libs may need their *own* SIGCHLD handler to work.  Sigh!  The viewer doesn't need to catch SIGCHLD anyway.
+  add_compile_options(-fvisibility=hidden)
+  # don't catch SIGCHLD in our base application class for the viewer - some of
+  # our 3rd party libs may need their *own* SIGCHLD handler to work. Sigh! The
+  # viewer doesn't need to catch SIGCHLD anyway.
   add_definitions(-DLL_IGNORE_SIGCHLD)
-  if (WORD_SIZE EQUAL 32)
-    add_definitions(-march=pentium4)
-  endif (WORD_SIZE EQUAL 32)
-  add_definitions(-mfpmath=sse)
-  #add_definitions(-ftree-vectorize) # THIS CRASHES GCC 3.1-3.2
+  if (ADDRESS_SIZE EQUAL 32)
+    add_compile_options(-march=pentium4)
+  endif (ADDRESS_SIZE EQUAL 32)
+  #add_compile_options(-ftree-vectorize) # THIS CRASHES GCC 3.1-3.2
   if (NOT USESYSTEMLIBS)
     # this stops us requiring a really recent glibc at runtime
-    add_definitions(-fno-stack-protector)
+    add_compile_options(-fno-stack-protector)
     # linking can be very memory-hungry, especially the final viewer link
     set(CMAKE_CXX_LINK_FLAGS "-Wl,--no-keep-memory")
   endif (NOT USESYSTEMLIBS)
 
   set(CMAKE_CXX_FLAGS_DEBUG "-fno-inline ${CMAKE_CXX_FLAGS_DEBUG}")
-  set(CMAKE_CXX_FLAGS_RELEASE "-O2 ${CMAKE_CXX_FLAGS_RELEASE}")
 endif (LINUX)
 
 
 if (DARWIN)
-  add_definitions(-DLL_DARWIN=1)
-  set(CMAKE_CXX_LINK_FLAGS "-Wl,-no_compact_unwind -Wl,-headerpad_max_install_names,-search_paths_first")
+  set(CMAKE_CXX_LINK_FLAGS "-Wl,-headerpad_max_install_names,-search_paths_first")
   set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
-  set(DARWIN_extra_cstar_flags "-g -Wno-unused-local-typedef -Wno-deprecated-declarations")
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${DARWIN_extra_cstar_flags}")
+  set(DARWIN_extra_cstar_flags "-Wno-unused-local-typedef -Wno-deprecated-declarations")
+  # The viewer code base can now be successfully compiled with -std=c++14. But
+  # turning that on in the generic viewer-build-variables/variables file would
+  # potentially require tweaking each of our ~50 third-party library builds.
+  # Until we decide to set -std=c++14 in viewer-build-variables/variables, set
+  # it locally here: we want to at least prevent inadvertently reintroducing
+  # viewer code that would fail with C++14.
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${DARWIN_extra_cstar_flags} -std=c++14")
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  ${DARWIN_extra_cstar_flags}")
   # NOTE: it's critical that the optimization flag is put in front.
   # NOTE: it's critical to have both CXX_FLAGS and C_FLAGS covered.
-  set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O0 ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
-  set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O0 ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
-  set(ENABLE_SIGNING TRUE)
-  set(SIGNING_IDENTITY "Developer ID Application: Linden Research, Inc.")
+## Really?? On developer machines too?
+##set(ENABLE_SIGNING TRUE)
+##set(SIGNING_IDENTITY "Developer ID Application: Linden Research, Inc.")
 endif (DARWIN)
 
 
@@ -226,22 +192,17 @@ if (LINUX OR DARWIN)
   set(CMAKE_C_FLAGS "${GCC_WARNINGS} ${CMAKE_C_FLAGS}")
   set(CMAKE_CXX_FLAGS "${GCC_CXX_WARNINGS} ${CMAKE_CXX_FLAGS}")
 
-  if (WORD_SIZE EQUAL 32)
-    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
-  elseif (WORD_SIZE EQUAL 64)
-    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64")
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
-  endif (WORD_SIZE EQUAL 32)
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m${ADDRESS_SIZE}")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m${ADDRESS_SIZE}")
 endif (LINUX OR DARWIN)
 
 
 if (USESYSTEMLIBS)
   add_definitions(-DLL_USESYSTEMLIBS=1)
 
-  if (LINUX AND ${ARCH} STREQUAL "i686")
+  if (LINUX AND ADDRESS_SIZE EQUAL 32)
     add_definitions(-march=pentiumpro)
-  endif (LINUX AND ${ARCH} STREQUAL "i686")
+  endif (LINUX AND ADDRESS_SIZE EQUAL 32)
 
 else (USESYSTEMLIBS)
   set(${ARCH}_linux_INCLUDES
diff --git a/indra/cmake/BuildPackagesInfo.cmake b/indra/cmake/BuildPackagesInfo.cmake
index 0f574ee39a17b08da618b5ed84169ec4b5744039..93461cea953c54f0d0b17bb3670c81df841186bb 100644
--- a/indra/cmake/BuildPackagesInfo.cmake
+++ b/indra/cmake/BuildPackagesInfo.cmake
@@ -2,9 +2,18 @@
 # Construct the version and copyright information based on package data.
 include(Python)
 
+# packages-formatter.py runs autobuild install --versions, which needs to know
+# the build_directory, which (on Windows) depends on AUTOBUILD_ADDRSIZE.
+# Within an autobuild build, AUTOBUILD_ADDRSIZE is already set. But when
+# building in an IDE, it probably isn't. Set it explicitly using
+# run_build_test.py.
 add_custom_command(OUTPUT packages-info.txt
   COMMENT Generating packages-info.txt for the about box
   MAIN_DEPENDENCY ${CMAKE_SOURCE_DIR}/../autobuild.xml
   DEPENDS ${CMAKE_SOURCE_DIR}/../scripts/packages-formatter.py
-  COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/../scripts/packages-formatter.py > packages-info.txt
+          ${CMAKE_SOURCE_DIR}/../autobuild.xml
+  COMMAND ${PYTHON_EXECUTABLE}
+          ${CMAKE_SOURCE_DIR}/cmake/run_build_test.py -DAUTOBUILD_ADDRSIZE=${ADDRESS_SIZE}
+          ${PYTHON_EXECUTABLE}
+          ${CMAKE_SOURCE_DIR}/../scripts/packages-formatter.py "${VIEWER_CHANNEL}" "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}" > packages-info.txt
   )
diff --git a/indra/cmake/BuildVersion.cmake b/indra/cmake/BuildVersion.cmake
index 6ffa698a1c65132e172d6a59eba196b6a9f36f2b..157fdd07e4c19f5ee97e5d25ac91dcd92a4bc4a2 100644
--- a/indra/cmake/BuildVersion.cmake
+++ b/indra/cmake/BuildVersion.cmake
@@ -14,6 +14,10 @@ if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/n
            set(VIEWER_VERSION_REVISION $ENV{revision})
            message(STATUS "Revision (from environment): ${VIEWER_VERSION_REVISION}")
 
+        elseif (DEFINED ENV{AUTOBUILD_BUILD_ID})
+           set(VIEWER_VERSION_REVISION $ENV{AUTOBUILD_BUILD_ID})
+           message(STATUS "Revision (from autobuild environment): ${VIEWER_VERSION_REVISION}")
+
         else (DEFINED ENV{revision})
           find_program(MERCURIAL
                        NAMES hg
@@ -54,7 +58,7 @@ if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/n
     endif ("${VIEWER_VERSION_REVISION}" STREQUAL "")
 
     set(VIEWER_CHANNEL_VERSION_DEFINES
-        "LL_VIEWER_CHANNEL=\"${VIEWER_CHANNEL}\""
+        "LL_VIEWER_CHANNEL=${VIEWER_CHANNEL}"
         "LL_VIEWER_VERSION_MAJOR=${VIEWER_VERSION_MAJOR}"
         "LL_VIEWER_VERSION_MINOR=${VIEWER_VERSION_MINOR}"
         "LL_VIEWER_VERSION_PATCH=${VIEWER_VERSION_PATCH}"
diff --git a/indra/cmake/CEFPlugin.cmake b/indra/cmake/CEFPlugin.cmake
index 9cfb7d14c7994d06d1e0163b15e3e1a46b7b78d6..b8e569d3a844886581c7de916388ca5291d0d3c1 100644
--- a/indra/cmake/CEFPlugin.cmake
+++ b/indra/cmake/CEFPlugin.cmake
@@ -6,7 +6,7 @@ if (USESYSTEMLIBS)
     set(CEFPLUGIN OFF CACHE BOOL
         "CEFPLUGIN support for the llplugin/llmedia test apps.")
 else (USESYSTEMLIBS)
-    use_prebuilt_binary(llceflib)
+    use_prebuilt_binary(dullahan)
     set(CEFPLUGIN ON CACHE BOOL
         "CEFPLUGIN support for the llplugin/llmedia test apps.")
         set(CEF_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/cef)
@@ -16,7 +16,7 @@ if (WINDOWS)
     set(CEF_PLUGIN_LIBRARIES
         libcef.lib
         libcef_dll_wrapper.lib
-        llceflib.lib
+        dullahan.lib
     )
 elseif (DARWIN)
     FIND_LIBRARY(APPKIT_LIBRARY AppKit)
@@ -31,7 +31,7 @@ elseif (DARWIN)
 
     set(CEF_PLUGIN_LIBRARIES
         ${ARCH_PREBUILT_DIRS_RELEASE}/libcef_dll_wrapper.a
-        ${ARCH_PREBUILT_DIRS_RELEASE}/libLLCefLib.a
+        ${ARCH_PREBUILT_DIRS_RELEASE}/libdullahan.a
         ${APPKIT_LIBRARY}
         ${CEF_LIBRARY}
        )
diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt
index 13a31cbce7d02c488e6a782e1f6a04ce58db798d..100645611e13c215d7f1559ef3ac7b7a4b5ee285 100644
--- a/indra/cmake/CMakeLists.txt
+++ b/indra/cmake/CMakeLists.txt
@@ -30,7 +30,6 @@ set(cmake_SOURCE_FILES
     FindFMODEX.cmake
     FindGLH.cmake
     FindGoogleBreakpad.cmake
-    FindGooglePerfTools.cmake
     FindHUNSPELL.cmake
     FindJsonCpp.cmake
     FindNDOF.cmake
@@ -46,11 +45,8 @@ set(cmake_SOURCE_FILES
     GLOD.cmake
 ##  GStreamer010Plugin.cmake
     GetPrerequisites_2_8.cmake
-##  Glui.cmake
-    Glut.cmake
     GoogleBreakpad.cmake
     GoogleMock.cmake
-    GooglePerfTools.cmake
     Havok.cmake
     Hunspell.cmake
     JPEG.cmake
@@ -90,7 +86,6 @@ set(cmake_SOURCE_FILES
     Prebuilt.cmake
     PulseAudio.cmake
     Python.cmake
-    QuickTimePlugin.cmake
     TemplateCheck.cmake
     Tut.cmake
     UI.cmake
diff --git a/indra/cmake/ConfigurePkgConfig.cmake b/indra/cmake/ConfigurePkgConfig.cmake
index 82ee3e7a5b54d107e852ea17bab037c76c3d9c16..55d865392e37b294459166116c8bdf71d0fdc121 100644
--- a/indra/cmake/ConfigurePkgConfig.cmake
+++ b/indra/cmake/ConfigurePkgConfig.cmake
@@ -6,17 +6,17 @@ SET(DEBUG_PKG_CONFIG "YES")
 IF("$ENV{PKG_CONFIG_LIBDIR}" STREQUAL "")
 
   # Guess at architecture-specific system library paths.
-  if (WORD_SIZE EQUAL 32)
+  if (ADDRESS_SIZE EQUAL 32)
     SET(PKG_CONFIG_NO_MULTI_GUESS /usr/lib32 /usr/lib)
     SET(PKG_CONFIG_NO_MULTI_LOCAL_GUESS /usr/local/lib32 /usr/local/lib)
     SET(PKG_CONFIG_MULTI_GUESS /usr/lib/i386-linux-gnu)
     SET(PKG_CONFIG_MULTI_LOCAL_GUESS /usr/local/lib/i386-linux-gnu)
-  else (WORD_SIZE EQUAL 32)
+  else (ADDRESS_SIZE EQUAL 32)
     SET(PKG_CONFIG_NO_MULTI_GUESS /usr/lib64 /usr/lib)
     SET(PKG_CONFIG_NO_MULTI_LOCAL_GUESS /usr/local/lib64 /usr/local/lib)
     SET(PKG_CONFIG_MULTI_GUESS /usr/local/lib/x86_64-linux-gnu)
     SET(PKG_CONFIG_MULTI_LOCAL_GUESS /usr/local/lib/x86_64-linux-gnu)
-  endif (WORD_SIZE EQUAL 32)
+  endif (ADDRESS_SIZE EQUAL 32)
   
   # Use DPKG architecture, if available.
   IF (${DPKG_ARCH})
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 70d85b864ca4edac22ef1be9c7347acab354a337..43188673eba6c95b10f5bae68cd1b5c5fc4e364b 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -30,18 +30,6 @@ if(WINDOWS)
     #*******************************
     # Misc shared libs 
 
-    set(debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}")
-    set(debug_files
-        openjpegd.dll
-        libapr-1.dll
-        libaprutil-1.dll
-        libapriconv-1.dll
-        ssleay32.dll
-        libeay32.dll
-        glod.dll    
-        libhunspell.dll
-        )
-
     set(release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
     set(release_files
         openjpeg.dll
@@ -54,14 +42,13 @@ if(WINDOWS)
         libhunspell.dll
         )
 
-    if(USE_TCMALLOC)
-      set(debug_files ${debug_files} libtcmalloc_minimal-debug.dll)
-      set(release_files ${release_files} libtcmalloc_minimal.dll)
-    endif(USE_TCMALLOC)
-
     if (FMODEX)
-      set(debug_files ${debug_files} fmodexL.dll)
-      set(release_files ${release_files} fmodex.dll)
+
+        if(ADDRESS_SIZE EQUAL 32)
+            set(release_files ${release_files} fmodex.dll)
+        else(ADDRESS_SIZE EQUAL 32)
+            set(release_files ${release_files} fmodex64.dll)
+        endif(ADDRESS_SIZE EQUAL 32)
     endif (FMODEX)
 
     #*******************************
@@ -80,8 +67,9 @@ if(WINDOWS)
     endif (MSVC80)
 
     # try to copy VS2010 redist independently of system version
-    list(APPEND LMSVC_VER 100)
-    list(APPEND LMSVC_VERDOT 10.0)
+    # maint-7360 CP
+    # list(APPEND LMSVC_VER 100)
+    # list(APPEND LMSVC_VERDOT 10.0)
     
     list(LENGTH LMSVC_VER count)
     math(EXPR count "${count}-1")
@@ -115,12 +103,17 @@ if(WINDOWS)
             unset(debug_msvc_redist_path CACHE)
         endif()
 
+        if(ADDRESS_SIZE EQUAL 32)
+            # this folder contains the 32bit DLLs.. (yes really!)
+            set(registry_find_path "[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/SysWOW64")
+        else(ADDRESS_SIZE EQUAL 32)
+            # this folder contains the 64bit DLLs.. (yes really!)
+            set(registry_find_path "[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/System32")
+        endif(ADDRESS_SIZE EQUAL 32)
+
         FIND_PATH(release_msvc_redist_path NAME msvcr${MSVC_VER}.dll
             PATHS            
-            [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\${MSVC_VERDOT}\\Setup\\VC;ProductDir]/redist/x86/Microsoft.VC${MSVC_VER}.CRT
-            [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/SysWOW64
-            [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/System32
-            ${MSVC_REDIST_PATH}
+            ${registry_find_path}
             NO_DEFAULT_PATH
             )
 
@@ -175,10 +168,8 @@ elseif(DARWIN)
         libaprutil-1.0.dylib
         libaprutil-1.dylib
         libexception_handler.dylib
-        libexpat.1.5.2.dylib
-        libexpat.dylib
+        ${EXPAT_COPY}
         libGLOD.dylib
-        libhunspell-1.3.0.dylib
         libndofdev.dylib
        )
 
@@ -218,8 +209,7 @@ elseif(LINUX)
         libaprutil-1.so.0
         libatk-1.0.so
         libdb-5.1.so
-        libexpat.so
-        libexpat.so.1
+        ${EXPAT_COPY}
         libfreetype.so.6.6.2
         libfreetype.so.6
         libGLOD.so
@@ -234,10 +224,6 @@ elseif(LINUX)
         libfontconfig.so.1
        )
 
-    if (USE_TCMALLOC)
-      set(release_files ${release_files} "libtcmalloc_minimal.so")
-    endif (USE_TCMALLOC)
-
     if (FMODEX)
       set(debug_files ${debug_files} "libfmodexL.so")
       set(release_files ${release_files} "libfmodex.so")
@@ -294,13 +280,13 @@ set(third_party_targets ${third_party_targets} ${out_targets})
 
 
 
-copy_if_different(
-    ${debug_src_dir}
-    "${SHARED_LIB_STAGING_DIR_DEBUG}"
-    out_targets
-    ${debug_files}
-    )
-set(third_party_targets ${third_party_targets} ${out_targets})
+#copy_if_different(
+#    ${debug_src_dir}
+#    "${SHARED_LIB_STAGING_DIR_DEBUG}"
+#    out_targets
+#    ${debug_files}
+#    )
+#set(third_party_targets ${third_party_targets} ${out_targets})
 
 copy_if_different(
     ${release_src_dir}
diff --git a/indra/cmake/DeploySharedLibs.cmake b/indra/cmake/DeploySharedLibs.cmake
index 663c272e502ffca8e33b2e7c7784e672a85bf687..e57fd5eee3f1a2f58f19d7974d49d3f868355620 100644
--- a/indra/cmake/DeploySharedLibs.cmake
+++ b/indra/cmake/DeploySharedLibs.cmake
@@ -12,7 +12,7 @@
 get_filename_component(current_dir ${CMAKE_CURRENT_LIST_FILE} PATH)
 include(${current_dir}/GetPrerequisites_2_8.cmake)
 
-message("Getting recursive dependencies for file: ${BIN_NAME}")
+message(STATUS "Getting recursive dependencies for file: ${BIN_NAME}")
 
 set(EXCLUDE_SYSTEM 1)
 set(RECURSE 1)
@@ -21,7 +21,7 @@ get_filename_component(EXE_PATH ${BIN_NAME} PATH)
 get_prerequisites( ${BIN_NAME} RESULTS ${EXCLUDE_SYSTEM} ${RECURSE} "${EXE_PATH}" "${SEARCH_DIRS}" )
 
 foreach(DEP ${RESULTS})
-  Message("Processing dependency: ${DEP}")
+  Message(STATUS "Processing dependency: ${DEP}")
   get_filename_component(DEP_FILE ${DEP} NAME)
   set(DEP_FILES ${DEP_FILES} ${DEP_FILE})
 endforeach(DEP)
@@ -64,10 +64,10 @@ if(FOUND_FILES)
   foreach(FILE ${FOUND_FILES})
     get_filename_component(DST_FILE ${FILE} NAME)
     set(DST_FILE "${DST_PATH}/${DST_FILE}")
-    message("Copying ${FILE} to ${DST_FILE}")
+    message(STATUS "Copying ${FILE} to ${DST_FILE}")
     execute_process(
       COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILE} ${DST_FILE}
       )
   endforeach(FILE ${FOUND_FILES})
 endif(FOUND_FILES)
-message("Success!")
+
diff --git a/indra/cmake/EXPAT.cmake b/indra/cmake/EXPAT.cmake
index c1155531ff6d1a4e9b52d3edd3eafba294b499a2..cddc71b227525f1d4f6b18879c92b59d2c371f33 100644
--- a/indra/cmake/EXPAT.cmake
+++ b/indra/cmake/EXPAT.cmake
@@ -10,8 +10,14 @@ else (USESYSTEMLIBS)
     use_prebuilt_binary(expat)
     if (WINDOWS)
         set(EXPAT_LIBRARIES libexpatMT)
+        set(EXPAT_COPY libexpatMT.dll)
     else (WINDOWS)
         set(EXPAT_LIBRARIES expat)
+        if (DARWIN)
+            set(EXPAT_COPY libexpat.1.dylib libexpat.dylib)
+        else ()
+            set(EXPAT_COPY libexpat.so.1 libexpat.so)
+        endif ()
     endif (WINDOWS)
     set(EXPAT_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
 endif (USESYSTEMLIBS)
diff --git a/indra/cmake/FindHUNSPELL.cmake b/indra/cmake/FindHUNSPELL.cmake
index 6faf22959c65ab189f5c10e3b3afdfaba00bd973..d411bdb9e5eba98c57ecca9f96c0cefc7f11a7f1 100644
--- a/indra/cmake/FindHUNSPELL.cmake
+++ b/indra/cmake/FindHUNSPELL.cmake
@@ -10,7 +10,7 @@ find_path(HUNSPELL_INCLUDE_DIR hunspell.h
   PATH_SUFFIXES hunspell
   )
 
-set(HUNSPELL_NAMES ${HUNSPELL_NAMES} libhunspell-1.3.0 libhunspell)
+set(HUNSPELL_NAMES ${HUNSPELL_NAMES} libhunspell-1.3 libhunspell)
 find_library(HUNSPELL_LIBRARY
   NAMES ${HUNSPELL_NAMES}
   )
diff --git a/indra/cmake/GLEXT.cmake b/indra/cmake/GLEXT.cmake
index 2a08c8fbaeb5890f50ca288d29ee6bd68852ab72..9fd3923bfd9b2448a4edd171a7cf299b43d24127 100644
--- a/indra/cmake/GLEXT.cmake
+++ b/indra/cmake/GLEXT.cmake
@@ -5,6 +5,6 @@ if (NOT USESYSTEMLIBS)
   if (WINDOWS OR LINUX)
     use_prebuilt_binary(glext)
   endif (WINDOWS OR LINUX)
-  use_prebuilt_binary(glh-linear)
+  use_prebuilt_binary(glh_linear)
   set(GLEXT_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
 endif (NOT USESYSTEMLIBS)
diff --git a/indra/cmake/GLH.cmake b/indra/cmake/GLH.cmake
index d0992f57b8217ef3eb12a8908705eb7995a5e768..d5262f2efa79acafca6fa6661a2bd81d6dcbbdd1 100644
--- a/indra/cmake/GLH.cmake
+++ b/indra/cmake/GLH.cmake
@@ -7,5 +7,5 @@ set(GLH_FIND_QUIETLY TRUE)
 if (USESYSTEMLIBS)
   include(FindGLH)
 else (USESYSTEMLIBS)
-  use_prebuilt_binary(glh-linear)
+  use_prebuilt_binary(glh_linear)
 endif (USESYSTEMLIBS)
diff --git a/indra/cmake/Glui.cmake b/indra/cmake/Glui.cmake
deleted file mode 100644
index db353a91ecaa9d85d1c3c0a1920980c26c16d756..0000000000000000000000000000000000000000
--- a/indra/cmake/Glui.cmake
+++ /dev/null
@@ -1,28 +0,0 @@
-# -*- cmake -*-
-include(Linking)
-include(Prebuilt)
-
-if (USESYSTEMLIBS)
-    set(GLUI OFF CACHE BOOL
-        "GLUI support for the llplugin/llmedia test apps.")
-else (USESYSTEMLIBS)
-    use_prebuilt_binary(glui)
-    set(GLUI ON CACHE BOOL
-        "GLUI support for the llplugin/llmedia test apps.")
-endif (USESYSTEMLIBS)
-
-if (LINUX)
-    set(GLUI ON CACHE BOOL
-        "llplugin media apps HACK for Linux.")
-endif (LINUX)
-
-if (DARWIN OR LINUX)
-    set(GLUI_LIBRARY
-        glui)
-endif (DARWIN OR LINUX)
-
-if (WINDOWS)
-    set(GLUI_LIBRARY
-        debug glui32.lib
-        optimized glui32.lib)
-endif (WINDOWS)
diff --git a/indra/cmake/Glut.cmake b/indra/cmake/Glut.cmake
deleted file mode 100644
index 314da30652d2da78807112d6b48050b5792f37bd..0000000000000000000000000000000000000000
--- a/indra/cmake/Glut.cmake
+++ /dev/null
@@ -1,19 +0,0 @@
-# -*- cmake -*-
-include(Linking)
-include(Prebuilt)
-
-if (WINDOWS)
-    use_prebuilt_binary(freeglut)
-    set(GLUT_LIBRARY
-        debug freeglut_static.lib
-        optimized freeglut_static.lib)
-endif (WINDOWS)
-
-if (LINUX)
-  FIND_LIBRARY(GLUT_LIBRARY glut)
-endif (LINUX)
-
-if (DARWIN)
-  include(CMakeFindFrameworks)
-  find_library(GLUT_LIBRARY GLUT)
-endif (DARWIN)
diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake
deleted file mode 100644
index c1faeb9325241f4f54298fb6b97d9ddc3cd68b97..0000000000000000000000000000000000000000
--- a/indra/cmake/GooglePerfTools.cmake
+++ /dev/null
@@ -1,61 +0,0 @@
-# -*- cmake -*-
-include(Prebuilt)
-
-# If you want to enable or disable TCMALLOC in viewer builds, this is the place.
-# set ON or OFF as desired.
-set (USE_TCMALLOC OFF)
-
-if (USESYSTEMLIBS)
-  include(FindGooglePerfTools)
-else (USESYSTEMLIBS)
-  if (WINDOWS)
-    if (USE_TCMALLOC)
-       use_prebuilt_binary(gperftools)
-       set(TCMALLOC_LIBRARIES 
-         debug libtcmalloc_minimal-debug
-         optimized libtcmalloc_minimal)
-       set(TCMALLOC_LINK_FLAGS  "/INCLUDE:__tcmalloc")
-    else (USE_TCMALLOC)
-      set(TCMALLOC_LIBRARIES)
-      set(TCMALLOC_LINK_FLAGS)
-    endif (USE_TCMALLOC)
-    set(GOOGLE_PERFTOOLS_FOUND "YES")
-  endif (WINDOWS)
-  if (LINUX)
-    if (USE_TCMALLOC)
-      use_prebuilt_binary(gperftools)
-      set(TCMALLOC_LIBRARIES 
-        tcmalloc)
-    else (USE_TCMALLOC)
-      set(TCMALLOC_LIBRARIES)
-    endif (USE_TCMALLOC)
-    set(PROFILER_LIBRARIES profiler)
-    set(GOOGLE_PERFTOOLS_INCLUDE_DIR
-        ${LIBS_PREBUILT_DIR}/include)
-    set(GOOGLE_PERFTOOLS_FOUND "YES")
-  endif (LINUX)
-endif (USESYSTEMLIBS)
-
-if (GOOGLE_PERFTOOLS_FOUND)
-  # XXX Disable temporarily, until we have compilation issues on 64-bit
-  # Etch sorted.
-  set(USE_GOOGLE_PERFTOOLS OFF CACHE BOOL "Build with Google PerfTools support.")
-endif (GOOGLE_PERFTOOLS_FOUND)
-
-if (WINDOWS)
-   set(USE_GOOGLE_PERFTOOLS ON)
-endif (WINDOWS)
-
-if (USE_GOOGLE_PERFTOOLS)
-  if (USE_TCMALLOC)
-    set(TCMALLOC_FLAG -DLL_USE_TCMALLOC=1)
-  else (USE_TCMALLOC)
-    set(TCMALLOC_FLAG -ULL_USE_TCMALLOC)
-  endif (USE_TCMALLOC)
-endif (USE_GOOGLE_PERFTOOLS)
-
-if (USE_GOOGLE_PERFTOOLS)
-  include_directories(${GOOGLE_PERFTOOLS_INCLUDE_DIR})
-  set(GOOGLE_PERFTOOLS_LIBRARIES ${TCMALLOC_LIBRARIES} ${STACKTRACE_LIBRARIES} ${PROFILER_LIBRARIES})
-else (USE_GOOGLE_PERFTOOLS)
-endif (USE_GOOGLE_PERFTOOLS)
diff --git a/indra/cmake/Havok.cmake b/indra/cmake/Havok.cmake
index 99e73341184d6791c43fecedb878b58e89cbc291..811a126b8fbc1407a650d74ffaf6b63bbc1b4142 100644
--- a/indra/cmake/Havok.cmake
+++ b/indra/cmake/Havok.cmake
@@ -8,6 +8,11 @@ use_prebuilt_binary(havok-source)
 set(Havok_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/havok/Source)
 list(APPEND Havok_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/havok/Demo)
 
+# HK_DISABLE_IMPLICIT_VVECTOR3_CONVERSION suppresses an intended conversion
+# function which Xcode scolds us will unconditionally enter infinite
+# recursion if called. This hides that function.
+add_definitions("-DHK_DISABLE_IMPLICIT_VVECTOR3_CONVERSION")
+
 set(HAVOK_DEBUG_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/debug/havok-fulldebug)
 set(HAVOK_RELEASE_LIBRARY_PATH ${LIBS_PREBUILT_DIR}/lib/release/havok)
 
@@ -49,89 +54,74 @@ unset(HK_DEBUG_LIBRARIES)
 unset(HK_RELEASE_LIBRARIES)
 unset(HK_RELWITHDEBINFO_LIBRARIES)
 
+if (DEBUG_PREBUILT)
+  # DEBUG_MESSAGE() displays debugging message
+  function(DEBUG_MESSAGE)
+    # prints message args separated by semicolons rather than spaces,
+    # but making it pretty is a lot more work
+    message(STATUS "${ARGN}")
+  endfunction(DEBUG_MESSAGE)
+else (DEBUG_PREBUILT)
+  # without DEBUG_PREBUILT, DEBUG_MESSAGE() is a no-op
+  function(DEBUG_MESSAGE)
+  endfunction(DEBUG_MESSAGE)
+endif (DEBUG_PREBUILT)
+
+# DEBUG_EXEC() reports each execute_process() before invoking
+function(DEBUG_EXEC)
+  DEBUG_MESSAGE(${ARGN})
+  execute_process(COMMAND ${ARGN})
+endfunction(DEBUG_EXEC)
+
 # *TODO: Figure out why we need to extract like this...
 foreach(HAVOK_LIB ${HAVOK_LIBS})
-        find_library(HAVOK_DEBUG_LIB_${HAVOK_LIB}   ${HAVOK_LIB} PATHS ${HAVOK_DEBUG_LIBRARY_PATH})
-        find_library(HAVOK_RELEASE_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_RELEASE_LIBRARY_PATH})
-        find_library(HAVOK_RELWITHDEBINFO_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_RELWITHDEBINFO_LIBRARY_PATH})
-        
-        if(LINUX)
-            set(debug_dir "${HAVOK_DEBUG_LIBRARY_PATH}/${HAVOK_LIB}")
-            set(release_dir "${HAVOK_RELEASE_LIBRARY_PATH}/${HAVOK_LIB}")
-            set(relwithdebinfo_dir "${HAVOK_RELWITHDEBINFO_LIBRARY_PATH}/${HAVOK_LIB}")
+  find_library(HAVOK_DEBUG_LIB_${HAVOK_LIB}   ${HAVOK_LIB} PATHS ${HAVOK_DEBUG_LIBRARY_PATH})
+  find_library(HAVOK_RELEASE_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_RELEASE_LIBRARY_PATH})
+  find_library(HAVOK_RELWITHDEBINFO_LIB_${HAVOK_LIB} ${HAVOK_LIB} PATHS ${HAVOK_RELWITHDEBINFO_LIBRARY_PATH})
+  
+  if(LINUX)
+    set(debug_dir "${HAVOK_DEBUG_LIBRARY_PATH}/${HAVOK_LIB}")
+    set(release_dir "${HAVOK_RELEASE_LIBRARY_PATH}/${HAVOK_LIB}")
+    set(relwithdebinfo_dir "${HAVOK_RELWITHDEBINFO_LIBRARY_PATH}/${HAVOK_LIB}")
 
     # Try to avoid extracting havok library each time we run cmake.
     if("${havok_${HAVOK_LIB}_extracted}" STREQUAL "" AND EXISTS "${PREBUILD_TRACKING_DIR}/havok_${HAVOK_LIB}_extracted")
       file(READ ${PREBUILD_TRACKING_DIR}/havok_${HAVOK_LIB}_extracted "havok_${HAVOK_LIB}_extracted")
-      if(DEBUG_PREBUILT)
-        message(STATUS "havok_${HAVOK_LIB}_extracted: \"${havok_${HAVOK_LIB}_extracted}\"")
-      endif(DEBUG_PREBUILT)
+      DEBUG_MESSAGE("havok_${HAVOK_LIB}_extracted: \"${havok_${HAVOK_LIB}_extracted}\"")
     endif("${havok_${HAVOK_LIB}_extracted}" STREQUAL "" AND EXISTS "${PREBUILD_TRACKING_DIR}/havok_${HAVOK_LIB}_extracted")
 
     if(${PREBUILD_TRACKING_DIR}/havok_source_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/havok_${HAVOK_LIB}_extracted OR NOT ${havok_${HAVOK_LIB}_extracted} EQUAL 0)
-      if(DEBUG_PREBUILT)
-        MESSAGE(STATUS "Extracting ${HAVOK_LIB}...")
-      endif(DEBUG_PREBUILT)
-      set(cmd "mkdir")
-
-      if(DEBUG_PREBUILT)
-        MESSAGE(STATUS "${cmd} ${debug_dir}")
-      endif(DEBUG_PREBUILT)
-            exec_program( ${cmd} ${HAVOK_DEBUG_LIBRARY_PATH} ARGS ${debug_dir} OUTPUT_VARIABLE rv)
-
-      if(DEBUG_PREBUILT)
-        MESSAGE(STATUS "${cmd} ${release_dir}")
-      endif(DEBUG_PREBUILT)
-            exec_program( ${cmd} ${HAVOK_RELEASE_LIBRARY_PATH} ARGS ${release_dir} OUTPUT_VARIABLE rv)
-
-      if(DEBUG_PREBUILT)
-        MESSAGE(STATUS "${cmd} ${relwithdebinfo_dir}")
-      endif(DEBUG_PREBUILT)
-            exec_program( ${cmd} ${HAVOK_RELWITHDEBINFO_LIBRARY_PATH} ARGS ${relwithdebinfo_dir} OUTPUT_VARIABLE rv)
-
-            set(cmd "ar")
-            set(arg " -xv")
-            set(arg "${arg} ../lib${HAVOK_LIB}.a")
-      if(DEBUG_PREBUILT)
-        MESSAGE(STATUS "cd ${debug_dir} && ${cmd} ${arg}")
-      endif(DEBUG_PREBUILT)
-            exec_program( ${cmd} ${debug_dir} ARGS ${arg} OUTPUT_VARIABLE rv)
-
-      if(DEBUG_PREBUILT)
-        MESSAGE(STATUS "cd ${release_dir} && ${cmd} ${arg}")
-      endif(DEBUG_PREBUILT)
-            exec_program( ${cmd} ${release_dir} ARGS ${arg} OUTPUT_VARIABLE rv)
-
-      if(DEBUG_PREBUILT)
-        MESSAGE(STATUS "cd ${relwithdebinfo_dir} && ${cmd} ${arg}")
-      endif(DEBUG_PREBUILT)
-            exec_program( ${cmd} ${relwithdebinfo_dir} ARGS ${arg} OUTPUT_VARIABLE rv)
+      DEBUG_MESSAGE("Extracting ${HAVOK_LIB}...")
+
+      foreach(lib ${debug_dir} ${release_dir} ${relwithdebinfo_dir})
+        DEBUG_EXEC("mkdir" ${lib})
+        DEBUG_EXEC("ar" "-xv" "../lib${HAVOK_LIB}.a"
+          WORKING_DIRECTORY ${lib})
+      endforeach(lib)
 
       # Just assume success for now.
       set(havok_${HAVOK_LIB}_extracted 0)
       file(WRITE ${PREBUILD_TRACKING_DIR}/havok_${HAVOK_LIB}_extracted "${havok_${HAVOK_LIB}_extracted}")
 
-    endif(${PREBUILD_TRACKING_DIR}/havok_source_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/havok_${HAVOK_LIB}_extracted OR NOT ${havok_${HAVOK_LIB}_extracted} EQUAL 0)
-
-            file(GLOB extracted_debug "${debug_dir}/*.o")
-            file(GLOB extracted_release "${release_dir}/*.o")
-            file(GLOB extracted_relwithdebinfo "${relwithdebinfo_dir}/*.o")
-
-    if(DEBUG_PREBUILT)
-      MESSAGE(STATUS "extracted_debug ${debug_dir}/*.o")
-      MESSAGE(STATUS "extracted_release ${release_dir}/*.o")
-      MESSAGE(STATUS "extracted_relwithdebinfo ${relwithdebinfo_dir}/*.o")
-    endif(DEBUG_PREBUILT)
-
-            list(APPEND HK_DEBUG_LIBRARIES ${extracted_debug})
-            list(APPEND HK_RELEASE_LIBRARIES ${extracted_release})
-            list(APPEND HK_RELWITHDEBINFO_LIBRARIES ${extracted_relwithdebinfo})
-        else(LINUX)
-        # Win32
-            list(APPEND HK_DEBUG_LIBRARIES   ${HAVOK_DEBUG_LIB_${HAVOK_LIB}})
-            list(APPEND HK_RELEASE_LIBRARIES ${HAVOK_RELEASE_LIB_${HAVOK_LIB}})
-            list(APPEND HK_RELWITHDEBINFO_LIBRARIES ${HAVOK_RELWITHDEBINFO_LIB_${HAVOK_LIB}})
-        endif (LINUX)
+    endif()
+
+    file(GLOB extracted_debug "${debug_dir}/*.o")
+    file(GLOB extracted_release "${release_dir}/*.o")
+    file(GLOB extracted_relwithdebinfo "${relwithdebinfo_dir}/*.o")
+
+    DEBUG_MESSAGE("extracted_debug ${debug_dir}/*.o")
+    DEBUG_MESSAGE("extracted_release ${release_dir}/*.o")
+    DEBUG_MESSAGE("extracted_relwithdebinfo ${relwithdebinfo_dir}/*.o")
+
+    list(APPEND HK_DEBUG_LIBRARIES ${extracted_debug})
+    list(APPEND HK_RELEASE_LIBRARIES ${extracted_release})
+    list(APPEND HK_RELWITHDEBINFO_LIBRARIES ${extracted_relwithdebinfo})
+  else(LINUX)
+    # Win32
+    list(APPEND HK_DEBUG_LIBRARIES   ${HAVOK_DEBUG_LIB_${HAVOK_LIB}})
+    list(APPEND HK_RELEASE_LIBRARIES ${HAVOK_RELEASE_LIB_${HAVOK_LIB}})
+    list(APPEND HK_RELWITHDEBINFO_LIBRARIES ${HAVOK_RELWITHDEBINFO_LIB_${HAVOK_LIB}})
+  endif (LINUX)
 endforeach(HAVOK_LIB)
 
 endif(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED)
diff --git a/indra/cmake/Hunspell.cmake b/indra/cmake/Hunspell.cmake
index ef74d95b2a6711f9e2fc20eba393a58242389bda..06227b3fe2336190d3277444c9b1623ac95d1d34 100644
--- a/indra/cmake/Hunspell.cmake
+++ b/indra/cmake/Hunspell.cmake
@@ -11,7 +11,7 @@ else (USESYSTEMLIBS)
   if (WINDOWS)
     set(HUNSPELL_LIBRARY libhunspell)
   elseif(DARWIN)
-    set(HUNSPELL_LIBRARY hunspell-1.3.0)
+    set(HUNSPELL_LIBRARY hunspell-1.3)
   elseif(LINUX)
     set(HUNSPELL_LIBRARY hunspell-1.3)
   else()
diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake
index db8b95dbe2e80690dafed9a306206d240bc23f1c..024bfe14a104e8814f52c5cc5cf4fd06fa98e605 100644
--- a/indra/cmake/LLAddBuildTest.cmake
+++ b/indra/cmake/LLAddBuildTest.cmake
@@ -3,6 +3,9 @@ include(LLTestCommand)
 include(GoogleMock)
 include(Tut)
 
+#*****************************************************************************
+#   LL_ADD_PROJECT_UNIT_TESTS
+#*****************************************************************************
 MACRO(LL_ADD_PROJECT_UNIT_TESTS project sources)
   # Given a project name and a list of sourcefiles (with optional properties on each),
   # add targets to build and run the tests specified.
@@ -35,7 +38,6 @@ INCLUDE(GoogleMock)
     ${APRUTIL_LIBRARIES}
     ${APR_LIBRARIES}
     llcommon
-    llcorehttp
     )
   IF(NOT "${project}" STREQUAL "llmath")
     # add llmath as a dep unless the tested module *is* llmath!
@@ -75,19 +77,17 @@ INCLUDE(GoogleMock)
     # Per-codefile additional / external source, header, and include dir property extraction
     #
     # Source
-    GET_SOURCE_FILE_PROPERTY(${name}_test_additional_SOURCE_FILES ${source} LL_TEST_ADDITIONAL_SOURCE_FILES)
-    IF(${name}_test_additional_SOURCE_FILES MATCHES NOTFOUND)
-      SET(${name}_test_additional_SOURCE_FILES "")
-    ENDIF(${name}_test_additional_SOURCE_FILES MATCHES NOTFOUND)
-    SET(${name}_test_SOURCE_FILES ${source} tests/${name}_test.${extension} ${alltest_SOURCE_FILES} ${${name}_test_additional_SOURCE_FILES} )
+    GET_OPT_SOURCE_FILE_PROPERTY(${name}_test_additional_SOURCE_FILES ${source} LL_TEST_ADDITIONAL_SOURCE_FILES)
+    SET(${name}_test_SOURCE_FILES
+      ${source}
+      tests/${name}_test.${extension}
+      ${alltest_SOURCE_FILES}
+      ${${name}_test_additional_SOURCE_FILES} )
     IF(LL_TEST_VERBOSE)
       MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_SOURCE_FILES ${${name}_test_SOURCE_FILES}")
     ENDIF(LL_TEST_VERBOSE)
     # Headers
-    GET_SOURCE_FILE_PROPERTY(${name}_test_additional_HEADER_FILES ${source} LL_TEST_ADDITIONAL_HEADER_FILES)
-    IF(${name}_test_additional_HEADER_FILES MATCHES NOTFOUND)
-      SET(${name}_test_additional_HEADER_FILES "")
-    ENDIF(${name}_test_additional_HEADER_FILES MATCHES NOTFOUND)
+    GET_OPT_SOURCE_FILE_PROPERTY(${name}_test_additional_HEADER_FILES ${source} LL_TEST_ADDITIONAL_HEADER_FILES)
     SET(${name}_test_HEADER_FILES ${name}.h ${${name}_test_additional_HEADER_FILES})
     set_source_files_properties(${${name}_test_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE)
     LIST(APPEND ${name}_test_SOURCE_FILES ${${name}_test_HEADER_FILES})
@@ -95,10 +95,7 @@ INCLUDE(GoogleMock)
       MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_HEADER_FILES ${${name}_test_HEADER_FILES}")
     ENDIF(LL_TEST_VERBOSE)
     # Include dirs
-    GET_SOURCE_FILE_PROPERTY(${name}_test_additional_INCLUDE_DIRS ${source} LL_TEST_ADDITIONAL_INCLUDE_DIRS)
-    IF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND)
-      SET(${name}_test_additional_INCLUDE_DIRS "")
-    ENDIF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND)
+    GET_OPT_SOURCE_FILE_PROPERTY(${name}_test_additional_INCLUDE_DIRS ${source} LL_TEST_ADDITIONAL_INCLUDE_DIRS)
     INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${${name}_test_additional_INCLUDE_DIRS} )
     IF(LL_TEST_VERBOSE)
       MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_INCLUDE_DIRS ${${name}_test_additional_INCLUDE_DIRS}")
@@ -114,15 +111,9 @@ INCLUDE(GoogleMock)
     #
     # WARNING: it's REALLY IMPORTANT to not mix these. I guarantee it will not work in the future. + poppy 2009-04-19
     # Projects
-    GET_SOURCE_FILE_PROPERTY(${name}_test_additional_PROJECTS ${source} LL_TEST_ADDITIONAL_PROJECTS)
-    IF(${name}_test_additional_PROJECTS MATCHES NOTFOUND)
-      SET(${name}_test_additional_PROJECTS "")
-    ENDIF(${name}_test_additional_PROJECTS MATCHES NOTFOUND)
+    GET_OPT_SOURCE_FILE_PROPERTY(${name}_test_additional_PROJECTS ${source} LL_TEST_ADDITIONAL_PROJECTS)
     # Libraries
-    GET_SOURCE_FILE_PROPERTY(${name}_test_additional_LIBRARIES ${source} LL_TEST_ADDITIONAL_LIBRARIES)
-    IF(${name}_test_additional_LIBRARIES MATCHES NOTFOUND)
-      SET(${name}_test_additional_LIBRARIES "")
-    ENDIF(${name}_test_additional_LIBRARIES MATCHES NOTFOUND)
+    GET_OPT_SOURCE_FILE_PROPERTY(${name}_test_additional_LIBRARIES ${source} LL_TEST_ADDITIONAL_LIBRARIES)
     IF(LL_TEST_VERBOSE)
       MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_PROJECTS ${${name}_test_additional_PROJECTS}")
       MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_LIBRARIES ${${name}_test_additional_LIBRARIES}")
@@ -130,13 +121,14 @@ INCLUDE(GoogleMock)
     # Add to project
     TARGET_LINK_LIBRARIES(PROJECT_${project}_TEST_${name} ${alltest_LIBRARIES} ${alltest_DEP_TARGETS} ${${name}_test_additional_PROJECTS} ${${name}_test_additional_LIBRARIES} )
     # Compile-time Definitions
-    GET_SOURCE_FILE_PROPERTY(${name}_test_additional_CFLAGS ${source} LL_TEST_ADDITIONAL_CFLAGS)
-     IF(NOT ${name}_test_additional_CFLAGS MATCHES NOTFOUND)
-       SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name} PROPERTIES COMPILE_FLAGS ${${name}_test_additional_CFLAGS} )
-       IF(LL_TEST_VERBOSE)
-         MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_CFLAGS ${${name}_test_additional_CFLAGS}")
-       ENDIF(LL_TEST_VERBOSE)
-     ENDIF(NOT ${name}_test_additional_CFLAGS MATCHES NOTFOUND)
+    GET_OPT_SOURCE_FILE_PROPERTY(${name}_test_additional_CFLAGS ${source} LL_TEST_ADDITIONAL_CFLAGS)
+    SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name}
+      PROPERTIES
+      COMPILE_FLAGS "${${name}_test_additional_CFLAGS}"
+      COMPILE_DEFINITIONS "LL_TEST=${name};LL_TEST_${name}")
+    IF(LL_TEST_VERBOSE)
+      MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_CFLAGS ${${name}_test_additional_CFLAGS}")
+    ENDIF(LL_TEST_VERBOSE)
      
     #
     # Setup test targets
@@ -176,6 +168,19 @@ INCLUDE(GoogleMock)
   ADD_DEPENDENCIES(${project} ${project}_tests)
 ENDMACRO(LL_ADD_PROJECT_UNIT_TESTS)
 
+#*****************************************************************************
+#   GET_OPT_SOURCE_FILE_PROPERTY
+#*****************************************************************************
+MACRO(GET_OPT_SOURCE_FILE_PROPERTY var filename property)
+  GET_SOURCE_FILE_PROPERTY(${var} "${filename}" "${property}")
+  IF("${${var}}" MATCHES NOTFOUND)
+    SET(${var} "")
+  ENDIF("${${var}}" MATCHES NOTFOUND)
+ENDMACRO(GET_OPT_SOURCE_FILE_PROPERTY)
+
+#*****************************************************************************
+#   LL_ADD_INTEGRATION_TEST
+#*****************************************************************************
 FUNCTION(LL_ADD_INTEGRATION_TEST 
     testname
     additional_source_files
@@ -185,7 +190,7 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
   if(TEST_DEBUG)
     message(STATUS "Adding INTEGRATION_TEST_${testname} - debug output is on")
   endif(TEST_DEBUG)
-  
+
   SET(source_files
     tests/${testname}_test.cpp
     ${CMAKE_SOURCE_DIR}/test/test.cpp
@@ -207,7 +212,11 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
     message(STATUS "ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})")
   endif(TEST_DEBUG)
   ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})
-  SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}")
+  SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname}
+    PROPERTIES
+    RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}"
+    COMPILE_DEFINITIONS "LL_TEST=${testname};LL_TEST_${testname}"
+    )
 
   if(USESYSTEMLIBS)
     SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES COMPILE_FLAGS -I"${TUT_INCLUDE_DIR}")
@@ -269,6 +278,9 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
 
 ENDFUNCTION(LL_ADD_INTEGRATION_TEST)
 
+#*****************************************************************************
+#   SET_TEST_PATH
+#*****************************************************************************
 MACRO(SET_TEST_PATH LISTVAR)
   IF(WINDOWS)
     # We typically build/package only Release variants of third-party
diff --git a/indra/cmake/LLCommon.cmake b/indra/cmake/LLCommon.cmake
index b50b4bcdb223cac4201492764c01a52b4af5f808..3e29297c580435e215ea5bc8ee4bcb634fd6bde9 100644
--- a/indra/cmake/LLCommon.cmake
+++ b/indra/cmake/LLCommon.cmake
@@ -4,7 +4,6 @@ include(APR)
 include(Boost)
 include(EXPAT)
 include(ZLIB)
-include(GooglePerfTools)
 
 set(LLCOMMON_INCLUDE_DIRS
     ${LIBS_OPEN_DIR}/llcommon
@@ -34,8 +33,6 @@ else (LINUX)
         ${BOOST_SYSTEM_LIBRARY} )
 endif (LINUX)
 
-# add_definitions(${TCMALLOC_FLAG})
-
 set(LLCOMMON_LINK_SHARED OFF CACHE BOOL "Build the llcommon target as a static library.")
 if(LLCOMMON_LINK_SHARED)
   add_definitions(-DLL_COMMON_LINK_SHARED=1)
diff --git a/indra/cmake/LLSharedLibs.cmake b/indra/cmake/LLSharedLibs.cmake
index a3c1c871aadd72e0aa7e9bcdfdf44a893ead818e..f69b45cd926193e04ce625a7ae2ed0c1674d2d81 100644
--- a/indra/cmake/LLSharedLibs.cmake
+++ b/indra/cmake/LLSharedLibs.cmake
@@ -3,35 +3,38 @@
 macro(ll_deploy_sharedlibs_command target_exe) 
   set(TARGET_LOCATION $<TARGET_FILE:${target_exe}>)
   get_filename_component(OUTPUT_PATH ${TARGET_LOCATION} PATH)
-  
-  if(DARWIN)
-    SET_TEST_PATH(SEARCH_DIRS)
-    get_target_property(IS_BUNDLE ${target_exe} MACOSX_BUNDLE)
-    if(IS_BUNDLE)
-      # If its a bundle the exe is not in the target location, this should find it.
-      get_filename_component(TARGET_FILE ${TARGET_LOCATION} NAME)
-      set(OUTPUT_PATH ${TARGET_LOCATION}.app/Contents/MacOS)
-      set(TARGET_LOCATION ${OUTPUT_PATH}/${TARGET_FILE})
-      set(OUTPUT_PATH ${OUTPUT_PATH}/../Resources)
-    endif(IS_BUNDLE)
-  elseif(WINDOWS)
-    SET_TEST_PATH(SEARCH_DIRS)
-    LIST(APPEND SEARCH_DIRS "$ENV{SystemRoot}/system32")
-  elseif(LINUX)
-    SET_TEST_PATH(SEARCH_DIRS)
-    set(OUTPUT_PATH ${OUTPUT_PATH}/lib)
-  endif(DARWIN)
 
-  add_custom_command(
-    TARGET ${target_exe} POST_BUILD
-    COMMAND ${CMAKE_COMMAND} 
-    ARGS
-    "-DBIN_NAME=\"${TARGET_LOCATION}\""
-    "-DSEARCH_DIRS=\"${SEARCH_DIRS}\""
-    "-DDST_PATH=\"${OUTPUT_PATH}\""
-    "-P"
-    "${CMAKE_SOURCE_DIR}/cmake/DeploySharedLibs.cmake"
-    )
+  # It's not clear that this does anything useful for us on Darwin. It has
+  # been broken for some time now; the BIN_NAME was being constructed as a
+  # ridiculous nonexistent path with duplicated segments. Fixing that only
+  # produces ominous spammy warnings: at the time the command below is run, we
+  # have not yet populated the nested mac-crash-logger.app/Contents/Resources
+  # with the .dylibs with which it was linked. Moreover, the form of the
+  # embedded @executable_path/../Resources/mumble.dylib pathname confuses the
+  # GetPrerequisites.cmake tool invoked by DeploySharedLibs.cmake. It seems
+  # clear that we have long since accomplished by other means what this was
+  # originally supposed to do. Skipping it only eliminates an annoying
+  # non-fatal error.
+  if(NOT DARWIN)
+    if(WINDOWS)
+      SET_TEST_PATH(SEARCH_DIRS)
+      LIST(APPEND SEARCH_DIRS "$ENV{SystemRoot}/system32")
+    elseif(LINUX)
+      SET_TEST_PATH(SEARCH_DIRS)
+      set(OUTPUT_PATH ${OUTPUT_PATH}/lib)
+    endif(WINDOWS)
+
+    add_custom_command(
+      TARGET ${target_exe} POST_BUILD
+      COMMAND ${CMAKE_COMMAND} 
+      ARGS
+      "-DBIN_NAME=\"${TARGET_LOCATION}\""
+      "-DSEARCH_DIRS=\"${SEARCH_DIRS}\""
+      "-DDST_PATH=\"${OUTPUT_PATH}\""
+      "-P"
+      "${CMAKE_SOURCE_DIR}/cmake/DeploySharedLibs.cmake"
+      )
+  endif(NOT DARWIN)
 
 endmacro(ll_deploy_sharedlibs_command)
 
diff --git a/indra/cmake/LibVLCPlugin.cmake b/indra/cmake/LibVLCPlugin.cmake
index 4472676fb489b0d94d24936e4846de7597ff30f5..df829b615aa8fbb2defb8805a9cf9a36587bd78b 100644
--- a/indra/cmake/LibVLCPlugin.cmake
+++ b/indra/cmake/LibVLCPlugin.cmake
@@ -18,6 +18,10 @@ if (WINDOWS)
         libvlccore.lib
     )
 elseif (DARWIN)
+    set(VLC_PLUGIN_LIBRARIES
+        libvlc.dylib
+        libvlccore.dylib
+    )
 elseif (LINUX)
     # Specify a full path to make sure we get a static link
     set(VLC_PLUGIN_LIBRARIES
diff --git a/indra/cmake/Prebuilt.cmake b/indra/cmake/Prebuilt.cmake
index 98013da2f21bc67abebd418a24c2b12a25f68022..33a6d769167542a4294b4f8abbb017a0e5e2af93 100644
--- a/indra/cmake/Prebuilt.cmake
+++ b/indra/cmake/Prebuilt.cmake
@@ -39,7 +39,7 @@ macro (use_prebuilt_binary _binary)
 
     if(${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0)
       if(DEBUG_PREBUILT)
-        message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install
+        message(STATUS "cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install
         --install-dir=${AUTOBUILD_INSTALL_DIR}
         ${_binary} ")
       endif(DEBUG_PREBUILT)
diff --git a/indra/cmake/QuickTimePlugin.cmake b/indra/cmake/QuickTimePlugin.cmake
deleted file mode 100644
index c08e153ee3900f9313c1c8c46cf3aac06568e2c6..0000000000000000000000000000000000000000
--- a/indra/cmake/QuickTimePlugin.cmake
+++ /dev/null
@@ -1,48 +0,0 @@
-# -*- cmake -*-
-
-if(INSTALL_PROPRIETARY)
-  include(Prebuilt)
-  if (WINDOWS)
-    use_prebuilt_binary(quicktime)
-  endif (WINDOWS)
-endif(INSTALL_PROPRIETARY)
-
-if (DARWIN)
-  include(CMakeFindFrameworks)
-  find_library(QUICKTIME_LIBRARY QuickTime)
-elseif (WINDOWS)
-  set(QUICKTIME_SDK_DIR "$ENV{PROGRAMFILES}/QuickTime SDK"
-      CACHE PATH "Location of the QuickTime SDK.")
-
-  find_library(DEBUG_QUICKTIME_LIBRARY qtmlclient.lib
-               PATHS
-               ${ARCH_PREBUILT_DIRS_DEBUG}
-               "${QUICKTIME_SDK_DIR}\\libraries"
-               )
-
-  find_library(RELEASE_QUICKTIME_LIBRARY qtmlclient.lib
-               PATHS
-               ${ARCH_PREBUILT_DIRS_RELEASE}
-               "${QUICKTIME_SDK_DIR}\\libraries"
-               )
-
-  if (DEBUG_QUICKTIME_LIBRARY AND RELEASE_QUICKTIME_LIBRARY)
-    set(QUICKTIME_LIBRARY 
-        optimized ${RELEASE_QUICKTIME_LIBRARY}
-        debug ${DEBUG_QUICKTIME_LIBRARY}
-        )
-        
-  endif (DEBUG_QUICKTIME_LIBRARY AND RELEASE_QUICKTIME_LIBRARY)
-  
-  include_directories(
-    ${LIBS_PREBUILT_DIR}/include/quicktime
-    "${QUICKTIME_SDK_DIR}\\CIncludes"
-    )
-endif (DARWIN)
-
-mark_as_advanced(QUICKTIME_LIBRARY)
-
-if (QUICKTIME_LIBRARY)
-  set(QUICKTIME ON CACHE BOOL "Build with QuickTime streaming media support.")
-endif (QUICKTIME_LIBRARY)
-
diff --git a/indra/cmake/UI.cmake b/indra/cmake/UI.cmake
index 31174209a313aae3e3dadeea75d9d7aacf9fb891..77fd505df361c70c3e47c9d880cafb44a268828c 100644
--- a/indra/cmake/UI.cmake
+++ b/indra/cmake/UI.cmake
@@ -32,9 +32,9 @@ if (USESYSTEMLIBS)
     add_definitions(${${pkg}_CFLAGS_OTHERS})
   endforeach(pkg)
 else (USESYSTEMLIBS)
-  if (LINUX OR WINDOWS)
+  if (LINUX)
     use_prebuilt_binary(gtk-atk-pango-glib)
-  endif (LINUX OR WINDOWS)
+  endif (LINUX)
 
   if (LINUX)
     set(UI_LIBRARIES
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index 63e296b556d243085c40d2c4ceb59522a60b1d4b..e8698ace68f47cfd06992882f461f35e14abaf88 100644
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -9,6 +9,12 @@
 #   LINUX   - Linux
 #   WINDOWS - Windows
 
+# Switches set here and in 00-Common.cmake must agree with
+# https://bitbucket.org/lindenlab/viewer-build-variables/src/tip/variables
+# Reading $LL_BUILD is an attempt to directly use those switches.
+if ("$ENV{LL_BUILD}" STREQUAL "")
+  message(FATAL_ERROR "Environment variable LL_BUILD must be set")
+endif ()
 
 # Relative and absolute paths to subtrees.
 
@@ -60,46 +66,55 @@ if (NOT CMAKE_BUILD_TYPE)
       "Build type.  One of: Debug Release RelWithDebInfo" FORCE)
 endif (NOT CMAKE_BUILD_TYPE)
 
+# If someone has specified an address size, use that to determine the
+# architecture.  Otherwise, let the architecture specify the address size.
+if (ADDRESS_SIZE EQUAL 32)
+  #message(STATUS "ADDRESS_SIZE is 32")
+  set(ARCH i686)
+elseif (ADDRESS_SIZE EQUAL 64)
+  #message(STATUS "ADDRESS_SIZE is 64")
+  set(ARCH x86_64)
+else (ADDRESS_SIZE EQUAL 32)
+  #message(STATUS "ADDRESS_SIZE is UNRECOGNIZED: '${ADDRESS_SIZE}'")
+  # Use Python's platform.machine() since uname -m isn't available everywhere.
+  # Even if you can assume cygwin uname -m, the answer depends on whether
+  # you're running 32-bit cygwin or 64-bit cygwin! But even 32-bit Python will
+  # report a 64-bit processor.
+  execute_process(COMMAND
+                  "${PYTHON_EXECUTABLE}" "-c"
+                  "import platform; print platform.machine()"
+                  OUTPUT_VARIABLE ARCH OUTPUT_STRIP_TRAILING_WHITESPACE)
+  # We expect values of the form i386, i686, x86_64, AMD64.
+  # In CMake, expressing ARCH.endswith('64') is awkward:
+  string(LENGTH "${ARCH}" ARCH_LENGTH)
+  math(EXPR ARCH_LEN_2 "${ARCH_LENGTH} - 2")
+  string(SUBSTRING "${ARCH}" ${ARCH_LEN_2} 2 ARCH_LAST_2)
+  if (ARCH_LAST_2 STREQUAL 64)
+    #message(STATUS "ARCH is detected as 64; ARCH is ${ARCH}")
+    set(ADDRESS_SIZE 64)
+  else ()
+    #message(STATUS "ARCH is detected as 32; ARCH is ${ARCH}")
+    set(ADDRESS_SIZE 32)
+  endif ()
+endif (ADDRESS_SIZE EQUAL 32)
+
 if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
   set(WINDOWS ON BOOL FORCE)
-  set(ARCH i686)
   set(LL_ARCH ${ARCH}_win32)
   set(LL_ARCH_DIR ${ARCH}-win32)
-  set(WORD_SIZE 32)
 endif (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
 
 if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
   set(LINUX ON BOOl FORCE)
 
-  # If someone has specified a word size, use that to determine the
-  # architecture.  Otherwise, let the architecture specify the word size.
-  if (WORD_SIZE EQUAL 32)
-    #message(STATUS "WORD_SIZE is 32")
-    set(ARCH i686)
-  elseif (WORD_SIZE EQUAL 64)
-    #message(STATUS "WORD_SIZE is 64")
-    set(ARCH x86_64)
-  else (WORD_SIZE EQUAL 32)
-    #message(STATUS "WORD_SIZE is UNDEFINED")
-    execute_process(COMMAND uname -m COMMAND sed s/i.86/i686/
-                    OUTPUT_VARIABLE ARCH OUTPUT_STRIP_TRAILING_WHITESPACE)
-    if (ARCH STREQUAL x86_64)
-      #message(STATUS "ARCH is detected as 64; ARCH is ${ARCH}")
-      set(WORD_SIZE 64)
-    else (ARCH STREQUAL x86_64)
-      #message(STATUS "ARCH is detected as 32; ARCH is ${ARCH}")
-      set(WORD_SIZE 32)
-    endif (ARCH STREQUAL x86_64)
-  endif (WORD_SIZE EQUAL 32)
-
-  if (WORD_SIZE EQUAL 32)
+  if (ADDRESS_SIZE EQUAL 32)
     set(DEB_ARCHITECTURE i386)
     set(FIND_LIBRARY_USE_LIB64_PATHS OFF)
     set(CMAKE_SYSTEM_LIBRARY_PATH /usr/lib32 ${CMAKE_SYSTEM_LIBRARY_PATH})
-  else (WORD_SIZE EQUAL 32)
+  else (ADDRESS_SIZE EQUAL 32)
     set(DEB_ARCHITECTURE amd64)
     set(FIND_LIBRARY_USE_LIB64_PATHS ON)
-  endif (WORD_SIZE EQUAL 32)
+  endif (ADDRESS_SIZE EQUAL 32)
 
   execute_process(COMMAND dpkg-architecture -a${DEB_ARCHITECTURE} -qDEB_HOST_MULTIARCH 
       RESULT_VARIABLE DPKG_RESULT
@@ -129,29 +144,45 @@ endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
 
 if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
   set(DARWIN 1)
-  
-  # now we only support Xcode 7.0 using 10.11 (El Capitan), minimum OS 10.7 (Lion)
+
+  string(REGEX MATCH "-mmacosx-version-min=([^ ]+)" scratch "$ENV{LL_BUILD}")
+  set(CMAKE_OSX_DEPLOYMENT_TARGET "${CMAKE_MATCH_1}")
+  message(STATUS "CMAKE_OSX_DEPLOYMENT_TARGET = '${CMAKE_OSX_DEPLOYMENT_TARGET}'")
+
+  string(REGEX MATCH "-stdlib=([^ ]+)" scratch "$ENV{LL_BUILD}")
+  set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "${CMAKE_MATCH_1}")
+  message(STATUS "CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY = '${CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY}'")
+
+  string(REGEX MATCH " -g([^ ]*)" scratch "$ENV{LL_BUILD}")
+  set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "${CMAKE_MATCH_1}")
+  message(STATUS "CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT = '${CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT}'")
+
+  string(REGEX MATCH "-O([^ ]*)" scratch "$ENV{LL_BUILD}")
+  set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL "${CMAKE_MATCH_1}")
+  message(STATUS "CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL = '${CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL}'")
+
+  string(REGEX MATCHALL "[^ ]+" LL_BUILD_LIST "$ENV{LL_BUILD}")
+  list(FIND LL_BUILD_LIST "-iwithsysroot" sysroot_idx)
+  if ("${sysroot_idx}" LESS 0)
+    message(FATAL_ERROR "Environment variable LL_BUILD must contain '-iwithsysroot'")
+  endif ()
+  math(EXPR sysroot_idx "${sysroot_idx} + 1")
+  list(GET LL_BUILD_LIST "${sysroot_idx}" CMAKE_OSX_SYSROOT)
+  message(STATUS "CMAKE_OSX_SYSROOT = '${CMAKE_OSX_SYSROOT}'")
+
   set(XCODE_VERSION 7.0)
-  set(CMAKE_OSX_DEPLOYMENT_TARGET 10.7)
-  set(CMAKE_OSX_SYSROOT macosx10.11)
 
   set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "com.apple.compilers.llvm.clang.1_0")
-  set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL 3)
   set(CMAKE_XCODE_ATTRIBUTE_GCC_STRICT_ALIASING NO)
   set(CMAKE_XCODE_ATTRIBUTE_GCC_FAST_MATH NO)
   set(CMAKE_XCODE_ATTRIBUTE_CLANG_X86_VECTOR_INSTRUCTIONS ssse3)
-  set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libstdc++")
-  set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT dwarf-with-dsym)
 
-  # Build only for i386 by default, system default on MacOSX 10.6+ is x86_64
-  if (NOT CMAKE_OSX_ARCHITECTURES)
-    set(CMAKE_OSX_ARCHITECTURES "i386")
-  endif (NOT CMAKE_OSX_ARCHITECTURES)
+  set(CMAKE_OSX_ARCHITECTURES "${ARCH}")
+  string(REPLACE "i686"  "i386"   CMAKE_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}")
+  string(REPLACE "AMD64" "x86_64" CMAKE_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}")
 
-  set(ARCH ${CMAKE_OSX_ARCHITECTURES})
   set(LL_ARCH ${ARCH}_darwin)
   set(LL_ARCH_DIR universal-darwin)
-  set(WORD_SIZE 32)
 endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
 
 # Default deploy grid
diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py
index fdbb0a75f7128fcb33c3a7e12bbf43460f7fe336..f02c5e98b430c3c0b9f2034adac5834511cd8138 100755
--- a/indra/cmake/run_build_test.py
+++ b/indra/cmake/run_build_test.py
@@ -51,11 +51,13 @@
 import re
 import signal
 import subprocess
+import logging
 
-def main(command, libpath=[], vars={}):
+def main(command, arguments=[], libpath=[], vars={}):
     """Pass:
-    command is a sequence (e.g. a list) of strings. The first item in the list
-    must be the command name, the rest are its arguments.
+    command is the command to be executed
+
+    argument is a sequence (e.g. a list) of strings to be passed to command
 
     libpath is a sequence of directory pathnames. These will be appended to
     the platform-specific dynamic library search path environment variable.
@@ -85,7 +87,7 @@ def main(command, libpath=[], vars={}):
         # might not exist; instead of KeyError, just use an empty string.
         dirs = os.environ.get(var, "").split(os.pathsep)
         # Append the sequence in libpath
-        print "%s += %r" % (var, libpath)
+        log.info("%s += %r" % (var, libpath))
         for dir in libpath:
             # append system paths at the end
             if dir in ('/lib', '/usr/lib'):
@@ -103,20 +105,20 @@ def main(command, libpath=[], vars={}):
         # Now rebuild the path string. This way we use a minimum of separators
         # -- and we avoid adding a pointless separator when libpath is empty.
         os.environ[var] = os.pathsep.join(clean_dirs)
-        print "%s = %r" % (var, os.environ[var])
+        log.info("%s = %r" % (var, os.environ[var]))
     # Now handle arbitrary environment variables. The tricky part is ensuring
     # that all the keys and values we try to pass are actually strings.
     if vars:
-         print "Setting:"
-         for key, value in vars.iteritems():
-             print "%s=%s" % (key, value)
+         log.info("Setting: %s" % ("\n".join(["%s=%s" % (key, value) for key, value in vars.iteritems()])))
     os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()]))
     # Run the child process.
-    print "Running: %s" % " ".join(command)
+    command_list = [command]
+    command_list.extend(arguments)
+    log.info("Running: %s" % " ".join(command_list))
     # Make sure we see all relevant output *before* child-process output.
     sys.stdout.flush()
     try:
-        return subprocess.call(command)
+        return subprocess.call(command_list)
     except OSError as err:
         # If the caller is trying to execute a test program that doesn't
         # exist, we want to produce a reasonable error message rather than a
@@ -126,9 +128,9 @@ def main(command, libpath=[], vars={}):
         if err.errno != errno.ENOENT:
             raise
         # In practice, the pathnames into CMake's build tree are so long as to
-        # obscure the name of the test program. Just print its basename.
-        print "No such program %s; check for preceding build errors" % \
-              os.path.basename(command[0])
+        # obscure the name of the test program. Just log its basename.
+        log.warn("No such program %s; check for preceding build errors" % \
+                 os.path.basename(command[0]))
         # What rc should we simulate for missing executable? Windows produces
         # 9009.
         return 9009
@@ -172,10 +174,10 @@ def translate_rc(rc):
             table = get_windows_table()
             symbol, desc = table[hexrc]
         except Exception, err:
-            print >>sys.stderr, "(%s -- carrying on)" % err
-            return "terminated with rc %s (%s)" % (rc, hexrc)
+            log.error("(%s -- carrying on)" % err)
+            log.error("terminated with rc %s (%s)" % (rc, hexrc))
         else:
-            return "terminated with rc %s: %s: %s" % (hexrc, symbol, desc)
+            log.info("terminated with rc %s: %s: %s" % (hexrc, symbol, desc))
 
     else:
         # On Posix, negative rc means the child was terminated by signal -rc.
@@ -303,22 +305,26 @@ def get_windows_table():
 
     return _windows_table
 
+log=logging.getLogger(__name__)
+logging.basicConfig()
+
 if __name__ == "__main__":
-    from optparse import OptionParser
-    parser = OptionParser(usage="usage: %prog [options] command args...")
-    # We want optparse support for the options we ourselves handle -- but we
-    # DO NOT want it looking at options for the executable we intend to run,
-    # rejecting them as invalid because we don't define them. So configure the
-    # parser to stop looking for options as soon as it sees the first
-    # positional argument (traditional Unix syntax).
-    parser.disable_interspersed_args()
-    parser.add_option("-D", "--define", dest="vars", default=[], action="append",
-                      metavar="VAR=value",
-                      help="Add VAR=value to the env variables defined")
-    parser.add_option("-l", "--libpath", dest="libpath", default=[], action="append",
-                      metavar="DIR",
-                      help="Add DIR to the platform-dependent DLL search path")
-    opts, args = parser.parse_args()
+    import argparse
+    parser = argparse.ArgumentParser()
+    parser.add_argument("-d", "--debug", dest="loglevel", action="store_const",
+                        const=logging.DEBUG, default=logging.WARNING)
+    parser.add_argument("-D", "--define", dest="vars", default=[], action="append",
+                        metavar="VAR=value",
+                        help="Add VAR=value to the env variables defined")
+    parser.add_argument("-l", "--libpath", dest="libpath", default=[], action="append",
+                        metavar="DIR",
+                        help="Add DIR to the platform-dependent DLL search path")
+    parser.add_argument("command")
+    parser.add_argument('args', nargs=argparse.REMAINDER)
+    args = parser.parse_args()
+
+    log.setLevel(args.loglevel)
+
     # What we have in opts.vars is a list of strings of the form "VAR=value"
     # or possibly just "VAR". What we want is a dict. We can build that dict by
     # constructing a list of ["VAR", "value"] pairs -- so split each
@@ -326,9 +332,9 @@ def get_windows_table():
     # "VAR=some=user=string"). To handle the case of just "VAR", append "" to
     # the list returned by split(), then slice off anything after the pair we
     # want.
-    rc = main(command=args, libpath=opts.libpath,
-              vars=dict([(pair.split('=', 1) + [""])[:2] for pair in opts.vars]))
+    rc = main(command=args.command, arguments=args.args, libpath=args.libpath,
+              vars=dict([(pair.split('=', 1) + [""])[:2] for pair in args.vars]))
     if rc not in (None, 0):
-        print >>sys.stderr, "Failure running: %s" % " ".join(args)
-        print >>sys.stderr, "Error %s: %s" % (rc, translate_rc(rc))
+        log.error("Failure running: %s" % " ".join([args.command] + args.args))
+        log.error("Error %s: %s" % (rc, translate_rc(rc)))
     sys.exit((rc < 0) and 255 or rc)
diff --git a/indra/integration_tests/llimage_libtest/CMakeLists.txt b/indra/integration_tests/llimage_libtest/CMakeLists.txt
index 8a83ac498fea67716035452cefeafb082eff2831..13cf1f7bde9014b85d0ff31272e38b7867a9f796 100644
--- a/indra/integration_tests/llimage_libtest/CMakeLists.txt
+++ b/indra/integration_tests/llimage_libtest/CMakeLists.txt
@@ -104,21 +104,23 @@ add_custom_command(TARGET llimage_libtest POST_BUILD
 if (DARWIN)
   # Copy the required libraries to the package app
   add_custom_command(TARGET llimage_libtest POST_BUILD
-    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libapr-1.0.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
-    DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libapr-1.0.dylib
+    COMMAND ${CMAKE_COMMAND} -E copy ${AUTOBUILD_INSTALL_DIR}/lib/release/libapr-1.0.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+    DEPENDS ${AUTOBUILD_INSTALL_DIR}/lib/release/libapr-1.0.dylib
   )
   add_custom_command(TARGET llimage_libtest POST_BUILD
-    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libaprutil-1.0.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
-    DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libaprutil-1.0.dylib
+    COMMAND ${CMAKE_COMMAND} -E copy ${AUTOBUILD_INSTALL_DIR}/lib/release/libaprutil-1.0.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+    DEPENDS ${AUTOBUILD_INSTALL_DIR}/lib/release/libaprutil-1.0.dylib
   )
   add_custom_command(TARGET llimage_libtest POST_BUILD
-    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexception_handler.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
-    DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexception_handler.dylib
-  )
-  add_custom_command(TARGET llimage_libtest POST_BUILD
-    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexpat.1.5.2.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
-    DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexpat.1.5.2.dylib
+    COMMAND ${CMAKE_COMMAND} -E copy ${AUTOBUILD_INSTALL_DIR}/lib/release/libexception_handler.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+    DEPENDS ${AUTOBUILD_INSTALL_DIR}/lib/release/libexception_handler.dylib
   )
+  foreach(expat ${EXPAT_COPY})
+    add_custom_command(TARGET llimage_libtest POST_BUILD
+      COMMAND ${CMAKE_COMMAND} -E copy ${AUTOBUILD_INSTALL_DIR}/lib/release/${expat} ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+      DEPENDS ${AUTOBUILD_INSTALL_DIR}/lib/release/${expat}
+    )
+  endforeach(expat)
 endif (DARWIN)
 
 if (WINDOWS)
diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp
index 94c431feb4a30e9634350d41de4ac9c5fe340bba..e5089f028fe1cb9f12c4eaf72b76e9634a3b7d9a 100644
--- a/indra/llappearance/llavatarappearance.cpp
+++ b/indra/llappearance/llavatarappearance.cpp
@@ -2125,6 +2125,3 @@ LLAvatarAppearance::LLMaskedMorph::LLMaskedMorph(LLVisualParam *morph_target, BO
 		target->addPendingMorphMask();
 	}
 }
-
-
-
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index aa76a57f1d34c34eccab6d6544aff5d5f9d3b74b..142e56dfca71034fc76bf185f2d3e509a33933e9 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -10,7 +10,6 @@ include(Boost)
 include(LLSharedLibs)
 include(JsonCpp)
 include(GoogleBreakpad)
-include(GooglePerfTools)
 include(Copy3rdPartyLibs)
 include(ZLIB)
 include(URIPARSER)
@@ -259,13 +258,13 @@ list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES})
 
 if(LLCOMMON_LINK_SHARED)
   add_library (llcommon SHARED ${llcommon_SOURCE_FILES})
-  if(NOT WORD_SIZE EQUAL 32)
+  if(NOT ADDRESS_SIZE EQUAL 32)
     if(WINDOWS)
-      add_definitions(/FIXED:NO)
+      ##add_definitions(/FIXED:NO)
     else(WINDOWS) # not windows therefore gcc LINUX and DARWIN
       add_definitions(-fPIC)
     endif(WINDOWS)
-  endif(NOT WORD_SIZE EQUAL 32)
+  endif(NOT ADDRESS_SIZE EQUAL 32)
   if(WINDOWS)
     # always generate llcommon.pdb, even for "Release" builds
     set_target_properties(llcommon PROPERTIES LINK_FLAGS "/DEBUG")
@@ -351,8 +350,4 @@ if (LL_TESTS)
 ## throwing and catching exceptions.
 ##LL_ADD_INTEGRATION_TEST(llexception "" "${test_libs}")
 
-  # *TODO - reenable these once tcmalloc libs no longer break the build.
-  #ADD_BUILD_TEST(llallocator llcommon)
-  #ADD_BUILD_TEST(llallocator_heap_profile llcommon)
-  #ADD_BUILD_TEST(llmemtype llcommon)
 endif (LL_TESTS)
diff --git a/indra/llcommon/llallocator.cpp b/indra/llcommon/llallocator.cpp
index 34fc28d8cc4699349cefd235b31c44706c322cc1..ac97fb71dd11c5f8018056a5efa9f852a8add9d0 100644
--- a/indra/llcommon/llallocator.cpp
+++ b/indra/llcommon/llallocator.cpp
@@ -27,47 +27,6 @@
 #include "linden_common.h"
 #include "llallocator.h"
 
-#if (LL_USE_TCMALLOC && LL_USE_HEAP_PROFILER)
-
-#include "google/heap-profiler.h"
-#include "google/commandlineflags_public.h"
-
-DECLARE_bool(heap_profile_use_stack_trace);
-//DECLARE_double(tcmalloc_release_rate);
-
-void LLAllocator::setProfilingEnabled(bool should_enable)
-{
-    // NULL disables dumping to disk
-    static char const * const PREFIX = NULL;
-    if(should_enable)
-    {
-		HeapProfilerSetUseStackTrace(false);
-        HeapProfilerStart(PREFIX);
-    }
-    else
-    {
-        HeapProfilerStop();
-    }
-}
-
-// static
-bool LLAllocator::isProfiling()
-{
-    return IsHeapProfilerRunning();
-}
-
-std::string LLAllocator::getRawProfile()
-{
-    // *TODO - fix google-perftools to accept an buffer to avoid this
-    // malloc-copy-free cycle.
-    char * buffer = GetHeapProfile();
-    std::string ret = buffer;
-    free(buffer);
-    return ret;
-}
-
-#else // LL_USE_TCMALLOC
-
 //
 // stub implementations for when tcmalloc is disabled
 //
@@ -87,8 +46,6 @@ std::string LLAllocator::getRawProfile()
     return std::string();
 }
 
-#endif // LL_USE_TCMALLOC
-
 LLAllocatorHeapProfile const & LLAllocator::getProfile()
 {
     mProf.mLines.clear();
diff --git a/indra/llcommon/llcommon.cpp b/indra/llcommon/llcommon.cpp
index 439ff4e628e965da33163f1592d9b432eb16f331..2d665c611b47418f6594eff3cc5a57e1200ec27b 100644
--- a/indra/llcommon/llcommon.cpp
+++ b/indra/llcommon/llcommon.cpp
@@ -41,7 +41,6 @@ static LLTrace::ThreadRecorder* sMasterThreadRecorder = NULL;
 //static
 void LLCommon::initClass()
 {
-	LLMemory::initClass();
 	if (!sAprInitialized)
 	{
 		ll_init_apr();
@@ -70,5 +69,4 @@ void LLCommon::cleanupClass()
 		ll_cleanup_apr();
 		sAprInitialized = FALSE;
 	}
-	SUBSYSTEM_CLEANUP(LLMemory);
 }
diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp
index 3ffce4810a830aa4134510dee2e53d8892fd5279..1e1dfd2602c5e21f07bb4777880b799068612e98 100644
--- a/indra/llcommon/llcoros.cpp
+++ b/indra/llcommon/llcoros.cpp
@@ -151,7 +151,11 @@ LLCoros::LLCoros():
     // Previously we used
     // boost::context::guarded_stack_allocator::default_stacksize();
     // empirically this is 64KB on Windows and Linux. Try quadrupling.
+#if ADDRESS_SIZE == 64
+    mStackSize(512*1024)
+#else
     mStackSize(256*1024)
+#endif
 {
     // Register our cleanup() method for "mainloop" ticks
     LLEventPumps::instance().obtain("mainloop").listen(
diff --git a/indra/llcommon/lldependencies.h b/indra/llcommon/lldependencies.h
index 125bd6a835ce501ef35d5ffe3c3e420dcdc2633b..db2bbab8b040269e04bec4638b70bea4dd6fa4e4 100644
--- a/indra/llcommon/lldependencies.h
+++ b/indra/llcommon/lldependencies.h
@@ -124,8 +124,8 @@ class LL_COMMON_API LLDependenciesBase
     virtual std::string describe(bool full=true) const;
 
 protected:
-    typedef std::vector< std::pair<int, int> > EdgeList;
-    typedef std::vector<int> VertexList;
+    typedef std::vector< std::pair<std::size_t, std::size_t> > EdgeList;
+    typedef std::vector<std::size_t> VertexList;
     VertexList topo_sort(int vertices, const EdgeList& edges) const;
 
     /**
@@ -508,7 +508,7 @@ class LLDependencies: public LLDependenciesBase
             // been explicitly added. Rely on std::map rejecting a second attempt
             // to insert the same key. Use the map's size() as the vertex number
             // to get a distinct value for each successful insertion.
-            typedef std::map<KEY, int> VertexMap;
+            typedef std::map<KEY, std::size_t> VertexMap;
             VertexMap vmap;
             // Nest each of these loops because !@#$%? MSVC warns us that its
             // former broken behavior has finally been fixed -- and our builds
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index e6407ecf220b0df466bb3542a745df6c1ab415d8..2ddb3edbdd38e2020936a77d7b780c7cea65872e 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -1067,7 +1067,15 @@ namespace LLError
 		{
 			return false;
 		}
-		
+
+		// If we hit a logging request very late during shutdown processing,
+		// when either of the relevant LLSingletons has already been deleted,
+		// DO NOT resurrect them.
+		if (Settings::wasDeleted() || Globals::wasDeleted())
+		{
+			return false;
+		}
+
 		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
 		
 		s->mShouldLogCallCounter++;
@@ -1106,7 +1114,10 @@ namespace LLError
 	std::ostringstream* Log::out()
 	{
 		LogLock lock;
-		if (lock.ok())
+		// If we hit a logging request very late during shutdown processing,
+		// when either of the relevant LLSingletons has already been deleted,
+		// DO NOT resurrect them.
+		if (lock.ok() && ! (Settings::wasDeleted() || Globals::wasDeleted()))
 		{
 			Globals* g = Globals::getInstance();
 
@@ -1116,41 +1127,49 @@ namespace LLError
 				return &g->messageStream;
 			}
 		}
-		
+
 		return new std::ostringstream;
 	}
-	
+
 	void Log::flush(std::ostringstream* out, char* message)
-    {
-       LogLock lock;
-       if (!lock.ok())
-       {
-           return;
-       }
-       
-	   if(strlen(out->str().c_str()) < 128)
-	   {
-		   strcpy(message, out->str().c_str());
-	   }
-	   else
-	   {
-		   strncpy(message, out->str().c_str(), 127);
-		   message[127] = '\0' ;
-	   }
-	   
-	   Globals* g = Globals::getInstance();
-       if (out == &g->messageStream)
-       {
-           g->messageStream.clear();
-           g->messageStream.str("");
-           g->messageStreamInUse = false;
-       }
-       else
-       {
-           delete out;
-       }
-	   return ;
-    }
+	{
+		LogLock lock;
+		if (!lock.ok())
+		{
+			return;
+		}
+
+		// If we hit a logging request very late during shutdown processing,
+		// when either of the relevant LLSingletons has already been deleted,
+		// DO NOT resurrect them.
+		if (Settings::wasDeleted() || Globals::wasDeleted())
+		{
+			return;
+		}
+
+		if(strlen(out->str().c_str()) < 128)
+		{
+			strcpy(message, out->str().c_str());
+		}
+		else
+		{
+			strncpy(message, out->str().c_str(), 127);
+			message[127] = '\0' ;
+		}
+
+		Globals* g = Globals::getInstance();
+		if (out == &g->messageStream)
+		{
+			g->messageStream.clear();
+			g->messageStream.str("");
+			g->messageStreamInUse = false;
+		}
+		else
+		{
+			delete out;
+		}
+		return ;
+	}
 
 	void Log::flush(std::ostringstream* out, const CallSite& site)
 	{
@@ -1159,7 +1178,15 @@ namespace LLError
 		{
 			return;
 		}
-		
+
+		// If we hit a logging request very late during shutdown processing,
+		// when either of the relevant LLSingletons has already been deleted,
+		// DO NOT resurrect them.
+		if (Settings::wasDeleted() || Globals::wasDeleted())
+		{
+			return;
+		}
+
 		Globals* g = Globals::getInstance();
 		SettingsConfigPtr s = Settings::getInstance()->getSettingsConfig();
 
diff --git a/indra/llcommon/lleventdispatcher.h b/indra/llcommon/lleventdispatcher.h
index 7acc61de4ecd76b3a02a01741857b48d3cb1c23f..9e1244ef5bf4d2f4eeb0f3edac5a77d6d5cbc729 100644
--- a/indra/llcommon/lleventdispatcher.h
+++ b/indra/llcommon/lleventdispatcher.h
@@ -47,13 +47,13 @@
 // namespace) that a global 'nil' macro breaks badly.
 #if defined(nil)
 // Capture the value of the macro 'nil', hoping int is an appropriate type.
-static const int nil_(nil);
+static const auto nil_(nil);
 // Now forget the macro.
 #undef nil
 // Finally, reintroduce 'nil' as a properly-scoped alias for the previously-
 // defined const 'nil_'. Make it static since otherwise it produces duplicate-
 // symbol link errors later.
-static const int& nil(nil_);
+static const auto& nil(nil_);
 #endif
 
 #include <string>
diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp
index 97270e4931d7cfc7a0b7196173abffd94a62c728..a3856e4fc46b71f6c62a3a4e6bd3e8a057996bdd 100644
--- a/indra/llcommon/llevents.cpp
+++ b/indra/llcommon/llevents.cpp
@@ -281,7 +281,8 @@ const std::string LLEventPump::ANONYMOUS = std::string();
 
 LLEventPump::LLEventPump(const std::string& name, bool tweak):
     // Register every new instance with LLEventPumps
-    mName(LLEventPumps::instance().registerNew(*this, name, tweak)),
+    mRegistry(LLEventPumps::instance().getHandle()),
+    mName(mRegistry.get()->registerNew(*this, name, tweak)),
     mSignal(new LLStandardSignal()),
     mEnabled(true)
 {}
@@ -292,8 +293,13 @@ LLEventPump::LLEventPump(const std::string& name, bool tweak):
 
 LLEventPump::~LLEventPump()
 {
-    // Unregister this doomed instance from LLEventPumps
-    LLEventPumps::instance().unregister(*this);
+    // Unregister this doomed instance from LLEventPumps -- but only if
+    // LLEventPumps is still around!
+    LLEventPumps* registry = mRegistry.get();
+    if (registry)
+    {
+        registry->unregister(*this);
+    }
 }
 
 // static data member
diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h
index 7cff7dfd4537b99d99c0a83f6753c941375b7000..1d51c660ed0d7990c63a4f93c875b2e61597a7f8 100644
--- a/indra/llcommon/llevents.h
+++ b/indra/llcommon/llevents.h
@@ -62,6 +62,7 @@
 #include "lldependencies.h"
 #include "llstl.h"
 #include "llexception.h"
+#include "llhandle.h"
 
 /*==========================================================================*|
 // override this to allow binding free functions with more parameters
@@ -227,7 +228,15 @@ class LLEventPump;
  * LLEventPumps is a Singleton manager through which one typically accesses
  * this subsystem.
  */
-class LL_COMMON_API LLEventPumps: public LLSingleton<LLEventPumps>
+// LLEventPumps isa LLHandleProvider only for (hopefully rare) long-lived
+// class objects that must refer to this class late in their lifespan, say in
+// the destructor. Specifically, the case that matters is a possible reference
+// after LLEventPumps::deleteSingleton(). (Lingering LLEventPump instances are
+// capable of this.) In that case, instead of calling LLEventPumps::instance()
+// again -- resurrecting the deleted LLSingleton -- store an
+// LLHandle<LLEventPumps> and test it before use.
+class LL_COMMON_API LLEventPumps: public LLSingleton<LLEventPumps>,
+                                  public LLHandleProvider<LLEventPumps>
 {
     LLSINGLETON(LLEventPumps);
 public:
@@ -590,6 +599,9 @@ class LL_COMMON_API LLEventPump: public LLEventTrackable
         return this->listen_impl(name, listener, after, before);
     }
 
+    // must precede mName; see LLEventPump::LLEventPump()
+    LLHandle<LLEventPumps> mRegistry;
+
     std::string mName;
 
 protected:
@@ -817,14 +829,14 @@ class LL_COMMON_API LLListenerWrapperBase
         mConnection(new LLBoundListener)
     {
     }
-	
+
     /// Copy constructor. Copy shared_ptrs to original instance data.
     LLListenerWrapperBase(const LLListenerWrapperBase& that):
         mName(that.mName),
         mConnection(that.mConnection)
     {
     }
-	virtual ~LLListenerWrapperBase() {}
+    virtual ~LLListenerWrapperBase() {}
 
     /// Ask LLEventPump::listen() for the listener name
     virtual void accept_name(const std::string& name) const
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index f56e5596f5496fd862ff3b39bf9ad21123ca5494..2024d707da5d3a0bbfe1e2a89a6dffe5b69cafdc 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -90,33 +90,15 @@ class BlockTimer
 #if LL_FASTTIMER_USE_RDTSC
 	static U32 getCPUClockCount32()
 	{
-		U32 ret_val;
-		__asm
-		{
-			_emit   0x0f
-				_emit   0x31
-				shr eax,8
-				shl edx,24
-				or eax, edx
-				mov dword ptr [ret_val], eax
-		}
-		return ret_val;
+		unsigned __int64 val = __rdtsc();
+		val = val >> 8;
+		return static_cast<U32>(val);
 	}
 
 	// return full timer value, *not* shifted by 8 bits
 	static U64 getCPUClockCount64()
 	{
-		U64 ret_val;
-		__asm
-		{
-			_emit   0x0f
-				_emit   0x31
-				mov eax,eax
-				mov edx,edx
-				mov dword ptr [ret_val+4], edx
-				mov dword ptr [ret_val], eax
-		}
-		return ret_val;
+		return static_cast<U64>( __rdtsc() );
 	}
 
 #else
@@ -173,16 +155,16 @@ class BlockTimer
 	// Mac+Linux+Solaris FAST x86 implementation of CPU clock
 	static U32 getCPUClockCount32()
 	{
-		U64 x;
-		__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
-		return (U32)(x >> 8);
+		U32 low(0),high(0);
+		__asm__ volatile (".byte 0x0f, 0x31": "=a"(low), "=d"(high) );
+		return (low>>8) | (high<<24);
 	}
 
 	static U64 getCPUClockCount64()
 	{
-		U64 x;
-		__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
-		return x;
+		U32 low(0),high(0);
+		__asm__ volatile (".byte 0x0f, 0x31": "=a"(low), "=d"(high) );
+		return (U64)low | ( ((U64)high) << 32);
 	}
 
 #endif
diff --git a/indra/llcommon/llfile.h b/indra/llcommon/llfile.h
index d8f84daf2b18336f00e2e9d6ed7bbb05dae54ea6..37eb75881c2c4e8ec4449ecc1871a5bdba696d0f 100644
--- a/indra/llcommon/llfile.h
+++ b/indra/llcommon/llfile.h
@@ -45,7 +45,7 @@ typedef FILE	LLFILE;
 typedef struct _stat	llstat;
 #else
 typedef struct stat		llstat;
-#include <bits/postypes.h>
+#include <sys/types.h>
 #endif
 
 #ifndef S_ISREG
diff --git a/indra/llcommon/llhandle.h b/indra/llcommon/llhandle.h
index feb5f418489e5b401eff95591ba4dd0fc31dbd66..570cd330b87ff228e33f938da79ef184c1a41f32 100644
--- a/indra/llcommon/llhandle.h
+++ b/indra/llcommon/llhandle.h
@@ -28,6 +28,7 @@
 #define LLHANDLE_H
 
 #include "llpointer.h"
+#include "llrefcount.h"
 #include "llexception.h"
 #include <stdexcept>
 #include <boost/type_traits/is_convertible.hpp>
diff --git a/indra/llcommon/llheteromap.h b/indra/llcommon/llheteromap.h
index 9d6f303d08beb261fe4df04db426d5d320397c1c..7e96172333293340840af4b9b0e1ad2ccb3fb914 100644
--- a/indra/llcommon/llheteromap.h
+++ b/indra/llcommon/llheteromap.h
@@ -77,7 +77,7 @@ class LLHeteroMap
     // not always equal &typeid(A) in some other part. Use special comparator.
     struct type_info_ptr_comp
     {
-        bool operator()(const std::type_info* lhs, const std::type_info* rhs)
+        bool operator()(const std::type_info* lhs, const std::type_info* rhs) const
         {
             return lhs->before(*rhs);
         }
diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h
index 9783644e66199625000e2debb200aaced5a1019c..910c8dbd99cdebb677e5a157dd725d3c74553459 100644
--- a/indra/llcommon/llinstancetracker.h
+++ b/indra/llcommon/llinstancetracker.h
@@ -35,6 +35,31 @@
 #include <boost/iterator/transform_iterator.hpp>
 #include <boost/iterator/indirect_iterator.hpp>
 
+// As of 2017-05-06, as far as nat knows, only clang supports __has_feature().
+// Unfortunately VS2013's preprocessor shortcut logic doesn't prevent it from
+// producing (fatal) warnings for defined(__clang__) && __has_feature(...).
+// Have to work around that.
+#if ! defined(__clang__)
+#define __has_feature(x) 0
+#endif // __clang__
+
+#if defined(LL_TEST_llinstancetracker) && __has_feature(cxx_noexcept)
+// ~LLInstanceTracker() performs llassert_always() validation. That's fine in
+// production code, since the llassert_always() is implemented as an LL_ERRS
+// message, which will crash-with-message. In our integration test executable,
+// though, this llassert_always() throws an exception instead so we can test
+// error conditions and continue running the test. However -- as of C++11,
+// destructors are implicitly noexcept(true). Unless we mark
+// ~LLInstanceTracker() noexcept(false), the test executable crashes even on
+// the ATTEMPT to throw.
+#define LLINSTANCETRACKER_DTOR_NOEXCEPT noexcept(false)
+#else
+// If we're building for production, or in fact building *any other* test, or
+// we're using a compiler that doesn't support __has_feature(), or we're not
+// compiling with a C++ version that supports noexcept -- don't specify it.
+#define LLINSTANCETRACKER_DTOR_NOEXCEPT
+#endif
+
 /**
  * Base class manages "class-static" data that must actually have singleton
  * semantics: one instance per process, rather than one instance per module as
@@ -198,11 +223,11 @@ class LLInstanceTracker : public LLInstanceTrackerBase
 		getStatic();
 		add_(key); 
 	}
-	virtual ~LLInstanceTracker() 
+	virtual ~LLInstanceTracker() LLINSTANCETRACKER_DTOR_NOEXCEPT
 	{ 
 		// it's unsafe to delete instances of this type while all instances are being iterated over.
 		llassert_always(getStatic().getDepth() == 0);
-		remove_();		
+		remove_();
 	}
 	virtual void setKey(KEY key) { remove_(); add_(key); }
 	virtual const KEY& getKey() const { return mInstanceKey; }
@@ -335,7 +360,7 @@ class LLInstanceTracker<T, void, KEY_COLLISION_BEHAVIOR> : public LLInstanceTrac
 		getStatic();
 		getSet_().insert(static_cast<T*>(this));
 	}
-	virtual ~LLInstanceTracker()
+	virtual ~LLInstanceTracker() LLINSTANCETRACKER_DTOR_NOEXCEPT
 	{
 		// it's unsafe to delete instances of this type while all instances are being iterated over.
 		llassert_always(getStatic().getDepth() == 0);
diff --git a/indra/llcommon/llmake.h b/indra/llcommon/llmake.h
index 9a662a06408a3af5a9805bb409c8ac6b3f593e78..08744f90fb532f7ec0c3d314adf8fe7066778458 100644
--- a/indra/llcommon/llmake.h
+++ b/indra/llcommon/llmake.h
@@ -12,12 +12,10 @@
  * 
  *         also relevant:
  *
- *         Template parameter deduction for constructors
- *         http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0091r0.html
- *
- *         https://github.com/viboes/std-make
- *
- *         but obviously we're not there yet.
+ *         Template argument deduction for class templates
+ *         http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0091r3.html
+ *         was apparently adopted in June 2016? Unclear when compilers will
+ *         portably support this, but there is hope.
  *
  * $LicenseInfo:firstyear=2015&license=viewerlgpl$
  * Copyright (c) 2015, Linden Research, Inc.
diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp
index 3a8eabac09af4d6d1ce6485a19159b6a03d35fc5..049e9626381b5bd5deaf65a76a48ea78770437a3 100644
--- a/indra/llcommon/llmemory.cpp
+++ b/indra/llcommon/llmemory.cpp
@@ -44,10 +44,10 @@
 #include "llsys.h"
 #include "llframetimer.h"
 #include "lltrace.h"
+#include "llerror.h"
 //----------------------------------------------------------------------------
 
 //static
-char* LLMemory::reserveMem = 0;
 U32Kilobytes LLMemory::sAvailPhysicalMemInKB(U32_MAX);
 U32Kilobytes LLMemory::sMaxPhysicalMemInKB(0);
 static LLTrace::SampleStatHandle<F64Megabytes> sAllocatedMem("allocated_mem", "active memory in use by application");
@@ -78,29 +78,6 @@ void ll_assert_aligned_func(uintptr_t ptr,U32 alignment)
 #endif
 }
 
-//static
-void LLMemory::initClass()
-{
-	if (!reserveMem)
-	{
-		reserveMem = new char[16*1024]; // reserve 16K for out of memory error handling
-	}
-}
-
-//static
-void LLMemory::cleanupClass()
-{
-	delete [] reserveMem;
-	reserveMem = NULL;
-}
-
-//static
-void LLMemory::freeReserve()
-{
-	delete [] reserveMem;
-	reserveMem = NULL;
-}
-
 //static 
 void LLMemory::initMaxHeapSizeGB(F32Gigabytes max_heap_size, BOOL prevent_heap_failure)
 {
@@ -111,19 +88,18 @@ void LLMemory::initMaxHeapSizeGB(F32Gigabytes max_heap_size, BOOL prevent_heap_f
 //static 
 void LLMemory::updateMemoryInfo() 
 {
-#if LL_WINDOWS	
-	HANDLE self = GetCurrentProcess();
+#if LL_WINDOWS
 	PROCESS_MEMORY_COUNTERS counters;
-	
-	if (!GetProcessMemoryInfo(self, &counters, sizeof(counters)))
+
+	if (!GetProcessMemoryInfo(GetCurrentProcess(), &counters, sizeof(counters)))
 	{
 		LL_WARNS() << "GetProcessMemoryInfo failed" << LL_ENDL;
 		return ;
 	}
 
-	sAllocatedMemInKB = (U32Bytes)(counters.WorkingSetSize) ;
+	sAllocatedMemInKB = U64Bytes(counters.WorkingSetSize) ;
 	sample(sAllocatedMem, sAllocatedMemInKB);
-	sAllocatedPageSizeInKB = (U32Bytes)(counters.PagefileUsage) ;
+	sAllocatedPageSizeInKB = U64Bytes(counters.PagefileUsage) ;
 	sample(sVirtualMem, sAllocatedPageSizeInKB);
 
 	U32Kilobytes avail_phys, avail_virtual;
@@ -140,9 +116,9 @@ void LLMemory::updateMemoryInfo()
 	}
 #else
 	//not valid for other systems for now.
-	sAllocatedMemInKB = (U32Bytes)LLMemory::getCurrentRSS();
-	sMaxPhysicalMemInKB = (U32Bytes)U32_MAX ;
-	sAvailPhysicalMemInKB = (U32Bytes)U32_MAX ;
+	sAllocatedMemInKB = U64Bytes(LLMemory::getCurrentRSS());
+	sMaxPhysicalMemInKB = U64Bytes(U32_MAX);
+	sAvailPhysicalMemInKB = U64Bytes(U32_MAX);
 #endif
 
 	return ;
@@ -169,7 +145,7 @@ void* LLMemory::tryToAlloc(void* address, U32 size)
 	return address ;
 #else
 	return (void*)0x01 ; //skip checking
-#endif	
+#endif
 }
 
 //static 
@@ -183,7 +159,7 @@ void LLMemory::logMemoryInfo(BOOL update)
 
 	LL_INFOS() << "Current allocated physical memory(KB): " << sAllocatedMemInKB << LL_ENDL ;
 	LL_INFOS() << "Current allocated page size (KB): " << sAllocatedPageSizeInKB << LL_ENDL ;
-	LL_INFOS() << "Current availabe physical memory(KB): " << sAvailPhysicalMemInKB << LL_ENDL ;
+	LL_INFOS() << "Current available physical memory(KB): " << sAvailPhysicalMemInKB << LL_ENDL ;
 	LL_INFOS() << "Current max usable memory(KB): " << sMaxPhysicalMemInKB << LL_ENDL ;
 
 	LL_INFOS() << "--- private pool information -- " << LL_ENDL ;
@@ -263,12 +239,12 @@ U32Kilobytes LLMemory::getAllocatedMemKB()
 
 #if defined(LL_WINDOWS)
 
+//static 
 U64 LLMemory::getCurrentRSS()
 {
-	HANDLE self = GetCurrentProcess();
 	PROCESS_MEMORY_COUNTERS counters;
-	
-	if (!GetProcessMemoryInfo(self, &counters, sizeof(counters)))
+
+	if (!GetProcessMemoryInfo(GetCurrentProcess(), &counters, sizeof(counters)))
 	{
 		LL_WARNS() << "GetProcessMemoryInfo failed" << LL_ENDL;
 		return 0;
@@ -277,35 +253,8 @@ U64 LLMemory::getCurrentRSS()
 	return counters.WorkingSetSize;
 }
 
-//static 
-U32 LLMemory::getWorkingSetSize()
-{
-    PROCESS_MEMORY_COUNTERS pmc ;
-	U32 ret = 0 ;
-
-    if (GetProcessMemoryInfo( GetCurrentProcess(), &pmc, sizeof(pmc)) )
-	{
-		ret = pmc.WorkingSetSize ;
-	}
-
-	return ret ;
-}
-
 #elif defined(LL_DARWIN)
 
-/* 
-	The API used here is not capable of dealing with 64-bit memory sizes, but is available before 10.4.
-	
-	Once we start requiring 10.4, we can use the updated API, which looks like this:
-	
-	task_basic_info_64_data_t basicInfo;
-	mach_msg_type_number_t  basicInfoCount = TASK_BASIC_INFO_64_COUNT;
-	if (task_info(mach_task_self(), TASK_BASIC_INFO_64, (task_info_t)&basicInfo, &basicInfoCount) == KERN_SUCCESS)
-	
-	Of course, this doesn't gain us anything unless we start building the viewer as a 64-bit executable, since that's the only way
-	for our memory allocation to exceed 2^32.
-*/
-
 // 	if (sysctl(ctl, 2, &page_size, &size, NULL, 0) == -1)
 // 	{
 // 		LL_WARNS() << "Couldn't get page size" << LL_ENDL;
@@ -318,16 +267,15 @@ U32 LLMemory::getWorkingSetSize()
 U64 LLMemory::getCurrentRSS()
 {
 	U64 residentSize = 0;
-	task_basic_info_data_t basicInfo;
-	mach_msg_type_number_t  basicInfoCount = TASK_BASIC_INFO_COUNT;
-	if (task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&basicInfo, &basicInfoCount) == KERN_SUCCESS)
+	mach_task_basic_info_data_t basicInfo;
+	mach_msg_type_number_t  basicInfoCount = MACH_TASK_BASIC_INFO_COUNT;
+	if (task_info(mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t)&basicInfo, &basicInfoCount) == KERN_SUCCESS)
 	{
-		residentSize = basicInfo.resident_size;
-
-		// If we ever wanted it, the process virtual size is also available as:
-		// virtualSize = basicInfo.virtual_size;
-		
-//		LL_INFOS() << "resident size is " << residentSize << LL_ENDL;
+//		residentSize = basicInfo.resident_size;
+		// Although this method is defined to return the "resident set size,"
+		// in fact what callers want from it is the total virtual memory
+		// consumed by the application.
+		residentSize = basicInfo.virtual_size;
 	}
 	else
 	{
@@ -337,11 +285,6 @@ U64 LLMemory::getCurrentRSS()
 	return residentSize;
 }
 
-U32 LLMemory::getWorkingSetSize()
-{
-	return 0 ;
-}
-
 #elif defined(LL_LINUX)
 
 U64 LLMemory::getCurrentRSS()
@@ -353,7 +296,7 @@ U64 LLMemory::getCurrentRSS()
 	if (fp == NULL)
 	{
 		LL_WARNS() << "couldn't open " << statPath << LL_ENDL;
-		goto bail;
+		return 0;
 	}
 
 	// Eee-yew!	 See Documentation/filesystems/proc.txt in your
@@ -372,15 +315,9 @@ U64 LLMemory::getCurrentRSS()
 	
 	fclose(fp);
 
-bail:
 	return rss;
 }
 
-U32 LLMemory::getWorkingSetSize()
-{
-	return 0 ;
-}
-
 #elif LL_SOLARIS
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -410,11 +347,6 @@ U64 LLMemory::getCurrentRSS()
 	return((U64)proc_psinfo.pr_rssize * 1024);
 }
 
-U32 LLMemory::getWorkingSetSize()
-{
-	return 0 ;
-}
-
 #else
 
 U64 LLMemory::getCurrentRSS()
@@ -422,11 +354,6 @@ U64 LLMemory::getCurrentRSS()
 	return 0;
 }
 
-U32 LLMemory::getWorkingSetSize()
-{
-	return 0;
-}
-
 #endif
 
 //--------------------------------------------------------------------------------------------------
@@ -591,7 +518,7 @@ char* LLPrivateMemoryPool::LLMemoryBlock::allocate()
 void  LLPrivateMemoryPool::LLMemoryBlock::freeMem(void* addr) 
 {
 	//bit index
-	U32 idx = ((U32)addr - (U32)mBuffer - mDummySize) / mSlotSize ;
+	uintptr_t idx = ((uintptr_t)addr - (uintptr_t)mBuffer - mDummySize) / mSlotSize ;
 
 	U32* bits = &mUsageBits ;
 	if(idx >= 32)
@@ -773,7 +700,7 @@ char* LLPrivateMemoryPool::LLMemoryChunk::allocate(U32 size)
 
 void LLPrivateMemoryPool::LLMemoryChunk::freeMem(void* addr)
 {	
-	U32 blk_idx = getPageIndex((U32)addr) ;
+	U32 blk_idx = getPageIndex((uintptr_t)addr) ;
 	LLMemoryBlock* blk = (LLMemoryBlock*)(mMetaBuffer + blk_idx * sizeof(LLMemoryBlock)) ;
 	blk = blk->mSelf ;
 
@@ -798,7 +725,7 @@ bool LLPrivateMemoryPool::LLMemoryChunk::empty()
 
 bool LLPrivateMemoryPool::LLMemoryChunk::containsAddress(const char* addr) const
 {
-	return (U32)mBuffer <= (U32)addr && (U32)mBuffer + mBufferSize > (U32)addr ;
+	return (uintptr_t)mBuffer <= (uintptr_t)addr && (uintptr_t)mBuffer + mBufferSize > (uintptr_t)addr ;
 }
 
 //debug use
@@ -831,13 +758,13 @@ void LLPrivateMemoryPool::LLMemoryChunk::dump()
 	for(U32 i = 1 ; i < blk_list.size(); i++)
 	{
 		total_size += blk_list[i]->getBufferSize() ;
-		if((U32)blk_list[i]->getBuffer() < (U32)blk_list[i-1]->getBuffer() + blk_list[i-1]->getBufferSize())
+		if((uintptr_t)blk_list[i]->getBuffer() < (uintptr_t)blk_list[i-1]->getBuffer() + blk_list[i-1]->getBufferSize())
 		{
 			LL_ERRS() << "buffer corrupted." << LL_ENDL ;
 		}
 	}
 
-	llassert_always(total_size + mMinBlockSize >= mBufferSize - ((U32)mDataBuffer - (U32)mBuffer)) ;
+	llassert_always(total_size + mMinBlockSize >= mBufferSize - ((uintptr_t)mDataBuffer - (uintptr_t)mBuffer)) ;
 
 	U32 blk_num = (mBufferSize - (mDataBuffer - mBuffer)) / mMinBlockSize ;
 	for(U32 i = 0 ; i < blk_num ; )
@@ -860,7 +787,7 @@ void LLPrivateMemoryPool::LLMemoryChunk::dump()
 #endif
 #if 0
 	LL_INFOS() << "---------------------------" << LL_ENDL ;
-	LL_INFOS() << "Chunk buffer: " << (U32)getBuffer() << " size: " << getBufferSize() << LL_ENDL ;
+	LL_INFOS() << "Chunk buffer: " << (uintptr_t)getBuffer() << " size: " << getBufferSize() << LL_ENDL ;
 
 	LL_INFOS() << "available blocks ... " << LL_ENDL ;
 	for(S32 i = 0 ; i < mBlockLevels ; i++)
@@ -868,7 +795,7 @@ void LLPrivateMemoryPool::LLMemoryChunk::dump()
 		LLMemoryBlock* blk = mAvailBlockList[i] ;
 		while(blk)
 		{
-			LL_INFOS() << "blk buffer " << (U32)blk->getBuffer() << " size: " << blk->getBufferSize() << LL_ENDL ;
+			LL_INFOS() << "blk buffer " << (uintptr_t)blk->getBuffer() << " size: " << blk->getBufferSize() << LL_ENDL ;
 			blk = blk->mNext ;
 		}
 	}
@@ -879,7 +806,7 @@ void LLPrivateMemoryPool::LLMemoryChunk::dump()
 		LLMemoryBlock* blk = mFreeSpaceList[i] ;
 		while(blk)
 		{
-			LL_INFOS() << "blk buffer " << (U32)blk->getBuffer() << " size: " << blk->getBufferSize() << LL_ENDL ;
+			LL_INFOS() << "blk buffer " << (uintptr_t)blk->getBuffer() << " size: " << blk->getBufferSize() << LL_ENDL ;
 			blk = blk->mNext ;
 		}
 	}
@@ -1155,9 +1082,9 @@ void LLPrivateMemoryPool::LLMemoryChunk::addToAvailBlockList(LLMemoryBlock* blk)
 	return ;
 }
 
-U32 LLPrivateMemoryPool::LLMemoryChunk::getPageIndex(U32 addr)
+U32 LLPrivateMemoryPool::LLMemoryChunk::getPageIndex(uintptr_t addr)
 {
-	return (addr - (U32)mDataBuffer) / mMinBlockSize ;
+	return (addr - (uintptr_t)mDataBuffer) / mMinBlockSize ;
 }
 
 //for mAvailBlockList
@@ -1495,7 +1422,7 @@ void LLPrivateMemoryPool::removeChunk(LLMemoryChunk* chunk)
 
 U16 LLPrivateMemoryPool::findHashKey(const char* addr)
 {
-	return (((U32)addr) / CHUNK_SIZE) % mHashFactor ;
+	return (((uintptr_t)addr) / CHUNK_SIZE) % mHashFactor ;
 }
 
 LLPrivateMemoryPool::LLMemoryChunk* LLPrivateMemoryPool::findChunk(const char* addr)
@@ -1720,7 +1647,7 @@ LLPrivateMemoryPoolManager::~LLPrivateMemoryPoolManager()
 		S32 k = 0 ;
 		for(mem_allocation_info_t::iterator iter = sMemAllocationTracker.begin() ; iter != sMemAllocationTracker.end() ; ++iter)
 		{
-			LL_INFOS() << k++ << ", " << (U32)iter->first << " : " << iter->second << LL_ENDL ;
+			LL_INFOS() << k++ << ", " << (uintptr_t)iter->first << " : " << iter->second << LL_ENDL ;
 		}
 		sMemAllocationTracker.clear() ;
 	}
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index 575edddc43c9500bd4142458d8faea6ad38b01ac..c37967e10ebe32baaf7367ba54095397ff81d0d7 100644
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -138,7 +138,6 @@ template <typename T> T* LL_NEXT_ALIGNED_ADDRESS_64(T* address)
 //------------------------------------------------------------------------------------------------
 //------------------------------------------------------------------------------------------------
 
-#if !LL_USE_TCMALLOC
 inline void* ll_aligned_malloc_16(size_t size) // returned hunk MUST be freed with ll_aligned_free_16().
 {
 #if defined(LL_WINDOWS)
@@ -187,13 +186,6 @@ inline void* ll_aligned_realloc_16(void* ptr, size_t size, size_t old_size) // r
 #endif
 }
 
-#else // USE_TCMALLOC
-// ll_aligned_foo_16 are not needed with tcmalloc
-#define ll_aligned_malloc_16 malloc
-#define ll_aligned_realloc_16(a,b,c) realloc(a,b)
-#define ll_aligned_free_16 free
-#endif // USE_TCMALLOC
-
 inline void* ll_aligned_malloc_32(size_t size) // returned hunk MUST be freed with ll_aligned_free_32().
 {
 #if defined(LL_WINDOWS)
@@ -342,13 +334,9 @@ inline void ll_memcpy_nonaliased_aligned_16(char* __restrict dst, const char* __
 class LL_COMMON_API LLMemory
 {
 public:
-	static void initClass();
-	static void cleanupClass();
-	static void freeReserve();
 	// Return the resident set size of the current process, in bytes.
 	// Return value is zero if not known.
 	static U64 getCurrentRSS();
-	static U32 getWorkingSetSize();
 	static void* tryToAlloc(void* address, U32 size);
 	static void initMaxHeapSizeGB(F32Gigabytes max_heap_size, BOOL prevent_heap_failure);
 	static void updateMemoryInfo() ;
@@ -359,7 +347,6 @@ class LL_COMMON_API LLMemory
 	static U32Kilobytes getMaxMemKB() ;
 	static U32Kilobytes getAllocatedMemKB() ;
 private:
-	static char* reserveMem;
 	static U32Kilobytes sAvailPhysicalMemInKB ;
 	static U32Kilobytes sMaxPhysicalMemInKB ;
 	static U32Kilobytes sAllocatedMemInKB;
@@ -423,7 +410,7 @@ class LL_COMMON_API LLPrivateMemoryPool
 		{
 			bool operator()(const LLMemoryBlock* const& lhs, const LLMemoryBlock* const& rhs)
 			{
-				return (U32)lhs->getBuffer() < (U32)rhs->getBuffer();
+				return (uintptr_t)lhs->getBuffer() < (uintptr_t)rhs->getBuffer();
 			}
 		};
 	};
@@ -454,7 +441,7 @@ class LL_COMMON_API LLPrivateMemoryPool
 		void dump() ;
 
 	private:
-		U32 getPageIndex(U32 addr) ;
+		U32 getPageIndex(uintptr_t addr) ;
 		U32 getBlockLevel(U32 size) ;
 		U16 getPageLevel(U32 size) ;
 		LLMemoryBlock* addBlock(U32 blk_idx) ;
diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h
index 2c4bcc91f6e96ec41c8e6b588de038025a3fc807..2879038c3652c3e54d5a9aa4e6d6559f700c439a 100644
--- a/indra/llcommon/llpreprocessor.h
+++ b/indra/llcommon/llpreprocessor.h
@@ -138,6 +138,12 @@
 #pragma warning( 3      :  4266 )	// 'function' : no override available for virtual member function from base 'type'; function is hidden
 #pragma warning (disable : 4180)	// qualifier applied to function type has no meaning; ignored
 //#pragma warning( disable : 4284 )	// silly MS warning deep inside their <map> include file
+
+#if ADDRESS_SIZE == 64
+// That one is all over the place for x64 builds.
+#pragma warning( disable : 4267 )   // 'var' : conversion from 'size_t' to 'type', possible loss of data)
+#endif
+
 #pragma warning( disable : 4503 )	// 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation.
 #pragma warning( disable : 4800 )	// 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)
 #pragma warning( disable : 4996 )	// warning: deprecated
@@ -186,13 +192,9 @@
 # define LL_COMMON_API
 #endif // LL_COMMON_LINK_SHARED
 
-#if LL_WINDOWS
-#define LL_TYPEOF(exp) decltype(exp)
-#elif LL_LINUX
-#define LL_TYPEOF(exp) typeof(exp)
-#elif LL_DARWIN
-#define LL_TYPEOF(exp) typeof(exp)
-#endif
+// With C++11, decltype() is standard. We no longer need a platform-dependent
+// macro to get the type of an expression.
+#define LL_TYPEOF(expr) decltype(expr)
 
 #define LL_TO_STRING_HELPER(x) #x
 #define LL_TO_STRING(x) LL_TO_STRING_HELPER(x)
diff --git a/indra/llcommon/llprocess.cpp b/indra/llcommon/llprocess.cpp
index 8c321d06b9eaecad730a9e080da4bfd3e80a4eea..5753efdc592d5081853c527ce7706ac01c77c3c2 100644
--- a/indra/llcommon/llprocess.cpp
+++ b/indra/llcommon/llprocess.cpp
@@ -517,6 +517,10 @@ LLProcessPtr LLProcess::create(const LLSDOrParams& params)
 
 LLProcess::LLProcess(const LLSDOrParams& params):
 	mAutokill(params.autokill),
+	// Because 'autokill' originally meant both 'autokill' and 'attached', to
+	// preserve existing semantics, we promise that mAttached defaults to the
+	// same setting as mAutokill.
+	mAttached(params.attached.isProvided()? params.attached : params.autokill),
 	mPipes(NSLOTS)
 {
 	// Hmm, when you construct a ptr_vector with a size, it merely reserves
@@ -625,9 +629,9 @@ LLProcess::LLProcess(const LLSDOrParams& params):
 	// std handles and the like, and that's a bit more detachment than we
 	// want. autokill=false just means not to implicitly kill the child when
 	// the parent terminates!
-//	chkapr(apr_procattr_detach_set(procattr, params.autokill? 0 : 1));
+//	chkapr(apr_procattr_detach_set(procattr, mAutokill? 0 : 1));
 
-	if (params.autokill)
+	if (mAutokill)
 	{
 #if ! defined(APR_HAS_PROCATTR_AUTOKILL_SET)
 		// Our special preprocessor symbol isn't even defined -- wrong APR
@@ -696,7 +700,7 @@ LLProcess::LLProcess(const LLSDOrParams& params):
 	// take steps to terminate the child. This is all suspenders-and-belt: in
 	// theory our destructor should kill an autokill child, but in practice
 	// that doesn't always work (e.g. VWR-21538).
-	if (params.autokill)
+	if (mAutokill)
 	{
 /*==========================================================================*|
 		// NO: There may be an APR bug, not sure -- but at least on Mac, when
@@ -799,7 +803,7 @@ LLProcess::~LLProcess()
 		sProcessListener.dropPoll(*this);
 	}
 
-	if (mAutokill)
+	if (mAttached)
 	{
 		kill("destructor");
 	}
diff --git a/indra/llcommon/llprocess.h b/indra/llcommon/llprocess.h
index bfac4567a50587f5816a0cfcf94ba6127b9d2501..e3386ad88e49a7af005dc31007853698d6ddc752 100644
--- a/indra/llcommon/llprocess.h
+++ b/indra/llcommon/llprocess.h
@@ -167,6 +167,7 @@ class LL_COMMON_API LLProcess: public boost::noncopyable
 			args("args"),
 			cwd("cwd"),
 			autokill("autokill", true),
+			attached("attached", true),
 			files("files"),
 			postend("postend"),
 			desc("desc")
@@ -183,9 +184,31 @@ class LL_COMMON_API LLProcess: public boost::noncopyable
 		Multiple<std::string> args;
 		/// current working directory, if need it changed
 		Optional<std::string> cwd;
-		/// implicitly kill process on destruction of LLProcess object
-		/// (default true)
+		/// implicitly kill child process on termination of parent, whether
+		/// voluntary or crash (default true)
 		Optional<bool> autokill;
+		/// implicitly kill process on destruction of LLProcess object
+		/// (default same as autokill)
+		///
+		/// Originally, 'autokill' conflated two concepts: kill child process on
+		/// - destruction of its LLProcess object, and
+		/// - termination of parent process, voluntary or otherwise.
+		///
+		/// It's useful to tease these apart. Some child processes are sent a
+		/// "clean up and terminate" message before the associated LLProcess
+		/// object is destroyed. A child process launched with attached=false
+		/// has an extra time window from the destruction of its LLProcess
+		/// until parent-process termination in which to perform its own
+		/// orderly shutdown, yet autokill=true still guarantees that we won't
+		/// accumulate orphan instances of such processes indefinitely. With
+		/// attached=true, if a child process cannot clean up between the
+		/// shutdown message and LLProcess destruction (presumably very soon
+		/// thereafter), it's forcibly killed anyway -- which can lead to
+		/// distressing user-visible crash indications.
+		///
+		/// (The usefulness of attached=true with autokill=false is less
+		/// clear, but we don't prohibit that combination.)
+		Optional<bool> attached;
 		/**
 		 * Up to three FileParam items: for child stdin, stdout, stderr.
 		 * Passing two FileParam entries means default treatment for stderr,
@@ -540,7 +563,7 @@ class LL_COMMON_API LLProcess: public boost::noncopyable
 	std::string mDesc;
 	std::string mPostend;
 	apr_proc_t mProcess;
-	bool mAutokill;
+	bool mAutokill, mAttached;
 	Status mStatus;
 	// explicitly want this ptr_vector to be able to store NULLs
 	typedef boost::ptr_vector< boost::nullable<BasePipe> > PipeVector;
diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp
index e3e1d0c3918c8cdf1c61d2b98305c46d105a2dc8..446c312ca9e89b0f5d0d9cf41d2b0306356ecefb 100644
--- a/indra/llcommon/llprocessor.cpp
+++ b/indra/llcommon/llprocessor.cpp
@@ -26,9 +26,11 @@
 
 #include "linden_common.h"
 #include "llprocessor.h"
-
+#include "llstring.h"
+#include "stringize.h"
 #include "llerror.h"
 
+#include <iomanip>
 //#include <memory>
 
 #if LL_WINDOWS
@@ -188,7 +190,7 @@ namespace
 		case 0xF: return "Intel Pentium 4";
 		case 0x10: return "Intel Itanium 2 (IA-64)";
 		}
-		return "Unknown";
+		return STRINGIZE("Intel <unknown 0x" << std::hex << composed_family << ">");
 	}
 	
 	std::string amd_CPUFamilyName(int composed_family) 
@@ -201,26 +203,26 @@ namespace
 		case 0xF: return "AMD K8";
 		case 0x10: return "AMD K8L";
 		}
-   		return "Unknown";
+		return STRINGIZE("AMD <unknown 0x" << std::hex << composed_family << ">");
 	}
 
 	std::string compute_CPUFamilyName(const char* cpu_vendor, int family, int ext_family) 
 	{
 		const char* intel_string = "GenuineIntel";
 		const char* amd_string = "AuthenticAMD";
-		if(!strncmp(cpu_vendor, intel_string, strlen(intel_string)))
+		if (LLStringUtil::startsWith(cpu_vendor, intel_string))
 		{
 			U32 composed_family = family + ext_family;
 			return intel_CPUFamilyName(composed_family);
 		}
-		else if(!strncmp(cpu_vendor, amd_string, strlen(amd_string)))
+		else if (LLStringUtil::startsWith(cpu_vendor, amd_string))
 		{
 			U32 composed_family = (family == 0xF) 
 				? family + ext_family
 				: family;
 			return amd_CPUFamilyName(composed_family);
 		}
-		return "Unknown";
+		return STRINGIZE("Unrecognized CPU vendor <" << cpu_vendor << ">");
 	}
 
 } // end unnamed namespace
@@ -258,8 +260,8 @@ class LLProcessorInfoImpl
 		return hasExtension("Altivec"); 
 	}
 
-	std::string getCPUFamilyName() const { return getInfo(eFamilyName, "Unknown").asString(); }
-	std::string getCPUBrandName() const { return getInfo(eBrandName, "Unknown").asString(); }
+	std::string getCPUFamilyName() const { return getInfo(eFamilyName, "Unset family").asString(); }
+	std::string getCPUBrandName() const { return getInfo(eBrandName, "Unset brand").asString(); }
 
 	// This is virtual to support a different linux format.
 	// *NOTE:Mani - I didn't want to screw up server use of this data...
@@ -271,7 +273,7 @@ class LLProcessorInfoImpl
 		out << "//////////////////////////" << std::endl;
 		out << "Processor Name:   " << getCPUBrandName() << std::endl;
 		out << "Frequency:        " << getCPUFrequency() << " MHz" << std::endl;
-		out << "Vendor:			  " << getInfo(eVendor, "Unknown").asString() << std::endl;
+		out << "Vendor:			  " << getInfo(eVendor, "Unset vendor").asString() << std::endl;
 		out << "Family:           " << getCPUFamilyName() << " (" << getInfo(eFamily, 0) << ")" << std::endl;
 		out << "Extended family:  " << getInfo(eExtendedFamily, 0) << std::endl;
 		out << "Model:            " << getInfo(eModel, 0) << std::endl;
@@ -398,7 +400,7 @@ static F64 calculate_cpu_frequency(U32 measure_msecs)
 	HANDLE hThread = GetCurrentThread();
 	unsigned long dwCurPriorityClass = GetPriorityClass(hProcess);
 	int iCurThreadPriority = GetThreadPriority(hThread);
-	unsigned long dwProcessMask, dwSystemMask, dwNewMask = 1;
+	DWORD_PTR dwProcessMask, dwSystemMask, dwNewMask = 1;
 	GetProcessAffinityMask(hProcess, &dwProcessMask, &dwSystemMask);
 
 	SetPriorityClass(hProcess, REALTIME_PRIORITY_CLASS);
diff --git a/indra/llcommon/llsafehandle.h b/indra/llcommon/llsafehandle.h
index 4226bf04f0610d5f7b51d7455b09edc158a38ef8..9550e6253e8ff8f133bad890111a41c1cc0a899d 100644
--- a/indra/llcommon/llsafehandle.h
+++ b/indra/llcommon/llsafehandle.h
@@ -27,6 +27,30 @@
 #define LLSAFEHANDLE_H
 
 #include "llerror.h"	// *TODO: consider eliminating this
+#include "llsingleton.h"
+
+/*==========================================================================*|
+ ____   ___    _   _  ___ _____   _   _ ____  _____ _
+|  _ \ / _ \  | \ | |/ _ \_   _| | | | / ___|| ____| |
+| | | | | | | |  \| | | | || |   | | | \___ \|  _| | |
+| |_| | |_| | | |\  | |_| || |   | |_| |___) | |___|_|
+|____/ \___/  |_| \_|\___/ |_|    \___/|____/|_____(_)
+
+This handle class is deprecated. Unfortunately it is already in widespread use
+to reference the LLObjectSelection and LLParcelSelection classes, but do not
+apply LLSafeHandle to other classes, or declare new instances.
+
+Instead, use LLPointer or other smart pointer types with appropriate checks
+for NULL. If you're certain the reference cannot (or must not) be NULL,
+consider storing a C++ reference instead -- or use (e.g.) LLCheckedHandle.
+
+When an LLSafeHandle<T> containing NULL is dereferenced, it resolves to a
+canonical "null" T instance. This raises issues about the lifespan of the
+"null" instance. In addition to encouraging sloppy coding practices, it
+potentially masks bugs when code that performs some mutating operation
+inadvertently applies it to the "null" instance. That result might or might
+not ever affect subsequent computations.
+|*==========================================================================*/
 
 // Expands LLPointer to return a pointer to a special instance of class Type instead of NULL.
 // This is useful in instances where operations on NULL pointers are semantically safe and/or
@@ -112,10 +136,6 @@ class LLSafeHandle
 		return *this; 
 	}
 
-public:
-	typedef Type* (*NullFunc)();
-	static const NullFunc sNullFunc;
-
 protected:
 	void ref()                             
 	{ 
@@ -150,9 +170,25 @@ class LLSafeHandle
 		}
 	}
 
+	// Define an LLSingleton whose sole purpose is to hold a "null instance"
+	// of the subject Type: the canonical instance to dereference if this
+	// LLSafeHandle actually holds a null pointer. We use LLSingleton
+	// specifically so that the "null instance" can be cleaned up at a well-
+	// defined time, specifically LLSingletonBase::deleteAll().
+	// Of course, as with any LLSingleton, the "null instance" is only
+	// instantiated on demand -- in this case, if you actually try to
+	// dereference an LLSafeHandle containing null.
+	class NullInstanceHolder: public LLSingleton<NullInstanceHolder>
+	{
+		LLSINGLETON_EMPTY_CTOR(NullInstanceHolder);
+		~NullInstanceHolder() {}
+	public:
+		Type mNullInstance;
+	};
+
 	static Type* nonNull(Type* ptr)
 	{
-		return ptr == NULL ? sNullFunc() : ptr;
+		return ptr? ptr : &NullInstanceHolder::instance().mNullInstance;
 	}
 
 protected:
diff --git a/indra/llcommon/llsingleton.cpp b/indra/llcommon/llsingleton.cpp
index a3a87edd88b5893201f83894da6f080962a2ad0a..9fbd78a0003e10067cc16234fdc86363a3cebbc0 100644
--- a/indra/llcommon/llsingleton.cpp
+++ b/indra/llcommon/llsingleton.cpp
@@ -391,62 +391,20 @@ void LLSingletonBase::deleteAll()
     }
 }
 
-/*------------------------ Final cleanup management ------------------------*/
-class LLSingletonBase::MasterRefcount
-{
-public:
-    // store a POD int so it will be statically initialized to 0
-    int refcount;
-};
-static LLSingletonBase::MasterRefcount sMasterRefcount;
-
-LLSingletonBase::ref_ptr_t LLSingletonBase::get_master_refcount()
-{
-    // Calling this method constructs a new ref_ptr_t, which implicitly calls
-    // intrusive_ptr_add_ref(MasterRefcount*).
-    return &sMasterRefcount;
-}
-
-void intrusive_ptr_add_ref(LLSingletonBase::MasterRefcount* mrc)
-{
-    // Count outstanding SingletonLifetimeManager instances.
-    ++mrc->refcount;
-}
-
-void intrusive_ptr_release(LLSingletonBase::MasterRefcount* mrc)
-{
-    // Notice when each SingletonLifetimeManager instance is destroyed.
-    if (! --mrc->refcount)
-    {
-        // The last instance was destroyed. Time to kill any remaining
-        // LLSingletons -- but in dependency order.
-        LLSingletonBase::deleteAll();
-    }
-}
-
 /*---------------------------- Logging helpers -----------------------------*/
 namespace {
 bool oktolog()
 {
     // See comments in log() below.
-    return sMasterRefcount.refcount && LLError::is_available();
+    return LLError::is_available();
 }
 
 void log(LLError::ELevel level,
          const char* p1, const char* p2, const char* p3, const char* p4)
 {
-    // Check whether we're in the implicit final LLSingletonBase::deleteAll()
-    // call. We've carefully arranged for deleteAll() to be called when the
-    // last SingletonLifetimeManager instance is destroyed -- in other words,
-    // when the last translation unit containing an LLSingleton instance
-    // cleans up static data. That could happen after std::cerr is destroyed!
     // The is_available() test below ensures that we'll stop logging once
     // LLError has been cleaned up. If we had a similar portable test for
-    // std::cerr, this would be a good place to use it. As we do not, just
-    // don't log anything during implicit final deleteAll(). Detect that by
-    // the master refcount having gone to zero.
-    if (sMasterRefcount.refcount == 0)
-        return;
+    // std::cerr, this would be a good place to use it.
 
     // Check LLError::is_available() because some of LLError's infrastructure
     // is itself an LLSingleton. If that LLSingleton has not yet been
diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h
index 1b915dfd6e96d927fd520ba58415c52387295049..859e271e26c661a88a726456bcaf128d61f83672 100644
--- a/indra/llcommon/llsingleton.h
+++ b/indra/llcommon/llsingleton.h
@@ -27,7 +27,6 @@
 
 #include <boost/noncopyable.hpp>
 #include <boost/unordered_set.hpp>
-#include <boost/intrusive_ptr.hpp>
 #include <list>
 #include <vector>
 #include <typeinfo>
@@ -36,8 +35,6 @@ class LLSingletonBase: private boost::noncopyable
 {
 public:
     class MasterList;
-    class MasterRefcount;
-    typedef boost::intrusive_ptr<MasterRefcount> ref_ptr_t;
 
 private:
     // All existing LLSingleton instances are tracked in this master list.
@@ -119,9 +116,6 @@ class LLSingletonBase: private boost::noncopyable
                          const char* p3="", const char* p4="");
     static std::string demangle(const char* mangled);
 
-    // obtain canonical ref_ptr_t
-    static ref_ptr_t get_master_refcount();
-
     // Default methods in case subclass doesn't declare them.
     virtual void initSingleton() {}
     virtual void cleanupSingleton() {}
@@ -175,10 +169,6 @@ class LLSingletonBase: private boost::noncopyable
     static void deleteAll();
 };
 
-// support ref_ptr_t
-void intrusive_ptr_add_ref(LLSingletonBase::MasterRefcount*);
-void intrusive_ptr_release(LLSingletonBase::MasterRefcount*);
-
 // Most of the time, we want LLSingleton_manage_master() to forward its
 // methods to real LLSingletonBase methods.
 template <class T>
@@ -298,8 +288,7 @@ class LLSingleton : public LLSingletonBase
     // stores pointer to singleton instance
     struct SingletonLifetimeManager
     {
-        SingletonLifetimeManager():
-            mMasterRefcount(LLSingletonBase::get_master_refcount())
+        SingletonLifetimeManager()
         {
             construct();
         }
@@ -317,17 +306,14 @@ class LLSingleton : public LLSingletonBase
             // of static-object destruction, mean that we DO NOT WANT this
             // destructor to delete this LLSingleton. This destructor will run
             // without regard to any other LLSingleton whose cleanup might
-            // depend on its existence. What we really want is to count the
-            // runtime's attempts to cleanup LLSingleton static data -- and on
-            // the very last one, call LLSingletonBase::deleteAll(). That
-            // method will properly honor cross-LLSingleton dependencies. This
-            // is why we store an intrusive_ptr to a MasterRefcount: our
-            // ref_ptr_t member counts SingletonLifetimeManager instances.
-            // Once the runtime destroys the last of these, THEN we can delete
-            // every remaining LLSingleton.
+            // depend on its existence. If you want to clean up LLSingletons,
+            // call LLSingletonBase::deleteAll() sometime before static-object
+            // destruction begins. That method will properly honor cross-
+            // LLSingleton dependencies. Otherwise we simply leak LLSingleton
+            // instances at shutdown. Since the whole process is terminating
+            // anyway, that's not necessarily a bad thing; it depends on what
+            // resources your LLSingleton instances are managing.
         }
-
-        LLSingletonBase::ref_ptr_t mMasterRefcount;
     };
 
 protected:
@@ -452,6 +438,14 @@ class LLSingleton : public LLSingletonBase
         return sData.mInitState == INITIALIZED;
     }
 
+    // Has this singleton been deleted? This can be useful during shutdown
+    // processing to avoid "resurrecting" a singleton we thought we'd already
+    // cleaned up.
+    static bool wasDeleted()
+    {
+        return sData.mInitState == DELETED;
+    }
+
 private:
     struct SingletonData
     {
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 2255e638c29a79baa61008299f0b3234745001c9..a6629bc178a85298ea9cb0b4ad7466a17b955e1d 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -444,7 +444,7 @@ class LLStringExplicit : public std::string
 struct LLDictionaryLess
 {
 public:
-	bool operator()(const std::string& a, const std::string& b)
+	bool operator()(const std::string& a, const std::string& b) const
 	{
 		return (LLStringUtil::precedesDict(a, b) ? true : false);
 	}
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 1a66612e8785a22a792c505e8fd0bc494cef09d8..fd1828b1cc537538d8339f159c377e685ae76e72 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -914,22 +914,6 @@ U32Kilobytes LLMemoryInfo::getPhysicalMemoryKB() const
 #endif
 }
 
-U32Bytes LLMemoryInfo::getPhysicalMemoryClamped() const
-{
-	// Return the total physical memory in bytes, but clamp it
-	// to no more than U32_MAX
-	
-	U32Kilobytes phys_kb = getPhysicalMemoryKB();
-	if (phys_kb >= U32Gigabytes(4))
-	{
-		return U32Bytes(U32_MAX);
-	}
-	else
-	{
-		return phys_kb;
-	}
-}
-
 //static
 void LLMemoryInfo::getAvailableMemoryKB(U32Kilobytes& avail_physical_mem_kb, U32Kilobytes& avail_virtual_mem_kb)
 {
@@ -1144,10 +1128,10 @@ LLSD LLMemoryInfo::loadStatsMap()
 	//
 	
 	{
-		vm_statistics_data_t vmstat;
-		mach_msg_type_number_t vmstatCount = HOST_VM_INFO_COUNT;
+		vm_statistics64_data_t vmstat;
+		mach_msg_type_number_t vmstatCount = HOST_VM_INFO64_COUNT;
 
-		if (host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t) &vmstat, &vmstatCount) != KERN_SUCCESS)
+		if (host_statistics64(mach_host_self(), HOST_VM_INFO64, (host_info64_t) &vmstat, &vmstatCount) != KERN_SUCCESS)
 	{
 			LL_WARNS("LLMemoryInfo") << "Unable to collect memory information" << LL_ENDL;
 		}
@@ -1205,20 +1189,20 @@ LLSD LLMemoryInfo::loadStatsMap()
 	//
 
 		{
-		task_basic_info_64_data_t taskinfo;
-		unsigned taskinfoSize = sizeof(taskinfo);
-		
-		if (task_info(mach_task_self(), TASK_BASIC_INFO_64, (task_info_t) &taskinfo, &taskinfoSize) != KERN_SUCCESS)
+			mach_task_basic_info_data_t taskinfo;
+			mach_msg_type_number_t task_count = MACH_TASK_BASIC_INFO_COUNT;
+			if (task_info(mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t) &taskinfo, &task_count) != KERN_SUCCESS)
 			{
-			LL_WARNS("LLMemoryInfo") << "Unable to collect task information" << LL_ENDL;
-				}
-				else
-				{
-			stats.add("Basic suspend count",					taskinfo.suspend_count);
-			stats.add("Basic virtual memory KB",				taskinfo.virtual_size / 1024);
-			stats.add("Basic resident memory KB",				taskinfo.resident_size / 1024);
-			stats.add("Basic new thread policy",				taskinfo.policy);
-		}
+				LL_WARNS("LLMemoryInfo") << "Unable to collect task information" << LL_ENDL;
+			}
+			else
+			{
+				stats.add("Basic virtual memory KB", taskinfo.virtual_size / 1024);
+				stats.add("Basic resident memory KB", taskinfo.resident_size / 1024);
+				stats.add("Basic max resident memory KB", taskinfo.resident_size_max / 1024);
+				stats.add("Basic new thread policy", taskinfo.policy);
+				stats.add("Basic suspend count", taskinfo.suspend_count);
+			}
 	}
 
 #elif LL_SOLARIS
diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h
index 962367f69fe37a5af9af741e73d8f7017611218e..95ef4cf06571dd47b10e46126f18f5a35523cf8e 100644
--- a/indra/llcommon/llsys.h
+++ b/indra/llcommon/llsys.h
@@ -113,11 +113,6 @@ class LL_COMMON_API LLMemoryInfo
 	void stream(std::ostream& s) const;	///< output text info to s
 
 	U32Kilobytes getPhysicalMemoryKB() const; 
-	
-	/*! Memory size in bytes, if total memory is >= 4GB then U32_MAX will
-	**  be returned.
-	*/
-	U32Bytes getPhysicalMemoryClamped() const; ///< Memory size in clamped bytes
 
 	//get the available memory infomation in KiloBytes.
 	static void getAvailableMemoryKB(U32Kilobytes& avail_physical_mem_kb, U32Kilobytes& avail_virtual_mem_kb);
diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index c3f235c6ee3c78d80e19a38f1093653dcee40721..52255bfaeb58b8eb401193543ba28ecc354a37a8 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -63,7 +63,7 @@ void set_thread_name( DWORD dwThreadID, const char* threadName)
 
 	__try
 	{
-		::RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(DWORD), (DWORD*)&info );
+		::RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(DWORD), (ULONG_PTR*)&info );
 	}
 	__except(EXCEPTION_CONTINUE_EXECUTION)
 	{
diff --git a/indra/llcommon/lltrace.h b/indra/llcommon/lltrace.h
index 5f1289dad8d4df7f585c587ff17f1bde9910ff0e..79ff55b739888ccbcb45b74b3a2640cf3a2cb93f 100644
--- a/indra/llcommon/lltrace.h
+++ b/indra/llcommon/lltrace.h
@@ -57,7 +57,7 @@ class StatBase
 {
 public:
 	StatBase(const char* name, const char* description);
-	virtual ~StatBase() {};
+	virtual ~StatBase() LLINSTANCETRACKER_DTOR_NOEXCEPT	{}
 	virtual const char* getUnitLabel() const;
 
 	const std::string& getName() const { return mName; }
diff --git a/indra/llcommon/tests/llprocess_test.cpp b/indra/llcommon/tests/llprocess_test.cpp
index 5ba343b183b16e9f548210fc1dc5a89f8ec7ae4f..b27e125d2ecd824aab7bd2421424bf8bb81ed359 100644
--- a/indra/llcommon/tests/llprocess_test.cpp
+++ b/indra/llcommon/tests/llprocess_test.cpp
@@ -788,6 +788,69 @@ namespace tut
 
     template<> template<>
     void object::test<10>()
+    {
+        set_test_name("attached=false");
+        // almost just like autokill=false, except set autokill=true with
+        // attached=false.
+        NamedTempFile from("from", "not started");
+        NamedTempFile to("to", "");
+        LLProcess::handle phandle(0);
+        {
+            PythonProcessLauncher py(get_test_name(),
+                                     "from __future__ import with_statement\n"
+                                     "import sys, time\n"
+                                     "with open(sys.argv[1], 'w') as f:\n"
+                                     "    f.write('ok')\n"
+                                     "# wait for 'go' from test program\n"
+                                     "for i in xrange(60):\n"
+                                     "    time.sleep(1)\n"
+                                     "    with open(sys.argv[2]) as f:\n"
+                                     "        go = f.read()\n"
+                                     "    if go == 'go':\n"
+                                     "        break\n"
+                                     "else:\n"
+                                     "    with open(sys.argv[1], 'w') as f:\n"
+                                     "        f.write('never saw go')\n"
+                                     "    sys.exit(1)\n"
+                                     "# okay, saw 'go', write 'ack'\n"
+                                     "with open(sys.argv[1], 'w') as f:\n"
+                                     "    f.write('ack')\n");
+            py.mParams.args.add(from.getName());
+            py.mParams.args.add(to.getName());
+            py.mParams.autokill = true;
+            py.mParams.attached = false;
+            py.launch();
+            // Capture handle for later
+            phandle = py.mPy->getProcessHandle();
+            // Wait for the script to wake up and do its first write
+            int i = 0, timeout = 60;
+            for ( ; i < timeout; ++i)
+            {
+                yield();
+                if (readfile(from.getName(), "from autokill script") == "ok")
+                    break;
+            }
+            // If we broke this loop because of the counter, something's wrong
+            ensure("script never started", i < timeout);
+            // Now destroy the LLProcess, which should NOT kill the child!
+        }
+        // If the destructor killed the child anyway, give it time to die
+        yield(2);
+        // How do we know it's not terminated? By making it respond to
+        // a specific stimulus in a specific way.
+        {
+            std::ofstream outf(to.getName().c_str());
+            outf << "go";
+        } // flush and close.
+        // now wait for the script to terminate... one way or another.
+        waitfor(phandle, "autokill script");
+        // If the LLProcess destructor implicitly called kill(), the
+        // script could not have written 'ack' as we expect.
+        ensure_equals(get_test_name() + " script output", readfile(from.getName()), "ack");
+    }
+
+    template<> template<>
+    void object::test<11>()
     {
         set_test_name("'bogus' test");
         CaptureLog recorder;
@@ -801,7 +864,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<11>()
+    void object::test<12>()
     {
         set_test_name("'file' test");
         // Replace this test with one or more real 'file' tests when we
@@ -815,7 +878,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<12>()
+    void object::test<13>()
     {
         set_test_name("'tpipe' test");
         // Replace this test with one or more real 'tpipe' tests when we
@@ -832,7 +895,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<13>()
+    void object::test<14>()
     {
         set_test_name("'npipe' test");
         // Replace this test with one or more real 'npipe' tests when we
@@ -850,7 +913,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<14>()
+    void object::test<15>()
     {
         set_test_name("internal pipe name warning");
         CaptureLog recorder;
@@ -914,7 +977,7 @@ namespace tut
     } while (0)
 
     template<> template<>
-    void object::test<15>()
+    void object::test<16>()
     {
         set_test_name("get*Pipe() validation");
         PythonProcessLauncher py(get_test_name(),
@@ -934,7 +997,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<16>()
+    void object::test<17>()
     {
         set_test_name("talk to stdin/stdout");
         PythonProcessLauncher py(get_test_name(),
@@ -992,7 +1055,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<17>()
+    void object::test<18>()
     {
         set_test_name("listen for ReadPipe events");
         PythonProcessLauncher py(get_test_name(),
@@ -1052,7 +1115,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<18>()
+    void object::test<19>()
     {
         set_test_name("ReadPipe \"eof\" event");
         PythonProcessLauncher py(get_test_name(),
@@ -1078,7 +1141,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<19>()
+    void object::test<20>()
     {
         set_test_name("setLimit()");
         PythonProcessLauncher py(get_test_name(),
@@ -1107,7 +1170,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<20>()
+    void object::test<21>()
     {
         set_test_name("peek() ReadPipe data");
         PythonProcessLauncher py(get_test_name(),
@@ -1160,7 +1223,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<21>()
+    void object::test<22>()
     {
         set_test_name("bad postend");
         std::string pumpname("postend");
@@ -1185,7 +1248,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<22>()
+    void object::test<23>()
     {
         set_test_name("good postend");
         PythonProcessLauncher py(get_test_name(),
@@ -1241,7 +1304,7 @@ namespace tut
     };
 
     template<> template<>
-    void object::test<23>()
+    void object::test<24>()
     {
         set_test_name("all data visible at postend");
         PythonProcessLauncher py(get_test_name(),
diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp
index 81b930e1e2ce698bf4f4628e11c231839896b9b5..8836230640aa925bacdfe42dbd18f87ebdaf618a 100644
--- a/indra/llcommon/tests/llsdserialize_test.cpp
+++ b/indra/llcommon/tests/llsdserialize_test.cpp
@@ -1553,7 +1553,7 @@ namespace tut
             params.executable = PYTHON;
             params.args.add(scriptfile.getName());
             LLProcessPtr py(LLProcess::create(params));
-            ensure(STRINGIZE("Couldn't launch " << desc << " script"), py);
+            ensure(STRINGIZE("Couldn't launch " << desc << " script"), bool(py));
             // Implementing timeout would mean messing with alarm() and
             // catching SIGALRM... later maybe...
             int status(0);
diff --git a/indra/llcorehttp/CMakeLists.txt b/indra/llcorehttp/CMakeLists.txt
index b03ee6eeda65df2854c50d4c60ca5d4c290d4d62..7482fc577f551c3f97a2366be7b46fc2b29bcf17 100644
--- a/indra/llcorehttp/CMakeLists.txt
+++ b/indra/llcorehttp/CMakeLists.txt
@@ -148,7 +148,7 @@ if (LL_TESTS)
 if (DARWIN)
   # Path inside the app bundle where we'll need to copy libraries
   set(LL_TEST_DESTINATION_DIR
-    ${CMAKE_SOURCE_DIR}/../build-darwin-i386/sharedlibs/Resources
+    ${CMAKE_BINARY_DIR}/sharedlibs/Resources
   )
 
   # Create the Contents/Resources directory
@@ -164,21 +164,23 @@ if (DARWIN)
   
   # Copy the required libraries to the package app
   add_custom_command(TARGET INTEGRATION_TEST_llcorehttp PRE_BUILD
-    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libapr-1.0.dylib ${LL_TEST_DESTINATION_DIR}
-    DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libapr-1.0.dylib
+    COMMAND ${CMAKE_COMMAND} -E copy ${AUTOBUILD_INSTALL_DIR}/lib/release/libapr-1.0.dylib ${LL_TEST_DESTINATION_DIR}
+    DEPENDS ${AUTOBUILD_INSTALL_DIR}/lib/release/libapr-1.0.dylib
   )
   add_custom_command(TARGET INTEGRATION_TEST_llcorehttp PRE_BUILD
-    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libaprutil-1.0.dylib ${LL_TEST_DESTINATION_DIR}
-    DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libaprutil-1.0.dylib
+    COMMAND ${CMAKE_COMMAND} -E copy ${AUTOBUILD_INSTALL_DIR}/lib/release/libaprutil-1.0.dylib ${LL_TEST_DESTINATION_DIR}
+    DEPENDS ${AUTOBUILD_INSTALL_DIR}/lib/release/libaprutil-1.0.dylib
   )
   add_custom_command(TARGET INTEGRATION_TEST_llcorehttp PRE_BUILD
-    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexception_handler.dylib ${LL_TEST_DESTINATION_DIR}
-    DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexception_handler.dylib
-  )
-  add_custom_command(TARGET INTEGRATION_TEST_llcorehttp PRE_BUILD
-    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexpat.1.5.2.dylib ${LL_TEST_DESTINATION_DIR}
-    DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexpat.1.5.2.dylib
+    COMMAND ${CMAKE_COMMAND} -E copy ${AUTOBUILD_INSTALL_DIR}/lib/release/libexception_handler.dylib ${LL_TEST_DESTINATION_DIR}
+    DEPENDS ${AUTOBUILD_INSTALL_DIR}/lib/release/libexception_handler.dylib
   )
+  foreach(expat ${EXPAT_COPY})
+    add_custom_command(TARGET INTEGRATION_TEST_llcorehttp PRE_BUILD
+      COMMAND ${CMAKE_COMMAND} -E copy ${AUTOBUILD_INSTALL_DIR}/lib/release/${expat} ${LL_TEST_DESTINATION_DIR}
+      DEPENDS ${AUTOBUILD_INSTALL_DIR}/lib/release/${expat}
+    )
+  endforeach(expat)
 
 endif (DARWIN)
 
@@ -214,7 +216,7 @@ endif (DARWIN)
     # The following come from LLAddBuildTest.cmake's INTEGRATION_TEST_xxxx target.
     set_target_properties(http_texture_load
                           PROPERTIES
-                          LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:CONSOLE ${TCMALLOC_LINK_FLAGS}"
+                          LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:CONSOLE"
                           LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO"
                           LINK_FLAGS_RELEASE ""
                           )
diff --git a/indra/llcorehttp/httpcommon.cpp b/indra/llcorehttp/httpcommon.cpp
index c423047bb08fa6756461e69b5bdbec41f1bafb41..1829062af6426b1137323214aec283a8ecb9a475 100644
--- a/indra/llcorehttp/httpcommon.cpp
+++ b/indra/llcorehttp/httpcommon.cpp
@@ -50,11 +50,12 @@ HttpStatus::type_enum_t EXT_CURL_EASY;
 HttpStatus::type_enum_t EXT_CURL_MULTI;
 HttpStatus::type_enum_t LLCORE;
 
-HttpStatus::operator unsigned long() const
+HttpStatus::operator U32() const
 {
-	static const int shift(sizeof(unsigned long) * 4);
+	// Effectively, concatenate mType (high) with mStatus (low).
+	static const int shift(sizeof(mDetails->mStatus) * 8);
 
-	unsigned long result(((unsigned long)mDetails->mType) << shift | (unsigned long)(int)mDetails->mStatus);
+	U32 result(U32(mDetails->mType) << shift | U32((int)mDetails->mStatus));
 	return result;
 }
 
@@ -64,7 +65,7 @@ std::string HttpStatus::toHex() const
 	std::ostringstream result;
 	result.width(8);
 	result.fill('0');
-	result << std::hex << operator unsigned long();
+	result << std::hex << operator U32();
 	return result.str();
 }
 
diff --git a/indra/llcorehttp/httpcommon.h b/indra/llcorehttp/httpcommon.h
index b2db01d0387a6432b0d7fdc2906282b565480b7b..ea0c38abd7a09ea568f42b8c982bfd7cc20f7d7f 100644
--- a/indra/llcorehttp/httpcommon.h
+++ b/indra/llcorehttp/httpcommon.h
@@ -382,10 +382,10 @@ struct HttpStatus
 	/// creates an ambiguous second path to integer conversion
 	/// which tends to find programming errors such as formatting
 	/// the status to a stream (operator<<).
-	operator unsigned long() const;
-	unsigned long toULong() const
+	operator U32() const;
+	U32 toULong() const
 	{
-		return operator unsigned long();
+		return operator U32();
 	}
 
 	/// And to convert to a hex string.
diff --git a/indra/llcorehttp/tests/test_httprequest.hpp b/indra/llcorehttp/tests/test_httprequest.hpp
index 6cd7960ecd87847b468dbc6e2b5981a2054bbb4c..a9c192e141c2e0258df705bac82c8416e5cd9e1a 100644
--- a/indra/llcorehttp/tests/test_httprequest.hpp
+++ b/indra/llcorehttp/tests/test_httprequest.hpp
@@ -3089,6 +3089,10 @@ void HttpRequestTestObjectType::test<23>()
 
 	set_test_name("HttpRequest GET 503s with 'Retry-After'");
 
+#if LL_WINDOWS && ADDRESS_SIZE == 64
+	skip("llcorehttp 503-with-retry test hangs on Windows 64");
+#endif
+
 	// This tests mainly that the code doesn't fall over if
 	// various well- and mis-formed Retry-After headers are
 	// sent along with the response.  Direct inspection of
diff --git a/indra/llcorehttp/tests/test_httpstatus.hpp b/indra/llcorehttp/tests/test_httpstatus.hpp
index 4502d32fe1f0f6c9eb96bb3bebca02442aab3be8..cbe3f574d41670541f0f2185963b8fa33325b2ea 100644
--- a/indra/llcorehttp/tests/test_httpstatus.hpp
+++ b/indra/llcorehttp/tests/test_httpstatus.hpp
@@ -244,7 +244,7 @@ void HttpStatusTestObjectType::test<7>()
 	HttpStatus status(404);
 	std::string msg = status.toHex();
 	// std::cout << "Result:  " << msg << std::endl;
-	ensure(msg == "01940001");
+	ensure_equals(msg, "01940001");
 }
 
 
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index a07ea146212c5e208651ef42ff9519ab11661927..fe49e8e0112b21cf2614245ecceab5560d677125 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -1227,9 +1227,10 @@ void LLImageRaw::fill( const LLColor4U& color )
 	if( 4 == getComponents() )
 	{
 		U32* data = (U32*) getData();
+		U32 rgbaColor = color.asRGBA();
 		for( S32 i = 0; i < pixels; i++ )
 		{
-			data[i] = color.mAll;
+			data[ i ] = rgbaColor;
 		}
 	}
 	else
diff --git a/indra/llimage/llimagetga.cpp b/indra/llimage/llimagetga.cpp
index 5ad7658ec1bbc7ca498760fc826dc89f04d76c57..7c75aa1e2a7791ffdf83cd4e4ce6d6cd049d6486 100644
--- a/indra/llimage/llimagetga.cpp
+++ b/indra/llimage/llimagetga.cpp
@@ -811,7 +811,7 @@ bool LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, bool &alpha_opaque
 			}
 
 			src += 4;
-			register U32 value = rgba;
+			U32 value = rgba;
 			do
 			{
 				*dst_pixels = value;
diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp
index 3bb1778d9d13e5912ceff5db5f0ba024a205e304..925da5674bfc5591faa941221c035a4aea8da1da 100644
--- a/indra/llimagej2coj/llimagej2coj.cpp
+++ b/indra/llimagej2coj/llimagej2coj.cpp
@@ -41,8 +41,12 @@ LLImageJ2CImpl* fallbackCreateLLImageJ2CImpl()
 
 std::string LLImageJ2COJ::getEngineInfo() const
 {
+#ifdef OPENJPEG_VERSION
 	return std::string("OpenJPEG: " OPENJPEG_VERSION ", Runtime: ")
 		+ opj_version();
+#else
+	return std::string("OpenJPEG runtime: ") + opj_version();
+#endif
 }
 
 // Return string from message, eliminating final \n if present
diff --git a/indra/llkdu/CMakeLists.txt b/indra/llkdu/CMakeLists.txt
index b8f8b420c329cc8bc0c448c900f4d3ca34bfed41..cb0e204e91a6f2eb26c839727cd6b8d20e08380d 100644
--- a/indra/llkdu/CMakeLists.txt
+++ b/indra/llkdu/CMakeLists.txt
@@ -40,6 +40,14 @@ set_source_files_properties(${llkdu_HEADER_FILES}
 
 list(APPEND llkdu_SOURCE_FILES ${llkdu_HEADER_FILES})
 
+# Our KDU package is built with KDU_X86_INTRINSICS in its .vcxproj file.
+# Unless that macro is also set for every consumer build, KDU freaks out,
+# spamming the viewer log with alignment FUD.
+set_source_files_properties(${llkdu_SOURCE_FILES}
+                            PROPERTIES
+                            COMPILE_DEFINITIONS
+                            "KDU_X86_INTRINSICS")
+
 if (USE_KDU)
   add_library (llkdu ${llkdu_SOURCE_FILES})
 
diff --git a/indra/llkdu/include_kdu_xxxx.h b/indra/llkdu/include_kdu_xxxx.h
new file mode 100644
index 0000000000000000000000000000000000000000..a1dbced60b27b128dab55bdaeff52158f74dd03e
--- /dev/null
+++ b/indra/llkdu/include_kdu_xxxx.h
@@ -0,0 +1,40 @@
+/**
+ * @file   include_kdu_xxxx.h
+ * @author Nat Goodspeed
+ * @date   2016-04-25
+ * @brief  
+ * 
+ * $LicenseInfo:firstyear=2016&license=viewerlgpl$
+ * Copyright (c) 2016, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// This file specifically omits #include guards of its own: it's sort of an
+// #include macro used to wrap KDU #includes with proper incantations. Usage:
+
+// #define kdu_xxxx "kdu_compressed.h" // or whichever KDU header
+// #include "include_kdu_xxxx.h"
+// // kdu_xxxx #undef'ed by include_kdu_xxxx.h
+
+#if LL_DARWIN
+// don't *really* want to rebuild KDU so turn off specific warnings for this header
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wself-assign-field"
+#pragma clang diagnostic ignored "-Wunused-private-field"
+#include kdu_xxxx
+#pragma clang diagnostic pop
+#elif LL_WINDOWS
+// With warnings-as-errors in effect, strange relationship between
+// jp2_output_box and its subclass jp2_target in kdu_compressed.h
+// causes build failures. Specifically:
+// warning C4263: 'void kdu_supp::jp2_target::open(kdu_supp::jp2_family_tgt *)' : member function does not override any base class virtual member function
+// warning C4264: 'void kdu_supp::jp2_output_box::open(kdu_core::kdu_uint32)' : no override available for virtual member function from base 'kdu_supp::jp2_output_box'; function is hidden
+#pragma warning(push)
+#pragma warning(disable : 4263 4264)
+#include kdu_xxxx
+#pragma warning(pop)
+#else // some other platform
+#include kdu_xxxx
+#endif
+
+#undef kdu_xxxx
diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp
index dce421632070a4a7afc4ca2ca885ee880ef259bc..4048b9a43d0fa13e8fa83c3d5f8ac4170ab3b05f 100644
--- a/indra/llkdu/llimagej2ckdu.cpp
+++ b/indra/llkdu/llimagej2ckdu.cpp
@@ -25,21 +25,37 @@
  */
 
 #include "linden_common.h"
+
 #include "llimagej2ckdu.h"
 
 #include "lltimer.h"
 #include "llpointer.h"
 #include "llmath.h"
 #include "llkdumem.h"
-#include "stringize.h"
 
-#include "kdu_block_coding.h"
+#define kdu_xxxx "kdu_block_coding.h"
+#include "include_kdu_xxxx.h"
+
+// Avoid ubiquitous necessity of kdu_core:: qualification
+using namespace kdu_core;
 
 #include "llexception.h"
 #include <boost/exception/diagnostic_information.hpp>
 #include <sstream>
 #include <iomanip>
 
+// stream kdu_dims to std::ostream
+// Turns out this must NOT be in the anonymous namespace!
+// It must also precede #include "stringize.h".
+inline
+std::ostream& operator<<(std::ostream& out, const kdu_dims& dims)
+{
+	return out << "(" << dims.pos.x << "," << dims.pos.y << "),"
+				  "[" << dims.size.x << "x" << dims.size.y << "]";
+}
+
+#include "stringize.h"
+
 namespace {
 // Failure to load an image shouldn't crash the whole viewer.
 struct KDUError: public LLContinueError
@@ -82,20 +98,11 @@ std::string report_kdu_exception(kdu_exception mb)
 }
 } // anonymous namespace
 
-// stream kdu_dims to std::ostream
-// Turns out this must NOT be in the anonymous namespace!
-inline
-std::ostream& operator<<(std::ostream& out, const kdu_dims& dims)
-{
-	return out << "(" << dims.pos.x << "," << dims.pos.y << "),"
-				  "[" << dims.size.x << "x" << dims.size.y << "]";
-}
-
 
 class kdc_flow_control {
 	
 public:
-	kdc_flow_control(kdu_image_in_base *img_in, kdu_codestream codestream);
+	kdc_flow_control(kdu_supp::kdu_image_in_base *img_in, kdu_codestream codestream);
 	~kdc_flow_control();
 	bool advance_components();
 	void process_components();
@@ -104,7 +111,7 @@ class kdc_flow_control {
 	
 	struct kdc_component_flow_control {
 	public:
-		kdu_image_in_base *reader;
+		kdu_supp::kdu_image_in_base *reader;
 		int vert_subsampling;
 		int ratio_counter;  /*  Initialized to 0, decremented by `count_delta';
                                 when < 0, a new line must be processed, after
@@ -144,7 +151,8 @@ std::string LLImageJ2CKDU::getEngineInfo() const
 class LLKDUDecodeState
 {
 public:
-	LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap);
+	LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap,
+					 kdu_codestream* codestreamp);
 	~LLKDUDecodeState();
 	bool processTileDecode(F32 decode_time, bool limit_time = true);
 
@@ -346,9 +354,9 @@ void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, bool keep_codestream, ECod
 			// This method is only called from methods that catch KDUError.
 			// We want to fail the image load, not crash the viewer.
 			LLTHROW(KDUError(STRINGIZE("Component " << idx << " dimensions "
-									 << other_dims
-									 << " do not match component 0 dimensions "
-									 << dims << "!")));
+									   << stringize(other_dims)
+									   << " do not match component 0 dimensions "
+									   << stringize(dims) << "!")));
 		}
 	}
 
@@ -560,7 +568,8 @@ bool LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
 					kdu_coords offset = tile_dims.pos - dims.pos;
 					int row_gap = channels*dims.size.x; // inter-row separation
 					kdu_byte *buf = buffer + offset.y*row_gap + offset.x*channels;
-					mDecodeState.reset(new LLKDUDecodeState(tile, buf, row_gap));
+					mDecodeState.reset(new LLKDUDecodeState(tile, buf, row_gap,
+															mCodeStreamp.get()));
 				}
 				// Do the actual processing
 				F32 remaining_time = decode_time - decode_timer.getElapsedTimeF32();
@@ -1248,7 +1257,8 @@ all necessary level shifting, type conversion, rounding and truncation. */
 	}
 }
 
-LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap)
+LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap,
+								   kdu_codestream* codestreamp)
 {
 	S32 c;
 
@@ -1294,7 +1304,7 @@ LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap)
 			mEngines[c] = kdu_synthesis(res,&mAllocator,use_shorts);
 		}
 	}
-	mAllocator.finalize(); // Actually creates buffering resources
+	mAllocator.finalize(*codestreamp); // Actually creates buffering resources
 	for (c = 0; c < mNumComponents; c++)
 	{
 		mLines[c].create(); // Grabs resources from the allocator.
@@ -1352,7 +1362,7 @@ separation between consecutive rows in the real buffer. */
 
 // kdc_flow_control 
 
-kdc_flow_control::kdc_flow_control (kdu_image_in_base *img_in, kdu_codestream codestream)
+kdc_flow_control::kdc_flow_control (kdu_supp::kdu_image_in_base *img_in, kdu_codestream codestream)
 {
 	int n;
 	
diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h
index 7d234435a48058ff75777fe9e65881180be89dd5..b57e4cc40e51519fae5eab0b9b08caaedb89d4de 100644
--- a/indra/llkdu/llimagej2ckdu.h
+++ b/indra/llkdu/llimagej2ckdu.h
@@ -37,15 +37,8 @@
 #include "kdu_messaging.h"
 #include "kdu_params.h"
 
-// don't *really* want to rebuild KDU so turn off specific warnings for this header
-#if LL_DARWIN
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunused-private-field"
-#include "kdu_compressed.h"
-#pragma clang diagnostic pop
-#else
-#include "kdu_compressed.h"
-#endif
+#define kdu_xxxx "kdu_compressed.h"
+#include "include_kdu_xxxx.h"
 
 #include "kdu_sample_processing.h"
 #include <boost/scoped_ptr.hpp>
@@ -111,17 +104,19 @@ class LLImageJ2CKDU : public LLImageJ2CImpl
 			}
 		}
 
-		kdu_codestream* operator->() { return &mCodeStream; }
+		// for those few times when you need a raw kdu_codestream*
+		kdu_core::kdu_codestream* get() { return &mCodeStream; }
+		kdu_core::kdu_codestream* operator->() { return &mCodeStream; }
 
 	private:
-		kdu_codestream mCodeStream;
+		kdu_core::kdu_codestream mCodeStream;
 	};
 
 	// Encode variable
 	boost::scoped_ptr<LLKDUMemSource> mInputp;
 	CodeStreamHolder mCodeStreamp;
-	boost::scoped_ptr<kdu_coords> mTPosp; // tile position
-	boost::scoped_ptr<kdu_dims> mTileIndicesp;
+	boost::scoped_ptr<kdu_core::kdu_coords> mTPosp; // tile position
+	boost::scoped_ptr<kdu_core::kdu_dims> mTileIndicesp;
 	int mBlocksSize;
 	int mPrecinctsSize;
 	int mLevels;
diff --git a/indra/llkdu/llkdumem.cpp b/indra/llkdu/llkdumem.cpp
index 0347475559d8844c2530c0ce63905c31ba9cf566..96e9da25d8a614163a8d5981d9adb4224176fa06 100644
--- a/indra/llkdu/llkdumem.cpp
+++ b/indra/llkdu/llkdumem.cpp
@@ -28,6 +28,9 @@
 #include "llkdumem.h"
 #include "llerror.h"
 
+using namespace kdu_core;
+using kd_supp_image_local::image_line_buf;
+
 #if defined(LL_WINDOWS)
 # pragma warning(disable: 4702) // unreachable code
 #endif
diff --git a/indra/llkdu/llkdumem.h b/indra/llkdu/llkdumem.h
index fab913d93b7af6ab12d5ea3a333f8ce88f1e0474..09d81f38dec92cd87af57a7a28cec7078c526892 100644
--- a/indra/llkdu/llkdumem.h
+++ b/indra/llkdu/llkdumem.h
@@ -29,26 +29,22 @@
 
 // Support classes for reading and writing from memory buffers in KDU
 #define KDU_NO_THREADS
-// don't *really* want to rebuild KDU so turn off specific warnings for this header
-#if LL_DARWIN
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wself-assign-field"
-#pragma clang diagnostic ignored "-Wunused-private-field"
-#include "kdu_image.h"
-#pragma clang diagnostic pop
-#else
-#include "kdu_image.h"
-#endif
+
+#define kdu_xxxx "kdu_image.h"
+#include "include_kdu_xxxx.h"
 
 #include "kdu_elementary.h"
 #include "kdu_messaging.h"
 #include "kdu_params.h"
-#include "kdu_compressed.h"
+
+#define kdu_xxxx "kdu_compressed.h"
+#include "include_kdu_xxxx.h"
+
 #include "kdu_sample_processing.h"
 #include "image_local.h"
 #include "stdtypes.h"
 
-class LLKDUMemSource: public kdu_compressed_source
+class LLKDUMemSource: public kdu_core::kdu_compressed_source
 {
 public:
 	LLKDUMemSource(U8 *input_buffer, U32 size)
@@ -62,7 +58,7 @@ class LLKDUMemSource: public kdu_compressed_source
 	{
 	}
 
-	int read(kdu_byte *buf, int num_bytes)
+	int read(kdu_core::kdu_byte *buf, int num_bytes)
 	{
 		U32 num_out;
 		num_out = num_bytes;
@@ -87,7 +83,7 @@ class LLKDUMemSource: public kdu_compressed_source
 	U32 mCurPos;
 };
 
-class LLKDUMemTarget: public kdu_compressed_target
+class LLKDUMemTarget: public kdu_core::kdu_compressed_target
 {
 public:
 	LLKDUMemTarget(U8 *output_buffer, U32 &output_size, const U32 buffer_size)
@@ -102,7 +98,7 @@ class LLKDUMemTarget: public kdu_compressed_target
 	{
 	}
 
-	bool write(const kdu_byte *buf, int num_bytes)
+	bool write(const kdu_core::kdu_byte *buf, int num_bytes)
 	{
 		U32 num_out;
 		num_out = num_bytes;
@@ -126,7 +122,7 @@ class LLKDUMemTarget: public kdu_compressed_target
 	U32 *mOutputSize;
 };
 
-class LLKDUMemIn : public kdu_image_in_base
+class LLKDUMemIn : public kdu_supp::kdu_image_in_base
 {
 public:
 	LLKDUMemIn(const U8 *data,
@@ -134,10 +130,10 @@ class LLKDUMemIn : public kdu_image_in_base
 				const U16 rows,
 				const U16 cols,
 				U8 in_num_components,
-				siz_params *siz);
+				kdu_core::siz_params *siz);
 	~LLKDUMemIn();
 
-	bool get(int comp_idx, kdu_line_buf &line, int x_tnum);
+	bool get(int comp_idx, kdu_core::kdu_line_buf &line, int x_tnum);
 
 private:
 	const U8 *mData;
@@ -146,8 +142,8 @@ class LLKDUMemIn : public kdu_image_in_base
 	int rows, cols;
 	int alignment_bytes; // Number of 0's at end of each line.
 	int precision[3];
-	image_line_buf *incomplete_lines; // Each "sample" represents a full pixel
-	image_line_buf *free_lines;
+	kd_supp_image_local::image_line_buf *incomplete_lines; // Each "sample" represents a full pixel
+	kd_supp_image_local::image_line_buf *free_lines;
 	int num_unread_rows;
 
 	U32 mCurPos;
diff --git a/indra/llkdu/tests/llimagej2ckdu_test.cpp b/indra/llkdu/tests/llimagej2ckdu_test.cpp
index e8b550baa66eeedc2ed6ae81cf7b597fee8c84b1..e386a9f71b4ac5bc53144f944a10ada914f839fb 100644
--- a/indra/llkdu/tests/llimagej2ckdu_test.cpp
+++ b/indra/llkdu/tests/llimagej2ckdu_test.cpp
@@ -30,6 +30,7 @@
 #include "llimagej2ckdu.h"
 
 #if LL_DARWIN
+// For this source, it's true that private fields in llkdumem.h are unused.
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wunused-private-field"
 #include "llkdumem.h"
@@ -37,7 +38,6 @@
 #else
 #include "llkdumem.h"
 #endif
-
 #include "kdu_block_coding.h"
 // Tut header
 #include "lltut.h"
@@ -113,17 +113,19 @@ void LLImageJ2C::setLastError(const std::string&, const std::string&) { }
 bool LLImageJ2C::updateData() { return false; }
 void LLImageJ2C::updateRawDiscardLevel() { }
 
-LLKDUMemIn::LLKDUMemIn(const U8*, const U32, const U16, const U16, const U8, siz_params*) { }
+LLKDUMemIn::LLKDUMemIn(const U8*, const U32, const U16, const U16, const U8, kdu_core::siz_params*) { }
 LLKDUMemIn::~LLKDUMemIn() { }
-bool LLKDUMemIn::get(int, kdu_line_buf&, int) { return false; }
+bool LLKDUMemIn::get(int, kdu_core::kdu_line_buf&, int) { return false; }
 
 // Stub Kakadu Library calls
+// they're all namespaced now
+namespace kdu_core {
 kdu_tile_comp kdu_tile::access_component(int ) { kdu_tile_comp a; return a; }
 kdu_block_encoder::kdu_block_encoder() { }
 kdu_block_decoder::kdu_block_decoder() { }
 void kdu_block::set_max_passes(int , bool ) { }
 void kdu_block::set_max_bytes(int , bool ) { }
-void kdu_tile::close(kdu_thread_env* ) { }
+void kdu_tile::close(kdu_thread_env *, bool) {}
 int kdu_tile::get_num_components() { return 0; }
 bool kdu_tile::get_ycc() { return false; }
 void kdu_tile::set_components_of_interest(int , const int* ) { }
@@ -156,14 +158,14 @@ void kdu_codestream::set_fussy() { }
 void kdu_codestream::get_dims(int, kdu_dims&, bool ) { }
 int kdu_codestream::get_min_dwt_levels() { return 5; }
 int kdu_codestream::get_max_tile_layers() { return 1; }
-void kdu_codestream::change_appearance(bool, bool, bool) { }
+void kdu_codestream::change_appearance(bool, bool, bool, kdu_thread_env *) {}
 void kdu_codestream::get_tile_dims(kdu_coords, int, kdu_dims&, bool ) { }
 void kdu_codestream::destroy() { }
 void kdu_codestream::collect_timing_stats(int ) { }
 void kdu_codestream::set_max_bytes(kdu_long, bool, bool ) { }
 void kdu_codestream::get_valid_tiles(kdu_dims& ) { }
 void kdu_codestream::create(kdu_compressed_source*, kdu_thread_env*) { }
-void kdu_codestream::apply_input_restrictions( int, int, int, int, kdu_dims*, kdu_component_access_mode ) { }
+void kdu_codestream::apply_input_restrictions(int, int, int, int, kdu_dims const *, kdu_component_access_mode, kdu_thread_env *, kdu_quality_limiter const *) {}
 void kdu_codestream::get_subsampling(int , kdu_coords&, bool ) { }
 void kdu_codestream::flush(kdu_long *, int, kdu_uint16 *, bool, bool, double, kdu_thread_env*, int) { }
 void kdu_codestream::set_resilient(bool ) { }
@@ -178,13 +180,15 @@ siz_params* kdu_codestream::access_siz() { return NULL; }
 kdu_tile kdu_codestream::open_tile(kdu_coords , kdu_thread_env* ) { kdu_tile a; return a; }
 kdu_codestream_comment kdu_codestream::add_comment() { kdu_codestream_comment a; return a; }
 void kdu_subband::close_block(kdu_block*, kdu_thread_env*) { }
-void kdu_subband::get_valid_blocks(kdu_dims &indices) { }
-kdu_block* kdu_subband::open_block(kdu_coords, int*, kdu_thread_env*) { return NULL; }
+void kdu_subband::get_valid_blocks(kdu_dims &indices) const { }
+kdu_block * kdu_subband::open_block(kdu_coords, int *, kdu_thread_env *, int, bool) { return NULL; }
 bool kdu_codestream_comment::put_text(const char*) { return false; }
 void kdu_customize_warnings(kdu_message*) { }
 void kdu_customize_errors(kdu_message*) { }
-kdu_long kdu_multi_analysis::create(kdu_codestream, kdu_tile, kdu_thread_env*, kdu_thread_queue*, int, kdu_roi_image*, int) { kdu_long a = 0; return a; }
+kdu_long kdu_multi_analysis::create(kdu_codestream, kdu_tile, kdu_thread_env *,kdu_thread_queue *, int, kdu_roi_image *, int, kdu_sample_allocator *, kdu_push_pull_params const *) { return kdu_long(0); }
+void kdu_multi_analysis::destroy(kdu_thread_env *) {}
 siz_params::siz_params() : kdu_params(NULL, false, false, false, false, false) { }
+siz_params::~siz_params() {}
 void siz_params::finalize(bool ) { }
 void siz_params::copy_with_xforms(kdu_params*, int, int, bool, bool, bool) { }
 int siz_params::write_marker_segment(kdu_output*, kdu_params*, int) { return 0; }
@@ -193,10 +197,15 @@ bool siz_params::read_marker_segment(kdu_uint16, int, kdu_byte a[], int) { retur
 
 kdu_decoder::kdu_decoder(kdu_subband , kdu_sample_allocator*, bool , float, int, kdu_thread_env*, kdu_thread_queue*, int) { }
 void kdu_codestream::create(siz_params*, kdu_compressed_target*, kdu_dims*, int, kdu_long, kdu_thread_env* ) { }
+kdu_sample_allocator::~kdu_sample_allocator() {}
+void kdu_sample_allocator::do_finalize(kdu_codestream) {}
 void (*kdu_convert_ycc_to_rgb_rev16)(kdu_int16*,kdu_int16*,kdu_int16*,int);
 void (*kdu_convert_ycc_to_rgb_irrev16)(kdu_int16*,kdu_int16*,kdu_int16*,int);
 void (*kdu_convert_ycc_to_rgb_rev32)(kdu_int32*,kdu_int32*,kdu_int32*,int);
 void (*kdu_convert_ycc_to_rgb_irrev32)(float*,float*,float*,int);
+bool kdu_core_sample_alignment_checker(int, int, int, int, bool, bool) { return false; }
+void kdu_pull_ifc::destroy() {}
+} // namespace kdu_core
 
 // -------------------------------------------------------------------------------------------
 // TUT
diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt
index 0614fd92ef60f1bfaf8f1de1a52aca92ae888ae2..4c8bcdac917eb856022ac9626e33dc0cb74ce0bc 100644
--- a/indra/llmath/CMakeLists.txt
+++ b/indra/llmath/CMakeLists.txt
@@ -4,6 +4,7 @@ project(llmath)
 
 include(00-Common)
 include(LLCommon)
+include(Boost)
 
 include_directories(
     ${LLCOMMON_INCLUDE_DIRS}
@@ -20,6 +21,7 @@ set(llmath_SOURCE_FILES
     llline.cpp
     llmatrix3a.cpp
     llmodularmath.cpp
+    lloctree.cpp
     llperlin.cpp
     llquaternion.cpp
     llrect.cpp
@@ -117,6 +119,11 @@ if (LL_TESTS)
     v4color.cpp
     v4coloru.cpp
     )
+  set_source_files_properties(
+    ${llmath_TEST_SOURCE_FILES}
+    PROPERTIES
+    LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_THREAD_LIBRARY}"
+  )
   LL_ADD_PROJECT_UNIT_TESTS(llmath "${llmath_TEST_SOURCE_FILES}")
 
   # INTEGRATION TESTS
diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h
index 692284e04b8507b65c12a3d58ffccc426c4d0695..e508c9a19976cabea54d7055a8753dffaa6ef20a 100644
--- a/indra/llmath/llmath.h
+++ b/indra/llmath/llmath.h
@@ -153,7 +153,7 @@ inline F64 llabs(const F64 a)
 
 inline S32 lltrunc( F32 f )
 {
-#if LL_WINDOWS && !defined( __INTEL_COMPILER )
+#if LL_WINDOWS && !defined( __INTEL_COMPILER ) && (ADDRESS_SIZE == 32)
 		// Avoids changing the floating point control word.
 		// Add or subtract 0.5 - epsilon and then round
 		const static U32 zpfp[] = { 0xBEFFFFFF, 0x3EFFFFFF };
@@ -179,7 +179,7 @@ inline S32 lltrunc( F64 f )
 
 inline S32 llfloor( F32 f )
 {
-#if LL_WINDOWS && !defined( __INTEL_COMPILER )
+#if LL_WINDOWS && !defined( __INTEL_COMPILER ) && (ADDRESS_SIZE == 32)
 		// Avoids changing the floating point control word.
 		// Accurate (unlike Stereopsis version) for all values between S32_MIN and S32_MAX and slightly faster than Stereopsis version.
 		// Add -(0.5 - epsilon) and then round
diff --git a/indra/llmath/lloctree.cpp b/indra/llmath/lloctree.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3fcb3a27d79f3be983068ae0291ca9504317c6ba
--- /dev/null
+++ b/indra/llmath/lloctree.cpp
@@ -0,0 +1,29 @@
+/** 
+ * @file lloctree.cpp
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+#include "stdtypes.h"
+
+U32 gOctreeMaxCapacity;
+F32 gOctreeMinSize;
+
diff --git a/indra/llmath/llsimdmath.h b/indra/llmath/llsimdmath.h
index cebd2ace7d8cee33699da11846de43f1930bc21a..54a275633f5cd5248d1fd8af5fce55c145a04044 100644
--- a/indra/llmath/llsimdmath.h
+++ b/indra/llmath/llsimdmath.h
@@ -31,7 +31,7 @@
 #error "Please include llmath.h before this file."
 #endif
 
-#if ( ( LL_DARWIN || LL_LINUX ) && !(__SSE2__) ) || ( LL_WINDOWS && ( _M_IX86_FP < 2 ) )
+#if ( ( LL_DARWIN || LL_LINUX ) && !(__SSE2__) ) || ( LL_WINDOWS && ( _M_IX86_FP < 2 && ADDRESS_SIZE == 32 ) )
 #error SSE2 not enabled. LLVector4a and related class will not compile.
 #endif
 
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 7a54d83b3fdd9e57d0e0d67d7b7f6e033075a7d1..274ec50f20da0c524814fc6ad697a35f2ac48db7 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -89,7 +89,7 @@ const F32 SKEW_MAX	=  0.95f;
 const F32 SCULPT_MIN_AREA = 0.002f;
 const S32 SCULPT_MIN_AREA_DETAIL = 1;
 
-extern BOOL gDebugGL;
+BOOL gDebugGL = FALSE;
 
 BOOL check_same_clock_dir( const LLVector3& pt1, const LLVector3& pt2, const LLVector3& pt3, const LLVector3& norm)
 {    
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index d66004cdadbc7ef370966497a0351fab69d0a28d..bf81c978a039282dcea328d64e3604f55b1bde21 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -199,6 +199,8 @@ const U8 LL_SCULPT_FLAG_MASK = LL_SCULPT_FLAG_INVERT | LL_SCULPT_FLAG_MIRROR;
 
 const S32 LL_SCULPT_MESH_MAX_FACES = 8;
 
+extern BOOL gDebugGL;
+
 class LLProfileParams
 {
 public:
diff --git a/indra/llmath/tests/v4math_test.cpp b/indra/llmath/tests/v4math_test.cpp
index 191ac864dfcf315123a7c7619d4e442478db25aa..9779dfded383f57e3272f10b0844d55127b037d9 100644
--- a/indra/llmath/tests/v4math_test.cpp
+++ b/indra/llmath/tests/v4math_test.cpp
@@ -355,7 +355,8 @@ namespace tut
 		val3 = z1 + (z2 - z1)* val;
 		val4 = w1 + (w2 - w1)* val;
 		LLVector4 vec4b = lerp(vec4,vec4a,val);
-		ensure("lerp failed", ((val1 ==vec4b.mV[VX])&& (val2 ==vec4b.mV[VY]) && (val3 ==vec4b.mV[VZ])&& (val4 ==vec4b.mV[VW])));	
+		LLVector4 check(val1, val2, val3, val4);
+		ensure_equals("lerp failed", check, vec4b);
 	}
 
 	template<> template<>
diff --git a/indra/llmath/v4color.cpp b/indra/llmath/v4color.cpp
index 79a64b24f2c3b34f264efbb35fba92f9dd01ec43..a8768bda35ea1060b09f3ca95ae6948a6d602399 100644
--- a/indra/llmath/v4color.cpp
+++ b/indra/llmath/v4color.cpp
@@ -122,7 +122,7 @@ LLColor4 LLColor4::cyan6(0.2f, 0.6f, 0.6f, 1.0f);
 //////////////////////////////////////////////////////////////////////////////
 
 // conversion
-LLColor4::operator const LLColor4U() const
+LLColor4::operator LLColor4U() const
 {
 	return LLColor4U(
 		(U8)llclampb(ll_round(mV[VRED]*255.f)),
diff --git a/indra/llmath/v4color.h b/indra/llmath/v4color.h
index 0d632f59be3a180851c0339bf4841f94a4c86c35..8f353ead5a251c95aca64570f66329753868f7d3 100644
--- a/indra/llmath/v4color.h
+++ b/indra/llmath/v4color.h
@@ -131,7 +131,7 @@ class LLColor4
 		friend const LLColor4& operator*=(LLColor4 &a, const LLColor4 &b); // Doesn't multiply alpha! (for lighting)
 
 		// conversion
-		operator const LLColor4U() const;
+		operator LLColor4U() const;
 
 		// Basic color values.
 		static LLColor4 red;
diff --git a/indra/llmath/v4coloru.h b/indra/llmath/v4coloru.h
index fddad349789139a076f86a1e72285245359151d0..0f2eff3d14334b678db48aa295b5ebb9d9fc1f90 100644
--- a/indra/llmath/v4coloru.h
+++ b/indra/llmath/v4coloru.h
@@ -47,14 +47,7 @@ class LLColor4U
 {
 public:
 
-	union
-	{
-		U8         mV[LENGTHOFCOLOR4U];
-		U32        mAll;
-		LLColor4*  mSources;
-		LLColor4U* mSourcesU;
-	};
-
+	U8 mV[LENGTHOFCOLOR4U];
 
 	LLColor4U();						// Initializes LLColor4U to (0, 0, 0, 1)
 	LLColor4U(U8 r, U8 g, U8 b);		// Initializes LLColor4U to (r, g, b, 1)
@@ -127,11 +120,14 @@ class LLColor4U
 	static BOOL parseColor4U(const std::string& buf, LLColor4U* value);
 
 	// conversion
-	operator const LLColor4() const
+	operator LLColor4() const
 	{
 		return LLColor4(*this);
 	}
 
+	U32 asRGBA() const;
+	void fromRGBA( U32 aVal );
+
 	static LLColor4U white;
 	static LLColor4U black;
 	static LLColor4U red;
@@ -565,6 +561,26 @@ void LLColor4U::setVecScaleClamp(const LLColor3& color)
 	mV[3] = 255;
 }
 
+inline U32 LLColor4U::asRGBA() const
+{
+	// Little endian: values are swapped in memory. The original code access the array like a U32, so we need to swap here
+
+	return (mV[3] << 24) | (mV[2] << 16) | (mV[1] << 8) | mV[0];
+}
+
+inline void LLColor4U::fromRGBA( U32 aVal )
+{
+	// Little endian: values are swapped in memory. The original code access the array like a U32, so we need to swap here
+
+	mV[ 0 ] = aVal & 0xFF;
+	aVal >>= 8;
+	mV[ 1 ] = aVal & 0xFF;
+	aVal >>= 8;
+	mV[ 2 ] = aVal & 0xFF;
+	aVal >>= 8;
+	mV[ 3 ] = aVal & 0xFF;
+}
+
 
 #endif
 
diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt
index 84667f1b826f5a38ed400bd038cac0b912479687..2cdea67723b135368a02362e0560a4bbb74866ee 100644
--- a/indra/llplugin/CMakeLists.txt
+++ b/indra/llplugin/CMakeLists.txt
@@ -56,13 +56,13 @@ set(llplugin_HEADER_FILES
 set_source_files_properties(${llplugin_HEADER_FILES}
                             PROPERTIES HEADER_FILE_ONLY TRUE)
 
-if(NOT WORD_SIZE EQUAL 32)
+if(NOT ADDRESS_SIZE EQUAL 32)
   if(WINDOWS)
-    add_definitions(/FIXED:NO)
+    ##add_definitions(/FIXED:NO)
   else(WINDOWS) # not windows therefore gcc LINUX and DARWIN
     add_definitions(-fPIC)
   endif(WINDOWS)
-endif(NOT WORD_SIZE EQUAL 32)
+endif(NOT ADDRESS_SIZE EQUAL 32)
 
 list(APPEND llplugin_SOURCE_FILES ${llplugin_HEADER_FILES})
 
diff --git a/indra/llplugin/llpluginmessagepipe.cpp b/indra/llplugin/llpluginmessagepipe.cpp
index 7e2bf90ad15360bb3b115a7463b083275521a48e..9468696507b31e98be7b947a4badad5024ee9c56 100644
--- a/indra/llplugin/llpluginmessagepipe.cpp
+++ b/indra/llplugin/llpluginmessagepipe.cpp
@@ -215,7 +215,7 @@ bool LLPluginMessagePipe::pumpOutput()
 			else if(APR_STATUS_IS_EOF(status))
 			{
 				// This is what we normally expect when a plugin exits.
-				LL_INFOS() << "Got EOF from plugin socket. " << LL_ENDL;
+				//LL_INFOS() << "Got EOF from plugin socket. " << LL_ENDL;
 
 				if(mOwner)
 				{
@@ -329,7 +329,7 @@ bool LLPluginMessagePipe::pumpInput(F64 timeout)
 				else if(APR_STATUS_IS_EOF(status))
 				{
 					// This is what we normally expect when a plugin exits.
-					LL_INFOS("PluginSocket") << "Got EOF from plugin socket. " << LL_ENDL;
+					//LL_INFOS("PluginSocket") << "Got EOF from plugin socket. " << LL_ENDL;
 
 					if(mOwner)
 					{
diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp
index be80d38305807f18640a8acb351df5e12fefff29..e24d222cb66e8eaf7063e1a4c785c74dcf7f7544 100644
--- a/indra/llplugin/llpluginprocesschild.cpp
+++ b/indra/llplugin/llpluginprocesschild.cpp
@@ -1,30 +1,30 @@
-/** 
- * @file llpluginprocesschild.cpp
- * @brief LLPluginProcessChild handles the child side of the external-process plugin API. 
- *
- * @cond
- * $LicenseInfo:firstyear=2008&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- * @endcond
- */
+/**
+* @file llpluginprocesschild.cpp
+* @brief LLPluginProcessChild handles the child side of the external-process plugin API.
+*
+* @cond
+* $LicenseInfo:firstyear=2008&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2010, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+* @endcond
+*/
 
 #include "linden_common.h"
 
@@ -50,7 +50,7 @@ LLPluginProcessChild::LLPluginProcessChild()
 
 LLPluginProcessChild::~LLPluginProcessChild()
 {
-	if(mInstance != NULL)
+	if (mInstance != NULL)
 	{
 		sendMessageToPlugin(LLPluginMessage("base", "cleanup"));
 
@@ -58,7 +58,7 @@ LLPluginProcessChild::~LLPluginProcessChild()
 		// appears to fail and lock up which means that a given instance of the slplugin process never exits. 
 		// This is bad, especially when users try to update their version of SL - it fails because the slplugin 
 		// process as well as a bunch of plugin specific files are locked and cannot be overwritten.
-		exit( 0 );
+		exit(0);
 		//delete mInstance;
 		//mInstance = NULL;
 	}
@@ -81,166 +81,173 @@ void LLPluginProcessChild::idle(void)
 	bool idle_again;
 	do
 	{
-		if(APR_STATUS_IS_EOF(mSocketError))
-		{
-			// Plugin socket was closed.  This covers both normal plugin termination and host crashes.
-			setState(STATE_ERROR);
-		}
-		else if(mSocketError != APR_SUCCESS)
-		{
-			LL_INFOS("Plugin") << "message pipe is in error state (" << mSocketError << "), moving to STATE_ERROR"<< LL_ENDL;
-			setState(STATE_ERROR);
-		}	
+		if (mState < STATE_SHUTDOWNREQ)
+		{   // Once we have hit the shutdown request state checking for errors might put us in a spurious 
+			// error state... don't do that.
 
-		if((mState > STATE_INITIALIZED) && (mMessagePipe == NULL))
-		{
-			// The pipe has been closed -- we're done.
-			// TODO: This could be slightly more subtle, but I'm not sure it needs to be.
-			LL_INFOS("Plugin") << "message pipe went away, moving to STATE_ERROR"<< LL_ENDL;
-			setState(STATE_ERROR);
+			if (APR_STATUS_IS_EOF(mSocketError))
+			{
+				// Plugin socket was closed.  This covers both normal plugin termination and host crashes.
+				setState(STATE_ERROR);
+			}
+			else if (mSocketError != APR_SUCCESS)
+			{
+				LL_INFOS("Plugin") << "message pipe is in error state (" << mSocketError << "), moving to STATE_ERROR" << LL_ENDL;
+				setState(STATE_ERROR);
+			}
+
+			if ((mState > STATE_INITIALIZED) && (mMessagePipe == NULL))
+			{
+				// The pipe has been closed -- we're done.
+				// TODO: This could be slightly more subtle, but I'm not sure it needs to be.
+				LL_INFOS("Plugin") << "message pipe went away, moving to STATE_ERROR" << LL_ENDL;
+				setState(STATE_ERROR);
+			}
 		}
-	
+
 		// If a state needs to go directly to another state (as a performance enhancement), it can set idle_again to true after calling setState().
 		// USE THIS CAREFULLY, since it can starve other code.  Specifically make sure there's no way to get into a closed cycle and never return.
 		// When in doubt, don't do it.
 		idle_again = false;
-		
-		if(mInstance != NULL)
+
+		if (mInstance != NULL)
 		{
 			// Provide some time to the plugin
 			mInstance->idle();
 		}
-		
-		switch(mState)
+
+		switch (mState)
 		{
-			case STATE_UNINITIALIZED:
+		case STATE_UNINITIALIZED:
 			break;
 
-			case STATE_INITIALIZED:
-				if(mSocket->blockingConnect(mLauncherHost))
+		case STATE_INITIALIZED:
+			if (mSocket->blockingConnect(mLauncherHost))
+			{
+				// This automatically sets mMessagePipe
+				new LLPluginMessagePipe(this, mSocket);
+
+				setState(STATE_CONNECTED);
+			}
+			else
+			{
+				// connect failed
+				setState(STATE_ERROR);
+			}
+			break;
+
+		case STATE_CONNECTED:
+			sendMessageToParent(LLPluginMessage(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "hello"));
+			setState(STATE_PLUGIN_LOADING);
+			break;
+
+		case STATE_PLUGIN_LOADING:
+			if (!mPluginFile.empty())
+			{
+				mInstance = new LLPluginInstance(this);
+				if (mInstance->load(mPluginDir, mPluginFile) == 0)
 				{
-					// This automatically sets mMessagePipe
-					new LLPluginMessagePipe(this, mSocket);
-					
-					setState(STATE_CONNECTED);
+					mHeartbeat.start();
+					mHeartbeat.setTimerExpirySec(HEARTBEAT_SECONDS);
+					mCPUElapsed = 0.0f;
+					setState(STATE_PLUGIN_LOADED);
 				}
 				else
 				{
-					// connect failed
 					setState(STATE_ERROR);
 				}
+			}
 			break;
-			
-			case STATE_CONNECTED:
-				sendMessageToParent(LLPluginMessage(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "hello"));
-				setState(STATE_PLUGIN_LOADING);
+
+		case STATE_PLUGIN_LOADED:
+		{
+			setState(STATE_PLUGIN_INITIALIZING);
+			LLPluginMessage message("base", "init");
+			sendMessageToPlugin(message);
+		}
+		break;
+
+		case STATE_PLUGIN_INITIALIZING:
+			// waiting for init_response...
 			break;
-						
-			case STATE_PLUGIN_LOADING:
-				if(!mPluginFile.empty())
+
+		case STATE_RUNNING:
+			if (mInstance != NULL)
+			{
+				// Provide some time to the plugin
+				LLPluginMessage message("base", "idle");
+				message.setValueReal("time", PLUGIN_IDLE_SECONDS);
+				sendMessageToPlugin(message);
+
+				mInstance->idle();
+
+				if (mHeartbeat.hasExpired())
 				{
-					mInstance = new LLPluginInstance(this);
-					if(mInstance->load(mPluginDir, mPluginFile) == 0)
-					{
-						mHeartbeat.start();
-						mHeartbeat.setTimerExpirySec(HEARTBEAT_SECONDS);
-						mCPUElapsed = 0.0f;
-						setState(STATE_PLUGIN_LOADED);
-					}
-					else
-					{
-						setState(STATE_ERROR);
-					}
+
+					// This just proves that we're not stuck down inside the plugin code.
+					LLPluginMessage heartbeat(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "heartbeat");
+
+					// Calculate the approximage CPU usage fraction (floating point value between 0 and 1) used by the plugin this heartbeat cycle.
+					// Note that this will not take into account any threads or additional processes the plugin spawns, but it's a first approximation.
+					// If we could write OS-specific functions to query the actual CPU usage of this process, that would be a better approximation.
+					heartbeat.setValueReal("cpu_usage", mCPUElapsed / mHeartbeat.getElapsedTimeF64());
+
+					sendMessageToParent(heartbeat);
+
+					mHeartbeat.reset();
+					mHeartbeat.setTimerExpirySec(HEARTBEAT_SECONDS);
+					mCPUElapsed = 0.0f;
 				}
+			}
+			// receivePluginMessage will transition to STATE_UNLOADING
 			break;
-			
-			case STATE_PLUGIN_LOADED:
-				{
-					setState(STATE_PLUGIN_INITIALIZING);
-					LLPluginMessage message("base", "init");
-					sendMessageToPlugin(message);
-				}
+
+		case STATE_SHUTDOWNREQ:
+			// set next state first thing in case "cleanup" message advances state.
+			setState(STATE_UNLOADING);
+			mWaitGoodbye.setTimerExpirySec(GOODBYE_SECONDS);
+
+			if (mInstance != NULL)
+			{
+				sendMessageToPlugin(LLPluginMessage("base", "cleanup"));
+			}
 			break;
-			
-			case STATE_PLUGIN_INITIALIZING:
-				// waiting for init_response...
+
+		case STATE_UNLOADING:
+			// waiting for goodbye from plugin.
+			if (mWaitGoodbye.hasExpired())
+			{
+				LL_WARNS() << "Wait for goodbye expired.  Advancing to UNLOADED" << LL_ENDL;
+				setState(STATE_UNLOADED);
+			}
+			break;
+
+		case STATE_UNLOADED:
+			killSockets();
+			delete mInstance;
+			mInstance = NULL;
+			setState(STATE_DONE);
+			break;
+
+		case STATE_ERROR:
+			// Close the socket to the launcher
+			killSockets();
+			// TODO: Where do we go from here?  Just exit()?
+			setState(STATE_DONE);
+			break;
+
+		case STATE_DONE:
+			// just sit here.
 			break;
-			
-			case STATE_RUNNING:
-				if(mInstance != NULL)
-				{
-					// Provide some time to the plugin
-					LLPluginMessage message("base", "idle");
-					message.setValueReal("time", PLUGIN_IDLE_SECONDS);
-					sendMessageToPlugin(message);
-					
-					mInstance->idle();
-					
-					if(mHeartbeat.hasExpired())
-					{
-						
-						// This just proves that we're not stuck down inside the plugin code.
-						LLPluginMessage heartbeat(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "heartbeat");
-						
-						// Calculate the approximage CPU usage fraction (floating point value between 0 and 1) used by the plugin this heartbeat cycle.
-						// Note that this will not take into account any threads or additional processes the plugin spawns, but it's a first approximation.
-						// If we could write OS-specific functions to query the actual CPU usage of this process, that would be a better approximation.
-						heartbeat.setValueReal("cpu_usage", mCPUElapsed / mHeartbeat.getElapsedTimeF64());
-						
-						sendMessageToParent(heartbeat);
-
-						mHeartbeat.reset();
-						mHeartbeat.setTimerExpirySec(HEARTBEAT_SECONDS);
-						mCPUElapsed = 0.0f;
-					}
-				}
-				// receivePluginMessage will transition to STATE_UNLOADING
-			    break;
-
-            case STATE_SHUTDOWNREQ:
-                if (mInstance != NULL)
-                {
-                    sendMessageToPlugin(LLPluginMessage("base", "cleanup"));
-                    delete mInstance;
-                    mInstance = NULL;
-                }
-                setState(STATE_UNLOADING);
-                mWaitGoodbye.setTimerExpirySec(GOODBYE_SECONDS);
-                break;
-
-			case STATE_UNLOADING:
-                // waiting for goodbye from plugin.
-                if (mWaitGoodbye.hasExpired())
-                {
-                    LL_WARNS() << "Wait for goodbye expired.  Advancing to UNLOADED" << LL_ENDL;
-                    setState(STATE_UNLOADED);
-                }
-			    break;
-			
-			case STATE_UNLOADED:
-				killSockets();
-				setState(STATE_DONE);
-			    break;
-
-			case STATE_ERROR:
-				// Close the socket to the launcher
-				killSockets();				
-				// TODO: Where do we go from here?  Just exit()?
-				setState(STATE_DONE);
-			    break;
-			
-			case STATE_DONE:
-				// just sit here.
-			    break;
 		}
-	
+
 	} while (idle_again);
 }
 
 void LLPluginProcessChild::sleep(F64 seconds)
 {
 	deliverQueuedMessages();
-	if(mMessagePipe)
+	if (mMessagePipe)
 	{
 		mMessagePipe->pump(seconds);
 	}
@@ -253,7 +260,7 @@ void LLPluginProcessChild::sleep(F64 seconds)
 void LLPluginProcessChild::pump(void)
 {
 	deliverQueuedMessages();
-	if(mMessagePipe)
+	if (mMessagePipe)
 	{
 		mMessagePipe->pump(0.0f);
 	}
@@ -267,26 +274,26 @@ void LLPluginProcessChild::pump(void)
 bool LLPluginProcessChild::isRunning(void)
 {
 	bool result = false;
-	
-	if(mState == STATE_RUNNING)
+
+	if (mState == STATE_RUNNING)
 		result = true;
-		
+
 	return result;
 }
 
 bool LLPluginProcessChild::isDone(void)
 {
 	bool result = false;
-	
-	switch(mState)
+
+	switch (mState)
 	{
-		case STATE_DONE:
+	case STATE_DONE:
 		result = true;
 		break;
-		default:
+	default:
 		break;
 	}
-		
+
 	return result;
 }
 
@@ -295,12 +302,12 @@ void LLPluginProcessChild::sendMessageToPlugin(const LLPluginMessage &message)
 	if (mInstance)
 	{
 		std::string buffer = message.generate();
-		
+
 		LL_DEBUGS("Plugin") << "Sending to plugin: " << buffer << LL_ENDL;
 		LLTimer elapsed;
-		
+
 		mInstance->sendMessage(buffer);
-		
+
 		mCPUElapsed += elapsed.getElapsedTimeF64();
 	}
 	else
@@ -328,11 +335,11 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
 	LLPluginMessage parsed;
 	parsed.parse(message);
 
-	if(mBlockingRequest)
+	if (mBlockingRequest)
 	{
 		// We're blocking the plugin waiting for a response.
 
-		if(parsed.hasValue("blocking_response"))
+		if (parsed.hasValue("blocking_response"))
 		{
 			// This is the message we've been waiting for -- fall through and send it immediately. 
 			mBlockingResponseReceived = true;
@@ -344,34 +351,34 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
 			return;
 		}
 	}
-	
+
 	bool passMessage = true;
-	
+
 	// FIXME: how should we handle queueing here?
-	
+
 	{
 		std::string message_class = parsed.getClass();
-		if(message_class == LLPLUGIN_MESSAGE_CLASS_INTERNAL)
+		if (message_class == LLPLUGIN_MESSAGE_CLASS_INTERNAL)
 		{
 			passMessage = false;
-			
+
 			std::string message_name = parsed.getName();
-			if(message_name == "load_plugin")
+			if (message_name == "load_plugin")
 			{
 				mPluginFile = parsed.getValue("file");
 				mPluginDir = parsed.getValue("dir");
 			}
-            else if (message_name == "shutdown_plugin")
-            {
-                setState(STATE_SHUTDOWNREQ);
-            }
-			else if(message_name == "shm_add")
+			else if (message_name == "shutdown_plugin")
+			{
+				setState(STATE_SHUTDOWNREQ);
+			}
+			else if (message_name == "shm_add")
 			{
 				std::string name = parsed.getValue("name");
 				size_t size = (size_t)parsed.getValueS32("size");
-				
+
 				sharedMemoryRegionsType::iterator iter = mSharedMemoryRegions.find(name);
-				if(iter != mSharedMemoryRegions.end())
+				if (iter != mSharedMemoryRegions.end())
 				{
 					// Need to remove the old region first
 					LL_WARNS("Plugin") << "Adding a duplicate shared memory segment!" << LL_ENDL;
@@ -380,20 +387,20 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
 				{
 					// This is a new region
 					LLPluginSharedMemory *region = new LLPluginSharedMemory;
-					if(region->attach(name, size))
+					if (region->attach(name, size))
 					{
 						mSharedMemoryRegions.insert(sharedMemoryRegionsType::value_type(name, region));
-						
+
 						std::stringstream addr;
 						addr << region->getMappedAddress();
-						
+
 						// Send the add notification to the plugin
 						LLPluginMessage message("base", "shm_added");
 						message.setValue("name", name);
 						message.setValueS32("size", (S32)size);
 						message.setValuePointer("address", region->getMappedAddress());
 						sendMessageToPlugin(message);
-						
+
 						// and send the response to the parent
 						message.setMessage(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "shm_add_response");
 						message.setValue("name", name);
@@ -405,13 +412,13 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
 						delete region;
 					}
 				}
-				
+
 			}
-			else if(message_name == "shm_remove")
+			else if (message_name == "shm_remove")
 			{
 				std::string name = parsed.getValue("name");
 				sharedMemoryRegionsType::iterator iter = mSharedMemoryRegions.find(name);
-				if(iter != mSharedMemoryRegions.end())
+				if (iter != mSharedMemoryRegions.end())
 				{
 					// forward the remove request to the plugin -- its response will trigger us to detach the segment.
 					LLPluginMessage message("base", "shm_remove");
@@ -423,20 +430,20 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
 					LL_WARNS("Plugin") << "shm_remove for unknown memory segment!" << LL_ENDL;
 				}
 			}
-			else if(message_name == "sleep_time")
+			else if (message_name == "sleep_time")
 			{
 				mSleepTime = llmax(parsed.getValueReal("time"), 1.0 / 100.0); // clamp to maximum of 100Hz
 			}
-			else if(message_name == "crash")
+			else if (message_name == "crash")
 			{
 				// Crash the plugin
 				LL_ERRS("Plugin") << "Plugin crash requested." << LL_ENDL;
 			}
-			else if(message_name == "hang")
+			else if (message_name == "hang")
 			{
 				// Hang the plugin
 				LL_WARNS("Plugin") << "Plugin hang requested." << LL_ENDL;
-				while(1)
+				while (1)
 				{
 					// wheeeeeeeee......
 				}
@@ -447,8 +454,8 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
 			}
 		}
 	}
-	
-	if(passMessage && mInstance != NULL)
+
+	if (passMessage && mInstance != NULL)
 	{
 		LLTimer elapsed;
 
@@ -458,50 +465,50 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
 	}
 }
 
-/* virtual */ 
+/* virtual */
 void LLPluginProcessChild::receivePluginMessage(const std::string &message)
 {
 	LL_DEBUGS("Plugin") << "Received from plugin: " << message << LL_ENDL;
-	
-	if(mBlockingRequest)
+
+	if (mBlockingRequest)
 	{
 		// 
 		LL_ERRS("Plugin") << "Can't send a message while already waiting on a blocking request -- aborting!" << LL_ENDL;
 	}
-	
+
 	// Incoming message from the plugin instance
 	bool passMessage = true;
 
 	// FIXME: how should we handle queueing here?
-	
+
 	// Intercept certain base messages (responses to ones sent by this class)
 	{
 		// Decode this message
 		LLPluginMessage parsed;
 		parsed.parse(message);
-		
-		if(parsed.hasValue("blocking_request"))
+
+		if (parsed.hasValue("blocking_request"))
 		{
 			mBlockingRequest = true;
 		}
 
 		std::string message_class = parsed.getClass();
-		if(message_class == "base")
+		if (message_class == "base")
 		{
 			std::string message_name = parsed.getName();
-			if(message_name == "init_response")
+			if (message_name == "init_response")
 			{
 				// The plugin has finished initializing.
 				setState(STATE_RUNNING);
 
 				// Don't pass this message up to the parent
 				passMessage = false;
-				
+
 				LLPluginMessage new_message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "load_plugin_response");
 				LLSD versions = parsed.getValueLLSD("versions");
 				new_message.setValueLLSD("versions", versions);
-				
-				if(parsed.hasValue("plugin_version"))
+
+				if (parsed.hasValue("plugin_version"))
 				{
 					std::string plugin_version = parsed.getValue("plugin_version");
 					new_message.setValueLLSD("plugin_version", plugin_version);
@@ -510,25 +517,25 @@ void LLPluginProcessChild::receivePluginMessage(const std::string &message)
 				// Let the parent know it's loaded and initialized.
 				sendMessageToParent(new_message);
 			}
-            else if (message_name == "goodbye")
-            {
-                setState(STATE_UNLOADED);
-            }
-			else if(message_name == "shm_remove_response")
+			else if (message_name == "goodbye")
+			{
+				setState(STATE_UNLOADED);
+			}
+			else if (message_name == "shm_remove_response")
 			{
 				// Don't pass this message up to the parent
 				passMessage = false;
 
 				std::string name = parsed.getValue("name");
-				sharedMemoryRegionsType::iterator iter = mSharedMemoryRegions.find(name);				
-				if(iter != mSharedMemoryRegions.end())
+				sharedMemoryRegionsType::iterator iter = mSharedMemoryRegions.find(name);
+				if (iter != mSharedMemoryRegions.end())
 				{
 					// detach the shared memory region
 					iter->second->detach();
-					
+
 					// and remove it from our map
 					mSharedMemoryRegions.erase(iter);
-					
+
 					// Finally, send the response to the parent.
 					LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "shm_remove_response");
 					message.setValue("name", name);
@@ -541,19 +548,19 @@ void LLPluginProcessChild::receivePluginMessage(const std::string &message)
 			}
 		}
 	}
-	
-	if(passMessage)
+
+	if (passMessage)
 	{
 		LL_DEBUGS("Plugin") << "Passing through to parent: " << message << LL_ENDL;
 		writeMessageRaw(message);
 	}
-	
-	while(mBlockingRequest)
+
+	while (mBlockingRequest)
 	{
 		// The plugin wants to block and wait for a response to this message.
 		sleep(mSleepTime);	// this will pump the message pipe and process messages
 
-		if(mBlockingResponseReceived || mSocketError != APR_SUCCESS || (mMessagePipe == NULL))
+		if (mBlockingResponseReceived || mSocketError != APR_SUCCESS || (mMessagePipe == NULL))
 		{
 			// Response has been received, or we've hit an error state.  Stop waiting.
 			mBlockingRequest = false;
@@ -566,14 +573,14 @@ void LLPluginProcessChild::receivePluginMessage(const std::string &message)
 void LLPluginProcessChild::setState(EState state)
 {
 	LL_DEBUGS("Plugin") << "setting state to " << state << LL_ENDL;
-	mState = state; 
+	mState = state;
 };
 
 void LLPluginProcessChild::deliverQueuedMessages()
 {
-	if(!mBlockingRequest)
+	if (!mBlockingRequest)
 	{
-		while(!mMessageQueue.empty())
+		while (!mMessageQueue.empty())
 		{
 			receiveMessageRaw(mMessageQueue.front());
 			mMessageQueue.pop();
diff --git a/indra/llplugin/slplugin/slplugin.cpp b/indra/llplugin/slplugin/slplugin.cpp
index 684bcf1207fff878300a57f7fb858a6f567ccaee..b96056541628b9c2d4dc5bd75760b9b4a3746585 100644
--- a/indra/llplugin/slplugin/slplugin.cpp
+++ b/indra/llplugin/slplugin/slplugin.cpp
@@ -100,33 +100,8 @@ LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(
 
 BOOL PreventSetUnhandledExceptionFilter()
 {
-// WARNING: This won't work on 64-bit Windows systems so we turn it off it.
-//          It should work for any flavor of 32-bit Windows we care about.
-//          If it's off, sometimes you will see an OS message when a plugin crashes
-#ifndef _WIN64
-	HMODULE hKernel32 = LoadLibraryA( "kernel32.dll" );
-	if ( NULL == hKernel32 )
-		return FALSE;
-
-	void *pOrgEntry = GetProcAddress( hKernel32, "SetUnhandledExceptionFilter" );
-	if( NULL == pOrgEntry )
-		return FALSE;
-
-	unsigned char newJump[ 100 ];
-	DWORD dwOrgEntryAddr = (DWORD)pOrgEntry;
-	dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far
-	void *pNewFunc = &MyDummySetUnhandledExceptionFilter;
-	DWORD dwNewEntryAddr = (DWORD) pNewFunc;
-	DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;
-
-	newJump[ 0 ] = 0xE9;  // JMP absolute
-	memcpy( &newJump[ 1 ], &dwRelativeAddr, sizeof( pNewFunc ) );
-	SIZE_T bytesWritten;
-	BOOL bRet = WriteProcessMemory( GetCurrentProcess(), pOrgEntry, newJump, sizeof( pNewFunc ) + 1, &bytesWritten );
-	return bRet;
-#else
-	return FALSE;
-#endif
+	// remove the scary stuff that also isn't supported on 64 bit Windows
+	return TRUE;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 7757198af525935904294419c8e4752decee956e..18063e9700131b257102353a8e75ba91f7c87623 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -55,7 +55,6 @@
 
 
 BOOL gDebugSession = FALSE;
-BOOL gDebugGL = FALSE;
 BOOL gClothRipple = FALSE;
 BOOL gHeadlessClient = FALSE;
 BOOL gGLActive = FALSE;
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 3e7c69611d741945bf891521ec900ea466cae20f..76f28bb43fcd9ddd812bfe5ab899d2dcc7bc896f 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -1829,48 +1829,6 @@ void LLRender::flush()
 {
 	if (mCount > 0)
 	{
-#if 0
-		if (!glIsEnabled(GL_VERTEX_ARRAY))
-		{
-			LL_ERRS() << "foo 1" << LL_ENDL;
-		}
-
-		if (!glIsEnabled(GL_COLOR_ARRAY))
-		{
-			LL_ERRS() << "foo 2" << LL_ENDL;
-		}
-
-		if (!glIsEnabled(GL_TEXTURE_COORD_ARRAY))
-		{
-			LL_ERRS() << "foo 3" << LL_ENDL;
-		}
-
-		if (glIsEnabled(GL_NORMAL_ARRAY))
-		{
-			LL_ERRS() << "foo 7" << LL_ENDL;
-		}
-
-		GLvoid* pointer;
-
-		glGetPointerv(GL_VERTEX_ARRAY_POINTER, &pointer);
-		if (pointer != &(mBuffer[0].v))
-		{
-			LL_ERRS() << "foo 4" << LL_ENDL;
-		}
-
-		glGetPointerv(GL_COLOR_ARRAY_POINTER, &pointer);
-		if (pointer != &(mBuffer[0].c))
-		{
-			LL_ERRS() << "foo 5" << LL_ENDL;
-		}
-
-		glGetPointerv(GL_TEXTURE_COORD_ARRAY_POINTER, &pointer);
-		if (pointer != &(mBuffer[0].uv))
-		{
-			LL_ERRS() << "foo 6" << LL_ENDL;
-		}
-#endif
-				
 		if (!mUIOffset.empty())
 		{
 			sUICalls++;
@@ -2046,7 +2004,8 @@ void LLRender::vertexBatchPreTransformed(LLVector3* verts, S32 vert_count)
 		}
 	}
 
-	mVerticesp[mCount] = mVerticesp[mCount-1];
+	if( mCount > 0 ) // ND: Guard against crashes if mCount is zero, yes it can happen
+		mVerticesp[mCount] = mVerticesp[mCount-1];
 }
 
 void LLRender::vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, S32 vert_count)
@@ -2103,8 +2062,11 @@ void LLRender::vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, S32 v
 		}
 	}
 
-	mVerticesp[mCount] = mVerticesp[mCount-1];
-	mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+	if (mCount > 0)
+	{
+		mVerticesp[mCount] = mVerticesp[mCount - 1];
+		mTexcoordsp[mCount] = mTexcoordsp[mCount - 1];
+	}
 }
 
 void LLRender::vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, LLColor4U* colors, S32 vert_count)
@@ -2162,9 +2124,12 @@ void LLRender::vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, LLCol
 		}
 	}
 
-	mVerticesp[mCount] = mVerticesp[mCount-1];
-	mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
-	mColorsp[mCount] = mColorsp[mCount-1];
+	if (mCount > 0)
+	{
+		mVerticesp[mCount] = mVerticesp[mCount - 1];
+		mTexcoordsp[mCount] = mTexcoordsp[mCount - 1];
+		mColorsp[mCount] = mColorsp[mCount - 1];
+	}
 }
 
 void LLRender::vertex2i(const GLint& x, const GLint& y)
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 31dffdd545300abf55686fd74883d1938d55ebbe..385166936023853ab9f5bd2c70b652890f10d5ca 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -1436,13 +1436,22 @@ void LLVertexBuffer::setupVertexArray()
 				//glVertexattribIPointer requires GLSL 1.30 or later
 				if (gGLManager.mGLSLVersionMajor > 1 || gGLManager.mGLSLVersionMinor >= 30)
 				{
-					glVertexAttribIPointer(i, attrib_size[i], attrib_type[i], sTypeSize[i], (void*) mOffsets[i]); 
+					glVertexAttribIPointer(i, attrib_size[i], attrib_type[i], sTypeSize[i], (const GLvoid*) mOffsets[i]); 
 				}
 #endif
 			}
 			else
 			{
-				glVertexAttribPointerARB(i, attrib_size[i], attrib_type[i], attrib_normalized[i], sTypeSize[i], (void*) mOffsets[i]); 
+				// nat 2016-12-16: With 64-bit clang compile, the compiler
+				// produces an error if we simply cast mOffsets[i] -- an S32
+				// -- to (GLvoid *), the type of the parameter. It correctly
+				// points out that there's no way an S32 could fit a real
+				// pointer value. Ruslan asserts that in this case the last
+				// param is interpreted as an array data offset within the VBO
+				// rather than as an actual pointer, so it's okay.
+				glVertexAttribPointerARB(i, attrib_size[i], attrib_type[i],
+										 attrib_normalized[i], sTypeSize[i],
+										 reinterpret_cast<GLvoid*>(mOffsets[i])); 
 			}
 		}
 		else
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index 7fb1db15fb232128978c99d56edba439e06cfd20..8054eb36199cdf57ebc8bafea46b1c026911b00a 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -3,6 +3,7 @@
 project(llui)
 
 include(00-Common)
+include(Hunspell)
 include(LLCommon)
 include(LLImage)
 include(LLInventory)
@@ -294,7 +295,11 @@ if(LL_TESTS)
       )
   LL_ADD_PROJECT_UNIT_TESTS(llui "${llui_TEST_SOURCE_FILES}")
   # INTEGRATION TESTS
-  set(test_libs llui llmessage llcorehttp llcommon ${LLCOMMON_LIBRARIES} ${BOOST_COROUTINE_LIBRARY} ${BOOST_CONTEXT_LIBRARY} ${BOOST_SYSTEM_LIBRARY} ${WINDOWS_LIBRARIES})
+  set(test_libs llui llmessage llcorehttp llcommon
+      ${HUNSPELL_LIBRARY}
+      ${LLCOMMON_LIBRARIES}
+      ${BOOST_COROUTINE_LIBRARY} ${BOOST_CONTEXT_LIBRARY} ${BOOST_SYSTEM_LIBRARY}
+      ${WINDOWS_LIBRARIES})
   if(NOT LINUX)
     LL_ADD_INTEGRATION_TEST(llurlentry llurlentry.cpp "${test_libs}")
   endif(NOT LINUX)
diff --git a/indra/llui/llstatgraph.h b/indra/llui/llstatgraph.h
index f381e92a4dba1364d5e269611707c307699d1ed2..ba7cfc5d10fa52c54fc7c3b0e84692d8fa2c30e8 100644
--- a/indra/llui/llstatgraph.h
+++ b/indra/llui/llstatgraph.h
@@ -126,7 +126,7 @@ class LLStatGraph : public LLView
 
 		F32 mValue;
 		LLUIColor mColor;
-		bool operator <(const Threshold& other)
+		bool operator <(const Threshold& other) const
 		{
 			return mValue < other.mValue;
 		}
diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp
index 233fb6da23451ee3bdc02410a8581352f303d79b..119cbebc8146f693a69fcacef545605a28a9a1ff 100644
--- a/indra/llui/tests/llurlentry_test.cpp
+++ b/indra/llui/tests/llurlentry_test.cpp
@@ -28,7 +28,7 @@
 #include "linden_common.h"
 #include "../llurlentry.h"
 #include "../lluictrl.h"
-#include "llurlentry_stub.cpp"
+//#include "llurlentry_stub.cpp"
 #include "lltut.h"
 #include "../lluicolortable.h"
 #include "../llrender/lluiimage.h"
@@ -49,6 +49,7 @@
 // 
 // }
 
+/*==========================================================================*|
 typedef std::map<std::string, LLControlGroup*> settings_map_t;
 settings_map_t LLUI::sSettingGroups;
 
@@ -83,6 +84,7 @@ S32 LLUIImage::getHeight() const
 {
 	return 0;
 }
+|*==========================================================================*/
 
 namespace tut
 {
diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp
index 4038c924654487e00cbdb8504fdef98d040061a1..e776b84a12da93e280ff530c0f99650d1110b36a 100644
--- a/indra/llvfs/lldir_mac.cpp
+++ b/indra/llvfs/lldir_mac.cpp
@@ -94,7 +94,7 @@ LLDir_Mac::LLDir_Mac()
 		// MBW -- This keeps the mac application from finding other things.
 		// If this is really for skins, it should JUST apply to skins.
         
-		U32 build_dir_pos = mExecutableDir.rfind("/build-darwin-");
+		std::string::size_type build_dir_pos = mExecutableDir.rfind("/build-darwin-");
 		if (build_dir_pos != std::string::npos)
 		{
 			// ...we're in a dev checkout
diff --git a/indra/llwindow/lldragdropwin32.cpp b/indra/llwindow/lldragdropwin32.cpp
index d00d9ab47ea1caa2d0a8347f4fbefc13ba4ebe64..0d1a47408bb6e6bd9a47043dee4cf9c26cbf3f42 100644
--- a/indra/llwindow/lldragdropwin32.cpp
+++ b/indra/llwindow/lldragdropwin32.cpp
@@ -113,7 +113,7 @@ class LLDragDropWin32Target:
 					PVOID data = GlobalLock( stgmed.hGlobal );
 					mDropUrl = std::string( (char*)data );
 					// XXX MAJOR MAJOR HACK!
-					LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong(mAppWindowHandle, GWL_USERDATA);
+					LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLongPtr( mAppWindowHandle, GWLP_USERDATA );
 					if (NULL != window_imp)
 					{
 						LLCoordGL gl_coord( 0, 0 );
@@ -168,7 +168,7 @@ class LLDragDropWin32Target:
 			if ( mAllowDrop )
 			{
 				// XXX MAJOR MAJOR HACK!
-				LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong(mAppWindowHandle, GWL_USERDATA);
+				LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLongPtr( mAppWindowHandle, GWLP_USERDATA );
 				if (NULL != window_imp)
 				{
 					LLCoordGL gl_coord( 0, 0 );
@@ -215,7 +215,7 @@ class LLDragDropWin32Target:
 		HRESULT __stdcall DragLeave( void )
 		{
 			// XXX MAJOR MAJOR HACK!
-			LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong(mAppWindowHandle, GWL_USERDATA);
+			LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLongPtr( mAppWindowHandle, GWLP_USERDATA );
 			if (NULL != window_imp)
 			{
 				LLCoordGL gl_coord( 0, 0 );
@@ -232,7 +232,7 @@ class LLDragDropWin32Target:
 			if ( mAllowDrop )
 			{
 				// window impl stored in Window data (neat!)
-				LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong( mAppWindowHandle, GWL_USERDATA );
+				LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLongPtr( mAppWindowHandle, GWLP_USERDATA );
 				if ( NULL != window_imp )
 				{
 					POINT pt_client;
diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index 22f3339cf19b0fdee5a5fcb68a68a6e52c9402b1..c8c086d705c8be6b7845323f49e51b941e1e16c7 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -232,8 +232,8 @@ attributedStringInfo getSegments(NSAttributedString *str)
 		NSOpenGLPFADoubleBuffer,
 		NSOpenGLPFAClosestPolicy,
 		NSOpenGLPFAAccelerated,
-		NSOpenGLPFASampleBuffers, (samples > 0 ? 1 : 0),
-		NSOpenGLPFASamples, samples,
+		NSOpenGLPFASampleBuffers, static_cast<NSOpenGLPixelFormatAttribute>(samples > 0 ? 1 : 0),
+		NSOpenGLPFASamples, static_cast<NSOpenGLPixelFormatAttribute>(samples),
 		NSOpenGLPFAStencilSize, 8,
 		NSOpenGLPFADepthSize, 24,
 		NSOpenGLPFAAlphaSize, 8,
@@ -370,8 +370,8 @@ attributedStringInfo getSegments(NSAttributedString *str)
 - (void)mouseMoved:(NSEvent *)theEvent
 {
 	float mouseDeltas[2] = {
-		[theEvent deltaX],
-		[theEvent deltaY]
+		float([theEvent deltaX]),
+		float([theEvent deltaY])
 	};
 	
 	callDeltaUpdate(mouseDeltas, 0);
@@ -391,8 +391,8 @@ attributedStringInfo getSegments(NSAttributedString *str)
 	// The old CoreGraphics APIs we previously relied on are now flagged as obsolete.
 	// NSEvent isn't obsolete, and provides us with the correct deltas.
 	float mouseDeltas[2] = {
-		[theEvent deltaX],
-		[theEvent deltaY]
+		float([theEvent deltaX]),
+		float([theEvent deltaY])
 	};
 	
 	callDeltaUpdate(mouseDeltas, 0);
@@ -592,13 +592,13 @@ attributedStringInfo getSegments(NSAttributedString *str)
     if (mMarkedTextAllowed)
     {
         unsigned int selected[2] = {
-            selectedRange.location,
-            selectedRange.length
+            unsigned(selectedRange.location),
+            unsigned(selectedRange.length)
         };
         
         unsigned int replacement[2] = {
-            replacementRange.location,
-            replacementRange.length
+            unsigned(replacementRange.location),
+            unsigned(replacementRange.length)
         };
         
         int string_length = [aString length];
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index 754306b5d2568fa4391fc571e6767c5b482b443f..5f35a0f0f9bc27ac44131b13c7809f66a91e7aed 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -544,7 +544,7 @@ void getPreeditLocation(float *location, unsigned int length)
 		
 		preeditor->getPreeditLocation(length, &coord, &rect, NULL);
 		
-		float c[4] = {coord.mX, coord.mY, 0, 0};
+		float c[4] = {float(coord.mX), float(coord.mY), 0, 0};
 		
 		convertRectToScreen(gWindowImplementation->getWindow(), c);
 		
@@ -899,7 +899,7 @@ BOOL LLWindowMacOSX::setPosition(const LLCoordScreen position)
 {
 	if(mWindow)
 	{
-		float pos[2] = {position.mX, position.mY};
+		float pos[2] = {float(position.mX), float(position.mY)};
 		setWindowPos(mWindow, pos);
 	}
 
@@ -1758,7 +1758,7 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url, bool async)
 LLSD LLWindowMacOSX::getNativeKeyData()
 {
 	LLSD result = LLSD::emptyMap();
-#if 1
+
 	if(mRawKeyEvent)
 	{
         result["event_type"] = LLSD::Integer(mRawKeyEvent->mEventType);
@@ -1768,7 +1768,6 @@ LLSD LLWindowMacOSX::getNativeKeyData()
         result["event_umodchars"] = (mRawKeyEvent->mEventUnmodChars) ? LLSD(LLSD::Integer(mRawKeyEvent->mEventUnmodChars)) : LLSD();
         result["event_isrepeat"] = LLSD::Boolean(mRawKeyEvent->mEventRepeat);
 	}
-#endif
 
 	LL_DEBUGS() << "native key data is: " << result << LL_ENDL;
 
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index b5ed53fd4fcc218831b51531e250b5c359d50c7b..1a280661b92e2f38a91c3fbba6d90322e157049a 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -785,7 +785,7 @@ void LLWindowWin32::close()
 	LL_DEBUGS("Window") << "Destroying Window" << LL_ENDL;
 	
 	// Don't process events in our mainWindowProc any longer.
-	SetWindowLong(mWindowHandle, GWL_USERDATA, NULL);
+	SetWindowLongPtr(mWindowHandle, GWLP_USERDATA, NULL);
 
 	// Make sure we don't leave a blank toolbar button.
 	ShowWindow(mWindowHandle, SW_HIDE);
@@ -1564,7 +1564,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
 		LL_DEBUGS("Window") << "Keeping vertical sync" << LL_ENDL;
 	}
 
-	SetWindowLong(mWindowHandle, GWL_USERDATA, (U32)this);
+	SetWindowLongPtr(mWindowHandle, GWLP_USERDATA, (LONG_PTR)this);
 
 	// register this window as handling drag/drop events from the OS
 	DragAcceptFiles( mWindowHandle, TRUE );
@@ -1876,7 +1876,7 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
 	// This is to avoid triggering double click teleport after returning focus (see MAINT-3786).
 	static bool sHandleDoubleClick = true;
 
-	LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong(h_wnd, GWL_USERDATA);
+	LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLongPtr( h_wnd, GWLP_USERDATA );
 
 
 	if (NULL != window_imp)
@@ -3800,7 +3800,7 @@ LLWindowCallbacks::DragNDropResult LLWindowWin32::completeDragNDropRequest( cons
 // When it handled the message, the value to be returned from
 // the Window Procedure is set to *result.
 
-BOOL LLWindowWin32::handleImeRequests(U32 request, U32 param, LRESULT *result)
+BOOL LLWindowWin32::handleImeRequests(WPARAM request, LPARAM param, LRESULT *result)
 {
 	if ( mPreeditor )
 	{
diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h
index 39ef9b31a4e1ca8f16881e0fbd60c931c01fd867..059a008c45023f17df218405906d29f11104d85d 100644
--- a/indra/llwindow/llwindowwin32.h
+++ b/indra/llwindow/llwindowwin32.h
@@ -148,7 +148,7 @@ class LLWindowWin32 : public LLWindow
 	U32		fillReconvertString(const LLWString &text, S32 focus, S32 focus_length, RECONVERTSTRING *reconvert_string);
 	void	handleStartCompositionMessage();
 	void	handleCompositionMessage(U32 indexes);
-	BOOL	handleImeRequests(U32 request, U32 param, LRESULT *result);
+	BOOL	handleImeRequests(WPARAM request, LPARAM param, LRESULT *result);
 
 protected:
 	//
diff --git a/indra/media_plugins/CMakeLists.txt b/indra/media_plugins/CMakeLists.txt
index 9055e0111a37f5b06f902fd733af87178007af57..1a5cc8ec9a44af8014a042eaece49c7722d26895 100644
--- a/indra/media_plugins/CMakeLists.txt
+++ b/indra/media_plugins/CMakeLists.txt
@@ -5,17 +5,17 @@ add_subdirectory(base)
 if (LINUX)
     add_subdirectory(gstreamer010)
     add_subdirectory(libvlc)
+    add_subdirectory(example)
 endif (LINUX)
 
 if (DARWIN)
-    add_subdirectory(quicktime)
     add_subdirectory(cef)
+    add_subdirectory(libvlc)
+    add_subdirectory(example)
 endif (DARWIN)
 
 if (WINDOWS)
     add_subdirectory(cef)
-    add_subdirectory(winmmshim)
     add_subdirectory(libvlc)
+    add_subdirectory(example)
 endif (WINDOWS)
-
-### add_subdirectory(example)
diff --git a/indra/media_plugins/base/CMakeLists.txt b/indra/media_plugins/base/CMakeLists.txt
index 7367b9e5e654911c75a0bf8a9fca789a1c260378..70c81d40236562776d3ff3893ce68897724e1d2f 100644
--- a/indra/media_plugins/base/CMakeLists.txt
+++ b/indra/media_plugins/base/CMakeLists.txt
@@ -28,13 +28,13 @@ include_directories(SYSTEM
 
 ### media_plugin_base
 
-if(NOT WORD_SIZE EQUAL 32)
+if(NOT ADDRESS_SIZE EQUAL 32)
   if(WINDOWS)
-    add_definitions(/FIXED:NO)
+    ##add_definitions(/FIXED:NO)
   else(WINDOWS) # not windows therefore gcc LINUX and DARWIN
     add_definitions(-fPIC)
   endif(WINDOWS)
-endif(NOT WORD_SIZE EQUAL 32)
+endif(NOT ADDRESS_SIZE EQUAL 32)
 
 set(media_plugin_base_SOURCE_FILES
     media_plugin_base.cpp
diff --git a/indra/media_plugins/cef/CMakeLists.txt b/indra/media_plugins/cef/CMakeLists.txt
index db471c7906c9900b9a4e77e06c475126d6fc7243..5452fd9d1eb8f196be5efb627d8d6008c66cd23a 100644
--- a/indra/media_plugins/cef/CMakeLists.txt
+++ b/indra/media_plugins/cef/CMakeLists.txt
@@ -34,13 +34,13 @@ include_directories(SYSTEM
 
 ### media_plugin_cef
 
-if(NOT WORD_SIZE EQUAL 32)
+if(NOT ADDRESS_SIZE EQUAL 32)
   if(WINDOWS)
-    add_definitions(/FIXED:NO)
+    ##add_definitions(/FIXED:NO)
   else(WINDOWS) # not windows therefore gcc LINUX and DARWIN
     add_definitions(-fPIC)
   endif(WINDOWS)
-endif(NOT WORD_SIZE EQUAL 32)
+endif(NOT ADDRESS_SIZE EQUAL 32)
 
 set(media_plugin_cef_SOURCE_FILES
     media_plugin_cef.cpp
@@ -57,14 +57,12 @@ set (media_plugin_cef_LINK_LIBRARIES
   ${LLCOMMON_LIBRARIES}
   ${PLUGIN_API_WINDOWS_LIBRARIES})
 
-
 # Select which VolumeCatcher implementation to use
 if (LINUX)
   message(FATAL_ERROR "CEF plugin has been enabled for a Linux compile.\n"
     "  Please create a volume_catcher implementation for this platform.")
-
 elseif (DARWIN)
-  list(APPEND media_plugin_cef_SOURCE_FILES mac_volume_catcher.cpp)
+  list(APPEND media_plugin_cef_SOURCE_FILES mac_volume_catcher_null.cpp)
   find_library(CORESERVICES_LIBRARY CoreServices)
   find_library(AUDIOUNIT_LIBRARY AudioUnit)
   list(APPEND media_plugin_cef_LINK_LIBRARIES
@@ -97,8 +95,8 @@ if (WINDOWS)
   set_target_properties(
     media_plugin_cef
     PROPERTIES
-    LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /LTCG /NODEFAULTLIB:LIBCMT"
-    LINK_FLAGS_DEBUG "/MANIFEST:NO /SAFESEH:NO /NODEFAULTLIB:LIBCMTD"
+    LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /NODEFAULTLIB:LIBCMT /IGNORE:4099"
+    LINK_FLAGS_DEBUG "/MANIFEST:NO /SAFESEH:NO /NODEFAULTLIB:LIBCMTD /IGNORE:4099"
     )
 endif (WINDOWS)
 
@@ -113,6 +111,9 @@ if (DARWIN)
     LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"
   )
 
+  ## turns on C++11 using Cmake
+  target_compile_features(media_plugin_cef PRIVATE cxx_range_for)
+
   add_custom_command(TARGET media_plugin_cef
     POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "@executable_path/Chromium Embedded Framework"
         "@executable_path/../../../../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework"
diff --git a/indra/media_plugins/cef/mac_volume_catcher_null.cpp b/indra/media_plugins/cef/mac_volume_catcher_null.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f4fcef71aa17f0f128c76250787f0b5393695173
--- /dev/null
+++ b/indra/media_plugins/cef/mac_volume_catcher_null.cpp
@@ -0,0 +1,95 @@
+/** 
+ * @file windows_volume_catcher.cpp
+ * @brief A null implementation of volume level control of all audio channels opened by a process.
+ *        We are using this for the macOS version for now until we can understand how to make the 
+ *        exitising mac_volume_catcher.cpp work without the (now, non-existant) QuickTime dependency
+ *
+ * @cond
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ * @endcond
+ */
+
+#include "volume_catcher.h"
+#include "llsingleton.h"
+class VolumeCatcherImpl : public LLSingleton<VolumeCatcherImpl>
+{
+	LLSINGLETON(VolumeCatcherImpl);
+	// This is a singleton class -- both callers and the component implementation should use getInstance() to find the instance.
+	~VolumeCatcherImpl();
+
+public:
+
+	void setVolume(F32 volume);
+	void setPan(F32 pan);
+	
+private:
+	F32 	mVolume;
+	F32 	mPan;
+	bool mSystemIsVistaOrHigher;
+};
+
+VolumeCatcherImpl::VolumeCatcherImpl()
+:	mVolume(1.0f),			// default volume is max
+	mPan(0.f)				// default pan is centered
+{
+}
+
+VolumeCatcherImpl::~VolumeCatcherImpl()
+{
+}
+
+void VolumeCatcherImpl::setVolume(F32 volume)
+{
+	mVolume = volume;
+}
+
+void VolumeCatcherImpl::setPan(F32 pan)
+{	// remember pan for calculating individual channel levels later
+	mPan = pan;
+}
+
+/////////////////////////////////////////////////////
+
+VolumeCatcher::VolumeCatcher()
+{
+	pimpl = VolumeCatcherImpl::getInstance();
+}
+
+VolumeCatcher::~VolumeCatcher()
+{
+	// Let the instance persist until exit.
+}
+
+void VolumeCatcher::setVolume(F32 volume)
+{
+	pimpl->setVolume(volume);
+}
+
+void VolumeCatcher::setPan(F32 pan)
+{
+	pimpl->setPan(pan);
+}
+
+void VolumeCatcher::pump()
+{
+	// No periodic tasks are necessary for this implementation.
+}
diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
index 4eb29c98f9aa6ea4cd96ecd991c22c6967b91d9f..796e262d6fbf8f54917196bbb1915ef392be88d2 100644
--- a/indra/media_plugins/cef/media_plugin_cef.cpp
+++ b/indra/media_plugins/cef/media_plugin_cef.cpp
@@ -34,12 +34,12 @@
 #include "llplugininstance.h"
 #include "llpluginmessage.h"
 #include "llpluginmessageclasses.h"
+#include "volume_catcher.h"
 #include "media_plugin_base.h"
 
-#include "boost/function.hpp"
-#include "boost/bind.hpp"
-#include "llCEFLib.h"
-#include "volume_catcher.h"
+#include <functional>
+
+#include "dullahan.h"
 
 ////////////////////////////////////////////////////////////////////////////////
 //
@@ -56,7 +56,7 @@ class MediaPluginCEF :
 private:
 	bool init();
 
-	void onPageChangedCallback(unsigned char* pixels, int x, int y, int width, int height, bool is_popup);
+	void onPageChangedCallback(const unsigned char* pixels, int x, int y, const int width, const int height);
 	void onCustomSchemeURLCallback(std::string url);
 	void onConsoleMessageCallback(std::string message, std::string source, int line);
 	void onStatusMessageCallback(std::string value);
@@ -67,26 +67,25 @@ class MediaPluginCEF :
 	void onAddressChangeCallback(std::string url);
 	void onNavigateURLCallback(std::string url, std::string target);
 	bool onHTTPAuthCallback(const std::string host, const std::string realm, std::string& username, std::string& password);
-	void onCursorChangedCallback(LLCEFLib::ECursorType type, unsigned int handle);
+	void onCursorChangedCallback(dullahan::ECursorType type);
 	void onFileDownloadCallback(std::string filename);
 	const std::string onFileDialogCallback();
 
 	void postDebugMessage(const std::string& msg);
 	void authResponse(LLPluginMessage &message);
 
-	LLCEFLib::EKeyboardModifier decodeModifiers(std::string &modifiers);
-	void deserializeKeyboardData(LLSD native_key_data, uint32_t& native_scan_code, uint32_t& native_virtual_key, uint32_t& native_modifiers);
-	void keyEvent(LLCEFLib::EKeyEvent key_event, int key, LLCEFLib::EKeyboardModifier modifiers, LLSD native_key_data);
-	void unicodeInput(const std::string &utf8str, LLCEFLib::EKeyboardModifier modifiers, LLSD native_key_data);
+	void keyEvent(dullahan::EKeyEvent key_event, LLSD native_key_data);
+	void unicodeInput(LLSD native_key_data);
 
 	void checkEditState();
-    void setVolume(F32 vol);
+    void setVolume();
 
 	bool mEnableMediaPluginDebugging;
 	std::string mHostLanguage;
 	bool mCookiesEnabled;
 	bool mPluginsEnabled;
 	bool mJavascriptEnabled;
+	bool mDisableGPU;
 	std::string mUserAgentSubtring;
 	std::string mAuthUsername;
 	std::string mAuthPassword;
@@ -97,15 +96,9 @@ class MediaPluginCEF :
 	std::string mCachePath;
 	std::string mCookiePath;
 	std::string mPickedFile;
-	LLCEFLib* mLLCEFLib;
-
-    VolumeCatcher mVolumeCatcher;
-
-	U8 *mPopupBuffer;
-	U32 mPopupW;
-	U32 mPopupH;
-	U32 mPopupX;
-	U32 mPopupY;
+	VolumeCatcher mVolumeCatcher;
+	F32 mCurVolume;
+	dullahan* mCEFLib;
 };
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -122,6 +115,7 @@ MediaPluginBase(host_send_func, host_user_data)
 	mCookiesEnabled = true;
 	mPluginsEnabled = false;
 	mJavascriptEnabled = true;
+	mDisableGPU = true;
 	mUserAgentSubtring = "";
 	mAuthUsername = "";
 	mAuthPassword = "";
@@ -132,20 +126,18 @@ MediaPluginBase(host_send_func, host_user_data)
 	mCachePath = "";
 	mCookiePath = "";
 	mPickedFile = "";
-	mLLCEFLib = new LLCEFLib();
+	mCurVolume = 0.0;
 
-	mPopupBuffer = NULL;
-	mPopupW = 0;
-	mPopupH = 0;
-	mPopupX = 0;
-	mPopupY = 0;
+	mCEFLib = new dullahan();
+
+	setVolume();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 //
 MediaPluginCEF::~MediaPluginCEF()
 {
-	delete[] mPopupBuffer;
+	mCEFLib->shutdown();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -166,56 +158,13 @@ void MediaPluginCEF::postDebugMessage(const std::string& msg)
 
 ////////////////////////////////////////////////////////////////////////////////
 //
-void MediaPluginCEF::onPageChangedCallback(unsigned char* pixels, int x, int y, int width, int height, bool is_popup)
+void MediaPluginCEF::onPageChangedCallback(const unsigned char* pixels, int x, int y, const int width, const int height)
 {
-	if( is_popup )
-	{
-		delete mPopupBuffer;
-		mPopupBuffer = NULL;
-		mPopupH = 0;
-		mPopupW = 0;
-		mPopupX = 0;
-		mPopupY = 0;
-	}
-
 	if( mPixels && pixels )
 	{
-		if (is_popup)
+		if (mWidth == width && mHeight == height)
 		{
-			if( width > 0 && height> 0 )
-			{
-				mPopupBuffer = new U8[ width * height * mDepth ];
-				memcpy( mPopupBuffer, pixels, width * height * mDepth );
-				mPopupH = height;
-				mPopupW = width;
-				mPopupX = x;
-				mPopupY = mHeight - y - height;
-			}
-		}
-		else
-		{
-			if (mWidth == width && mHeight == height)
-			{
-				memcpy(mPixels, pixels, mWidth * mHeight * mDepth);
-			}
-			if( mPopupBuffer && mPopupH && mPopupW )
-			{
-				U32 bufferSize = mWidth * mHeight * mDepth;
-				U32 popupStride = mPopupW * mDepth;
-				U32 bufferStride = mWidth * mDepth;
-				int dstY = mPopupY;
-
-				int src = 0;
-				int dst = dstY  * mWidth * mDepth + mPopupX * mDepth;
-
-				for( int line = 0; dst + popupStride < bufferSize && line < mPopupH; ++line )
-				{
-					memcpy( mPixels + dst, mPopupBuffer + src, popupStride );
-					src += popupStride;
-					dst += bufferStride;
-				}
-			}
-
+			memcpy(mPixels, pixels, mWidth * mHeight * mDepth);
 		}
 		setDirty(0, 0, mWidth, mHeight);
 	}
@@ -254,8 +203,8 @@ void MediaPluginCEF::onLoadStartCallback()
 {
 	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
 	//message.setValue("uri", event.getEventUri());  // not easily available here in CEF - needed?
-	message.setValueBoolean("history_back_available", mLLCEFLib->canGoBack());
-	message.setValueBoolean("history_forward_available", mLLCEFLib->canGoForward());
+	message.setValueBoolean("history_back_available", mCEFLib->canGoBack());
+	message.setValueBoolean("history_forward_available", mCEFLib->canGoForward());
 	sendMessage(message);
 }
 
@@ -263,10 +212,10 @@ void MediaPluginCEF::onLoadStartCallback()
 //
 void MediaPluginCEF::onRequestExitCallback()
 {
-	mLLCEFLib->shutdown();
-
 	LLPluginMessage message("base", "goodbye");
 	sendMessage(message);
+
+	mDeleteMe = true;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -276,8 +225,8 @@ void MediaPluginCEF::onLoadEndCallback(int httpStatusCode)
 	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
 	//message.setValue("uri", event.getEventUri());  // not easily available here in CEF - needed?
 	message.setValueS32("result_code", httpStatusCode);
-	message.setValueBoolean("history_back_available", mLLCEFLib->canGoBack());
-	message.setValueBoolean("history_forward_available", mLLCEFLib->canGoForward());
+	message.setValueBoolean("history_back_available", mCEFLib->canGoBack());
+	message.setValueBoolean("history_forward_available", mCEFLib->canGoForward());
 	sendMessage(message);
 }
 
@@ -360,25 +309,25 @@ const std::string MediaPluginCEF::onFileDialogCallback()
 	return mPickedFile;
 }
 
-void MediaPluginCEF::onCursorChangedCallback(LLCEFLib::ECursorType type, unsigned int handle)
+void MediaPluginCEF::onCursorChangedCallback(dullahan::ECursorType type)
 {
 	std::string name = "";
 
 	switch (type)
 	{
-		case LLCEFLib::CT_POINTER:
+		case dullahan::CT_POINTER:
 			name = "arrow";
 			break;
-		case LLCEFLib::CT_IBEAM:
+		case dullahan::CT_IBEAM:
 			name = "ibeam";
 			break;
-		case LLCEFLib::CT_NORTHSOUTHRESIZE:
+		case dullahan::CT_NORTHSOUTHRESIZE:
 			name = "splitv";
 			break;
-		case LLCEFLib::CT_EASTWESTRESIZE:
+		case dullahan::CT_EASTWESTRESIZE:
 			name = "splith";
 			break;
-		case LLCEFLib::CT_HAND:
+		case dullahan::CT_HAND:
 			name = "hand";
 			break;
 
@@ -430,9 +379,8 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 			}
 			else if (message_name == "idle")
 			{
-				mLLCEFLib->update();
+				mCEFLib->update();
 
-                mVolumeCatcher.pump();
 				// this seems bad but unless the state changes (it won't until we figure out
 				// how to get CEF to tell us if copy/cut/paste is available) then this function
 				// will return immediately
@@ -440,7 +388,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 			}
 			else if (message_name == "cleanup")
 			{
-				mLLCEFLib->requestExit();
+				mCEFLib->requestExit();
 			}
 			else if (message_name == "shm_added")
 			{
@@ -482,42 +430,56 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 		{
 			if (message_name == "init")
 			{
-				// event callbacks from LLCefLib
-				mLLCEFLib->setOnPageChangedCallback(boost::bind(&MediaPluginCEF::onPageChangedCallback, this, _1, _2, _3, _4, _5, _6));
-				mLLCEFLib->setOnCustomSchemeURLCallback(boost::bind(&MediaPluginCEF::onCustomSchemeURLCallback, this, _1));
-				mLLCEFLib->setOnConsoleMessageCallback(boost::bind(&MediaPluginCEF::onConsoleMessageCallback, this, _1, _2, _3));
-				mLLCEFLib->setOnStatusMessageCallback(boost::bind(&MediaPluginCEF::onStatusMessageCallback, this, _1));
-				mLLCEFLib->setOnTitleChangeCallback(boost::bind(&MediaPluginCEF::onTitleChangeCallback, this, _1));
-				mLLCEFLib->setOnLoadStartCallback(boost::bind(&MediaPluginCEF::onLoadStartCallback, this));
-				mLLCEFLib->setOnLoadEndCallback(boost::bind(&MediaPluginCEF::onLoadEndCallback, this, _1));
-				mLLCEFLib->setOnAddressChangeCallback(boost::bind(&MediaPluginCEF::onAddressChangeCallback, this, _1));
-				mLLCEFLib->setOnNavigateURLCallback(boost::bind(&MediaPluginCEF::onNavigateURLCallback, this, _1, _2));
-				mLLCEFLib->setOnHTTPAuthCallback(boost::bind(&MediaPluginCEF::onHTTPAuthCallback, this, _1, _2, _3, _4));
-				mLLCEFLib->setOnFileDownloadCallback(boost::bind(&MediaPluginCEF::onFileDownloadCallback, this, _1));
-				mLLCEFLib->setOnFileDialogCallback(boost::bind(&MediaPluginCEF::onFileDialogCallback, this));
-				mLLCEFLib->setOnCursorChangedCallback(boost::bind(&MediaPluginCEF::onCursorChangedCallback, this, _1, _2));
-				mLLCEFLib->setOnRequestExitCallback(boost::bind(&MediaPluginCEF::onRequestExitCallback, this));
-
-				LLCEFLib::LLCEFLibSettings settings;
-				settings.initial_width = 1024;
-				settings.initial_height = 1024;
-				settings.page_zoom_factor = message_in.getValueReal("factor");
-				settings.plugins_enabled = mPluginsEnabled;
-				settings.media_stream_enabled = false; // MAINT-6060 - WebRTC media removed until we can add granualrity/query UI
-				settings.javascript_enabled = mJavascriptEnabled;
-				settings.cookies_enabled = mCookiesEnabled;
-				settings.cookie_store_path = mCookiePath;
+				// event callbacks from Dullahan
+				mCEFLib->setOnPageChangedCallback(std::bind(&MediaPluginCEF::onPageChangedCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5));
+				mCEFLib->setOnCustomSchemeURLCallback(std::bind(&MediaPluginCEF::onCustomSchemeURLCallback, this, std::placeholders::_1));
+				mCEFLib->setOnConsoleMessageCallback(std::bind(&MediaPluginCEF::onConsoleMessageCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
+				mCEFLib->setOnStatusMessageCallback(std::bind(&MediaPluginCEF::onStatusMessageCallback, this, std::placeholders::_1));
+				mCEFLib->setOnTitleChangeCallback(std::bind(&MediaPluginCEF::onTitleChangeCallback, this, std::placeholders::_1));
+				mCEFLib->setOnLoadStartCallback(std::bind(&MediaPluginCEF::onLoadStartCallback, this));
+				mCEFLib->setOnLoadEndCallback(std::bind(&MediaPluginCEF::onLoadEndCallback, this, std::placeholders::_1));
+				mCEFLib->setOnAddressChangeCallback(std::bind(&MediaPluginCEF::onAddressChangeCallback, this, std::placeholders::_1));
+				mCEFLib->setOnNavigateURLCallback(std::bind(&MediaPluginCEF::onNavigateURLCallback, this, std::placeholders::_1, std::placeholders::_2));
+				mCEFLib->setOnHTTPAuthCallback(std::bind(&MediaPluginCEF::onHTTPAuthCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4));
+				mCEFLib->setOnFileDownloadCallback(std::bind(&MediaPluginCEF::onFileDownloadCallback, this, std::placeholders::_1));
+				mCEFLib->setOnFileDialogCallback(std::bind(&MediaPluginCEF::onFileDialogCallback, this));
+				mCEFLib->setOnCursorChangedCallback(std::bind(&MediaPluginCEF::onCursorChangedCallback, this, std::placeholders::_1));
+				mCEFLib->setOnRequestExitCallback(std::bind(&MediaPluginCEF::onRequestExitCallback, this));
+
+				dullahan::dullahan_settings settings;
+				settings.accept_language_list = mHostLanguage;
+				settings.background_color = 0xffffff;
 				settings.cache_enabled = true;
 				settings.cache_path = mCachePath;
-				settings.accept_language_list = mHostLanguage;
-				settings.user_agent_substring = mLLCEFLib->makeCompatibleUserAgentString(mUserAgentSubtring);
+				settings.cookie_store_path = mCookiePath;
+				settings.cookies_enabled = mCookiesEnabled;
+				settings.disable_gpu = mDisableGPU;
+				settings.flash_enabled = mPluginsEnabled;
+				settings.flip_mouse_y = false;
+				settings.flip_pixels_y = true;
+				settings.frame_rate = 60;
+				settings.force_wave_audio = true;
+				settings.initial_height = 1024;
+				settings.initial_width = 1024;
+				settings.java_enabled = false;
+				settings.javascript_enabled = mJavascriptEnabled;
+				settings.media_stream_enabled = false; // MAINT-6060 - WebRTC media removed until we can add granualrity/query UI
+				settings.plugins_enabled = mPluginsEnabled;
+				settings.user_agent_substring = mCEFLib->makeCompatibleUserAgentString(mUserAgentSubtring);
+				settings.webgl_enabled = true;
+
+				std::vector<std::string> custom_schemes(1, "secondlife");
+				mCEFLib->setCustomSchemes(custom_schemes);
 
-				bool result = mLLCEFLib->init(settings);
+				bool result = mCEFLib->init(settings);
 				if (!result)
 				{
 					// if this fails, the media system in viewer will put up a message
 				}
 
+				// now we can set page zoom factor
+				mCEFLib->setPageZoom(message_in.getValueReal("factor"));
+
 				// Plugin gets to decide the texture parameters to use.
 				mDepth = 4;
 				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
@@ -560,7 +522,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 					};
 				};
 
-				mLLCEFLib->setSize(mWidth, mHeight);
+				mCEFLib->setSize(mWidth, mHeight);
 
 				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");
 				message.setValue("name", name);
@@ -578,7 +540,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 			else if (message_name == "load_uri")
 			{
 				std::string uri = message_in.getValue("uri");
-				mLLCEFLib->navigate(uri);
+				mCEFLib->navigate(uri);
 			}
 			else if (message_name == "set_cookie")
 			{
@@ -589,7 +551,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 				std::string path = message_in.getValue("path");
 				bool httponly = message_in.getValueBoolean("httponly");
 				bool secure = message_in.getValueBoolean("secure");
-				mLLCEFLib->setCookie(uri, name, value, domain, path, httponly, secure);
+				mCEFLib->setCookie(uri, name, value, domain, path, httponly, secure);
 			}
 			else if (message_name == "mouse_event")
 			{
@@ -598,18 +560,16 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 				S32 x = message_in.getValueS32("x");
 				S32 y = message_in.getValueS32("y");
 
-				y = mHeight - y;
-
-				// only even send left mouse button events to LLCEFLib
+				// only even send left mouse button events to the CEF library
 				// (partially prompted by crash in OS X CEF when sending right button events)
 				// we catch the right click in viewer and display our own context menu anyway
 				S32 button = message_in.getValueS32("button");
-				LLCEFLib::EMouseButton btn = LLCEFLib::MB_MOUSE_BUTTON_LEFT;
+				dullahan::EMouseButton btn = dullahan::MB_MOUSE_BUTTON_LEFT;
 
 				if (event == "down" && button == 0)
 				{
-					mLLCEFLib->mouseButton(btn, LLCEFLib::ME_MOUSE_DOWN, x, y);
-					mLLCEFLib->setFocus(true);
+					mCEFLib->mouseButton(btn, dullahan::ME_MOUSE_DOWN, x, y);
+					mCEFLib->setFocus();
 
 					std::stringstream str;
 					str << "Mouse down at = " << x << ", " << y;
@@ -617,7 +577,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 				}
 				else if (event == "up" && button == 0)
 				{
-					mLLCEFLib->mouseButton(btn, LLCEFLib::ME_MOUSE_UP, x, y);
+					mCEFLib->mouseButton(btn, dullahan::ME_MOUSE_UP, x, y);
 
 					std::stringstream str;
 					str << "Mouse up at = " << x << ", " << y;
@@ -625,11 +585,11 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 				}
 				else if (event == "double_click")
 				{
-					mLLCEFLib->mouseButton(btn, LLCEFLib::ME_MOUSE_DOUBLE_CLICK, x, y);
+					mCEFLib->mouseButton(btn, dullahan::ME_MOUSE_DOUBLE_CLICK, x, y);
 				}
 				else
 				{
-					mLLCEFLib->mouseMove(x, y);
+					mCEFLib->mouseMove(x, y);
 				}
 			}
 			else if (message_name == "scroll_event")
@@ -639,68 +599,47 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 				const int scaling_factor = 40;
 				y *= -scaling_factor;
 
-				mLLCEFLib->mouseWheel(x, y);
+				mCEFLib->mouseWheel(x, y);
 			}
 			else if (message_name == "text_event")
 			{
-				std::string text = message_in.getValue("text");
-				std::string modifiers = message_in.getValue("modifiers");
 				LLSD native_key_data = message_in.getValueLLSD("native_key_data");
-
-				unicodeInput(text, decodeModifiers(modifiers), native_key_data);
+				unicodeInput(native_key_data);
 			}
 			else if (message_name == "key_event")
 			{
 #if LL_DARWIN
 				std::string event = message_in.getValue("event");
-				S32 key = message_in.getValueS32("key");
                 LLSD native_key_data = message_in.getValueLLSD("native_key_data");
 
-#if 0
-				if (event == "down")
-				{
-					//mLLCEFLib->keyPress(key, true);
-					mLLCEFLib->keyboardEvent(LLCEFLib::KE_KEY_DOWN, (uint32_t)key, 0, LLCEFLib::KM_MODIFIER_NONE, 0, 0, 0);
-
-				}
-				else if (event == "up")
-				{
-					//mLLCEFLib->keyPress(key, false);
-					mLLCEFLib->keyboardEvent(LLCEFLib::KE_KEY_UP, (uint32_t)key, 0, LLCEFLib::KM_MODIFIER_NONE, 0, 0, 0);
-				}
-#else
-                // Treat unknown events as key-up for safety.
-                LLCEFLib::EKeyEvent key_event = LLCEFLib::KE_KEY_UP;
+                dullahan::EKeyEvent key_event = dullahan::KE_KEY_UP;
                 if (event == "down")
                 {
-                    key_event = LLCEFLib::KE_KEY_DOWN;
+                    key_event = dullahan::KE_KEY_DOWN;
                 }
                 else if (event == "repeat")
                 {
-                    key_event = LLCEFLib::KE_KEY_REPEAT;
+                    key_event = dullahan::KE_KEY_REPEAT;
                 }
 
-                keyEvent(key_event, key, LLCEFLib::KM_MODIFIER_NONE, native_key_data);
+                keyEvent(key_event, native_key_data);
 
-#endif
 #elif LL_WINDOWS
 				std::string event = message_in.getValue("event");
-				S32 key = message_in.getValueS32("key");
-				std::string modifiers = message_in.getValue("modifiers");
 				LLSD native_key_data = message_in.getValueLLSD("native_key_data");
 
 				// Treat unknown events as key-up for safety.
-				LLCEFLib::EKeyEvent key_event = LLCEFLib::KE_KEY_UP;
+				dullahan::EKeyEvent key_event = dullahan::KE_KEY_UP;
 				if (event == "down")
 				{
-					key_event = LLCEFLib::KE_KEY_DOWN;
+					key_event = dullahan::KE_KEY_DOWN;
 				}
 				else if (event == "repeat")
 				{
-					key_event = LLCEFLib::KE_KEY_REPEAT;
+					key_event = dullahan::KE_KEY_REPEAT;
 				}
 
-				keyEvent(key_event, key, decodeModifiers(modifiers), native_key_data);
+				keyEvent(key_event, native_key_data);
 #endif
 			}
 			else if (message_name == "enable_media_plugin_debugging")
@@ -717,15 +656,15 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 			}
 			if (message_name == "edit_cut")
 			{
-				mLLCEFLib->editCut();
+				mCEFLib->editCut();
 			}
 			if (message_name == "edit_copy")
 			{
-				mLLCEFLib->editCopy();
+				mCEFLib->editCopy();
 			}
 			if (message_name == "edit_paste")
 			{
-				mLLCEFLib->editPaste();
+				mCEFLib->editPaste();
 			}
 		}
 		else if (message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER)
@@ -733,24 +672,24 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 			if (message_name == "set_page_zoom_factor")
 			{
 				F32 factor = (F32)message_in.getValueReal("factor");
-				mLLCEFLib->setPageZoom(factor);
+				mCEFLib->setPageZoom(factor);
 			}
 			if (message_name == "browse_stop")
 			{
-				mLLCEFLib->stop();
+				mCEFLib->stop();
 			}
 			else if (message_name == "browse_reload")
 			{
 				bool ignore_cache = true;
-				mLLCEFLib->reload(ignore_cache);
+				mCEFLib->reload(ignore_cache);
 			}
 			else if (message_name == "browse_forward")
 			{
-				mLLCEFLib->goForward();
+				mCEFLib->goForward();
 			}
 			else if (message_name == "browse_back")
 			{
-				mLLCEFLib->goBack();
+				mCEFLib->goBack();
 			}
 			else if (message_name == "cookies_enabled")
 			{
@@ -762,7 +701,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 			}
 			else if (message_name == "show_web_inspector")
 			{
-				mLLCEFLib->showDevTools(true);
+				mCEFLib->showDevTools();
 			}
 			else if (message_name == "plugins_enabled")
 			{
@@ -772,13 +711,18 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 			{
 				mJavascriptEnabled = message_in.getValueBoolean("enable");
 			}
+			else if (message_name == "gpu_disabled")
+			{
+				mDisableGPU = message_in.getValueBoolean("disable");
+			}
 		}
         else if (message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
         {
             if (message_name == "set_volume")
             {
-                F32 volume = (F32)message_in.getValueReal("volume");
-                setVolume(volume);
+				F32 volume = (F32)message_in.getValueReal("volume");
+				mCurVolume = volume;
+                setVolume();
             }
         }
         else
@@ -787,100 +731,39 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 	}
 }
 
-LLCEFLib::EKeyboardModifier MediaPluginCEF::decodeModifiers(std::string &modifiers)
-{
-	int result = 0;
-
-	if (modifiers.find("shift") != std::string::npos)
-		result |= LLCEFLib::KM_MODIFIER_SHIFT;
-
-	if (modifiers.find("alt") != std::string::npos)
-		result |= LLCEFLib::KM_MODIFIER_ALT;
-
-	if (modifiers.find("control") != std::string::npos)
-		result |= LLCEFLib::KM_MODIFIER_CONTROL;
-
-	if (modifiers.find("meta") != std::string::npos)
-		result |= LLCEFLib::KM_MODIFIER_META;
-
-	return (LLCEFLib::EKeyboardModifier)result;
-}
-
 ////////////////////////////////////////////////////////////////////////////////
 //
-void MediaPluginCEF::deserializeKeyboardData(LLSD native_key_data, uint32_t& native_scan_code, uint32_t& native_virtual_key, uint32_t& native_modifiers)
+void MediaPluginCEF::keyEvent(dullahan::EKeyEvent key_event, LLSD native_key_data = LLSD::emptyMap())
 {
-	native_scan_code = 0;
-	native_virtual_key = 0;
-	native_modifiers = 0;
-
-	if (native_key_data.isMap())
-	{
 #if LL_DARWIN
-		native_scan_code = (uint32_t)(native_key_data["char_code"].asInteger());
-		native_virtual_key = (uint32_t)(native_key_data["key_code"].asInteger());
-		native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger());
-#elif LL_WINDOWS
-		native_scan_code = (uint32_t)(native_key_data["scan_code"].asInteger());
-		native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger());
-		// TODO: I don't think we need to do anything with native modifiers here -- please verify
-#endif
-	};
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void MediaPluginCEF::keyEvent(LLCEFLib::EKeyEvent key_event, int key, LLCEFLib::EKeyboardModifier modifiers_x, LLSD native_key_data = LLSD::emptyMap())
-{
-#if LL_DARWIN
-
-    if (!native_key_data.has("event_type") ||
-            !native_key_data.has("event_modifiers") ||
-            !native_key_data.has("event_keycode") ||
-            !native_key_data.has("event_isrepeat"))
-        return;
-
-    uint32_t eventType = native_key_data["event_type"].asInteger();
-    if (!eventType)
-        return;
-    uint32_t eventModifiers = native_key_data["event_modifiers"].asInteger();
-    uint32_t eventKeycode = native_key_data["event_keycode"].asInteger();
-    char eventChars = static_cast<char>(native_key_data["event_chars"].isUndefined() ? 0 : native_key_data["event_chars"].asInteger());
-    char eventUChars = static_cast<char>(native_key_data["event_umodchars"].isUndefined() ? 0 : native_key_data["event_umodchars"].asInteger());
-    bool eventIsRepeat = native_key_data["event_isrepeat"].asBoolean();
-
-    mLLCEFLib->keyboardEventOSX(eventType, eventModifiers, (eventChars) ? &eventChars : NULL,
-                                (eventUChars) ? &eventUChars : NULL, eventIsRepeat, eventKeycode);
-
+	U32 event_modifiers = native_key_data["event_modifiers"].asInteger();
+	U32 event_keycode = native_key_data["event_keycode"].asInteger();
+	U32 event_chars = native_key_data["event_chars"].asInteger();
+	U32 event_umodchars = native_key_data["event_umodchars"].asInteger();
+	bool event_isrepeat = native_key_data["event_isrepeat"].asBoolean();
+
+	mCEFLib->nativeKeyboardEventOSX(key_event, event_modifiers, 
+									event_keycode, event_chars, 
+									event_umodchars, event_isrepeat);
 #elif LL_WINDOWS
 	U32 msg = ll_U32_from_sd(native_key_data["msg"]);
 	U32 wparam = ll_U32_from_sd(native_key_data["w_param"]);
 	U64 lparam = ll_U32_from_sd(native_key_data["l_param"]);
 
-	mLLCEFLib->nativeKeyboardEvent(msg, wparam, lparam);
+	mCEFLib->nativeKeyboardEventWin(msg, wparam, lparam);
 #endif
 };
 
-void MediaPluginCEF::unicodeInput(const std::string &utf8str, LLCEFLib::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap())
+void MediaPluginCEF::unicodeInput(LLSD native_key_data = LLSD::emptyMap())
 {
 #if LL_DARWIN
-	//mLLCEFLib->keyPress(utf8str[0], true);
-	//mLLCEFLib->keyboardEvent(LLCEFLib::KE_KEY_DOWN, (uint32_t)(utf8str[0]), 0, LLCEFLib::KM_MODIFIER_NONE, 0, 0, 0);
-    if (!native_key_data.has("event_chars") || !native_key_data.has("event_umodchars") ||
-            !native_key_data.has("event_keycode") || !native_key_data.has("event_modifiers"))
-        return;
-    uint32_t unicodeChar = native_key_data["event_chars"].asInteger();
-    uint32_t unmodifiedChar = native_key_data["event_umodchars"].asInteger();
-    uint32_t keyCode = native_key_data["event_keycode"].asInteger();
-    uint32_t rawmodifiers = native_key_data["event_modifiers"].asInteger();
-
-    mLLCEFLib->injectUnicodeText(unicodeChar, unmodifiedChar, keyCode, rawmodifiers);
-
+	// code to send keys here doesn't seem to be required for Darwin - in fact,
+	// not having reliable key event type info here means we don't know what to send anyway
 #elif LL_WINDOWS
 	U32 msg = ll_U32_from_sd(native_key_data["msg"]);
 	U32 wparam = ll_U32_from_sd(native_key_data["w_param"]);
 	U64 lparam = ll_U32_from_sd(native_key_data["l_param"]);
-	mLLCEFLib->nativeKeyboardEvent(msg, wparam, lparam);
+	mCEFLib->nativeKeyboardEventWin(msg, wparam, lparam);
 #endif
 };
 
@@ -888,9 +771,9 @@ void MediaPluginCEF::unicodeInput(const std::string &utf8str, LLCEFLib::EKeyboar
 //
 void MediaPluginCEF::checkEditState()
 {
-	bool can_cut = mLLCEFLib->editCanCut();
-	bool can_copy = mLLCEFLib->editCanCopy();
-	bool can_paste = mLLCEFLib->editCanPaste();
+	bool can_cut = mCEFLib->editCanCut();
+	bool can_copy = mCEFLib->editCanCopy();
+	bool can_paste = mCEFLib->editCanPaste();
 
 	if ((can_cut != mCanCut) || (can_copy != mCanCopy) || (can_paste != mCanPaste))
 	{
@@ -918,9 +801,9 @@ void MediaPluginCEF::checkEditState()
 	}
 }
 
-void MediaPluginCEF::setVolume(F32 vol)
+void MediaPluginCEF::setVolume()
 {
-    mVolumeCatcher.setVolume(vol);
+	mVolumeCatcher.setVolume(mCurVolume);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/media_plugins/cef/windows_volume_catcher.cpp b/indra/media_plugins/cef/windows_volume_catcher.cpp
index c9ea3ed5979af835b4a556e4a7ecac5fbd677d29..6953ad3ab8a03aaf34ad6a876513cc83a10759ff 100644
--- a/indra/media_plugins/cef/windows_volume_catcher.cpp
+++ b/indra/media_plugins/cef/windows_volume_catcher.cpp
@@ -41,44 +41,15 @@ class VolumeCatcherImpl : public LLSingleton<VolumeCatcherImpl>
 	void setPan(F32 pan);
 	
 private:
-	typedef void (WINAPI *set_volume_func_t)(F32);
-	typedef void (WINAPI *set_mute_func_t)(bool);
-
-	set_volume_func_t mSetVolumeFunc;
-	set_mute_func_t mSetMuteFunc;
-
-	// tests if running on Vista, 7, 8 + once in CTOR
-	bool isWindowsVistaOrHigher();
-
 	F32 	mVolume;
 	F32 	mPan;
 	bool mSystemIsVistaOrHigher;
 };
 
-bool VolumeCatcherImpl::isWindowsVistaOrHigher()
-{
-	OSVERSIONINFO osvi;
-	ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
-	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-	GetVersionEx(&osvi);
-	return osvi.dwMajorVersion >= 6;
-}
-
 VolumeCatcherImpl::VolumeCatcherImpl()
 :	mVolume(1.0f),			// default volume is max
 	mPan(0.f)				// default pan is centered
 {
-	mSystemIsVistaOrHigher = isWindowsVistaOrHigher();
-
-	if ( ! mSystemIsVistaOrHigher )
-	{
-		HMODULE handle = ::LoadLibrary(L"winmm.dll");
-		if(handle)
-		{
-			mSetVolumeFunc = (set_volume_func_t)::GetProcAddress(handle, "setPluginVolume");
-			mSetMuteFunc = (set_mute_func_t)::GetProcAddress(handle, "setPluginMute");
-		}
-	}
 }
 
 VolumeCatcherImpl::~VolumeCatcherImpl()
@@ -89,26 +60,12 @@ void VolumeCatcherImpl::setVolume(F32 volume)
 {
 	mVolume = volume;
 
-	if ( mSystemIsVistaOrHigher )
-	{
-		// set both left/right to same volume
-		// TODO: use pan value to set independently
-		DWORD left_channel  = (DWORD)(mVolume * 65535.0f);
-		DWORD right_channel =  (DWORD)(mVolume * 65535.0f);
-		DWORD hw_volume = left_channel << 16 | right_channel;
-		::waveOutSetVolume(NULL, hw_volume);
-	}
-	else
-	{
-		if (mSetMuteFunc)
-		{
-			mSetMuteFunc(volume == 0.f);
-		}
-		if (mSetVolumeFunc)
-		{
-			mSetVolumeFunc(mVolume);
-		}
-	}
+	// set both left/right to same volume
+	// TODO: use pan value to set independently
+	DWORD left_channel = (DWORD)(mVolume * 65535.0f);
+	DWORD right_channel = (DWORD)(mVolume * 65535.0f);
+	DWORD hw_volume = left_channel << 16 | right_channel;
+	::waveOutSetVolume(NULL, hw_volume);
 }
 
 void VolumeCatcherImpl::setPan(F32 pan)
diff --git a/indra/media_plugins/example/CMakeLists.txt b/indra/media_plugins/example/CMakeLists.txt
index 171645ef0467e068197fd9df71dde2745235971e..6f5b28b8e91bcf4a355aad26363461ba08953750 100644
--- a/indra/media_plugins/example/CMakeLists.txt
+++ b/indra/media_plugins/example/CMakeLists.txt
@@ -32,13 +32,13 @@ include_directories(SYSTEM
 
 ### media_plugin_example
 
-if(NOT WORD_SIZE EQUAL 32)
+if(NOT ADDRESS_SIZE EQUAL 32)
   if(WINDOWS)
-    add_definitions(/FIXED:NO)
+    ##add_definitions(/FIXED:NO)
   else(WINDOWS) # not windows therefore gcc LINUX and DARWIN
     add_definitions(-fPIC)
   endif(WINDOWS)
-endif(NOT WORD_SIZE EQUAL 32)
+endif(NOT ADDRESS_SIZE EQUAL 32)
 
 set(media_plugin_example_SOURCE_FILES
     media_plugin_example.cpp
@@ -60,14 +60,16 @@ target_link_libraries(media_plugin_example
 add_dependencies(media_plugin_example
   ${LLPLUGIN_LIBRARIES}
   ${MEDIA_PLUGIN_BASE_LIBRARIES}
-  ${LLCOMMON_LIBRARIES}
+  # Using ${LLCOMMON_LIBRARIES} here drags in a whole bunch of Boost stuff
+  # that only produces CMake warnings about nonexistent dependencies.
+  llcommon
 )
 
 if (WINDOWS)
   set_target_properties(
     media_plugin_example
     PROPERTIES
-    LINK_FLAGS "/MANIFEST:NO"
+    LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /LTCG /NODEFAULTLIB:LIBCMT"
     )
 endif (WINDOWS)
 
diff --git a/indra/media_plugins/example/media_plugin_example.cpp b/indra/media_plugins/example/media_plugin_example.cpp
index 66c00cd58cd0e534eae65819b4cb4149e21de475..c296a0413de5daaea3c4e3a4b0629a131a838270 100644
--- a/indra/media_plugins/example/media_plugin_example.cpp
+++ b/indra/media_plugins/example/media_plugin_example.cpp
@@ -1,30 +1,30 @@
 /**
- * @file media_plugin_example.cpp
- * @brief Example plugin for LLMedia API plugin system
- *
- * @cond
- * $LicenseInfo:firstyear=2008&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- * @endcond
- */
+* @file media_plugin_example.cpp
+* @brief Example plugin for LLMedia API plugin system
+*
+* @cond
+* $LicenseInfo:firstyear=2008&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2010, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+* @endcond
+*/
 
 #include "linden_common.h"
 
@@ -38,375 +38,354 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 //
-class MediaPluginExample :
-        public MediaPluginBase
+class mediaPluginExample :
+	public MediaPluginBase
 {
-    public:
-        MediaPluginExample( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data );
-        ~MediaPluginExample();
-
-        /*virtual*/ void receiveMessage( const char* message_string );
-
-    private:
-        bool init();
-        void update( F64 milliseconds );
-        void write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b );
-        bool mFirstTime;
-
-        time_t mLastUpdateTime;
-        enum Constants { ENumObjects = 10 };
-        unsigned char* mBackgroundPixels;
-        int mColorR[ ENumObjects ];
-        int mColorG[ ENumObjects ];
-        int mColorB[ ENumObjects ];
-        int mXpos[ ENumObjects ];
-        int mYpos[ ENumObjects ];
-        int mXInc[ ENumObjects ];
-        int mYInc[ ENumObjects ];
-        int mBlockSize[ ENumObjects ];
-        bool mMouseButtonDown;
-        bool mStopAction;
+public:
+	mediaPluginExample(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
+	~mediaPluginExample();
+
+	/*virtual*/ void receiveMessage(const char* message_string);
+
+private:
+	bool init();
+	void update(F64 milliseconds);
+	bool mFirstTime;
+
+	time_t mLastUpdateTime;
+	enum Constants { ENumObjects = 64 };
+	unsigned char* mBackgroundPixels;
+	int mColorR[ENumObjects];
+	int mColorG[ENumObjects];
+	int mColorB[ENumObjects];
+	int mXpos[ENumObjects];
+	int mYpos[ENumObjects];
+	int mXInc[ENumObjects];
+	int mYInc[ENumObjects];
+	int mBlockSize[ENumObjects];
 };
 
 ////////////////////////////////////////////////////////////////////////////////
 //
-MediaPluginExample::MediaPluginExample( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data ) :
-    MediaPluginBase( host_send_func, host_user_data )
+mediaPluginExample::mediaPluginExample(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data) :
+MediaPluginBase(host_send_func, host_user_data)
 {
-    mFirstTime = true;
-    mWidth = 0;
-    mHeight = 0;
-    mDepth = 4;
-    mPixels = 0;
-    mMouseButtonDown = false;
-    mStopAction = false;
-    mLastUpdateTime = 0;
+	mFirstTime = true;
+	mTextureWidth = 0;
+	mTextureHeight = 0;
+	mWidth = 0;
+	mHeight = 0;
+	mDepth = 4;
+	mPixels = 0;
+	mLastUpdateTime = 0;
+	mBackgroundPixels = 0;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 //
-MediaPluginExample::~MediaPluginExample()
+mediaPluginExample::~mediaPluginExample()
 {
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 //
-void MediaPluginExample::receiveMessage( const char* message_string )
+void mediaPluginExample::receiveMessage(const char* message_string)
 {
-//  std::cerr << "MediaPluginWebKit::receiveMessage: received message: \"" << message_string << "\"" << std::endl;
-    LLPluginMessage message_in;
-
-    if(message_in.parse(message_string) >= 0)
-    {
-        std::string message_class = message_in.getClass();
-        std::string message_name = message_in.getName();
-        if(message_class == LLPLUGIN_MESSAGE_CLASS_BASE)
-        {
-            if(message_name == "init")
-            {
-                LLPluginMessage message("base", "init_response");
-                LLSD versions = LLSD::emptyMap();
-                versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
-                versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
-                versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER] = LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER_VERSION;
-                message.setValueLLSD("versions", versions);
-
-                std::string plugin_version = "Example plugin 1.0..0";
-                message.setValue("plugin_version", plugin_version);
-                sendMessage(message);
-            }
-            else if(message_name == "idle")
-            {
-                // no response is necessary here.
-                F64 time = message_in.getValueReal("time");
-
-                // Convert time to milliseconds for update()
-                update((int)(time * 1000.0f));
-            }
-            else if(message_name == "cleanup")
-            {
-            }
-            else if(message_name == "shm_added")
-            {
-                SharedSegmentInfo info;
-                info.mAddress = message_in.getValuePointer("address");
-                info.mSize = (size_t)message_in.getValueS32("size");
-                std::string name = message_in.getValue("name");
-
-                mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
-
-            }
-            else if(message_name == "shm_remove")
-            {
-                std::string name = message_in.getValue("name");
-
-                SharedSegmentMap::iterator iter = mSharedSegments.find(name);
-                if(iter != mSharedSegments.end())
-                {
-                    if(mPixels == iter->second.mAddress)
-                    {
-                        // This is the currently active pixel buffer.  Make sure we stop drawing to it.
-                        mPixels = NULL;
-                        mTextureSegmentName.clear();
-                    }
-                    mSharedSegments.erase(iter);
-                }
-                else
-                {
-//                  std::cerr << "MediaPluginWebKit::receiveMessage: unknown shared memory region!" << std::endl;
-                }
-
-                // Send the response so it can be cleaned up.
-                LLPluginMessage message("base", "shm_remove_response");
-                message.setValue("name", name);
-                sendMessage(message);
-            }
-            else
-            {
-//              std::cerr << "MediaPluginWebKit::receiveMessage: unknown base message: " << message_name << std::endl;
-            }
-        }
-        else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
-        {
-            if(message_name == "init")
-            {
-                // Plugin gets to decide the texture parameters to use.
-                mDepth = 4;
-                LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
-                message.setValueS32("default_width", 1024);
-                message.setValueS32("default_height", 1024);
-                message.setValueS32("depth", mDepth);
-                message.setValueU32("internalformat", GL_RGBA);
-                message.setValueU32("format", GL_RGBA);
-                message.setValueU32("type", GL_UNSIGNED_BYTE);
-                message.setValueBoolean("coords_opengl", true);
-                sendMessage(message);
-            }
-            else if(message_name == "size_change")
-            {
-                std::string name = message_in.getValue("name");
-                S32 width = message_in.getValueS32("width");
-                S32 height = message_in.getValueS32("height");
-                S32 texture_width = message_in.getValueS32("texture_width");
-                S32 texture_height = message_in.getValueS32("texture_height");
-
-                if(!name.empty())
-                {
-                    // Find the shared memory region with this name
-                    SharedSegmentMap::iterator iter = mSharedSegments.find(name);
-                    if(iter != mSharedSegments.end())
-                    {
-                        mPixels = (unsigned char*)iter->second.mAddress;
-                        mWidth = width;
-                        mHeight = height;
-
-                        mTextureWidth = texture_width;
-                        mTextureHeight = texture_height;
-                    };
-                };
-
-                LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");
-                message.setValue("name", name);
-                message.setValueS32("width", width);
-                message.setValueS32("height", height);
-                message.setValueS32("texture_width", texture_width);
-                message.setValueS32("texture_height", texture_height);
-                sendMessage(message);
-
-            }
-            else if(message_name == "load_uri")
-            {
-            }
-            else if(message_name == "mouse_event")
-            {
-                std::string event = message_in.getValue("event");
-                if(event == "down")
-                {
-
-                }
-                else if(event == "up")
-                {
-                }
-                else if(event == "double_click")
-                {
-                }
-            }
-        }
-        else
-        {
-//          std::cerr << "MediaPluginWebKit::receiveMessage: unknown message class: " << message_class << std::endl;
-        };
-    }
+	//  std::cerr << "MediaPluginWebKit::receiveMessage: received message: \"" << message_string << "\"" << std::endl;
+	LLPluginMessage message_in;
+
+	if (message_in.parse(message_string) >= 0)
+	{
+		std::string message_class = message_in.getClass();
+		std::string message_name = message_in.getName();
+		if (message_class == LLPLUGIN_MESSAGE_CLASS_BASE)
+		{
+			if (message_name == "init")
+			{
+				LLPluginMessage message("base", "init_response");
+				LLSD versions = LLSD::emptyMap();
+				versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
+				versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
+				versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER] = LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER_VERSION;
+				message.setValueLLSD("versions", versions);
+
+				std::string plugin_version = "Example plugin 0.0.0";
+				message.setValue("plugin_version", plugin_version);
+				sendMessage(message);
+			}
+			else if (message_name == "idle")
+			{
+				// no response is necessary here.
+				F64 time = message_in.getValueReal("time");
+
+				// Convert time to milliseconds for update()
+				update((int)(time * 1000.0f));
+			}
+			else if (message_name == "cleanup")
+			{
+				LLPluginMessage message("base", "goodbye");
+				sendMessage(message);
+
+				mDeleteMe = true;
+			}
+			else if (message_name == "shm_added")
+			{
+				SharedSegmentInfo info;
+				info.mAddress = message_in.getValuePointer("address");
+				info.mSize = (size_t)message_in.getValueS32("size");
+				std::string name = message_in.getValue("name");
+
+				mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
+
+			}
+			else if (message_name == "shm_remove")
+			{
+				std::string name = message_in.getValue("name");
+
+				SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+				if (iter != mSharedSegments.end())
+				{
+					if (mPixels == iter->second.mAddress)
+					{
+						// This is the currently active pixel buffer.  Make sure we stop drawing to it.
+						mPixels = NULL;
+						mTextureSegmentName.clear();
+					}
+					mSharedSegments.erase(iter);
+				}
+				else
+				{
+					//                  std::cerr << "MediaPluginWebKit::receiveMessage: unknown shared memory region!" << std::endl;
+				}
+
+				// Send the response so it can be cleaned up.
+				LLPluginMessage message("base", "shm_remove_response");
+				message.setValue("name", name);
+				sendMessage(message);
+			}
+			else
+			{
+				//              std::cerr << "MediaPluginWebKit::receiveMessage: unknown base message: " << message_name << std::endl;
+			}
+		}
+		else if (message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
+		{
+			if (message_name == "init")
+			{
+				// Plugin gets to decide the texture parameters to use.
+				mDepth = 4;
+				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
+				message.setValueS32("default_width", 1024);
+				message.setValueS32("default_height", 1024);
+				message.setValueS32("depth", mDepth);
+				message.setValueU32("internalformat", GL_RGB);
+				message.setValueU32("format", GL_RGBA);
+				message.setValueU32("type", GL_UNSIGNED_BYTE);
+				message.setValueBoolean("coords_opengl", true);
+				sendMessage(message);
+			}
+			else if (message_name == "size_change")
+			{
+				std::string name = message_in.getValue("name");
+				S32 width = message_in.getValueS32("width");
+				S32 height = message_in.getValueS32("height");
+				S32 texture_width = message_in.getValueS32("texture_width");
+				S32 texture_height = message_in.getValueS32("texture_height");
+
+				if (!name.empty())
+				{
+					// Find the shared memory region with this name
+					SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+					if (iter != mSharedSegments.end())
+					{
+						mPixels = (unsigned char*)iter->second.mAddress;
+						mWidth = width;
+						mHeight = height;
+
+						mTextureWidth = texture_width;
+						mTextureHeight = texture_height;
+					};
+				};
+
+				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");
+				message.setValue("name", name);
+				message.setValueS32("width", width);
+				message.setValueS32("height", height);
+				message.setValueS32("texture_width", texture_width);
+				message.setValueS32("texture_height", texture_height);
+				sendMessage(message);
+
+				mFirstTime = true;
+				mLastUpdateTime = 0;
+
+			}
+			else if (message_name == "load_uri")
+			{
+			}
+			else if (message_name == "mouse_event")
+			{
+				std::string event = message_in.getValue("event");
+				if (event == "down")
+				{
+
+				}
+				else if (event == "up")
+				{
+				}
+				else if (event == "double_click")
+				{
+				}
+			}
+		}
+		else
+		{
+		};
+	}
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 //
-void MediaPluginExample::write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b )
+void mediaPluginExample::update(F64 milliseconds)
 {
-    // make sure we don't write outside the buffer
-    if ( ( x < 0 ) || ( x >= mWidth ) || ( y < 0 ) || ( y >= mHeight ) )
-        return;
-
-    if ( mBackgroundPixels != NULL )
-    {
-        unsigned char *pixel = mBackgroundPixels;
-        pixel += y * mWidth * mDepth;
-        pixel += ( x * mDepth );
-        pixel[ 0 ] = b;
-        pixel[ 1 ] = g;
-        pixel[ 2 ] = r;
-
-        setDirty( x, y, x + 1, y + 1 );
-    };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void MediaPluginExample::update( F64 milliseconds )
-{
-    if ( mWidth < 1 || mWidth > 2048 || mHeight < 1 || mHeight > 2048 )
-        return;
-
-    if ( mPixels == 0 )
-            return;
-
-    if ( mFirstTime )
-    {
-        for( int n = 0; n < ENumObjects; ++n )
-        {
-            mXpos[ n ] = ( mWidth / 2 ) + rand() % ( mWidth / 16 ) - ( mWidth / 32 );
-            mYpos[ n ] = ( mHeight / 2 ) + rand() % ( mHeight / 16 ) - ( mHeight / 32 );
-
-            mColorR[ n ] = rand() % 0x60 + 0x60;
-            mColorG[ n ] = rand() % 0x60 + 0x60;
-            mColorB[ n ] = rand() % 0x60 + 0x60;
-
-            mXInc[ n ] = 0;
-            while ( mXInc[ n ] == 0 )
-                mXInc[ n ] = rand() % 7 - 3;
-
-            mYInc[ n ] = 0;
-            while ( mYInc[ n ] == 0 )
-                mYInc[ n ] = rand() % 9 - 4;
-
-            mBlockSize[ n ] = rand() % 0x30 + 0x10;
-        };
-
-        delete [] mBackgroundPixels;
-
-        mBackgroundPixels = new unsigned char[ mWidth * mHeight * mDepth ];
-
-        mFirstTime = false;
-    };
-
-    if ( mStopAction )
-        return;
-
-    if ( time( NULL ) > mLastUpdateTime + 3 )
-    {
-        const int num_squares = rand() % 20 + 4;
-        int sqr1_r = rand() % 0x80 + 0x20;
-        int sqr1_g = rand() % 0x80 + 0x20;
-        int sqr1_b = rand() % 0x80 + 0x20;
-        int sqr2_r = rand() % 0x80 + 0x20;
-        int sqr2_g = rand() % 0x80 + 0x20;
-        int sqr2_b = rand() % 0x80 + 0x20;
-
-        for ( int y1 = 0; y1 < num_squares; ++y1 )
-        {
-            for ( int x1 = 0; x1 < num_squares; ++x1 )
-            {
-                int px_start = mWidth * x1 / num_squares;
-                int px_end = ( mWidth * ( x1 + 1 ) ) / num_squares;
-                int py_start = mHeight * y1 / num_squares;
-                int py_end = ( mHeight * ( y1 + 1 ) ) / num_squares;
-
-                for( int y2 = py_start; y2 < py_end; ++y2 )
-                {
-                    for( int x2 = px_start; x2 < px_end; ++x2 )
-                    {
-                        int rowspan = mWidth * mDepth;
-
-                        if ( ( y1 % 2 ) ^ ( x1 % 2 ) )
-                        {
-                            mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr1_r;
-                            mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr1_g;
-                            mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr1_b;
-                        }
-                        else
-                        {
-                            mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr2_r;
-                            mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr2_g;
-                            mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr2_b;
-                        };
-                    };
-                };
-            };
-        };
-
-        time( &mLastUpdateTime );
-    };
-
-    memcpy( mPixels, mBackgroundPixels, mWidth * mHeight * mDepth );
-
-    for( int n = 0; n < ENumObjects; ++n )
-    {
-        if ( rand() % 50 == 0 )
-        {
-                mXInc[ n ] = 0;
-                while ( mXInc[ n ] == 0 )
-                    mXInc[ n ] = rand() % 7 - 3;
-
-                mYInc[ n ] = 0;
-                while ( mYInc[ n ] == 0 )
-                    mYInc[ n ] = rand() % 9 - 4;
-        };
-
-        if ( mXpos[ n ] + mXInc[ n ] < 0 || mXpos[ n ] + mXInc[ n ] >= mWidth - mBlockSize[ n ] )
-            mXInc[ n ]= -mXInc[ n ];
-
-        if ( mYpos[ n ] + mYInc[ n ] < 0 || mYpos[ n ] + mYInc[ n ] >= mHeight - mBlockSize[ n ] )
-            mYInc[ n ]= -mYInc[ n ];
-
-        mXpos[ n ] += mXInc[ n ];
-        mYpos[ n ] += mYInc[ n ];
-
-        for( int y = 0; y < mBlockSize[ n ]; ++y )
-        {
-            for( int x = 0; x < mBlockSize[ n ]; ++x )
-            {
-                mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 0 ] = mColorR[ n ];
-                mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 1 ] = mColorG[ n ];
-                mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 2 ] = mColorB[ n ];
-            };
-        };
-    };
-
-    setDirty( 0, 0, mWidth, mHeight );
+	if (mWidth < 1 || mWidth > 2048 || mHeight < 1 || mHeight > 2048)
+		return;
+
+	if (mPixels == 0)
+		return;
+
+	if (mFirstTime)
+	{
+		for (int n = 0; n < ENumObjects; ++n)
+		{
+			mXpos[n] = (mWidth / 2) + rand() % (mWidth / 16) - (mWidth / 32);
+			mYpos[n] = (mHeight / 2) + rand() % (mHeight / 16) - (mHeight / 32);
+
+			mColorR[n] = rand() % 0x60 + 0x60;
+			mColorG[n] = rand() % 0x60 + 0x60;
+			mColorB[n] = rand() % 0x60 + 0x60;
+
+			mXInc[n] = 0;
+			while (mXInc[n] == 0)
+				mXInc[n] = rand() % 7 - 3;
+
+			mYInc[n] = 0;
+			while (mYInc[n] == 0)
+				mYInc[n] = rand() % 9 - 4;
+
+			mBlockSize[n] = rand() % 0x30 + 0x10;
+		};
+
+		delete[] mBackgroundPixels;
+
+		mBackgroundPixels = new unsigned char[mWidth * mHeight * mDepth];
+
+		mFirstTime = false;
+	};
+
+	if (time(NULL) > mLastUpdateTime + 3)
+	{
+		const int num_squares = rand() % 20 + 4;
+		int sqr1_r = rand() % 0x80 + 0x20;
+		int sqr1_g = rand() % 0x80 + 0x20;
+		int sqr1_b = rand() % 0x80 + 0x20;
+		int sqr2_r = rand() % 0x80 + 0x20;
+		int sqr2_g = rand() % 0x80 + 0x20;
+		int sqr2_b = rand() % 0x80 + 0x20;
+
+		for (int y1 = 0; y1 < num_squares; ++y1)
+		{
+			for (int x1 = 0; x1 < num_squares; ++x1)
+			{
+				int px_start = mWidth * x1 / num_squares;
+				int px_end = (mWidth * (x1 + 1)) / num_squares;
+				int py_start = mHeight * y1 / num_squares;
+				int py_end = (mHeight * (y1 + 1)) / num_squares;
+
+				for (int y2 = py_start; y2 < py_end; ++y2)
+				{
+					for (int x2 = px_start; x2 < px_end; ++x2)
+					{
+						int rowspan = mWidth * mDepth;
+
+						if ((y1 % 2) ^ (x1 % 2))
+						{
+							mBackgroundPixels[y2 * rowspan + x2 * mDepth + 0] = sqr1_r;
+							mBackgroundPixels[y2 * rowspan + x2 * mDepth + 1] = sqr1_g;
+							mBackgroundPixels[y2 * rowspan + x2 * mDepth + 2] = sqr1_b;
+						}
+						else
+						{
+							mBackgroundPixels[y2 * rowspan + x2 * mDepth + 0] = sqr2_r;
+							mBackgroundPixels[y2 * rowspan + x2 * mDepth + 1] = sqr2_g;
+							mBackgroundPixels[y2 * rowspan + x2 * mDepth + 2] = sqr2_b;
+						};
+					};
+				};
+			};
+		};
+
+		time(&mLastUpdateTime);
+	};
+
+	memcpy(mPixels, mBackgroundPixels, mWidth * mHeight * mDepth);
+
+	for (int n = 0; n < ENumObjects; ++n)
+	{
+		if (rand() % 50 == 0)
+		{
+			mXInc[n] = 0;
+			while (mXInc[n] == 0)
+				mXInc[n] = rand() % 7 - 3;
+
+			mYInc[n] = 0;
+			while (mYInc[n] == 0)
+				mYInc[n] = rand() % 9 - 4;
+		};
+
+		if (mXpos[n] + mXInc[n] < 0 || mXpos[n] + mXInc[n] >= mWidth - mBlockSize[n])
+			mXInc[n] = -mXInc[n];
+
+		if (mYpos[n] + mYInc[n] < 0 || mYpos[n] + mYInc[n] >= mHeight - mBlockSize[n])
+			mYInc[n] = -mYInc[n];
+
+		mXpos[n] += mXInc[n];
+		mYpos[n] += mYInc[n];
+
+		for (int y = 0; y < mBlockSize[n]; ++y)
+		{
+			for (int x = 0; x < mBlockSize[n]; ++x)
+			{
+				mPixels[(mXpos[n] + x) * mDepth + (mYpos[n] + y) * mDepth * mWidth + 0] = mColorR[n];
+				mPixels[(mXpos[n] + x) * mDepth + (mYpos[n] + y) * mDepth * mWidth + 1] = mColorG[n];
+				mPixels[(mXpos[n] + x) * mDepth + (mYpos[n] + y) * mDepth * mWidth + 2] = mColorB[n];
+			};
+		};
+	};
+
+	setDirty(0, 0, mWidth, mHeight);
 };
 
 ////////////////////////////////////////////////////////////////////////////////
 //
-bool MediaPluginExample::init()
+bool mediaPluginExample::init()
 {
-    LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text" );
-    message.setValue( "name", "Example Plugin" );
-    sendMessage( message );
+	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
+	message.setValue("name", "Example Plugin");
+	sendMessage(message);
 
-    return true;
+	return true;
 };
 
 ////////////////////////////////////////////////////////////////////////////////
 //
-int init_media_plugin( LLPluginInstance::sendMessageFunction host_send_func,
-                        void* host_user_data,
-                        LLPluginInstance::sendMessageFunction *plugin_send_func,
-                        void **plugin_user_data )
+int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func,
+	void* host_user_data,
+	LLPluginInstance::sendMessageFunction *plugin_send_func,
+	void **plugin_user_data)
 {
-    MediaPluginExample* self = new MediaPluginExample( host_send_func, host_user_data );
-    *plugin_send_func = MediaPluginExample::staticReceiveMessage;
-    *plugin_user_data = ( void* )self;
+	mediaPluginExample* self = new mediaPluginExample(host_send_func, host_user_data);
+	*plugin_send_func = mediaPluginExample::staticReceiveMessage;
+	*plugin_user_data = (void*)self;
 
-    return 0;
+	return 0;
 }
-
diff --git a/indra/media_plugins/gstreamer010/CMakeLists.txt b/indra/media_plugins/gstreamer010/CMakeLists.txt
index 447f6e06895ec7d5cbf69ab85bd03513664e178d..6d18814b1e8a44fe828ea5b3f6416867da8deb43 100644
--- a/indra/media_plugins/gstreamer010/CMakeLists.txt
+++ b/indra/media_plugins/gstreamer010/CMakeLists.txt
@@ -33,13 +33,13 @@ include_directories(SYSTEM
 
 ### media_plugin_gstreamer010
 
-if(NOT WORD_SIZE EQUAL 32)
+if(NOT ADDRESS_SIZE EQUAL 32)
   if(WINDOWS)
-    add_definitions(/FIXED:NO)
+    ##add_definitions(/FIXED:NO)
   else(WINDOWS) # not windows therefore gcc LINUX and DARWIN
     add_definitions(-fPIC)
   endif(WINDOWS)
-endif(NOT WORD_SIZE EQUAL 32)
+endif(NOT ADDRESS_SIZE EQUAL 32)
 
 set(media_plugin_gstreamer010_SOURCE_FILES
     media_plugin_gstreamer010.cpp
diff --git a/indra/media_plugins/libvlc/CMakeLists.txt b/indra/media_plugins/libvlc/CMakeLists.txt
index 535d29125b763a2d51c0c9c38f92b82dc8989e93..d3e92430694521c89b55144405cf222c30d46d1a 100644
--- a/indra/media_plugins/libvlc/CMakeLists.txt
+++ b/indra/media_plugins/libvlc/CMakeLists.txt
@@ -33,13 +33,13 @@ include_directories(SYSTEM
 
 ### media_plugin_libvlc
 
-if(NOT WORD_SIZE EQUAL 32)
+if(NOT ADDRESS_SIZE EQUAL 32)
   if(WINDOWS)
-    add_definitions(/FIXED:NO)
+    ##add_definitions(/FIXED:NO)
   else(WINDOWS) # not windows therefore gcc LINUX and DARWIN
     add_definitions(-fPIC)
   endif(WINDOWS)
-endif(NOT WORD_SIZE EQUAL 32)
+endif(NOT ADDRESS_SIZE EQUAL 32)
 
 set(media_plugin_libvlc_SOURCE_FILES
     media_plugin_libvlc.cpp
@@ -61,14 +61,24 @@ target_link_libraries(media_plugin_libvlc
 add_dependencies(media_plugin_libvlc
   ${LLPLUGIN_LIBRARIES}
   ${MEDIA_PLUGIN_BASE_LIBRARIES}
-  ${LLCOMMON_LIBRARIES}
+##${LLCOMMON_LIBRARIES}
+  # Just say 'llcommon' here. LLCOMMON_LIBRARIES is specified for use in
+  # target_link_libraries: it includes several Boost libraries, which are
+  # absolutely NOT dependencies in the sense intended here. Those Boost
+  # library macros, in turn, specify 'debug' and 'optimized' and a different
+  # library name for each, producing several wordy errors:
+  # Policy CMP0046 is not set: Error on non-existent dependency in
+  # add_dependencies.
+  # Really, the only dependency we should mention from LLCOMMON_LIBRARIES is
+  # llcommon itself.
+  llcommon
 )
 
 if (WINDOWS)
   set_target_properties(
     media_plugin_libvlc
     PROPERTIES
-    LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /LTCG /NODEFAULTLIB:LIBCMT"
+    LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /NODEFAULTLIB:LIBCMT"
     )
 endif (WINDOWS)
 
diff --git a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp
index ebcdde2960f26b18dc6341105838e3e5d993c441..048e7675f8a6006d010db3376af99b224dc0ffb8 100644
--- a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp
+++ b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp
@@ -161,6 +161,10 @@ void MediaPluginLibVLC::initVLC()
 		"--video-filter=transform{type=vflip}",  // MAINT-6578 Y flip textures in plugin vs client
 	};
 
+#if LL_DARWIN
+	setenv("VLC_PLUGIN_PATH", ".", 1);
+#endif
+
 	int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);
 	mLibVLC = libvlc_new(vlc_argc, vlc_argv);
 
diff --git a/indra/media_plugins/quicktime/CMakeLists.txt b/indra/media_plugins/quicktime/CMakeLists.txt
deleted file mode 100755
index 58391007fff486a814a3ffe9fee3da1cd98e8489..0000000000000000000000000000000000000000
--- a/indra/media_plugins/quicktime/CMakeLists.txt
+++ /dev/null
@@ -1,94 +0,0 @@
-# -*- cmake -*-
-
-project(media_plugin_quicktime)
-
-include(00-Common)
-include(LLCommon)
-include(LLImage)
-include(LLPlugin)
-include(LLMath)
-include(LLRender)
-include(LLWindow)
-include(Linking)
-include(PluginAPI)
-include(MediaPluginBase)
-include(OpenGL)
-include(QuickTimePlugin)
-
-include_directories(
-    ${LLPLUGIN_INCLUDE_DIRS}
-    ${MEDIA_PLUGIN_BASE_INCLUDE_DIRS}
-    ${LLCOMMON_INCLUDE_DIRS}
-    ${LLMATH_INCLUDE_DIRS}
-    ${LLIMAGE_INCLUDE_DIRS}
-    ${LLRENDER_INCLUDE_DIRS}
-    ${LLWINDOW_INCLUDE_DIRS}
-)
-include_directories(SYSTEM
-    ${LLCOMMON_SYSTEM_INCLUDE_DIRS}
-    )
-
-if (DARWIN)
-    include(CMakeFindFrameworks)
-    find_library(CARBON_LIBRARY Carbon)
-endif (DARWIN)
-
-
-### media_plugin_quicktime
-
-set(media_plugin_quicktime_SOURCE_FILES
-    media_plugin_quicktime.cpp
-    )
-
-add_library(media_plugin_quicktime
-    SHARED
-    ${media_plugin_quicktime_SOURCE_FILES}
-)
-
-target_link_libraries(media_plugin_quicktime
-  ${LLPLUGIN_LIBRARIES}
-  ${MEDIA_PLUGIN_BASE_LIBRARIES}
-  ${LLCOMMON_LIBRARIES}
-  ${QUICKTIME_LIBRARY}
-  ${PLUGIN_API_WINDOWS_LIBRARIES}
-)
-
-add_dependencies(media_plugin_quicktime
-  ${LLPLUGIN_LIBRARIES}
-  ${MEDIA_PLUGIN_BASE_LIBRARIES}
-  ${LLCOMMON_LIBRARIES}
-)
-
-if (WINDOWS)
-  set_target_properties(
-    media_plugin_quicktime
-    PROPERTIES
-    LINK_FLAGS "/MANIFEST:NO"
-    )
-endif (WINDOWS)
-
-if (QUICKTIME)
-
-    add_definitions(-DLL_QUICKTIME_ENABLED=1)
-
-    if (DARWIN)
-      # Don't prepend 'lib' to the executable name, and don't embed a full path in the library's install name
-      set_target_properties(
-        media_plugin_quicktime
-        PROPERTIES
-        PREFIX ""
-        BUILD_WITH_INSTALL_RPATH 1
-        INSTALL_NAME_DIR "@executable_path"
-        LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"
-      )
-
-# We use a bunch of deprecated system APIs.
-    set_source_files_properties(
-        media_plugin_quicktime.cpp PROPERTIES
-        COMPILE_FLAGS -Wno-deprecated-declarations
-        )
-    find_library(CARBON_LIBRARY Carbon)
-    target_link_libraries(media_plugin_quicktime ${CARBON_LIBRARY})
-  endif (DARWIN)
-endif (QUICKTIME)
-
diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
deleted file mode 100755
index b43598e4a55fa3663bacddcde57bbbbb5f6e42b8..0000000000000000000000000000000000000000
--- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
+++ /dev/null
@@ -1,1085 +0,0 @@
-/**
- * @file media_plugin_quicktime.cpp
- * @brief QuickTime plugin for LLMedia API plugin system
- *
- * @cond
- * $LicenseInfo:firstyear=2008&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- * @endcond
- */
-
-#include "linden_common.h"
-
-#include "llgl.h"
- 
-#include "llplugininstance.h"
-#include "llpluginmessage.h"
-#include "llpluginmessageclasses.h"
-#include "media_plugin_base.h"
- 
-#if LL_QUICKTIME_ENABLED
- 
-#if defined(LL_DARWIN)
-#include <QuickTime/QuickTime.h>
-#elif defined(LL_WINDOWS)
-#include "llwin32headers.h"
-#include "MacTypes.h"
-#include "QTML.h"
-#include "Movies.h"
-#include "QDoffscreen.h"
-#include "FixMath.h"
-#include "QTLoadLibraryUtils.h"
-#endif
-
-
-
-// TODO: Make sure that the only symbol exported from this library is LLPluginInitEntryPoint
-////////////////////////////////////////////////////////////////////////////////
-//
-class MediaPluginQuickTime : public MediaPluginBase
-{
-public:
-	MediaPluginQuickTime(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
-	~MediaPluginQuickTime();
-
-	/* virtual */ void receiveMessage(const char *message_string);
-
-private:
-
-	int mNaturalWidth;
-	int mNaturalHeight;
-	Movie mMovieHandle;
-	GWorldPtr mGWorldHandle;
-	ComponentInstance mMovieController;
-	int mCurVolume;
-	bool mMediaSizeChanging;
-	bool mIsLooping;
-	std::string mMovieTitle;
-	bool mReceivedTitle;
-	const int mMinWidth;
-	const int mMaxWidth;
-	const int mMinHeight;
-	const int mMaxHeight;
-	F64 mPlayRate;
-	std::string mNavigateURL;
-
-	enum ECommand {
-		COMMAND_NONE,
-		COMMAND_STOP,
-		COMMAND_PLAY,
-		COMMAND_FAST_FORWARD,
-		COMMAND_FAST_REWIND,
-		COMMAND_PAUSE,
-		COMMAND_SEEK,
-	};
-	ECommand mCommand;
-
-	// Override this to add current time and duration to the message
-	/*virtual*/ void setDirty(int left, int top, int right, int bottom)
-	{
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "updated");
-
-		message.setValueS32("left", left);
-		message.setValueS32("top", top);
-		message.setValueS32("right", right);
-		message.setValueS32("bottom", bottom);
-
-		if(mMovieHandle)
-		{
-			message.setValueReal("current_time", getCurrentTime());
-			message.setValueReal("duration", getDuration());
-			message.setValueReal("current_rate", Fix2X(GetMovieRate(mMovieHandle)));
-		}
-
-		sendMessage(message);
-	}
-
-
-	static Rect rectFromSize(int width, int height)
-	{
-		Rect result;
-
-
-		result.left = 0;
-		result.top = 0;
-		result.right = width;
-		result.bottom = height;
-
-		return result;
-	}
-
-	Fixed getPlayRate(void)
-	{
-		Fixed result;
-		if(mPlayRate == 0.0f)
-		{
-			// Default to the movie's preferred rate
-			result = GetMoviePreferredRate(mMovieHandle);
-			if(result == 0)
-			{
-				// Don't return a 0 play rate, ever.
-				std::cerr << "Movie's preferred rate is 0, forcing to 1.0." << std::endl;
-				result = X2Fix(1.0f);
-			}
-		}
-		else
-		{
-			result = X2Fix(mPlayRate);
-		}
-
-		return result;
-	}
-
-	void load( const std::string url )
-	{
-
-		if ( url.empty() )
-			return;
-
-		// Stop and unload any existing movie before starting another one.
-		unload();
-
-		setStatus(STATUS_LOADING);
-
-		//In case std::string::c_str() makes a copy of the url data,
-		//make sure there is memory to hold it before allocating memory for handle.
-		//if fails, NewHandleClear(...) should return NULL.
-		const char* url_string = url.c_str() ;
-		Handle handle = NewHandleClear( ( Size )( url.length() + 1 ) );
-
-		if ( NULL == handle || noErr != MemError() || NULL == *handle )
-		{
-			setStatus(STATUS_ERROR);
-			return;
-		}
-
-		BlockMove( url_string, *handle, ( Size )( url.length() + 1 ) );
-
-		OSErr err = NewMovieFromDataRef( &mMovieHandle, newMovieActive | newMovieDontInteractWithUser | newMovieAsyncOK | newMovieIdleImportOK, nil, handle, URLDataHandlerSubType );
-		DisposeHandle( handle );
-		if ( noErr != err )
-		{
-			setStatus(STATUS_ERROR);
-			return;
-		};
-		
-		mNavigateURL = url;
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
-		message.setValue("uri", mNavigateURL);
-		sendMessage(message);
-
-		// do pre-roll actions (typically fired for streaming movies but not always)
-		PrePrerollMovie( mMovieHandle, 0, getPlayRate(), moviePrePrerollCompleteCallback, ( void * )this );
-
-		Rect movie_rect = rectFromSize(mWidth, mHeight);
-
-		// make a new movie controller
-		mMovieController = NewMovieController( mMovieHandle, &movie_rect, mcNotVisible | mcTopLeftMovie );
-
-		// movie controller
-		MCSetActionFilterWithRefCon( mMovieController, mcActionFilterCallBack, ( long )this );
-
-		SetMoviePlayHints( mMovieHandle, hintsAllowDynamicResize, hintsAllowDynamicResize );
-
-		// function that gets called when a frame is drawn
-		SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, movieDrawingCompleteCallback, ( long )this );
-
-		setStatus(STATUS_LOADED);
-
-		sizeChanged();
-	};
-
-	bool unload()
-	{
-		// new movie and have to get title again
-		mReceivedTitle = false;
-
-		if ( mMovieHandle )
-		{
-			StopMovie( mMovieHandle );
-			if ( mMovieController )
-			{
-				MCMovieChanged( mMovieController, mMovieHandle );
-			};
-		};
-
-		if ( mMovieController )
-		{
-			MCSetActionFilterWithRefCon( mMovieController, NULL, (long)this );
-			DisposeMovieController( mMovieController );
-			mMovieController = NULL;
-		};
-
-		if ( mMovieHandle )
-		{
-			SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, nil, ( long )this );
-			DisposeMovie( mMovieHandle );
-			mMovieHandle = NULL;
-		};
-
-        mGWorldHandle = NULL;
-        
-		setStatus(STATUS_NONE);
-
-		return true;
-	}
-
-	bool navigateTo( const std::string url )
-	{
-		unload();
-		load( url );
-
-		return true;
-	};
-
-	bool sizeChanged()
-	{
-		if ( ! mMovieHandle )
-			return false;
-
-		// Check to see whether the movie's natural size has updated
-		{
-			int width, height;
-			getMovieNaturalSize(&width, &height);
-			if((width != 0) && (height != 0) && ((width != mNaturalWidth) || (height != mNaturalHeight)))
-			{
-				mNaturalWidth = width;
-				mNaturalHeight = height;
-
-				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_request");
-				message.setValue("name", mTextureSegmentName);
-				message.setValueS32("width", width);
-				message.setValueS32("height", height);
-				sendMessage(message);
-				//std::cerr << "<--- Sending size change request to application with name: " << mTextureSegmentName << " - size is " << width << " x " << height << std::endl;
-			}
-		}
-        
-
-		// sanitize destination size
-		Rect dest_rect = rectFromSize(mWidth, mHeight);
-
-		// media depth won't change
-		int depth_bits = mDepth * 8;
-		long rowbytes = mDepth * mTextureWidth;
-
-		if(mPixels != NULL)
-		{
-			// We have pixels.  Set up a GWorld pointing at the texture.
-			OSErr result = QTNewGWorldFromPtr( &mGWorldHandle, depth_bits, &dest_rect, NULL, NULL, 0, (Ptr)mPixels, rowbytes);
-			if ( noErr != result )
-			{
-				// TODO: unrecoverable??  throw exception?  return something?
-				return false;
-			}
-		}
-		else
-		{
-			// We don't have pixels. Create a fake GWorld we can point the movie at when it's not safe to render normally.
-			Rect tempRect = rectFromSize(1, 1);
-			OSErr result = QTNewGWorld( &mGWorldHandle, depth_bits, &tempRect, NULL, NULL, 0);
-			if ( noErr != result )
-			{
-				// TODO: unrecoverable??  throw exception?  return something?
-				return false;
-			}
-		}
-
-		SetMovieGWorld( mMovieHandle, mGWorldHandle, NULL );
-        
-		// Set up the movie display matrix
-		{
-			// scale movie to fit rect and invert vertically to match opengl image format
-			MatrixRecord transform;
-			SetIdentityMatrix( &transform );	// transforms are additive so start from identify matrix
-			double scaleX = (double) mWidth / mNaturalWidth;
-			double scaleY = -1.0 * (double) mHeight / mNaturalHeight;
-			double centerX = mWidth / 2.0;
-			double centerY = mHeight / 2.0;
-			ScaleMatrix( &transform, X2Fix( scaleX ), X2Fix( scaleY ), X2Fix( centerX ), X2Fix( centerY ) );
-			SetMovieMatrix( mMovieHandle, &transform );
-		}
-
-		// update movie controller
-		if ( mMovieController )
-		{
-			MCSetControllerPort( mMovieController, mGWorldHandle );
-			MCPositionController( mMovieController, &dest_rect, &dest_rect,
-								  mcTopLeftMovie | mcPositionDontInvalidate );
-			MCMovieChanged( mMovieController, mMovieHandle );
-		}
-
-
-		// Emit event with size change so the calling app knows about it too
-		// TODO:
-		//LLMediaEvent event( this );
-		//mEventEmitter.update( &LLMediaObserver::onMediaSizeChange, event );
-
-		return true;
-	}
-	static Boolean mcActionFilterCallBack( MovieController mc, short action, void *params, long ref )
-	{
-		Boolean result = false;
-
-		MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
-
-		switch( action )
-		{
-			// handle window resizing
-			case mcActionControllerSizeChanged:
-				// Ensure that the movie draws correctly at the new size
-				self->sizeChanged();
-				break;
-
-			// Block any movie controller actions that open URLs.
-			case mcActionLinkToURL:
-			case mcActionGetNextURL:
-			case mcActionLinkToURLExtended:
-				// Prevent the movie controller from handling the message
-				result = true;
-				break;
-
-			default:
-				break;
-		};
-
-		return result;
-	};
-
-	static OSErr movieDrawingCompleteCallback( Movie call_back_movie, long ref )
-	{
-		MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
-
-		// IMPORTANT: typically, a consumer who is observing this event will set a flag
-		// when this event is fired then render later. Be aware that the media stream
-		// can change during this period - dimensions, depth, format etc.
-		//LLMediaEvent event( self );
-//		self->updateQuickTime();
-		// TODO ^^^
-
-
-		if ( self->mWidth > 0 && self->mHeight > 0 )
-			self->setDirty( 0, 0, self->mWidth, self->mHeight );
-
-		return noErr;
-	};
-
-	static void moviePrePrerollCompleteCallback( Movie movie, OSErr preroll_err, void *ref )
-	{
-		MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
-
-		// TODO:
-		//LLMediaEvent event( self );
-		//self->mEventEmitter.update( &LLMediaObserver::onMediaPreroll, event );
-		
-		// Send a "navigate complete" event.
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
-		message.setValue("uri", self->mNavigateURL);
-		message.setValueS32("result_code", 200);
-		message.setValue("result_string", "OK");
-		self->sendMessage(message);
-	};
-
-
-	void rewind()
-	{
-		GoToBeginningOfMovie( mMovieHandle );
-		MCMovieChanged( mMovieController, mMovieHandle );
-	};
-
-	bool processState()
-	{
-		if ( mCommand == COMMAND_PLAY )
-		{
-			if ( mStatus == STATUS_LOADED || mStatus == STATUS_PAUSED || mStatus == STATUS_PLAYING || mStatus == STATUS_DONE )
-			{
-				long state = GetMovieLoadState( mMovieHandle );
-
-				if ( state >= kMovieLoadStatePlaythroughOK )
-				{
-					// if the movie is at the end (generally because it reached it naturally)
-					// and we play is requested, jump back to the start of the movie.
-					// note: this is different from having loop flag set.
-					if ( IsMovieDone( mMovieHandle ) )
-					{
-						Fixed rate = X2Fix( 0.0 );
-						MCDoAction( mMovieController, mcActionPlay, (void*)rate );
-						rewind();
-					};
-
-					MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)getPlayRate() );
-					MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
-					setStatus(STATUS_PLAYING);
-					mCommand = COMMAND_NONE;
-				};
-			};
-		}
-		else
-		if ( mCommand == COMMAND_STOP )
-		{
-			if ( mStatus == STATUS_PLAYING || mStatus == STATUS_PAUSED || mStatus == STATUS_DONE )
-			{
-				if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
-				{
-					Fixed rate = X2Fix( 0.0 );
-					MCDoAction( mMovieController, mcActionPlay, (void*)rate );
-					rewind();
-
-					setStatus(STATUS_LOADED);
-					mCommand = COMMAND_NONE;
-				};
-			};
-		}
-		else
-		if ( mCommand == COMMAND_PAUSE )
-		{
-			if ( mStatus == STATUS_PLAYING )
-			{
-				if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
-				{
-					Fixed rate = X2Fix( 0.0 );
-					MCDoAction( mMovieController, mcActionPlay, (void*)rate );
-					setStatus(STATUS_PAUSED);
-					mCommand = COMMAND_NONE;
-				};
-			};
-		};
-
-		return true;
-	};
-
-	void play(F64 rate)
-	{
-		mPlayRate = rate;
-		mCommand = COMMAND_PLAY;
-	};
-
-	void stop()
-	{
-		mCommand = COMMAND_STOP;
-	};
-
-	void pause()
-	{
-		mCommand = COMMAND_PAUSE;
-	};
-
-	void getMovieNaturalSize(int *movie_width, int *movie_height)
-	{
-		Rect rect;
-
-		GetMovieNaturalBoundsRect( mMovieHandle, &rect );
-
-		int width  = ( rect.right - rect.left );
-		int height = ( rect.bottom - rect.top );
-
-		// make sure width and height fall in valid range
-		if ( width < mMinWidth )
-			width = mMinWidth;
-
-		if ( width > mMaxWidth )
-			width = mMaxWidth;
-
-		if ( height < mMinHeight )
-			height = mMinHeight;
-
-		if ( height > mMaxHeight )
-			height = mMaxHeight;
-
-		// return the new rect
-		*movie_width = width;
-		*movie_height = height;
-	}
-
-	void updateQuickTime(int milliseconds)
-	{
-		if ( ! mMovieHandle )
-			return;
-
-		if ( ! mMovieController )
-			return;
-
-		// this wasn't required in 1.xx viewer but we have to manually 
-		// work the Windows message pump now
-		#if defined( LL_WINDOWS )
-		MSG msg;
-		while ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) 
-		{
-			GetMessage( &msg, NULL, 0, 0 );
-			TranslateMessage( &msg );
-			DispatchMessage( &msg );
-		};
-		#endif
-
-		MCIdle( mMovieController );
-
-		if ( ! mGWorldHandle )
-			return;
-
-		if ( mMediaSizeChanging )
-			return;
-
-		// update state machine
-		processState();
-
-		// see if title arrived and if so, update member variable with contents
-		checkTitle();
-		
-		// QT call to see if we are at the end - can't do with controller
-		if ( IsMovieDone( mMovieHandle ) )
-		{
-			// special code for looping - need to rewind at the end of the movie
-			if ( mIsLooping )
-			{
-				// go back to start
-				rewind();
-
-				if ( mMovieController )
-				{
-					// kick off new play
-					MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)getPlayRate() );
-
-					// set the volume
-					MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
-				};
-			}
-			else
-			{
-				if(mStatus == STATUS_PLAYING)
-				{
-					setStatus(STATUS_DONE);
-				}
-			}
-		}
-
-	};
-    
-	void seek( F64 time )
-	{
-		if ( mMovieController )
-		{
-			TimeRecord when;
-			when.scale = GetMovieTimeScale( mMovieHandle );
-			when.base = 0;
-
-			// 'time' is in (floating point) seconds.  The timebase time will be in 'units', where
-			// there are 'scale' units per second.
-			SInt64 raw_time = ( SInt64 )( time * (double)( when.scale ) );
-
-			when.value.hi = ( SInt32 )( raw_time >> 32 );
-			when.value.lo = ( SInt32 )( ( raw_time & 0x00000000FFFFFFFF ) );
-
-			MCDoAction( mMovieController, mcActionGoToTime, &when );
-		};
-	};
-
-	F64 getLoadedDuration() 	  	 
-	{ 	  	 
-		TimeValue duration; 	  	 
-		if(GetMaxLoadedTimeInMovie( mMovieHandle, &duration ) != noErr) 	  	 
-		{ 	  	 
-			// If GetMaxLoadedTimeInMovie returns an error, return the full duration of the movie. 	  	 
-			duration = GetMovieDuration( mMovieHandle ); 	  	 
-		} 	  	 
-		TimeValue scale = GetMovieTimeScale( mMovieHandle ); 	  	 
-
-		return (F64)duration / (F64)scale; 	  	 
-	}; 	  	 
-
-	F64 getDuration()
-	{
-		TimeValue duration = GetMovieDuration( mMovieHandle );
-		TimeValue scale = GetMovieTimeScale( mMovieHandle );
-
-		return (F64)duration / (F64)scale;
-	};
-
-	F64 getCurrentTime()
-	{
-		TimeValue curr_time = GetMovieTime( mMovieHandle, 0 );
-		TimeValue scale = GetMovieTimeScale( mMovieHandle );
-
-		return (F64)curr_time / (F64)scale;
-	};
-
-	void setVolume( F64 volume )
-	{
-		mCurVolume = (short)(volume * ( double ) 0x100 );
-
-		if ( mMovieController )
-		{
-			MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
-		};
-	};
-
-	////////////////////////////////////////////////////////////////////////////////
-	//
-	void update(int milliseconds = 0)
-	{
-		updateQuickTime(milliseconds);
-	};
-
-	////////////////////////////////////////////////////////////////////////////////
-	//
-	void mouseDown( int x, int y )
-	{
-	};
-
-	////////////////////////////////////////////////////////////////////////////////
-	//
-	void mouseUp( int x, int y )
-	{
-	};
-
-	////////////////////////////////////////////////////////////////////////////////
-	//
-	void mouseMove( int x, int y )
-	{
-	};
-
-	////////////////////////////////////////////////////////////////////////////////
-	//
-	void keyPress( unsigned char key )
-	{
-	};
-
-	////////////////////////////////////////////////////////////////////////////////
-	// Grab movie title into mMovieTitle - should be called repeatedly
-	// until it returns true since movie title takes a while to become 
-	// available.
-	const bool getMovieTitle()
-	{
-		// grab meta data from movie
-		QTMetaDataRef media_data_ref;
-		OSErr result = QTCopyMovieMetaData( mMovieHandle, &media_data_ref );
-		if ( noErr != result ) 
-			return false;
-
-		// look up "Display Name" in meta data
-		OSType meta_data_key = kQTMetaDataCommonKeyDisplayName;
-		QTMetaDataItem item = kQTMetaDataItemUninitialized;
-		result = (OSErr)QTMetaDataGetNextItem( media_data_ref, kQTMetaDataStorageFormatWildcard, 
-										0, kQTMetaDataKeyFormatCommon, 
-										(const UInt8 *)&meta_data_key, 
-										sizeof( meta_data_key ), &item );
-		if ( noErr != result ) 
-			return false;
-
-		// find the size of the title
-		ByteCount size;
-		result = (OSErr)QTMetaDataGetItemValue( media_data_ref, item, NULL, 0, &size );
-		if ( noErr != result || size <= 0 /*|| size > 1024  FIXME: arbitrary limit */ ) 
-			return false;
-
-		// allocate some space and grab it
-		UInt8* item_data = new UInt8[ size + 1 ];
-		memset( item_data, 0, ( size + 1 ) * sizeof( UInt8 ) );
-		result = (OSErr)QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL );
-		if ( noErr != result ) 
-		{
-			delete [] item_data;
-			return false;
-		};
-
-		// save it
-		if ( strlen( (char*)item_data ) )
-			mMovieTitle = std::string( (char* )item_data );
-		else
-			mMovieTitle = "";
-
-		// clean up
-		delete [] item_data;
-
-		return true;
-	};
-
-	// called regularly to see if title changed
-	void checkTitle()
-	{
-		// we did already receive title so keep checking
-		if ( ! mReceivedTitle )
-		{
-			// grab title from movie meta data
-			if ( getMovieTitle() )
-			{
-				// pass back to host application
-				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
-				message.setValue("name", mMovieTitle );
-				sendMessage( message );
-
-				// stop looking once we find a title for this movie.
-				// TODO: this may to be reset if movie title changes
-				// during playback but this is okay for now
-				mReceivedTitle = true;
-			};
-		};
-	};
-};
-
-MediaPluginQuickTime::MediaPluginQuickTime(
-	LLPluginInstance::sendMessageFunction host_send_func,
-	void *host_user_data ) :
-	MediaPluginBase(host_send_func, host_user_data),
-	mMinWidth( 0 ),
-	mMaxWidth( 2048 ),
-	mMinHeight( 0 ),
-	mMaxHeight( 2048 )
-{
-//	std::cerr << "MediaPluginQuickTime constructor" << std::endl;
-
-	mNaturalWidth = -1;
-	mNaturalHeight = -1;
-	mMovieHandle = 0;
-	mGWorldHandle = 0;
-	mMovieController = 0;
-	mCurVolume = 0x99;
-	mMediaSizeChanging = false;
-	mIsLooping = false;
-	mMovieTitle = std::string();
-	mReceivedTitle = false;
-	mCommand = COMMAND_NONE;
-	mPlayRate = 0.0f;
-	mStatus = STATUS_NONE;
-}
-
-MediaPluginQuickTime::~MediaPluginQuickTime()
-{
-//	std::cerr << "MediaPluginQuickTime destructor" << std::endl;
-
-	ExitMovies();
-
-#ifdef LL_WINDOWS
-	TerminateQTML();
-//		std::cerr << "QuickTime closing down" << std::endl;
-#endif
-}
-
-
-void MediaPluginQuickTime::receiveMessage(const char *message_string)
-{
-//	std::cerr << "MediaPluginQuickTime::receiveMessage: received message: \"" << message_string << "\"" << std::endl;
-	LLPluginMessage message_in;
-
-	if(message_in.parse(message_string) >= 0)
-	{
-		std::string message_class = message_in.getClass();
-		std::string message_name = message_in.getName();
-		if(message_class == LLPLUGIN_MESSAGE_CLASS_BASE)
-		{
-			if(message_name == "init")
-			{
-				LLPluginMessage message("base", "init_response");
-				LLSD versions = LLSD::emptyMap();
-				versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
-				versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
-				// Normally a plugin would only specify one of these two subclasses, but this is a demo...
-				versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME] = LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME_VERSION;
-				message.setValueLLSD("versions", versions);
-
-				#ifdef LL_WINDOWS
-
-				// QuickTime 7.6.4 has an issue (that was not present in 7.6.2) with initializing QuickTime
-				// according to this article: http://lists.apple.com/archives/QuickTime-API/2009/Sep/msg00097.html
-				// The solution presented there appears to work.
-				QTLoadLibrary("qtcf.dll");
-
-				// main initialization for QuickTime - only required on Windows
-				OSErr result = InitializeQTML( 0L );
-				if ( result != noErr )
-				{
-					//TODO: If no QT on Windows, this fails - respond accordingly.
-				}
-				else
-				{
-					//std::cerr << "QuickTime initialized" << std::endl;
-				};
-				#endif
-
-				// required for both Windows and Mac
-				EnterMovies();
-
-				std::string plugin_version = "QuickTime media plugin, QuickTime version ";
-
-				long version = 0;
-				Gestalt( gestaltQuickTimeVersion, &version );
-				std::ostringstream codec( "" );
-				codec << std::hex << version << std::dec;
-				plugin_version += codec.str();
-				message.setValue("plugin_version", plugin_version);
-				sendMessage(message);
-			}
-			else if(message_name == "idle")
-			{
-				// no response is necessary here.
-				F64 time = message_in.getValueReal("time");
-
-				// Convert time to milliseconds for update()
-				update((int)(time * 1000.0f));
-			}
-			else if(message_name == "cleanup")
-			{
-				// TODO: clean up here
-			}
-			else if(message_name == "shm_added")
-			{
-				SharedSegmentInfo info;
-				info.mAddress = message_in.getValuePointer("address");
-				info.mSize = (size_t)message_in.getValueS32("size");
-				std::string name = message_in.getValue("name");
-//				std::cerr << "MediaPluginQuickTime::receiveMessage: shared memory added, name: " << name
-//					<< ", size: " << info.mSize
-//					<< ", address: " << info.mAddress
-//					<< std::endl;
-
-				mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
-
-			}
-			else if(message_name == "shm_remove")
-			{
-				std::string name = message_in.getValue("name");
-
-//				std::cerr << "MediaPluginQuickTime::receiveMessage: shared memory remove, name = " << name << std::endl;
-
-				SharedSegmentMap::iterator iter = mSharedSegments.find(name);
-				if(iter != mSharedSegments.end())
-				{
-					if(mPixels == iter->second.mAddress)
-					{
-						// This is the currently active pixel buffer.  Make sure we stop drawing to it.
-						mPixels = NULL;
-						mTextureSegmentName.clear();
-
-						// Make sure the movie GWorld is no longer pointed at the shared segment.
-						sizeChanged();
-					}
-					mSharedSegments.erase(iter);
-				}
-				else
-				{
-//					std::cerr << "MediaPluginQuickTime::receiveMessage: unknown shared memory region!" << std::endl;
-				}
-
-				// Send the response so it can be cleaned up.
-				LLPluginMessage message("base", "shm_remove_response");
-				message.setValue("name", name);
-				sendMessage(message);
-			}
-			else
-			{
-//				std::cerr << "MediaPluginQuickTime::receiveMessage: unknown base message: " << message_name << std::endl;
-			}
-		}
-		else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
-		{
-			if(message_name == "init")
-			{
-				// This is the media init message -- all necessary data for initialization should have been received.
-
-				// Plugin gets to decide the texture parameters to use.
-				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
-				#if defined(LL_WINDOWS)
-					// Values for Windows
-					mDepth = 3;
-					message.setValueU32("format", GL_RGB);
-					message.setValueU32("type", GL_UNSIGNED_BYTE);
-
-					// We really want to pad the texture width to a multiple of 32 bytes, but since we're using 3-byte pixels, it doesn't come out even.
-					// Padding to a multiple of 3*32 guarantees it'll divide out properly.
-					message.setValueU32("padding", 32 * 3);
-				#else
-					// Values for Mac
-					mDepth = 4;
-					message.setValueU32("format", GL_BGRA_EXT);
-					#ifdef __BIG_ENDIAN__
-						message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV );
-					#else
-						message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8);
-					#endif
-
-					// Pad texture width to a multiple of 32 bytes, to line up with cache lines.
-					message.setValueU32("padding", 32);
-				#endif
-				message.setValueS32("depth", mDepth);
-				message.setValueU32("internalformat", GL_RGB);
-
-                // note this apparently only has an effect when media is opened in 2D browser. 
-                // see https://jira.secondlife.com/browse/BUG-18252 - media flipped in 2D so flipping it back.
-				message.setValueBoolean("coords_opengl", true);	// true == use OpenGL-style coordinates, false == (0,0) is upper left.
-				message.setValueBoolean("allow_downsample", true);
-				sendMessage(message);
-			}
-			else if(message_name == "size_change")
-			{
-				std::string name = message_in.getValue("name");
-				S32 width = message_in.getValueS32("width");
-				S32 height = message_in.getValueS32("height");
-				S32 texture_width = message_in.getValueS32("texture_width");
-				S32 texture_height = message_in.getValueS32("texture_height");
-
-				//std::cerr << "---->Got size change instruction from application with name: " << name << " - size is " << width << " x " << height << std::endl;
-
-				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");
-				message.setValue("name", name);
-				message.setValueS32("width", width);
-				message.setValueS32("height", height);
-				message.setValueS32("texture_width", texture_width);
-				message.setValueS32("texture_height", texture_height);
-				sendMessage(message);
-
-				if(!name.empty())
-				{
-					// Find the shared memory region with this name
-					SharedSegmentMap::iterator iter = mSharedSegments.find(name);
-					if(iter != mSharedSegments.end())
-					{
-//						std::cerr << "%%% Got size change, new size is " << width << " by " << height << std::endl;
-//						std::cerr << "%%%%  texture size is " << texture_width << " by " << texture_height << std::endl;
-
-						mPixels = (unsigned char*)iter->second.mAddress;
-						mTextureSegmentName = name;
-						mWidth = width;
-						mHeight = height;
-
-						mTextureWidth = texture_width;
-						mTextureHeight = texture_height;
-
-						mMediaSizeChanging = false;
-
-						sizeChanged();
-
-						update();
-					};
-				};
-			}
-			else if(message_name == "load_uri")
-			{
-				std::string uri = message_in.getValue("uri");
-				load( uri );
-				sendStatus();
-			}
-			else if(message_name == "mouse_event")
-			{
-				std::string event = message_in.getValue("event");
-				S32 x = message_in.getValueS32("x");
-				S32 y = message_in.getValueS32("y");
-
-				if(event == "down")
-				{
-					mouseDown(x, y);
-				}
-				else if(event == "up")
-				{
-					mouseUp(x, y);
-				}
-				else if(event == "move")
-				{
-					mouseMove(x, y);
-				};
-			};
-		}
-		else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
-		{
-			if(message_name == "stop")
-			{
-				stop();
-			}
-			else if(message_name == "start")
-			{
-				F64 rate = 0.0;
-				if(message_in.hasValue("rate"))
-				{
-					rate = message_in.getValueReal("rate");
-				}
-				play(rate);
-			}
-			else if(message_name == "pause")
-			{
-				pause();
-			}
-			else if(message_name == "seek")
-			{
-				F64 time = message_in.getValueReal("time");
-				seek(time);
-			}
-			else if(message_name == "set_loop")
-			{
-				bool loop = message_in.getValueBoolean("loop");
-				mIsLooping = loop;
-			}
-			else if(message_name == "set_volume")
-			{
-				F64 volume = message_in.getValueReal("volume");
-				setVolume(volume);
-			}
-		}
-		else
-		{
-//			std::cerr << "MediaPluginQuickTime::receiveMessage: unknown message class: " << message_class << std::endl;
-		};
-	};
-}
-
-int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
-{
-	MediaPluginQuickTime *self = new MediaPluginQuickTime(host_send_func, host_user_data);
-	*plugin_send_func = MediaPluginQuickTime::staticReceiveMessage;
-	*plugin_user_data = (void*)self;
-
-	return 0;
-}
-
-#else // LL_QUICKTIME_ENABLED
-
-// Stubbed-out class with constructor/destructor (necessary or windows linker
-// will just think its dead code and optimize it all out)
-class MediaPluginQuickTime : public MediaPluginBase
-{
-public:
-	MediaPluginQuickTime(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
-	~MediaPluginQuickTime();
-	/* virtual */ void receiveMessage(const char *message_string);
-};
-
-MediaPluginQuickTime::MediaPluginQuickTime(
-	LLPluginInstance::sendMessageFunction host_send_func,
-	void *host_user_data ) :
-	MediaPluginBase(host_send_func, host_user_data)
-{
-    // no-op
-}
-
-MediaPluginQuickTime::~MediaPluginQuickTime()
-{
-    // no-op
-}
-
-void MediaPluginQuickTime::receiveMessage(const char *message_string)
-{
-    // no-op
-}
-
-// We're building without quicktime enabled.  Just refuse to initialize.
-int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
-{
-    return -1;
-}
-
-#endif // LL_QUICKTIME_ENABLED
diff --git a/indra/media_plugins/winmmshim/CMakeLists.txt b/indra/media_plugins/winmmshim/CMakeLists.txt
deleted file mode 100644
index 6890589892eef183a14b709242dcbff815010bb5..0000000000000000000000000000000000000000
--- a/indra/media_plugins/winmmshim/CMakeLists.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-# -*- cmake -*-
-
-project(winmm_shim)
-
-### winmm_shim
-# *HACK - override msvcrt implementation (intialized on 00-Common) to be
-# statically linked for winmm.dll this relies on vc taking the last flag on
-# the command line
-set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
-set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT")
-set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
-
-set(winmm_shim_SOURCE_FILES
-    forwarding_api.cpp
-    winmm_shim.cpp
-    )
-
-set(winmm_shim_HEADER_FILES
-    forwarding_api.h
-    winmm.def
-    )
-
-list(APPEND winmm_shim_SOURCE_FILES ${winmm_shim_HEADER_FILES})
-
-add_library(winmm_shim
-    SHARED
-    ${winmm_shim_SOURCE_FILES}
-)
-
-if (WINDOWS)
-  set_target_properties(
-    winmm_shim
-    PROPERTIES
-    LINK_FLAGS "/MANIFEST:NO"
-    OUTPUT_NAME "winmm"
-    )
-endif (WINDOWS)
diff --git a/indra/media_plugins/winmmshim/forwarding_api.cpp b/indra/media_plugins/winmmshim/forwarding_api.cpp
deleted file mode 100644
index 33f0675028188bc924f7a75eef849c7740fac549..0000000000000000000000000000000000000000
--- a/indra/media_plugins/winmmshim/forwarding_api.cpp
+++ /dev/null
@@ -1,1627 +0,0 @@
-/** 
- * @file forwarding_api.cpp
- * @brief forwards winmm API calls to real winmm.dll
- *
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#include "forwarding_api.h"
-
-CloseDriver_type CloseDriver_orig;
-OpenDriver_type OpenDriver_orig;
-SendDriverMessage_type SendDriverMessage_orig;
-DrvGetModuleHandle_type DrvGetModuleHandle_orig;
-GetDriverModuleHandle_type GetDriverModuleHandle_orig;
-DefDriverProc_type DefDriverProc_orig;
-DriverCallback_type DriverCallback_orig;
-mmsystemGetVersion_type mmsystemGetVersion_orig;
-sndPlaySoundA_type sndPlaySoundA_orig;
-sndPlaySoundW_type sndPlaySoundW_orig;
-PlaySoundA_type PlaySoundA_orig;
-PlaySoundW_type PlaySoundW_orig;
-waveOutGetNumDevs_type waveOutGetNumDevs_orig;
-waveOutGetDevCapsA_type waveOutGetDevCapsA_orig;
-waveOutGetDevCapsW_type waveOutGetDevCapsW_orig;
-waveOutGetVolume_type waveOutGetVolume_orig;
-waveOutSetVolume_type waveOutSetVolume_orig;
-waveOutGetErrorTextA_type waveOutGetErrorTextA_orig;
-waveOutGetErrorTextW_type waveOutGetErrorTextW_orig;
-waveOutOpen_type waveOutOpen_orig;
-waveOutClose_type waveOutClose_orig;
-waveOutPrepareHeader_type waveOutPrepareHeader_orig;
-waveOutUnprepareHeader_type waveOutUnprepareHeader_orig;
-waveOutWrite_type waveOutWrite_orig;
-waveOutPause_type waveOutPause_orig;
-waveOutRestart_type waveOutRestart_orig;
-waveOutReset_type waveOutReset_orig;
-waveOutBreakLoop_type waveOutBreakLoop_orig;
-waveOutGetPosition_type waveOutGetPosition_orig;
-waveOutGetPitch_type waveOutGetPitch_orig;
-waveOutSetPitch_type waveOutSetPitch_orig;
-waveOutGetPlaybackRate_type waveOutGetPlaybackRate_orig;
-waveOutSetPlaybackRate_type waveOutSetPlaybackRate_orig;
-waveOutGetID_type waveOutGetID_orig;
-waveOutMessage_type waveOutMessage_orig;
-waveInGetNumDevs_type waveInGetNumDevs_orig;
-waveInGetDevCapsA_type waveInGetDevCapsA_orig;
-waveInGetDevCapsW_type waveInGetDevCapsW_orig;
-waveInGetErrorTextA_type waveInGetErrorTextA_orig;
-waveInGetErrorTextW_type waveInGetErrorTextW_orig;
-waveInOpen_type waveInOpen_orig;
-waveInClose_type waveInClose_orig;
-waveInPrepareHeader_type waveInPrepareHeader_orig;
-waveInUnprepareHeader_type waveInUnprepareHeader_orig;
-waveInAddBuffer_type waveInAddBuffer_orig;
-waveInStart_type waveInStart_orig;
-waveInStop_type waveInStop_orig;
-waveInReset_type waveInReset_orig;
-waveInGetPosition_type waveInGetPosition_orig;
-waveInGetID_type waveInGetID_orig;
-waveInMessage_type waveInMessage_orig;
-midiOutGetNumDevs_type midiOutGetNumDevs_orig;
-midiStreamOpen_type midiStreamOpen_orig;
-midiStreamClose_type midiStreamClose_orig;
-midiStreamProperty_type midiStreamProperty_orig;
-midiStreamPosition_type midiStreamPosition_orig;
-midiStreamOut_type midiStreamOut_orig;
-midiStreamPause_type midiStreamPause_orig;
-midiStreamRestart_type midiStreamRestart_orig;
-midiStreamStop_type midiStreamStop_orig;
-midiConnect_type midiConnect_orig;
-midiDisconnect_type midiDisconnect_orig;
-midiOutGetDevCapsA_type midiOutGetDevCapsA_orig;
-midiOutGetDevCapsW_type midiOutGetDevCapsW_orig;
-midiOutGetVolume_type midiOutGetVolume_orig;
-midiOutSetVolume_type midiOutSetVolume_orig;
-midiOutGetErrorTextA_type midiOutGetErrorTextA_orig;
-midiOutGetErrorTextW_type midiOutGetErrorTextW_orig;
-midiOutOpen_type midiOutOpen_orig;
-midiOutClose_type midiOutClose_orig;
-midiOutPrepareHeader_type midiOutPrepareHeader_orig;
-midiOutUnprepareHeader_type midiOutUnprepareHeader_orig;
-midiOutShortMsg_type midiOutShortMsg_orig;
-midiOutLongMsg_type midiOutLongMsg_orig;
-midiOutReset_type midiOutReset_orig;
-midiOutCachePatches_type midiOutCachePatches_orig;
-midiOutCacheDrumPatches_type midiOutCacheDrumPatches_orig;
-midiOutGetID_type midiOutGetID_orig;
-midiOutMessage_type midiOutMessage_orig;
-midiInGetNumDevs_type midiInGetNumDevs_orig;
-midiInGetDevCapsA_type midiInGetDevCapsA_orig;
-midiInGetDevCapsW_type midiInGetDevCapsW_orig;
-midiInGetErrorTextA_type midiInGetErrorTextA_orig;
-midiInGetErrorTextW_type midiInGetErrorTextW_orig;
-midiInOpen_type midiInOpen_orig;
-midiInClose_type midiInClose_orig;
-midiInPrepareHeader_type midiInPrepareHeader_orig;
-midiInUnprepareHeader_type midiInUnprepareHeader_orig;
-midiInAddBuffer_type midiInAddBuffer_orig;
-midiInStart_type midiInStart_orig;
-midiInStop_type midiInStop_orig;
-midiInReset_type midiInReset_orig;
-midiInGetID_type midiInGetID_orig;
-midiInMessage_type midiInMessage_orig;
-auxGetNumDevs_type auxGetNumDevs_orig;
-auxGetDevCapsA_type auxGetDevCapsA_orig;
-auxGetDevCapsW_type auxGetDevCapsW_orig;
-auxSetVolume_type auxSetVolume_orig;
-auxGetVolume_type auxGetVolume_orig;
-auxOutMessage_type auxOutMessage_orig;
-mixerGetNumDevs_type mixerGetNumDevs_orig;
-mixerGetDevCapsA_type mixerGetDevCapsA_orig;
-mixerGetDevCapsW_type mixerGetDevCapsW_orig;
-mixerOpen_type mixerOpen_orig;
-mixerClose_type mixerClose_orig;
-mixerMessage_type mixerMessage_orig;
-mixerGetLineInfoA_type mixerGetLineInfoA_orig;
-mixerGetLineInfoW_type mixerGetLineInfoW_orig;
-mixerGetID_type mixerGetID_orig;
-mixerGetLineControlsA_type mixerGetLineControlsA_orig;
-mixerGetLineControlsW_type mixerGetLineControlsW_orig;
-mixerGetControlDetailsA_type mixerGetControlDetailsA_orig;
-mixerGetControlDetailsW_type mixerGetControlDetailsW_orig;
-mixerSetControlDetails_type mixerSetControlDetails_orig;
-mmGetCurrentTask_type mmGetCurrentTask_orig;
-mmTaskBlock_type mmTaskBlock_orig;
-mmTaskCreate_type mmTaskCreate_orig;
-mmTaskSignal_type mmTaskSignal_orig;
-mmTaskYield_type mmTaskYield_orig;
-timeGetSystemTime_type timeGetSystemTime_orig;
-timeGetTime_type timeGetTime_orig;
-timeSetEvent_type timeSetEvent_orig;
-timeKillEvent_type timeKillEvent_orig;
-timeGetDevCaps_type timeGetDevCaps_orig;
-timeBeginPeriod_type timeBeginPeriod_orig;
-timeEndPeriod_type timeEndPeriod_orig;
-joyGetNumDevs_type joyGetNumDevs_orig;
-joyConfigChanged_type joyConfigChanged_orig;
-joyGetDevCapsA_type joyGetDevCapsA_orig;
-joyGetDevCapsW_type joyGetDevCapsW_orig;
-joyGetPos_type joyGetPos_orig;
-joyGetPosEx_type joyGetPosEx_orig;
-joyGetThreshold_type joyGetThreshold_orig;
-joyReleaseCapture_type joyReleaseCapture_orig;
-joySetCapture_type joySetCapture_orig;
-joySetThreshold_type joySetThreshold_orig;
-mmioStringToFOURCCA_type mmioStringToFOURCCA_orig;
-mmioStringToFOURCCW_type mmioStringToFOURCCW_orig;
-mmioInstallIOProcA_type mmioInstallIOProcA_orig;
-mmioInstallIOProcW_type mmioInstallIOProcW_orig;
-mmioOpenA_type mmioOpenA_orig;
-mmioOpenW_type mmioOpenW_orig;
-mmioRenameA_type mmioRenameA_orig;
-mmioRenameW_type mmioRenameW_orig;
-mmioClose_type mmioClose_orig;
-mmioRead_type mmioRead_orig;
-mmioWrite_type mmioWrite_orig;
-mmioSeek_type mmioSeek_orig;
-mmioGetInfo_type mmioGetInfo_orig;
-mmioSetInfo_type mmioSetInfo_orig;
-mmioSetBuffer_type mmioSetBuffer_orig;
-mmioFlush_type mmioFlush_orig;
-mmioAdvance_type mmioAdvance_orig;
-mmioSendMessage_type mmioSendMessage_orig;
-mmioDescend_type mmioDescend_orig;
-mmioAscend_type mmioAscend_orig;
-mmioCreateChunk_type mmioCreateChunk_orig;
-mciSendCommandA_type mciSendCommandA_orig;
-mciSendCommandW_type mciSendCommandW_orig;
-mciSendStringA_type mciSendStringA_orig;
-mciSendStringW_type mciSendStringW_orig;
-mciGetDeviceIDA_type mciGetDeviceIDA_orig;
-mciGetDeviceIDW_type mciGetDeviceIDW_orig;
-mciGetDeviceIDFromElementIDA_type mciGetDeviceIDFromElementIDA_orig;
-mciGetDeviceIDFromElementIDW_type mciGetDeviceIDFromElementIDW_orig;
-mciGetDriverData_type mciGetDriverData_orig;
-mciGetErrorStringA_type mciGetErrorStringA_orig;
-mciGetErrorStringW_type mciGetErrorStringW_orig;
-mciSetDriverData_type mciSetDriverData_orig;
-mciDriverNotify_type mciDriverNotify_orig;
-mciDriverYield_type mciDriverYield_orig;
-mciSetYieldProc_type mciSetYieldProc_orig;
-mciFreeCommandResource_type mciFreeCommandResource_orig;
-mciGetCreatorTask_type mciGetCreatorTask_orig;
-mciGetYieldProc_type mciGetYieldProc_orig;
-mciLoadCommandResource_type mciLoadCommandResource_orig;
-mciExecute_type mciExecute_orig;
-
-// grab pointers to function calls in the real DLL
-void init_function_pointers(HMODULE winmm_handle)
-{	
-	CloseDriver_orig = (CloseDriver_type)::GetProcAddress(winmm_handle, "CloseDriver");
-	OpenDriver_orig = (OpenDriver_type)::GetProcAddress(winmm_handle, "OpenDriver");
-	SendDriverMessage_orig = (SendDriverMessage_type)::GetProcAddress(winmm_handle, "SendDriverMessage");
-	DrvGetModuleHandle_orig = (DrvGetModuleHandle_type)::GetProcAddress(winmm_handle, "DrvGetModuleHandle");
-	GetDriverModuleHandle_orig = (GetDriverModuleHandle_type)::GetProcAddress(winmm_handle, "GetDriverModuleHandle");
-	DefDriverProc_orig = (DefDriverProc_type)::GetProcAddress(winmm_handle, "DefDriverProc");
-	DriverCallback_orig = (DriverCallback_type)::GetProcAddress(winmm_handle, "DriverCallback");
-	mmsystemGetVersion_orig = (mmsystemGetVersion_type)::GetProcAddress(winmm_handle, "mmsystemGetVersion");
-	sndPlaySoundA_orig = (sndPlaySoundA_type)::GetProcAddress(winmm_handle, "sndPlaySoundA");
-	sndPlaySoundW_orig = (sndPlaySoundW_type)::GetProcAddress(winmm_handle, "sndPlaySoundW");
-	PlaySoundA_orig = (PlaySoundA_type)::GetProcAddress(winmm_handle, "PlaySoundA");
-	PlaySoundW_orig = (PlaySoundW_type)::GetProcAddress(winmm_handle, "PlaySoundW");
-	waveOutGetNumDevs_orig = (waveOutGetNumDevs_type)::GetProcAddress(winmm_handle, "waveOutGetNumDevs");
-	waveOutGetDevCapsA_orig = (waveOutGetDevCapsA_type)::GetProcAddress(winmm_handle, "waveOutGetDevCapsA");
-	waveOutGetDevCapsW_orig = (waveOutGetDevCapsW_type)::GetProcAddress(winmm_handle, "waveOutGetDevCapsW");
-	waveOutGetVolume_orig = (waveOutGetVolume_type)::GetProcAddress(winmm_handle, "waveOutGetVolume");
-	waveOutSetVolume_orig = (waveOutSetVolume_type)::GetProcAddress(winmm_handle, "waveOutSetVolume");
-	waveOutGetErrorTextA_orig = (waveOutGetErrorTextA_type)::GetProcAddress(winmm_handle, "waveOutGetErrorTextA");
-	waveOutGetErrorTextW_orig = (waveOutGetErrorTextW_type)::GetProcAddress(winmm_handle, "waveOutGetErrorTextW");
-	waveOutOpen_orig = (waveOutOpen_type)::GetProcAddress(winmm_handle, "waveOutOpen");
-	waveOutClose_orig = (waveOutClose_type)::GetProcAddress(winmm_handle, "waveOutClose");
-	waveOutPrepareHeader_orig = (waveOutPrepareHeader_type)::GetProcAddress(winmm_handle, "waveOutPrepareHeader");
-	waveOutUnprepareHeader_orig = (waveOutUnprepareHeader_type)::GetProcAddress(winmm_handle, "waveOutUnprepareHeader");
-	waveOutWrite_orig = (waveOutWrite_type)::GetProcAddress(winmm_handle, "waveOutWrite");
-	waveOutPause_orig = (waveOutPause_type)::GetProcAddress(winmm_handle, "waveOutPause");
-	waveOutRestart_orig = (waveOutRestart_type)::GetProcAddress(winmm_handle, "waveOutRestart");
-	waveOutReset_orig = (waveOutReset_type)::GetProcAddress(winmm_handle, "waveOutReset");
-	waveOutBreakLoop_orig = (waveOutBreakLoop_type)::GetProcAddress(winmm_handle, "waveOutBreakLoop");
-	waveOutGetPosition_orig = (waveOutGetPosition_type)::GetProcAddress(winmm_handle, "waveOutGetPosition");
-	waveOutGetPitch_orig = (waveOutGetPitch_type)::GetProcAddress(winmm_handle, "waveOutGetPitch");
-	waveOutSetPitch_orig = (waveOutSetPitch_type)::GetProcAddress(winmm_handle, "waveOutSetPitch");
-	waveOutGetPlaybackRate_orig = (waveOutGetPlaybackRate_type)::GetProcAddress(winmm_handle, "waveOutGetPlaybackRate");
-	waveOutSetPlaybackRate_orig = (waveOutSetPlaybackRate_type)::GetProcAddress(winmm_handle, "waveOutSetPlaybackRate");
-	waveOutGetID_orig = (waveOutGetID_type)::GetProcAddress(winmm_handle, "waveOutGetID");
-	waveOutMessage_orig = (waveOutMessage_type)::GetProcAddress(winmm_handle, "waveOutMessage");
-	waveInGetNumDevs_orig = (waveInGetNumDevs_type)::GetProcAddress(winmm_handle, "waveInGetNumDevs");
-	waveInGetDevCapsA_orig = (waveInGetDevCapsA_type)::GetProcAddress(winmm_handle, "waveInGetDevCapsA");
-	waveInGetDevCapsW_orig = (waveInGetDevCapsW_type)::GetProcAddress(winmm_handle, "waveInGetDevCapsW");
-	waveInGetErrorTextA_orig = (waveInGetErrorTextA_type)::GetProcAddress(winmm_handle, "waveInGetErrorTextA");
-	waveInGetErrorTextW_orig = (waveInGetErrorTextW_type)::GetProcAddress(winmm_handle, "waveInGetErrorTextW");
-	waveInOpen_orig = (waveInOpen_type)::GetProcAddress(winmm_handle, "waveInOpen");
-	waveInClose_orig = (waveInClose_type)::GetProcAddress(winmm_handle, "waveInClose");
-	waveInPrepareHeader_orig = (waveInPrepareHeader_type)::GetProcAddress(winmm_handle, "waveInPrepareHeader");
-	waveInUnprepareHeader_orig = (waveInUnprepareHeader_type)::GetProcAddress(winmm_handle, "waveInUnprepareHeader");
-	waveInAddBuffer_orig = (waveInAddBuffer_type)::GetProcAddress(winmm_handle, "waveInAddBuffer");
-	waveInStart_orig = (waveInStart_type)::GetProcAddress(winmm_handle, "waveInStart");
-	waveInStop_orig = (waveInStop_type)::GetProcAddress(winmm_handle, "waveInStop");
-	waveInReset_orig = (waveInReset_type)::GetProcAddress(winmm_handle, "waveInReset");
-	waveInGetPosition_orig = (waveInGetPosition_type)::GetProcAddress(winmm_handle, "waveInGetPosition");
-	waveInGetID_orig = (waveInGetID_type)::GetProcAddress(winmm_handle, "waveInGetID");
-	waveInMessage_orig = (waveInMessage_type)::GetProcAddress(winmm_handle, "waveInMessage");
-	midiOutGetNumDevs_orig = (midiOutGetNumDevs_type)::GetProcAddress(winmm_handle, "midiOutGetNumDevs");
-	midiStreamOpen_orig = (midiStreamOpen_type)::GetProcAddress(winmm_handle, "midiStreamOpen");
-	midiStreamClose_orig = (midiStreamClose_type)::GetProcAddress(winmm_handle, "midiStreamClose");
-	midiStreamProperty_orig = (midiStreamProperty_type)::GetProcAddress(winmm_handle, "midiStreamProperty");
-	midiStreamPosition_orig = (midiStreamPosition_type)::GetProcAddress(winmm_handle, "midiStreamPosition");
-	midiStreamOut_orig = (midiStreamOut_type)::GetProcAddress(winmm_handle, "midiStreamOut");
-	midiStreamPause_orig = (midiStreamPause_type)::GetProcAddress(winmm_handle, "midiStreamPause");
-	midiStreamRestart_orig = (midiStreamRestart_type)::GetProcAddress(winmm_handle, "midiStreamRestart");
-	midiStreamStop_orig = (midiStreamStop_type)::GetProcAddress(winmm_handle, "midiStreamStop");
-	midiConnect_orig = (midiConnect_type)::GetProcAddress(winmm_handle, "midiConnect");
-	midiDisconnect_orig = (midiDisconnect_type)::GetProcAddress(winmm_handle, "midiDisconnect");
-	midiOutGetDevCapsA_orig = (midiOutGetDevCapsA_type)::GetProcAddress(winmm_handle, "midiOutGetDevCapsA");
-	midiOutGetDevCapsW_orig = (midiOutGetDevCapsW_type)::GetProcAddress(winmm_handle, "midiOutGetDevCapsW");
-	midiOutGetVolume_orig = (midiOutGetVolume_type)::GetProcAddress(winmm_handle, "midiOutGetVolume");
-	midiOutSetVolume_orig = (midiOutSetVolume_type)::GetProcAddress(winmm_handle, "midiOutSetVolume");
-	midiOutGetErrorTextA_orig = (midiOutGetErrorTextA_type)::GetProcAddress(winmm_handle, "midiOutGetErrorTextA");
-	midiOutGetErrorTextW_orig = (midiOutGetErrorTextW_type)::GetProcAddress(winmm_handle, "midiOutGetErrorTextW");
-	midiOutOpen_orig = (midiOutOpen_type)::GetProcAddress(winmm_handle, "midiOutOpen");
-	midiOutClose_orig = (midiOutClose_type)::GetProcAddress(winmm_handle, "midiOutClose");
-	midiOutPrepareHeader_orig = (midiOutPrepareHeader_type)::GetProcAddress(winmm_handle, "midiOutPrepareHeader");
-	midiOutUnprepareHeader_orig = (midiOutUnprepareHeader_type)::GetProcAddress(winmm_handle, "midiOutUnprepareHeader");
-	midiOutShortMsg_orig = (midiOutShortMsg_type)::GetProcAddress(winmm_handle, "midiOutShortMsg");
-	midiOutLongMsg_orig = (midiOutLongMsg_type)::GetProcAddress(winmm_handle, "midiOutLongMsg");
-	midiOutReset_orig = (midiOutReset_type)::GetProcAddress(winmm_handle, "midiOutReset");
-	midiOutCachePatches_orig = (midiOutCachePatches_type)::GetProcAddress(winmm_handle, "midiOutCachePatches");
-	midiOutCacheDrumPatches_orig = (midiOutCacheDrumPatches_type)::GetProcAddress(winmm_handle, "midiOutCacheDrumPatches");
-	midiOutGetID_orig = (midiOutGetID_type)::GetProcAddress(winmm_handle, "midiOutGetID");
-	midiOutMessage_orig = (midiOutMessage_type)::GetProcAddress(winmm_handle, "midiOutMessage");
-	midiInGetNumDevs_orig = (midiInGetNumDevs_type)::GetProcAddress(winmm_handle, "midiInGetNumDevs");
-	midiInGetDevCapsA_orig = (midiInGetDevCapsA_type)::GetProcAddress(winmm_handle, "midiInGetDevCapsA");
-	midiInGetDevCapsW_orig = (midiInGetDevCapsW_type)::GetProcAddress(winmm_handle, "midiInGetDevCapsW");
-	midiInGetErrorTextA_orig = (midiInGetErrorTextA_type)::GetProcAddress(winmm_handle, "midiInGetErrorTextA");
-	midiInGetErrorTextW_orig = (midiInGetErrorTextW_type)::GetProcAddress(winmm_handle, "midiInGetErrorTextW");
-	midiInOpen_orig = (midiInOpen_type)::GetProcAddress(winmm_handle, "midiInOpen");
-	midiInClose_orig = (midiInClose_type)::GetProcAddress(winmm_handle, "midiInClose");
-	midiInPrepareHeader_orig = (midiInPrepareHeader_type)::GetProcAddress(winmm_handle, "midiInPrepareHeader");
-	midiInUnprepareHeader_orig = (midiInUnprepareHeader_type)::GetProcAddress(winmm_handle, "midiInUnprepareHeader");
-	midiInAddBuffer_orig = (midiInAddBuffer_type)::GetProcAddress(winmm_handle, "midiInAddBuffer");
-	midiInStart_orig = (midiInStart_type)::GetProcAddress(winmm_handle, "midiInStart");
-	midiInStop_orig = (midiInStop_type)::GetProcAddress(winmm_handle, "midiInStop");
-	midiInReset_orig = (midiInReset_type)::GetProcAddress(winmm_handle, "midiInReset");
-	midiInGetID_orig = (midiInGetID_type)::GetProcAddress(winmm_handle, "midiInGetID");
-	midiInMessage_orig = (midiInMessage_type)::GetProcAddress(winmm_handle, "midiInMessage");
-	auxGetNumDevs_orig = (auxGetNumDevs_type)::GetProcAddress(winmm_handle, "auxGetNumDevs");
-	auxGetDevCapsA_orig = (auxGetDevCapsA_type)::GetProcAddress(winmm_handle, "auxGetDevCapsA");
-	auxGetDevCapsW_orig = (auxGetDevCapsW_type)::GetProcAddress(winmm_handle, "auxGetDevCapsW");
-	auxSetVolume_orig = (auxSetVolume_type)::GetProcAddress(winmm_handle, "auxSetVolume");
-	auxGetVolume_orig = (auxGetVolume_type)::GetProcAddress(winmm_handle, "auxGetVolume");
-	auxOutMessage_orig = (auxOutMessage_type)::GetProcAddress(winmm_handle, "auxOutMessage");
-	mixerGetNumDevs_orig = (mixerGetNumDevs_type)::GetProcAddress(winmm_handle, "mixerGetNumDevs");
-	mixerGetDevCapsA_orig = (mixerGetDevCapsA_type)::GetProcAddress(winmm_handle, "mixerGetDevCapsA");
-	mixerGetDevCapsW_orig = (mixerGetDevCapsW_type)::GetProcAddress(winmm_handle, "mixerGetDevCapsW");
-	mixerOpen_orig = (mixerOpen_type)::GetProcAddress(winmm_handle, "mixerOpen");
-	mixerClose_orig = (mixerClose_type)::GetProcAddress(winmm_handle, "mixerClose");
-	mixerMessage_orig = (mixerMessage_type)::GetProcAddress(winmm_handle, "mixerMessage");
-	mixerGetLineInfoA_orig = (mixerGetLineInfoA_type)::GetProcAddress(winmm_handle, "mixerGetLineInfoA");
-	mixerGetLineInfoW_orig = (mixerGetLineInfoW_type)::GetProcAddress(winmm_handle, "mixerGetLineInfoW");
-	mixerGetID_orig = (mixerGetID_type)::GetProcAddress(winmm_handle, "mixerGetID");
-	mixerGetLineControlsA_orig = (mixerGetLineControlsA_type)::GetProcAddress(winmm_handle, "mixerGetLineControlsA");
-	mixerGetLineControlsW_orig = (mixerGetLineControlsW_type)::GetProcAddress(winmm_handle, "mixerGetLineControlsW");
-	mixerGetControlDetailsA_orig = (mixerGetControlDetailsA_type)::GetProcAddress(winmm_handle, "mixerGetControlDetailsA");
-	mixerGetControlDetailsW_orig = (mixerGetControlDetailsW_type)::GetProcAddress(winmm_handle, "mixerGetControlDetailsW");
-	mixerSetControlDetails_orig = (mixerSetControlDetails_type)::GetProcAddress(winmm_handle, "mixerSetControlDetails");
-	mmGetCurrentTask_orig = (mmGetCurrentTask_type)::GetProcAddress(winmm_handle, "mmGetCurrentTask");
-	mmTaskBlock_orig = (mmTaskBlock_type)::GetProcAddress(winmm_handle, "mmTaskBlock");
-	mmTaskCreate_orig = (mmTaskCreate_type)::GetProcAddress(winmm_handle, "mmTaskCreate");
-	mmTaskSignal_orig = (mmTaskSignal_type)::GetProcAddress(winmm_handle, "mmTaskSignal");
-	mmTaskYield_orig = (mmTaskYield_type)::GetProcAddress(winmm_handle, "mmTaskYield");
-	timeGetSystemTime_orig = (timeGetSystemTime_type)::GetProcAddress(winmm_handle, "timeGetSystemTime");
-	timeGetTime_orig = (timeGetTime_type)::GetProcAddress(winmm_handle, "timeGetTime");
-	timeSetEvent_orig = (timeSetEvent_type)::GetProcAddress(winmm_handle, "timeSetEvent");
-	timeKillEvent_orig = (timeKillEvent_type)::GetProcAddress(winmm_handle, "timeKillEvent");
-	timeGetDevCaps_orig = (timeGetDevCaps_type)::GetProcAddress(winmm_handle, "timeGetDevCaps");
-	timeBeginPeriod_orig = (timeBeginPeriod_type)::GetProcAddress(winmm_handle, "timeBeginPeriod");
-	timeEndPeriod_orig = (timeEndPeriod_type)::GetProcAddress(winmm_handle, "timeEndPeriod");
-	joyGetNumDevs_orig = (joyGetNumDevs_type)::GetProcAddress(winmm_handle, "joyGetNumDevs");
-	joyConfigChanged_orig = (joyConfigChanged_type)::GetProcAddress(winmm_handle, "joyConfigChanged");
-	joyGetDevCapsA_orig = (joyGetDevCapsA_type)::GetProcAddress(winmm_handle, "joyGetDevCapsA");
-	joyGetDevCapsW_orig = (joyGetDevCapsW_type)::GetProcAddress(winmm_handle, "joyGetDevCapsW");
-	joyGetPos_orig = (joyGetPos_type)::GetProcAddress(winmm_handle, "joyGetPos");
-	joyGetPosEx_orig = (joyGetPosEx_type)::GetProcAddress(winmm_handle, "joyGetPosEx");
-	joyGetThreshold_orig = (joyGetThreshold_type)::GetProcAddress(winmm_handle, "joyGetThreshold");
-	joyReleaseCapture_orig = (joyReleaseCapture_type)::GetProcAddress(winmm_handle, "joyReleaseCapture");
-	joySetCapture_orig = (joySetCapture_type)::GetProcAddress(winmm_handle, "joySetCapture");
-	joySetThreshold_orig = (joySetThreshold_type)::GetProcAddress(winmm_handle, "joySetThreshold");
-	mciDriverNotify_orig = (mciDriverNotify_type)::GetProcAddress(winmm_handle, "mciDriverNotify");
-	mciDriverYield_orig = (mciDriverYield_type)::GetProcAddress(winmm_handle, "mciDriverYield");
-	mmioStringToFOURCCA_orig = (mmioStringToFOURCCA_type)::GetProcAddress(winmm_handle, "mmioStringToFOURCCA");
-	mmioStringToFOURCCW_orig = (mmioStringToFOURCCW_type)::GetProcAddress(winmm_handle, "mmioStringToFOURCCW");
-	mmioInstallIOProcA_orig = (mmioInstallIOProcA_type)::GetProcAddress(winmm_handle, "mmioInstallIOProcA");
-	mmioInstallIOProcW_orig = (mmioInstallIOProcW_type)::GetProcAddress(winmm_handle, "mmioInstallIOProcW");
-	mmioOpenA_orig = (mmioOpenA_type)::GetProcAddress(winmm_handle, "mmioOpenA");
-	mmioOpenW_orig = (mmioOpenW_type)::GetProcAddress(winmm_handle, "mmioOpenW");
-	mmioRenameA_orig = (mmioRenameA_type)::GetProcAddress(winmm_handle, "mmioRenameA");
-	mmioRenameW_orig = (mmioRenameW_type)::GetProcAddress(winmm_handle, "mmioRenameW");
-	mmioClose_orig = (mmioClose_type)::GetProcAddress(winmm_handle, "mmioClose");
-	mmioRead_orig = (mmioRead_type)::GetProcAddress(winmm_handle, "mmioRead");
-	mmioWrite_orig = (mmioWrite_type)::GetProcAddress(winmm_handle, "mmioWrite");
-	mmioSeek_orig = (mmioSeek_type)::GetProcAddress(winmm_handle, "mmioSeek");
-	mmioGetInfo_orig = (mmioGetInfo_type)::GetProcAddress(winmm_handle, "mmioGetInfo");
-	mmioSetInfo_orig = (mmioSetInfo_type)::GetProcAddress(winmm_handle, "mmioSetInfo");
-	mmioSetBuffer_orig = (mmioSetBuffer_type)::GetProcAddress(winmm_handle, "mmioSetBuffer");
-	mmioFlush_orig = (mmioFlush_type)::GetProcAddress(winmm_handle, "mmioFlush");
-	mmioAdvance_orig = (mmioAdvance_type)::GetProcAddress(winmm_handle, "mmioAdvance");
-	mmioSendMessage_orig = (mmioSendMessage_type)::GetProcAddress(winmm_handle, "mmioSendMessage");
-	mmioDescend_orig = (mmioDescend_type)::GetProcAddress(winmm_handle, "mmioDescend");
-	mmioAscend_orig = (mmioAscend_type)::GetProcAddress(winmm_handle, "mmioAscend");
-	mmioCreateChunk_orig = (mmioCreateChunk_type)::GetProcAddress(winmm_handle, "mmioCreateChunk");
-	mciSendCommandA_orig = (mciSendCommandA_type)::GetProcAddress(winmm_handle, "mciSendCommandA");
-	mciSendCommandW_orig = (mciSendCommandW_type)::GetProcAddress(winmm_handle, "mciSendCommandW");
-	mciSendStringA_orig = (mciSendStringA_type)::GetProcAddress(winmm_handle, "mciSendStringA");
-	mciSendStringW_orig = (mciSendStringW_type)::GetProcAddress(winmm_handle, "mciSendStringW");
-	mciGetDeviceIDA_orig = (mciGetDeviceIDA_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDA");
-	mciGetDeviceIDW_orig = (mciGetDeviceIDW_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDW");
-	mciGetDeviceIDFromElementIDA_orig = (mciGetDeviceIDFromElementIDA_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDFromElementIDA");
-	mciGetDeviceIDFromElementIDW_orig = (mciGetDeviceIDFromElementIDW_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDFromElementIDW");
-	mciGetDriverData_orig = (mciGetDriverData_type)::GetProcAddress(winmm_handle, "mciGetDriverData");
-	mciGetErrorStringA_orig = (mciGetErrorStringA_type)::GetProcAddress(winmm_handle, "mciGetErrorStringA");
-	mciGetErrorStringW_orig = (mciGetErrorStringW_type)::GetProcAddress(winmm_handle, "mciGetErrorStringW");
-	mciSetDriverData_orig = (mciSetDriverData_type)::GetProcAddress(winmm_handle, "mciSetDriverData");
-	mciSetYieldProc_orig = (mciSetYieldProc_type)::GetProcAddress(winmm_handle, "mciSetYieldProc");
-	mciFreeCommandResource_orig = (mciFreeCommandResource_type)::GetProcAddress(winmm_handle, "mciFreeCommandResource");
-	mciGetCreatorTask_orig = (mciGetCreatorTask_type)::GetProcAddress(winmm_handle, "mciGetCreatorTask");
-	mciGetYieldProc_orig = (mciGetYieldProc_type)::GetProcAddress(winmm_handle, "mciGetYieldProc");
-	mciLoadCommandResource_orig = (mciLoadCommandResource_type)::GetProcAddress(winmm_handle, "mciLoadCommandResource");
-	mciExecute_orig = (mciExecute_type)::GetProcAddress(winmm_handle, "mciExecute");
-}
-
-extern "C" {
-	LRESULT   WINAPI CloseDriver( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"CloseDriver\n");
-		return CloseDriver_orig( hDriver, lParam1, lParam2);
-	}
-
-	HDRVR     WINAPI OpenDriver( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"OpenDriver\n");
-		return OpenDriver_orig( szDriverName, szSectionName, lParam2);
-	}
-
-	LRESULT   WINAPI SendDriverMessage( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"SendDriverMessage\n");
-		return SendDriverMessage_orig( hDriver, message, lParam1, lParam2);
-	}
-
-	HMODULE   WINAPI DrvGetModuleHandle( HDRVR hDriver)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"DrvGetModuleHandle\n");
-		return DrvGetModuleHandle_orig( hDriver);
-	}
-
-	HMODULE   WINAPI GetDriverModuleHandle( HDRVR hDriver)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"GetDriverModuleHandle\n");
-		return GetDriverModuleHandle_orig( hDriver);
-	}
-
-	LRESULT   WINAPI DefDriverProc( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"DefDriverProc\n");
-		return DefDriverProc_orig( dwDriverIdentifier, hdrvr, uMsg, lParam1, lParam2);
-	}
-
-	BOOL WINAPI DriverCallback( DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"DriverCallback\n");
-		return DriverCallback_orig(dwCallBack, dwFlags, hdrvr, msg, dwUser, dwParam1, dwParam2);
-	}
-
-	UINT WINAPI mmsystemGetVersion(void)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmsystemGetVersion\n");
-		return mmsystemGetVersion_orig();
-	}
-
-	BOOL WINAPI sndPlaySoundA( LPCSTR pszSound, UINT fuSound)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"sndPlaySoundA\n");
-		return sndPlaySoundA_orig( pszSound, fuSound);
-	}
-
-	BOOL WINAPI sndPlaySoundW( LPCWSTR pszSound, UINT fuSound)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"sndPlaySoundW\n");
-		return sndPlaySoundW_orig( pszSound, fuSound);
-	}
-
-	BOOL WINAPI PlaySoundA( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"PlaySoundA\n");
-		return PlaySoundA_orig( pszSound, hmod, fdwSound);
-	}
-
-	BOOL WINAPI PlaySoundW( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"PlaySoundW\n");
-		return PlaySoundW_orig( pszSound, hmod, fdwSound);
-	}
-
-	UINT WINAPI waveOutGetNumDevs(void)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutGetNumDevs\n");
-		return waveOutGetNumDevs_orig();
-	}
-
-	MMRESULT WINAPI waveOutGetDevCapsA( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutGetDevCapsA\n");
-		return waveOutGetDevCapsA_orig( uDeviceID, pwoc, cbwoc);
-	}
-
-	MMRESULT WINAPI waveOutGetDevCapsW( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutGetDevCapsW\n");
-		return waveOutGetDevCapsW_orig( uDeviceID, pwoc, cbwoc);
-	}
-
-
-	MMRESULT WINAPI waveOutGetVolume( HWAVEOUT hwo, LPDWORD pdwVolume)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutGetVolume\n");
-		return waveOutGetVolume_orig( hwo, pdwVolume);
-	}
-
-	MMRESULT WINAPI waveOutSetVolume( HWAVEOUT hwo, DWORD dwVolume)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutSetVolume\n");
-		return waveOutSetVolume_orig( hwo, dwVolume);
-	}
-
-	MMRESULT WINAPI waveOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutGetErrorTextA\n");
-		return waveOutGetErrorTextA_orig( mmrError, pszText, cchText);
-	}
-
-	MMRESULT WINAPI waveOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutGetErrorTextW\n");
-		return waveOutGetErrorTextW_orig( mmrError, pszText, cchText);
-	}
-
-	//MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
-	//{
-	//	//OutputDebugString(L"waveOutGetErrorTextW\n");
-	//	return waveOutOpen_orig( phwo, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen);
-	//}
-
-	//MMRESULT WINAPI waveOutClose( HWAVEOUT hwo)
-	//{
-	//	//OutputDebugString(L"waveOutGetErrorTextW\n");
-	//	return waveOutClose_orig( hwo );
-	//}
-
-	MMRESULT WINAPI waveOutPrepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutPrepareHeader\n");
-		return waveOutPrepareHeader_orig( hwo, pwh, cbwh);
-	}
-
-	MMRESULT WINAPI waveOutUnprepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutUnprepareHeader\n");
-		return waveOutUnprepareHeader_orig( hwo, pwh, cbwh);
-	}
-
-
-	//MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
-	//{
-	//	//OutputDebugString(L"waveOutUnprepareHeader\n");
-	//	return waveOutWrite_orig( hwo, pwh, cbwh);
-	//}
-
-	MMRESULT WINAPI waveOutPause( HWAVEOUT hwo)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutPause\n");
-		return waveOutPause_orig( hwo);
-	}
-
-	MMRESULT WINAPI waveOutRestart( HWAVEOUT hwo)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutRestart\n");
-		return waveOutRestart_orig( hwo);
-	}
-
-	MMRESULT WINAPI waveOutReset( HWAVEOUT hwo)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutReset\n");
-		return waveOutReset_orig( hwo);
-	}
-
-	MMRESULT WINAPI waveOutBreakLoop( HWAVEOUT hwo)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutBreakLoop\n");
-		return waveOutBreakLoop_orig( hwo);
-	}
-
-	MMRESULT WINAPI waveOutGetPosition( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutGetPosition\n");
-		return waveOutGetPosition_orig( hwo, pmmt, cbmmt);
-	}
-
-	MMRESULT WINAPI waveOutGetPitch( HWAVEOUT hwo, LPDWORD pdwPitch)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutGetPitch\n");
-		return waveOutGetPitch_orig( hwo, pdwPitch);
-	}
-
-	MMRESULT WINAPI waveOutSetPitch( HWAVEOUT hwo, DWORD dwPitch)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutSetPitch\n");
-		return waveOutSetPitch_orig( hwo, dwPitch);
-	}
-
-	MMRESULT WINAPI waveOutGetPlaybackRate( HWAVEOUT hwo, LPDWORD pdwRate)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutGetPlaybackRate\n");
-		return waveOutGetPlaybackRate_orig( hwo, pdwRate);
-	}
-
-	MMRESULT WINAPI waveOutSetPlaybackRate( HWAVEOUT hwo, DWORD dwRate)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutSetPlaybackRate\n");
-		return waveOutSetPlaybackRate_orig( hwo, dwRate);
-	}
-
-	MMRESULT WINAPI waveOutGetID( HWAVEOUT hwo, LPUINT puDeviceID)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutGetID\n");
-		return waveOutGetID_orig( hwo, puDeviceID);
-	}
-
-	MMRESULT WINAPI waveOutMessage( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveOutMessage\n");
-		return waveOutMessage_orig( hwo, uMsg, dw1, dw2);
-	}
-
-	UINT WINAPI waveInGetNumDevs(void)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInGetNumDevs\n");
-		return waveInGetNumDevs_orig();
-	}
-
-	MMRESULT WINAPI waveInGetDevCapsA( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInGetDevCapsA\n");
-		return waveInGetDevCapsA_orig( uDeviceID, pwic, cbwic);
-	}
-
-	MMRESULT WINAPI waveInGetDevCapsW( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInGetDevCapsW\n");
-		return waveInGetDevCapsW_orig( uDeviceID, pwic, cbwic);
-	}
-
-	MMRESULT WINAPI waveInGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInGetErrorTextA\n");
-		return waveInGetErrorTextA_orig(mmrError, pszText, cchText);
-	}
-
-	MMRESULT WINAPI waveInGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInGetErrorTextW\n");
-		return waveInGetErrorTextW_orig(mmrError, pszText, cchText);
-	}
-
-	MMRESULT WINAPI waveInOpen( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInOpen\n");
-		return waveInOpen_orig(phwi, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen);
-	}
-
-	MMRESULT WINAPI waveInClose( HWAVEIN hwi)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInClose\n");
-		return waveInClose_orig( hwi);
-	}
-
-	MMRESULT WINAPI waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInPrepareHeader\n");
-		return waveInPrepareHeader_orig( hwi, pwh, cbwh);
-	}
-
-	MMRESULT WINAPI waveInUnprepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInUnprepareHeader\n");
-		return waveInUnprepareHeader_orig( hwi, pwh, cbwh);
-	}
-
-	MMRESULT WINAPI waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInAddBuffer\n");
-		return waveInAddBuffer_orig( hwi, pwh, cbwh);
-	}
-
-	MMRESULT WINAPI waveInStart( HWAVEIN hwi)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInStart\n");
-		return waveInStart_orig( hwi);
-	}
-
-	MMRESULT WINAPI waveInStop( HWAVEIN hwi)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInStop\n");
-		return waveInStop_orig(hwi);
-	}
-
-	MMRESULT WINAPI waveInReset( HWAVEIN hwi)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInReset\n");
-		return waveInReset_orig(hwi);
-	}
-
-	MMRESULT WINAPI waveInGetPosition( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInGetPosition\n");
-		return waveInGetPosition_orig( hwi, pmmt, cbmmt);
-	}
-
-	MMRESULT WINAPI waveInGetID( HWAVEIN hwi, LPUINT puDeviceID)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInGetID\n");
-		return waveInGetID_orig( hwi, puDeviceID);
-	}
-
-	MMRESULT WINAPI waveInMessage( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"waveInMessage\n");
-		return waveInMessage_orig( hwi, uMsg, dw1, dw2);
-	}
-
-	UINT WINAPI midiOutGetNumDevs(void)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutGetNumDevs\n");
-		return midiOutGetNumDevs_orig();
-	}
-
-	MMRESULT WINAPI midiStreamOpen( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiStreamOpen\n");
-		return midiStreamOpen_orig( phms, puDeviceID, cMidi, dwCallback, dwInstance, fdwOpen);
-	}
-
-	MMRESULT WINAPI midiStreamClose( HMIDISTRM hms)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiStreamClose\n");
-		return midiStreamClose_orig( hms);
-	}
-
-	MMRESULT WINAPI midiStreamProperty( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiStreamProperty\n");
-		return midiStreamProperty_orig( hms, lppropdata, dwProperty);
-	}
-
-	MMRESULT WINAPI midiStreamPosition( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiStreamPosition\n");
-		return midiStreamPosition_orig( hms, lpmmt, cbmmt);
-	}
-
-	MMRESULT WINAPI midiStreamOut( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiStreamOut\n");
-		return midiStreamOut_orig( hms, pmh, cbmh);
-	}
-
-	MMRESULT WINAPI midiStreamPause( HMIDISTRM hms)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiStreamPause\n");
-		return midiStreamPause_orig( hms);
-	}
-
-	MMRESULT WINAPI midiStreamRestart( HMIDISTRM hms)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiStreamRestart\n");
-		return midiStreamRestart_orig( hms);
-	}
-
-	MMRESULT WINAPI midiStreamStop( HMIDISTRM hms)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiStreamStop\n");
-		return midiStreamStop_orig( hms);
-	}
-
-	MMRESULT WINAPI midiConnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiConnect\n");
-		return midiConnect_orig( hmi, hmo, pReserved);
-	}
-
-	MMRESULT WINAPI midiDisconnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiDisconnect\n");
-		return midiDisconnect_orig( hmi, hmo, pReserved);
-	}
-
-	MMRESULT WINAPI midiOutGetDevCapsA( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutGetDevCapsA\n");
-		return midiOutGetDevCapsA_orig( uDeviceID, pmoc, cbmoc);
-	}
-
-	MMRESULT WINAPI midiOutGetDevCapsW( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutGetDevCapsW\n");
-		return midiOutGetDevCapsW_orig( uDeviceID, pmoc, cbmoc);
-	}
-
-	MMRESULT WINAPI midiOutGetVolume( HMIDIOUT hmo, LPDWORD pdwVolume)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutGetVolume\n");
-		return midiOutGetVolume_orig( hmo, pdwVolume);
-	}
-
-	MMRESULT WINAPI midiOutSetVolume( HMIDIOUT hmo, DWORD dwVolume)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutSetVolume\n");
-		return midiOutSetVolume_orig( hmo, dwVolume);
-	}
-
-	MMRESULT WINAPI midiOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutGetErrorTextA\n");
-		return midiOutGetErrorTextA_orig( mmrError, pszText, cchText);
-	}
-
-	MMRESULT WINAPI midiOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutGetErrorTextW\n");
-		return midiOutGetErrorTextW_orig( mmrError, pszText, cchText);
-	}
-
-	MMRESULT WINAPI midiOutOpen( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutOpen\n");
-		return midiOutOpen_orig(phmo, uDeviceID, dwCallback, dwInstance, fdwOpen);
-	}
-
-	MMRESULT WINAPI midiOutClose( HMIDIOUT hmo)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutClose\n");
-		return midiOutClose_orig( hmo);
-	}
-
-	MMRESULT WINAPI midiOutPrepareHeader( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutPrepareHeader\n");
-		return midiOutPrepareHeader_orig( hmo, pmh, cbmh);
-	}
-
-	MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutUnprepareHeader\n");
-		return midiOutUnprepareHeader_orig(hmo, pmh, cbmh);
-	}
-
-	MMRESULT WINAPI midiOutShortMsg( HMIDIOUT hmo, DWORD dwMsg)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutShortMsg\n");
-		return midiOutShortMsg_orig( hmo, dwMsg);
-	}
-
-	MMRESULT WINAPI midiOutLongMsg(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutLongMsg\n");
-		return midiOutLongMsg_orig(hmo, pmh, cbmh);
-	}
-
-	MMRESULT WINAPI midiOutReset( HMIDIOUT hmo)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutReset\n");
-		return midiOutReset_orig( hmo);
-	}
-
-	MMRESULT WINAPI midiOutCachePatches( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutCachePatches\n");
-		return midiOutCachePatches_orig( hmo, uBank, pwpa, fuCache);
-	}
-
-	MMRESULT WINAPI midiOutCacheDrumPatches( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutCacheDrumPatches\n");
-		return midiOutCacheDrumPatches_orig( hmo, uPatch, pwkya, fuCache);
-	}
-
-	MMRESULT WINAPI midiOutGetID( HMIDIOUT hmo, LPUINT puDeviceID)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutGetID\n");
-		return midiOutGetID_orig( hmo, puDeviceID);
-	}
-
-	MMRESULT WINAPI midiOutMessage( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiOutMessage\n");
-		return midiOutMessage_orig( hmo, uMsg, dw1, dw2);
-	}
-
-	UINT WINAPI midiInGetNumDevs(void)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiInGetNumDevs\n");
-		return midiInGetNumDevs_orig();
-	}
-
-	MMRESULT WINAPI midiInGetDevCapsA( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiInGetDevCapsA\n");
-		return midiInGetDevCapsA_orig( uDeviceID, pmic, cbmic);
-	}
-
-	MMRESULT WINAPI midiInGetDevCapsW( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiInGetDevCapsW\n");
-		return midiInGetDevCapsW_orig( uDeviceID, pmic, cbmic);
-	}
-
-	MMRESULT WINAPI midiInGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiInGetErrorTextA\n");
-		return midiInGetErrorTextA_orig( mmrError, pszText, cchText);
-	}
-
-	MMRESULT WINAPI midiInGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiInGetErrorTextW\n");
-		return midiInGetErrorTextW_orig( mmrError, pszText, cchText);
-	}
-
-	MMRESULT WINAPI midiInOpen( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiInOpen\n");
-		return midiInOpen_orig(phmi, uDeviceID, dwCallback, dwInstance, fdwOpen);
-	}
-
-	MMRESULT WINAPI midiInClose( HMIDIIN hmi)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiInClose\n");
-		return midiInClose_orig( hmi);
-	}
-
-	MMRESULT WINAPI midiInPrepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiInPrepareHeader\n");
-		return midiInPrepareHeader_orig( hmi, pmh, cbmh);
-	}
-
-	MMRESULT WINAPI midiInUnprepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiInUnprepareHeader\n");
-		return midiInUnprepareHeader_orig( hmi, pmh, cbmh);
-	}
-
-	MMRESULT WINAPI midiInAddBuffer( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiInAddBuffer\n");
-		return midiInAddBuffer_orig( hmi, pmh, cbmh);
-	}
-
-	MMRESULT WINAPI midiInStart( HMIDIIN hmi)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiInStart\n");
-		return midiInStart_orig( hmi);
-	}
-
-	MMRESULT WINAPI midiInStop( HMIDIIN hmi)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiInStop\n");
-		return midiInStop_orig(hmi);
-	}
-
-	MMRESULT WINAPI midiInReset( HMIDIIN hmi)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiInReset\n");
-		return midiInReset_orig( hmi);
-	}
-
-	MMRESULT WINAPI midiInGetID( HMIDIIN hmi, LPUINT puDeviceID)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiInGetID\n");
-		return midiInGetID_orig( hmi, puDeviceID);
-	}
-
-	MMRESULT WINAPI midiInMessage( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"midiInMessage\n");
-		return midiInMessage_orig( hmi, uMsg, dw1, dw2);
-	}
-
-	UINT WINAPI auxGetNumDevs(void)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"auxGetNumDevs\n");
-		return auxGetNumDevs_orig();
-	}
-
-	MMRESULT WINAPI auxGetDevCapsA( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"auxGetDevCapsA\n");
-		return auxGetDevCapsA_orig( uDeviceID, pac, cbac);
-	}
-
-	MMRESULT WINAPI auxGetDevCapsW( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"auxGetDevCapsW\n");
-		return auxGetDevCapsW_orig( uDeviceID, pac, cbac);
-	}
-
-	MMRESULT WINAPI auxSetVolume( UINT uDeviceID, DWORD dwVolume)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"auxSetVolume\n");
-		return auxSetVolume_orig( uDeviceID, dwVolume);
-	}
-
-	MMRESULT WINAPI auxGetVolume( UINT uDeviceID, LPDWORD pdwVolume)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"auxGetVolume\n");
-		return auxGetVolume_orig( uDeviceID, pdwVolume);
-	}
-
-	MMRESULT WINAPI auxOutMessage( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"auxOutMessage\n");
-		return auxOutMessage_orig( uDeviceID, uMsg, dw1, dw2);
-	}
-
-	UINT WINAPI mixerGetNumDevs(void)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mixerGetNumDevs\n");
-		return mixerGetNumDevs_orig();
-	}
-
-	MMRESULT WINAPI mixerGetDevCapsA( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mixerGetDevCapsA\n");
-		return mixerGetDevCapsA_orig( uMxId, pmxcaps, cbmxcaps);
-	}
-
-	MMRESULT WINAPI mixerGetDevCapsW( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mixerGetDevCapsW\n");
-		return mixerGetDevCapsW_orig( uMxId, pmxcaps, cbmxcaps);
-	}
-
-	MMRESULT WINAPI mixerOpen( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mixerOpen\n");
-		return mixerOpen_orig( phmx, uMxId, dwCallback, dwInstance, fdwOpen);
-	}
-
-	MMRESULT WINAPI mixerClose( HMIXER hmx)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mixerClose\n");
-		return mixerClose_orig( hmx);
-	}
-
-	DWORD WINAPI mixerMessage( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mixerMessage\n");
-		return mixerMessage_orig( hmx, uMsg, dwParam1, dwParam2);
-	}
-
-	MMRESULT WINAPI mixerGetLineInfoA( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mixerGetLineInfoA\n");
-		return mixerGetLineInfoA_orig( hmxobj, pmxl, fdwInfo);
-	}
-
-	MMRESULT WINAPI mixerGetLineInfoW( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mixerGetLineInfoW\n");
-		return mixerGetLineInfoW_orig( hmxobj, pmxl, fdwInfo);
-	}
-
-	MMRESULT WINAPI mixerGetID( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mixerGetID\n");
-		return mixerGetID_orig( hmxobj, puMxId, fdwId);
-	}
-
-	MMRESULT WINAPI mixerGetLineControlsA( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mixerGetLineControlsA\n");
-		return mixerGetLineControlsA_orig( hmxobj, pmxlc, fdwControls);
-	}
-
-	MMRESULT WINAPI mixerGetLineControlsW( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mixerGetLineControlsW\n");
-		return mixerGetLineControlsW_orig( hmxobj, pmxlc, fdwControls);
-	}
-
-	MMRESULT WINAPI mixerGetControlDetailsA( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mixerGetControlDetailsA\n");
-		return mixerGetControlDetailsA_orig( hmxobj, pmxcd, fdwDetails);
-	}
-
-	MMRESULT WINAPI mixerGetControlDetailsW( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mixerGetControlDetailsW\n");
-		return mixerGetControlDetailsW_orig( hmxobj, pmxcd, fdwDetails);
-	}
-
-	MMRESULT WINAPI mixerSetControlDetails( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mixerSetControlDetails\n");
-		return mixerSetControlDetails_orig( hmxobj, pmxcd, fdwDetails);
-	}
-
-	DWORD    WINAPI mmGetCurrentTask(void)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmGetCurrentTask\n");
-		return mmGetCurrentTask_orig();
-	}
-
-	void WINAPI mmTaskBlock(DWORD val)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmTaskBlock\n");
-		return mmTaskBlock_orig(val);
-	}
-
-	UINT WINAPI mmTaskCreate(LPTASKCALLBACK a, HANDLE* b, DWORD_PTR c)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmTaskCreate\n");
-		return mmTaskCreate_orig(a, b, c);
-	}
-
-	BOOL WINAPI mmTaskSignal(DWORD a)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmTaskSignal\n");
-		return mmTaskSignal_orig(a);
-	}
-
-	VOID WINAPI mmTaskYield()
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmTaskYield\n");
-		mmTaskYield_orig();
-	}
-
-	MMRESULT WINAPI timeGetSystemTime( LPMMTIME pmmt, UINT cbmmt)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"timeGetSystemTime\n");
-		return timeGetSystemTime_orig( pmmt, cbmmt);
-	}
-
-	DWORD WINAPI timeGetTime(void)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"timeGetTime\n");
-		return timeGetTime_orig();
-	}
-
-	MMRESULT WINAPI timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"timeSetEvent\n");
-		return timeSetEvent_orig(uDelay, uResolution, fptc, dwUser, fuEvent);
-	}
-
-	MMRESULT WINAPI timeKillEvent( UINT uTimerID)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"timeKillEvent\n");
-		return timeKillEvent_orig( uTimerID);
-	}
-
-	MMRESULT WINAPI timeGetDevCaps( LPTIMECAPS ptc, UINT cbtc)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"timeGetDevCaps\n");
-		return timeGetDevCaps_orig( ptc, cbtc);
-	}
-
-	MMRESULT WINAPI timeBeginPeriod( UINT uPeriod)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"timeBeginPeriod\n");
-		return timeBeginPeriod_orig( uPeriod);
-	}
-
-	MMRESULT WINAPI timeEndPeriod( UINT uPeriod)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"timeEndPeriod\n");
-		return timeEndPeriod_orig( uPeriod);
-	}
-
-	UINT WINAPI joyGetNumDevs(void)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"joyGetNumDevs\n");
-		return joyGetNumDevs_orig();
-	}
-
-	MMRESULT WINAPI joyConfigChanged(DWORD dwFlags)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"joyConfigChanged\n");
-		return joyConfigChanged_orig(dwFlags);
-	}
-
-	MMRESULT WINAPI joyGetDevCapsA( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"joyGetDevCapsA\n");
-		return joyGetDevCapsA_orig( uJoyID, pjc, cbjc);
-	}
-
-	MMRESULT WINAPI joyGetDevCapsW( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"joyGetDevCapsW\n");
-		return joyGetDevCapsW_orig( uJoyID, pjc, cbjc);
-	}
-
-	MMRESULT WINAPI joyGetPos( UINT uJoyID, LPJOYINFO pji)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"joyGetPos\n");
-		return joyGetPos_orig( uJoyID, pji);
-	}
-
-	MMRESULT WINAPI joyGetPosEx( UINT uJoyID, LPJOYINFOEX pji)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"joyGetPosEx\n");
-		return joyGetPosEx_orig( uJoyID, pji);
-	}
-
-	MMRESULT WINAPI joyGetThreshold( UINT uJoyID, LPUINT puThreshold)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"joyGetThreshold\n");
-		return joyGetThreshold_orig( uJoyID, puThreshold);
-	}
-
-	MMRESULT WINAPI joyReleaseCapture( UINT uJoyID)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"joyReleaseCapture\n");
-		return joyReleaseCapture_orig( uJoyID);
-	}
-
-	MMRESULT WINAPI joySetCapture( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"joySetCapture\n");
-		return joySetCapture_orig(hwnd, uJoyID, uPeriod, fChanged);
-	}
-
-	MMRESULT WINAPI joySetThreshold( UINT uJoyID, UINT uThreshold)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"joySetThreshold\n");
-		return joySetThreshold_orig( uJoyID, uThreshold);
-	}
-
-	BOOL WINAPI mciDriverNotify(HANDLE hwndCallback, MCIDEVICEID uDeviceID, UINT uStatus)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciDriverNotify\n");
-		return mciDriverNotify_orig(hwndCallback, uDeviceID, uStatus);
-	}
-
-	UINT WINAPI  mciDriverYield(UINT uDeviceID)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciDriverYield\n");
-		return mciDriverYield_orig(uDeviceID);
-	}	
-
-	FOURCC WINAPI mmioStringToFOURCCA( LPCSTR sz, UINT uFlags)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioStringToFOURCCA\n");
-		return mmioStringToFOURCCA_orig( sz, uFlags);
-	}
-
-	FOURCC WINAPI mmioStringToFOURCCW( LPCWSTR sz, UINT uFlags)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioStringToFOURCCW\n");
-		return mmioStringToFOURCCW_orig( sz, uFlags);
-	}
-
-	LPMMIOPROC WINAPI mmioInstallIOProcA( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioInstallIOProcA\n");
-		return mmioInstallIOProcA_orig( fccIOProc, pIOProc, dwFlags);
-	}
-
-	LPMMIOPROC WINAPI mmioInstallIOProcW( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioInstallIOProcW\n");
-		return mmioInstallIOProcW_orig( fccIOProc, pIOProc, dwFlags);
-	}
-
-	HMMIO WINAPI mmioOpenA( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioOpenA\n");
-		return mmioOpenA_orig( pszFileName, pmmioinfo, fdwOpen);
-	}
-
-	HMMIO WINAPI mmioOpenW( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioOpenW\n");
-		return mmioOpenW_orig( pszFileName, pmmioinfo, fdwOpen);
-	}
-
-	MMRESULT WINAPI mmioRenameA( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioRenameA\n");
-		return mmioRenameA_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename);
-	}
-
-	MMRESULT WINAPI mmioRenameW( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioRenameW\n");
-		return mmioRenameW_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename);
-	}
-
-	MMRESULT WINAPI mmioClose( HMMIO hmmio, UINT fuClose)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioClose\n");
-		return mmioClose_orig( hmmio, fuClose);
-	}
-
-	LONG WINAPI mmioRead( HMMIO hmmio, HPSTR pch, LONG cch)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioRead\n");
-		return mmioRead_orig( hmmio, pch, cch);
-	}
-
-	LONG WINAPI mmioWrite( HMMIO hmmio, const char _huge* pch, LONG cch)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioWrite\n");
-		return mmioWrite_orig( hmmio, pch, cch);
-	}
-
-	LONG WINAPI mmioSeek( HMMIO hmmio, LONG lOffset, int iOrigin)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioSeek\n");
-		return mmioSeek_orig(hmmio, lOffset, iOrigin);
-	}
-
-	MMRESULT WINAPI mmioGetInfo( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioGetInfo\n");
-		return mmioGetInfo_orig( hmmio, pmmioinfo, fuInfo);
-	}
-
-	MMRESULT WINAPI mmioSetInfo( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioSetInfo\n");
-		return mmioSetInfo_orig( hmmio, pmmioinfo, fuInfo);
-	}
-
-	MMRESULT WINAPI mmioSetBuffer( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioSetBuffer\n");
-		return mmioSetBuffer_orig(hmmio, pchBuffer, cchBuffer, fuBuffer);
-	}
-
-	MMRESULT WINAPI mmioFlush( HMMIO hmmio, UINT fuFlush)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioFlush\n");
-		return mmioFlush_orig( hmmio, fuFlush);
-	}
-
-	MMRESULT WINAPI mmioAdvance( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioAdvance\n");
-		return mmioAdvance_orig( hmmio, pmmioinfo, fuAdvance);
-	}
-
-	LRESULT WINAPI mmioSendMessage( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioSendMessage\n");
-		return mmioSendMessage_orig(hmmio, uMsg, lParam1, lParam2);
-	}
-
-	MMRESULT WINAPI mmioDescend( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioDescend\n");
-		return mmioDescend_orig(hmmio, pmmcki, pmmckiParent, fuDescend);
-	}
-
-	MMRESULT WINAPI mmioAscend( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioAscend\n");
-		return mmioAscend_orig( hmmio, pmmcki, fuAscend);
-	}
-
-	MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mmioCreateChunk\n");
-		return mmioCreateChunk_orig(hmmio, pmmcki, fuCreate);
-	}
-
-	MCIERROR WINAPI mciSendCommandA( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciSendCommandA\n");
-		return mciSendCommandA_orig( mciId, uMsg, dwParam1, dwParam2);
-	}
-
-	MCIERROR WINAPI mciSendCommandW( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciSendCommandW\n");
-		return mciSendCommandW_orig( mciId, uMsg, dwParam1, dwParam2);
-	}
-
-	MCIERROR  WINAPI mciSendStringA( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciSendStringA\n");
-		return mciSendStringA_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback);
-	}
-
-	MCIERROR  WINAPI mciSendStringW( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciSendStringW\n");
-		return mciSendStringW_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback);
-	}
-
-	MCIDEVICEID WINAPI mciGetDeviceIDA( LPCSTR pszDevice)
-	{
-		//OutputDebugString(L"mciGetDeviceIDA\n");
-		return mciGetDeviceIDA_orig( pszDevice);
-	}
-
-	MCIDEVICEID WINAPI mciGetDeviceIDW( LPCWSTR pszDevice)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciGetDeviceIDW\n");
-		return mciGetDeviceIDW_orig( pszDevice);
-	}
-
-	MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA( DWORD dwElementID, LPCSTR lpstrType )
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciGetDeviceIDFromElementIDA\n");
-		return mciGetDeviceIDFromElementIDA_orig( dwElementID, lpstrType );
-	}
-
-	MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW( DWORD dwElementID, LPCWSTR lpstrType )
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciGetDeviceIDFromElementIDW\n");
-		return mciGetDeviceIDFromElementIDW_orig( dwElementID, lpstrType );
-	}
-
-	DWORD_PTR WINAPI  mciGetDriverData(UINT uDeviceID)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciGetDriverData\n");
-		return mciGetDriverData_orig(uDeviceID);
-	}
-
-	BOOL WINAPI mciGetErrorStringA( MCIERROR mcierr, LPSTR pszText, UINT cchText)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciGetErrorStringA\n");
-		return mciGetErrorStringA_orig( mcierr, pszText, cchText);
-	}
-
-	BOOL WINAPI mciGetErrorStringW( MCIERROR mcierr, LPWSTR pszText, UINT cchText)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciGetErrorStringW\n");
-		return mciGetErrorStringW_orig( mcierr, pszText, cchText);
-	}
-
-	BOOL WINAPI  mciSetDriverData(UINT uDeviceID, DWORD_PTR dwData)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciSetDriverData_type\n");
-		return mciSetDriverData_orig( uDeviceID, dwData );
-	}
-
-	BOOL WINAPI mciSetYieldProc( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciSetYieldProc\n");
-		return mciSetYieldProc_orig(mciId, fpYieldProc, dwYieldData);
-	}
-
-	BOOL WINAPI  mciFreeCommandResource(UINT uTable)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciFreeCommandResource\n");
-		return mciFreeCommandResource_orig(uTable);
-	}
-
-	HTASK WINAPI mciGetCreatorTask( MCIDEVICEID mciId)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciGetCreatorTask\n");
-		return mciGetCreatorTask_orig( mciId);
-	}
-
-	YIELDPROC WINAPI mciGetYieldProc( MCIDEVICEID mciId, LPDWORD pdwYieldData)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciGetYieldProc\n");
-		return mciGetYieldProc_orig( mciId, pdwYieldData);
-	}
-
-	UINT WINAPI mciLoadCommandResource(HANDLE hInstance, LPCWSTR lpResName, UINT uType)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciLoadCommandResource");
-		return mciLoadCommandResource_orig(hInstance, lpResName, uType);
-	}
-	
-
-	BOOL WINAPI mciExecute(LPCSTR pszCommand)
-	{
-		ll_winmm_shim_initialize();
-		//OutputDebugString(L"mciExecute\n");
-		return mciExecute_orig(pszCommand);
-	}
-}
diff --git a/indra/media_plugins/winmmshim/forwarding_api.h b/indra/media_plugins/winmmshim/forwarding_api.h
deleted file mode 100644
index 1418fc9e1da2c4a639f8244d03d68a1878eb1db2..0000000000000000000000000000000000000000
--- a/indra/media_plugins/winmmshim/forwarding_api.h
+++ /dev/null
@@ -1,390 +0,0 @@
-/** 
- * @file forwarding_api.h
- * @brief forwards winmm API calls to real winmm.dll
- *
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-// this turns off __declspec(dllimport) for the functions declared in mmsystem.h
-#define _WINMM_
-#include <windows.h>
-#include <mmsystem.h>
-
-void init_function_pointers(HMODULE winmm_handle);
-void ll_winmm_shim_initialize();
-
-typedef VOID (*LPTASKCALLBACK)(DWORD_PTR dwInst);
-
-typedef LRESULT   (WINAPI *CloseDriver_type)( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2);
-extern CloseDriver_type CloseDriver_orig;
-typedef HDRVR     (WINAPI *OpenDriver_type)( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2);
-extern OpenDriver_type OpenDriver_orig;
-typedef LRESULT   (WINAPI *SendDriverMessage_type)( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2);
-extern SendDriverMessage_type SendDriverMessage_orig;
-typedef HMODULE   (WINAPI *DrvGetModuleHandle_type)( HDRVR hDriver);
-extern DrvGetModuleHandle_type DrvGetModuleHandle_orig;
-typedef HMODULE   (WINAPI *GetDriverModuleHandle_type)( HDRVR hDriver);
-extern GetDriverModuleHandle_type GetDriverModuleHandle_orig;
-typedef LRESULT   (WINAPI *DefDriverProc_type)( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2);
-extern DefDriverProc_type DefDriverProc_orig;
-typedef BOOL (WINAPI *DriverCallback_type)(DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
-extern DriverCallback_type DriverCallback_orig;
-typedef UINT (WINAPI *mmsystemGetVersion_type)(void);
-extern mmsystemGetVersion_type mmsystemGetVersion_orig;
-typedef BOOL (WINAPI *sndPlaySoundA_type)( LPCSTR pszSound, UINT fuSound);
-extern sndPlaySoundA_type sndPlaySoundA_orig;
-typedef BOOL (WINAPI *sndPlaySoundW_type)( LPCWSTR pszSound, UINT fuSound);
-extern sndPlaySoundW_type sndPlaySoundW_orig;
-typedef BOOL (WINAPI *PlaySoundA_type)( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);
-extern PlaySoundA_type PlaySoundA_orig;
-typedef BOOL (WINAPI *PlaySoundW_type)( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound);
-extern PlaySoundW_type PlaySoundW_orig;
-typedef UINT (WINAPI *waveOutGetNumDevs_type)(void);
-extern waveOutGetNumDevs_type waveOutGetNumDevs_orig;
-typedef MMRESULT (WINAPI *waveOutGetDevCapsA_type)( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc);
-extern waveOutGetDevCapsA_type waveOutGetDevCapsA_orig;
-typedef MMRESULT (WINAPI *waveOutGetDevCapsW_type)( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc);
-extern waveOutGetDevCapsW_type waveOutGetDevCapsW_orig;
-typedef MMRESULT (WINAPI *waveOutGetVolume_type)( HWAVEOUT hwo, LPDWORD pdwVolume);
-extern waveOutGetVolume_type waveOutGetVolume_orig;
-typedef MMRESULT (WINAPI *waveOutSetVolume_type)( HWAVEOUT hwo, DWORD dwVolume);
-extern waveOutSetVolume_type waveOutSetVolume_orig;
-typedef MMRESULT (WINAPI *waveOutGetErrorTextA_type)( MMRESULT mmrError, LPSTR pszText, UINT cchText);
-extern waveOutGetErrorTextA_type waveOutGetErrorTextA_orig;
-typedef MMRESULT (WINAPI *waveOutGetErrorTextW_type)( MMRESULT mmrError, LPWSTR pszText, UINT cchText);
-extern waveOutGetErrorTextW_type waveOutGetErrorTextW_orig;
-typedef MMRESULT (WINAPI *waveOutOpen_type)( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);
-extern waveOutOpen_type waveOutOpen_orig;
-typedef MMRESULT (WINAPI *waveOutClose_type)( HWAVEOUT hwo);
-extern waveOutClose_type waveOutClose_orig;
-typedef MMRESULT (WINAPI *waveOutPrepareHeader_type)( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh);
-extern waveOutPrepareHeader_type waveOutPrepareHeader_orig;
-typedef MMRESULT (WINAPI *waveOutUnprepareHeader_type)( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh);
-extern waveOutUnprepareHeader_type waveOutUnprepareHeader_orig;
-typedef MMRESULT (WINAPI *waveOutWrite_type)( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh);
-extern waveOutWrite_type waveOutWrite_orig;
-typedef MMRESULT (WINAPI *waveOutPause_type)( HWAVEOUT hwo);
-extern waveOutPause_type waveOutPause_orig;
-typedef MMRESULT (WINAPI *waveOutRestart_type)( HWAVEOUT hwo);
-extern waveOutRestart_type waveOutRestart_orig;
-typedef MMRESULT (WINAPI *waveOutReset_type)( HWAVEOUT hwo);
-extern waveOutReset_type waveOutReset_orig;
-typedef MMRESULT (WINAPI *waveOutBreakLoop_type)( HWAVEOUT hwo);
-extern waveOutBreakLoop_type waveOutBreakLoop_orig;
-typedef MMRESULT (WINAPI *waveOutGetPosition_type)( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt);
-extern waveOutGetPosition_type waveOutGetPosition_orig;
-typedef MMRESULT (WINAPI *waveOutGetPitch_type)( HWAVEOUT hwo, LPDWORD pdwPitch);
-extern waveOutGetPitch_type waveOutGetPitch_orig;
-typedef MMRESULT (WINAPI *waveOutSetPitch_type)( HWAVEOUT hwo, DWORD dwPitch);
-extern waveOutSetPitch_type waveOutSetPitch_orig;
-typedef MMRESULT (WINAPI *waveOutGetPlaybackRate_type)( HWAVEOUT hwo, LPDWORD pdwRate);
-extern waveOutGetPlaybackRate_type waveOutGetPlaybackRate_orig;
-typedef MMRESULT (WINAPI *waveOutSetPlaybackRate_type)( HWAVEOUT hwo, DWORD dwRate);
-extern waveOutSetPlaybackRate_type waveOutSetPlaybackRate_orig;
-typedef MMRESULT (WINAPI *waveOutGetID_type)( HWAVEOUT hwo, LPUINT puDeviceID);
-extern waveOutGetID_type waveOutGetID_orig;
-typedef MMRESULT (WINAPI *waveOutMessage_type)( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2);
-extern waveOutMessage_type waveOutMessage_orig;
-typedef UINT (WINAPI *waveInGetNumDevs_type)(void);
-extern waveInGetNumDevs_type waveInGetNumDevs_orig;
-typedef MMRESULT (WINAPI *waveInGetDevCapsA_type)( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic);
-extern waveInGetDevCapsA_type waveInGetDevCapsA_orig;
-typedef MMRESULT (WINAPI *waveInGetDevCapsW_type)( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic);
-extern waveInGetDevCapsW_type waveInGetDevCapsW_orig;
-typedef MMRESULT (WINAPI *waveInGetErrorTextA_type)(MMRESULT mmrError, LPSTR pszText, UINT cchText);
-extern waveInGetErrorTextA_type waveInGetErrorTextA_orig;
-typedef MMRESULT (WINAPI *waveInGetErrorTextW_type)(MMRESULT mmrError, LPWSTR pszText, UINT cchText);
-extern waveInGetErrorTextW_type waveInGetErrorTextW_orig;
-typedef MMRESULT (WINAPI *waveInOpen_type)( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);
-extern waveInOpen_type waveInOpen_orig;
-typedef MMRESULT (WINAPI *waveInClose_type)( HWAVEIN hwi);
-extern waveInClose_type waveInClose_orig;
-typedef MMRESULT (WINAPI *waveInPrepareHeader_type)( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh);
-extern waveInPrepareHeader_type waveInPrepareHeader_orig;
-typedef MMRESULT (WINAPI *waveInUnprepareHeader_type)( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh);
-extern waveInUnprepareHeader_type waveInUnprepareHeader_orig;
-typedef MMRESULT (WINAPI *waveInAddBuffer_type)( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh);
-extern waveInAddBuffer_type waveInAddBuffer_orig;
-typedef MMRESULT (WINAPI *waveInStart_type)( HWAVEIN hwi);
-extern waveInStart_type waveInStart_orig;
-typedef MMRESULT (WINAPI *waveInStop_type)( HWAVEIN hwi);
-extern waveInStop_type waveInStop_orig;
-typedef MMRESULT (WINAPI *waveInReset_type)( HWAVEIN hwi);
-extern waveInReset_type waveInReset_orig;
-typedef MMRESULT (WINAPI *waveInGetPosition_type)( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt);
-extern waveInGetPosition_type waveInGetPosition_orig;
-typedef MMRESULT (WINAPI *waveInGetID_type)( HWAVEIN hwi, LPUINT puDeviceID);
-extern waveInGetID_type waveInGetID_orig;
-typedef MMRESULT (WINAPI *waveInMessage_type)( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2);
-extern waveInMessage_type waveInMessage_orig;
-typedef UINT (WINAPI *midiOutGetNumDevs_type)(void);
-extern midiOutGetNumDevs_type midiOutGetNumDevs_orig;
-typedef MMRESULT (WINAPI *midiStreamOpen_type)( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);
-extern midiStreamOpen_type midiStreamOpen_orig;
-typedef MMRESULT (WINAPI *midiStreamClose_type)( HMIDISTRM hms);
-extern midiStreamClose_type midiStreamClose_orig;
-typedef MMRESULT (WINAPI *midiStreamProperty_type)( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty);
-extern midiStreamProperty_type midiStreamProperty_orig;
-typedef MMRESULT (WINAPI *midiStreamPosition_type)( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt);
-extern midiStreamPosition_type midiStreamPosition_orig;
-typedef MMRESULT (WINAPI *midiStreamOut_type)( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh);
-extern midiStreamOut_type midiStreamOut_orig;
-typedef MMRESULT (WINAPI *midiStreamPause_type)( HMIDISTRM hms);
-extern midiStreamPause_type midiStreamPause_orig;
-typedef MMRESULT (WINAPI *midiStreamRestart_type)( HMIDISTRM hms);
-extern midiStreamRestart_type midiStreamRestart_orig;
-typedef MMRESULT (WINAPI *midiStreamStop_type)( HMIDISTRM hms);
-extern midiStreamStop_type midiStreamStop_orig;
-typedef MMRESULT (WINAPI *midiConnect_type)( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved);
-extern midiConnect_type midiConnect_orig;
-typedef MMRESULT (WINAPI *midiDisconnect_type)( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved);
-extern midiDisconnect_type midiDisconnect_orig;
-typedef MMRESULT (WINAPI *midiOutGetDevCapsA_type)( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc);
-extern midiOutGetDevCapsA_type midiOutGetDevCapsA_orig;
-typedef MMRESULT (WINAPI *midiOutGetDevCapsW_type)( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc);
-extern midiOutGetDevCapsW_type midiOutGetDevCapsW_orig;
-typedef MMRESULT (WINAPI *midiOutGetVolume_type)( HMIDIOUT hmo, LPDWORD pdwVolume);
-extern midiOutGetVolume_type midiOutGetVolume_orig;
-typedef MMRESULT (WINAPI *midiOutSetVolume_type)( HMIDIOUT hmo, DWORD dwVolume);
-extern midiOutSetVolume_type midiOutSetVolume_orig;
-typedef MMRESULT (WINAPI *midiOutGetErrorTextA_type)( MMRESULT mmrError, LPSTR pszText, UINT cchText);
-extern midiOutGetErrorTextA_type midiOutGetErrorTextA_orig;
-typedef MMRESULT (WINAPI *midiOutGetErrorTextW_type)( MMRESULT mmrError, LPWSTR pszText, UINT cchText);
-extern midiOutGetErrorTextW_type midiOutGetErrorTextW_orig;
-typedef MMRESULT (WINAPI *midiOutOpen_type)( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);
-extern midiOutOpen_type midiOutOpen_orig;
-typedef MMRESULT (WINAPI *midiOutClose_type)( HMIDIOUT hmo);
-extern midiOutClose_type midiOutClose_orig;
-typedef MMRESULT (WINAPI *midiOutPrepareHeader_type)( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh);
-extern midiOutPrepareHeader_type midiOutPrepareHeader_orig;
-typedef MMRESULT (WINAPI *midiOutUnprepareHeader_type)(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh);
-extern midiOutUnprepareHeader_type midiOutUnprepareHeader_orig;
-typedef MMRESULT (WINAPI *midiOutShortMsg_type)( HMIDIOUT hmo, DWORD dwMsg);
-extern midiOutShortMsg_type midiOutShortMsg_orig;
-typedef MMRESULT (WINAPI *midiOutLongMsg_type)(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh);
-extern midiOutLongMsg_type midiOutLongMsg_orig;
-typedef MMRESULT (WINAPI *midiOutReset_type)( HMIDIOUT hmo);
-extern midiOutReset_type midiOutReset_orig;
-typedef MMRESULT (WINAPI *midiOutCachePatches_type)( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache);
-extern midiOutCachePatches_type midiOutCachePatches_orig;
-typedef MMRESULT (WINAPI *midiOutCacheDrumPatches_type)( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache);
-extern midiOutCacheDrumPatches_type midiOutCacheDrumPatches_orig;
-typedef MMRESULT (WINAPI *midiOutGetID_type)( HMIDIOUT hmo, LPUINT puDeviceID);
-extern midiOutGetID_type midiOutGetID_orig;
-typedef MMRESULT (WINAPI *midiOutMessage_type)( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2);
-extern midiOutMessage_type midiOutMessage_orig;
-typedef UINT (WINAPI *midiInGetNumDevs_type)(void);
-extern midiInGetNumDevs_type midiInGetNumDevs_orig;
-typedef MMRESULT (WINAPI *midiInGetDevCapsA_type)( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic);
-extern midiInGetDevCapsA_type midiInGetDevCapsA_orig;
-typedef MMRESULT (WINAPI *midiInGetDevCapsW_type)( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic);
-extern midiInGetDevCapsW_type midiInGetDevCapsW_orig;
-typedef MMRESULT (WINAPI *midiInGetErrorTextA_type)( MMRESULT mmrError, LPSTR pszText, UINT cchText);
-extern midiInGetErrorTextA_type midiInGetErrorTextA_orig;
-typedef MMRESULT (WINAPI *midiInGetErrorTextW_type)( MMRESULT mmrError, LPWSTR pszText, UINT cchText);
-extern midiInGetErrorTextW_type midiInGetErrorTextW_orig;
-typedef MMRESULT (WINAPI *midiInOpen_type)( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);
-extern midiInOpen_type midiInOpen_orig;
-typedef MMRESULT (WINAPI *midiInClose_type)( HMIDIIN hmi);
-extern midiInClose_type midiInClose_orig;
-typedef MMRESULT (WINAPI *midiInPrepareHeader_type)( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh);
-extern midiInPrepareHeader_type midiInPrepareHeader_orig;
-typedef MMRESULT (WINAPI *midiInUnprepareHeader_type)( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh);
-extern midiInUnprepareHeader_type midiInUnprepareHeader_orig;
-typedef MMRESULT (WINAPI *midiInAddBuffer_type)( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh);
-extern midiInAddBuffer_type midiInAddBuffer_orig;
-typedef MMRESULT (WINAPI *midiInStart_type)( HMIDIIN hmi);
-extern midiInStart_type midiInStart_orig;
-typedef MMRESULT (WINAPI *midiInStop_type)( HMIDIIN hmi);
-extern midiInStop_type midiInStop_orig;
-typedef MMRESULT (WINAPI *midiInReset_type)( HMIDIIN hmi);
-extern midiInReset_type midiInReset_orig;
-typedef MMRESULT (WINAPI *midiInGetID_type)( HMIDIIN hmi, LPUINT puDeviceID);
-extern midiInGetID_type midiInGetID_orig;
-typedef MMRESULT (WINAPI *midiInMessage_type)( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2);
-extern midiInMessage_type midiInMessage_orig;
-typedef UINT (WINAPI *auxGetNumDevs_type)(void);
-extern auxGetNumDevs_type auxGetNumDevs_orig;
-typedef MMRESULT (WINAPI *auxGetDevCapsA_type)( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac);
-extern auxGetDevCapsA_type auxGetDevCapsA_orig;
-typedef MMRESULT (WINAPI *auxGetDevCapsW_type)( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac);
-extern auxGetDevCapsW_type auxGetDevCapsW_orig;
-typedef MMRESULT (WINAPI *auxSetVolume_type)( UINT uDeviceID, DWORD dwVolume);
-extern auxSetVolume_type auxSetVolume_orig;
-typedef MMRESULT (WINAPI *auxGetVolume_type)( UINT uDeviceID, LPDWORD pdwVolume);
-extern auxGetVolume_type auxGetVolume_orig;
-typedef MMRESULT (WINAPI *auxOutMessage_type)( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2);
-extern auxOutMessage_type auxOutMessage_orig;
-typedef UINT (WINAPI *mixerGetNumDevs_type)(void);
-extern mixerGetNumDevs_type mixerGetNumDevs_orig;
-typedef MMRESULT (WINAPI *mixerGetDevCapsA_type)( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps);
-extern mixerGetDevCapsA_type mixerGetDevCapsA_orig;
-typedef MMRESULT (WINAPI *mixerGetDevCapsW_type)( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps);
-extern mixerGetDevCapsW_type mixerGetDevCapsW_orig;
-typedef MMRESULT (WINAPI *mixerOpen_type)( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);
-extern mixerOpen_type mixerOpen_orig;
-typedef MMRESULT (WINAPI *mixerClose_type)( HMIXER hmx);
-extern mixerClose_type mixerClose_orig;
-typedef DWORD (WINAPI *mixerMessage_type)( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
-extern mixerMessage_type mixerMessage_orig;
-typedef MMRESULT (WINAPI *mixerGetLineInfoA_type)( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo);
-extern mixerGetLineInfoA_type mixerGetLineInfoA_orig;
-typedef MMRESULT (WINAPI *mixerGetLineInfoW_type)( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo);
-extern mixerGetLineInfoW_type mixerGetLineInfoW_orig;
-typedef MMRESULT (WINAPI *mixerGetID_type)( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId);
-extern mixerGetID_type mixerGetID_orig;
-typedef MMRESULT (WINAPI *mixerGetLineControlsA_type)( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls);
-extern mixerGetLineControlsA_type mixerGetLineControlsA_orig;
-typedef MMRESULT (WINAPI *mixerGetLineControlsW_type)( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls);
-extern mixerGetLineControlsW_type mixerGetLineControlsW_orig;
-typedef MMRESULT (WINAPI *mixerGetControlDetailsA_type)( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails);
-extern mixerGetControlDetailsA_type mixerGetControlDetailsA_orig;
-typedef MMRESULT (WINAPI *mixerGetControlDetailsW_type)( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails);
-extern mixerGetControlDetailsW_type mixerGetControlDetailsW_orig;
-typedef MMRESULT (WINAPI *mixerSetControlDetails_type)( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails);
-extern mixerSetControlDetails_type mixerSetControlDetails_orig;
-typedef DWORD    (WINAPI *mmGetCurrentTask_type)(void);
-extern mmGetCurrentTask_type mmGetCurrentTask_orig;
-typedef void (WINAPI *mmTaskBlock_type)(DWORD);
-extern mmTaskBlock_type mmTaskBlock_orig;
-typedef UINT (WINAPI *mmTaskCreate_type)(LPTASKCALLBACK, HANDLE*, DWORD_PTR);
-extern mmTaskCreate_type mmTaskCreate_orig;
-typedef BOOL (WINAPI *mmTaskSignal_type)(DWORD);
-extern mmTaskSignal_type mmTaskSignal_orig;
-typedef VOID (WINAPI *mmTaskYield_type)(VOID);
-extern mmTaskYield_type mmTaskYield_orig;
-typedef MMRESULT (WINAPI *timeGetSystemTime_type)( LPMMTIME pmmt, UINT cbmmt);
-extern timeGetSystemTime_type timeGetSystemTime_orig;
-typedef DWORD (WINAPI *timeGetTime_type)(void);
-extern timeGetTime_type timeGetTime_orig;
-typedef MMRESULT (WINAPI *timeSetEvent_type)( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent);
-extern timeSetEvent_type timeSetEvent_orig;
-typedef MMRESULT (WINAPI *timeKillEvent_type)( UINT uTimerID);
-extern timeKillEvent_type timeKillEvent_orig;
-typedef MMRESULT (WINAPI *timeGetDevCaps_type)( LPTIMECAPS ptc, UINT cbtc);
-extern timeGetDevCaps_type timeGetDevCaps_orig;
-typedef MMRESULT (WINAPI *timeBeginPeriod_type)( UINT uPeriod);
-extern timeBeginPeriod_type timeBeginPeriod_orig;
-typedef MMRESULT (WINAPI *timeEndPeriod_type)( UINT uPeriod);
-extern timeEndPeriod_type timeEndPeriod_orig;
-typedef UINT (WINAPI *joyGetNumDevs_type)(void);
-extern joyGetNumDevs_type joyGetNumDevs_orig;
-typedef MMRESULT (WINAPI *joyConfigChanged_type)(DWORD dwFlags);
-extern joyConfigChanged_type joyConfigChanged_orig;
-typedef MMRESULT (WINAPI *joyGetDevCapsA_type)( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc);
-extern joyGetDevCapsA_type joyGetDevCapsA_orig;
-typedef MMRESULT (WINAPI *joyGetDevCapsW_type)( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc);
-extern joyGetDevCapsW_type joyGetDevCapsW_orig;
-typedef MMRESULT (WINAPI *joyGetPos_type)( UINT uJoyID, LPJOYINFO pji);
-extern joyGetPos_type joyGetPos_orig;
-typedef MMRESULT (WINAPI *joyGetPosEx_type)( UINT uJoyID, LPJOYINFOEX pji);
-extern joyGetPosEx_type joyGetPosEx_orig;
-typedef MMRESULT (WINAPI *joyGetThreshold_type)( UINT uJoyID, LPUINT puThreshold);
-extern joyGetThreshold_type joyGetThreshold_orig;
-typedef MMRESULT (WINAPI *joyReleaseCapture_type)( UINT uJoyID);
-extern joyReleaseCapture_type joyReleaseCapture_orig;
-typedef MMRESULT (WINAPI *joySetCapture_type)( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged);
-extern joySetCapture_type joySetCapture_orig;
-typedef MMRESULT (WINAPI *joySetThreshold_type)( UINT uJoyID, UINT uThreshold);
-extern joySetThreshold_type joySetThreshold_orig;
-typedef BOOL(WINAPI  *mciDriverNotify_type)(HANDLE hwndCallback, MCIDEVICEID uDeviceID, UINT uStatus);
-extern mciDriverNotify_type mciDriverNotify_orig;
-typedef UINT (WINAPI  *mciDriverYield_type)(UINT uDeviceID);
-extern mciDriverYield_type mciDriverYield_orig;
-typedef FOURCC (WINAPI *mmioStringToFOURCCA_type)( LPCSTR sz, UINT uFlags);
-extern mmioStringToFOURCCA_type mmioStringToFOURCCA_orig;
-typedef FOURCC (WINAPI *mmioStringToFOURCCW_type)( LPCWSTR sz, UINT uFlags);
-extern mmioStringToFOURCCW_type mmioStringToFOURCCW_orig;
-typedef LPMMIOPROC (WINAPI *mmioInstallIOProcA_type)( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags);
-extern mmioInstallIOProcA_type mmioInstallIOProcA_orig;
-typedef LPMMIOPROC (WINAPI *mmioInstallIOProcW_type)( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags);
-extern mmioInstallIOProcW_type mmioInstallIOProcW_orig;
-typedef HMMIO (WINAPI *mmioOpenA_type)( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen);
-extern mmioOpenA_type mmioOpenA_orig;
-typedef HMMIO (WINAPI *mmioOpenW_type)( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen);
-extern mmioOpenW_type mmioOpenW_orig;
-typedef MMRESULT (WINAPI *mmioRenameA_type)( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename);
-extern mmioRenameA_type mmioRenameA_orig;
-typedef MMRESULT (WINAPI *mmioRenameW_type)( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename);
-extern mmioRenameW_type mmioRenameW_orig;
-typedef MMRESULT (WINAPI *mmioClose_type)( HMMIO hmmio, UINT fuClose);
-extern mmioClose_type mmioClose_orig;
-typedef LONG (WINAPI *mmioRead_type)( HMMIO hmmio, HPSTR pch, LONG cch);
-extern mmioRead_type mmioRead_orig;
-typedef LONG (WINAPI *mmioWrite_type)( HMMIO hmmio, const char _huge* pch, LONG cch);
-extern mmioWrite_type mmioWrite_orig;
-typedef LONG (WINAPI *mmioSeek_type)( HMMIO hmmio, LONG lOffset, int iOrigin);
-extern mmioSeek_type mmioSeek_orig;
-typedef MMRESULT (WINAPI *mmioGetInfo_type)( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo);
-extern mmioGetInfo_type mmioGetInfo_orig;
-typedef MMRESULT (WINAPI *mmioSetInfo_type)( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo);
-extern mmioSetInfo_type mmioSetInfo_orig;
-typedef MMRESULT (WINAPI *mmioSetBuffer_type)( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer);
-extern mmioSetBuffer_type mmioSetBuffer_orig;
-typedef MMRESULT (WINAPI *mmioFlush_type)( HMMIO hmmio, UINT fuFlush);
-extern mmioFlush_type mmioFlush_orig;
-typedef MMRESULT (WINAPI *mmioAdvance_type)( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance);
-extern mmioAdvance_type mmioAdvance_orig;
-typedef LRESULT (WINAPI *mmioSendMessage_type)( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2);
-extern mmioSendMessage_type mmioSendMessage_orig;
-typedef MMRESULT (WINAPI *mmioDescend_type)( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend);
-extern mmioDescend_type mmioDescend_orig;
-typedef MMRESULT (WINAPI *mmioAscend_type)( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend);
-extern mmioAscend_type mmioAscend_orig;
-typedef MMRESULT (WINAPI *mmioCreateChunk_type)(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate);
-extern mmioCreateChunk_type mmioCreateChunk_orig;
-typedef MCIERROR (WINAPI *mciSendCommandA_type)( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
-extern mciSendCommandA_type mciSendCommandA_orig;
-typedef MCIERROR (WINAPI *mciSendCommandW_type)( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
-extern mciSendCommandW_type mciSendCommandW_orig;
-typedef MCIERROR  (WINAPI *mciSendStringA_type)( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback);
-extern mciSendStringA_type mciSendStringA_orig;
-typedef MCIERROR  (WINAPI *mciSendStringW_type)( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback);
-extern mciSendStringW_type mciSendStringW_orig;
-typedef MCIDEVICEID (WINAPI *mciGetDeviceIDA_type)( LPCSTR pszDevice);
-extern mciGetDeviceIDA_type mciGetDeviceIDA_orig;
-typedef MCIDEVICEID (WINAPI *mciGetDeviceIDW_type)( LPCWSTR pszDevice);
-extern mciGetDeviceIDW_type mciGetDeviceIDW_orig;
-typedef MCIDEVICEID (WINAPI *mciGetDeviceIDFromElementIDA_type)( DWORD dwElementID, LPCSTR lpstrType );
-extern mciGetDeviceIDFromElementIDA_type mciGetDeviceIDFromElementIDA_orig;
-typedef MCIDEVICEID (WINAPI *mciGetDeviceIDFromElementIDW_type)( DWORD dwElementID, LPCWSTR lpstrType );
-extern mciGetDeviceIDFromElementIDW_type mciGetDeviceIDFromElementIDW_orig;
-typedef DWORD_PTR (WINAPI  *mciGetDriverData_type)(UINT uDeviceID);
-extern mciGetDriverData_type mciGetDriverData_orig;
-typedef BOOL (WINAPI *mciGetErrorStringA_type)( MCIERROR mcierr, LPSTR pszText, UINT cchText);
-extern mciGetErrorStringA_type mciGetErrorStringA_orig;
-typedef BOOL (WINAPI *mciGetErrorStringW_type)( MCIERROR mcierr, LPWSTR pszText, UINT cchText);
-extern mciGetErrorStringW_type mciGetErrorStringW_orig;
-typedef BOOL (WINAPI  *mciSetDriverData_type)(UINT uDeviceID, DWORD_PTR dwData);
-extern mciSetDriverData_type mciSetDriverData_orig;
-typedef BOOL (WINAPI *mciSetYieldProc_type)( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData);
-extern mciSetYieldProc_type mciSetYieldProc_orig;
-typedef BOOL (WINAPI  *mciFreeCommandResource_type)(UINT uTable);
-extern mciFreeCommandResource_type mciFreeCommandResource_orig;
-typedef HTASK (WINAPI *mciGetCreatorTask_type)( MCIDEVICEID mciId);
-extern mciGetCreatorTask_type mciGetCreatorTask_orig;
-typedef YIELDPROC (WINAPI *mciGetYieldProc_type)( MCIDEVICEID mciId, LPDWORD pdwYieldData);
-extern mciGetYieldProc_type mciGetYieldProc_orig;
-typedef UINT (WINAPI *mciLoadCommandResource_type)(HANDLE hInstance, LPCWSTR lpResName, UINT uType);
-extern mciLoadCommandResource_type mciLoadCommandResource_orig;
-typedef BOOL (WINAPI *mciExecute_type)(LPCSTR pszCommand);
-extern mciExecute_type mciExecute_orig;
diff --git a/indra/media_plugins/winmmshim/winmm.def b/indra/media_plugins/winmmshim/winmm.def
deleted file mode 100755
index c55a2845f8b50aa0e4a9e7a059ff9666f9df980c..0000000000000000000000000000000000000000
--- a/indra/media_plugins/winmmshim/winmm.def
+++ /dev/null
@@ -1,218 +0,0 @@
-; 
-;   winmm.def
-;
-;   Exports for WINMM DLL
-;
-
-LIBRARY WINMM
-EXPORTS
-CloseDriver
-DefDriverProc
-DriverCallback
-DrvGetModuleHandle
-GetDriverModuleHandle
-;MigrateAllDrivers
-;MigrateSoundEvents
-;NotifyCallbackData
-OpenDriver
-;PlaySound
-PlaySoundA
-PlaySoundW
-SendDriverMessage
-;WOW32DriverCallback
-;WOW32ResolveMultiMediaHandle
-;WOWAppExit
-;WinmmLogoff
-;WinmmLogon
-;aux32Message
-auxGetDevCapsA
-auxGetDevCapsW
-auxGetNumDevs
-auxGetVolume
-auxOutMessage
-auxSetVolume
-;gfxAddGfx
-;gfxBatchChange
-;gfxCreateGfxFactoriesList
-;gfxCreateZoneFactoriesList
-;gfxDestroyDeviceInterfaceList
-;gfxEnumerateGfxs
-;gfxLogoff
-;gfxLogon
-;gfxModifyGfx
-;gfxOpenGfx
-;gfxRemoveGfx
-;joy32Message
-joyConfigChanged
-joyGetDevCapsA
-joyGetDevCapsW
-joyGetNumDevs
-joyGetPos
-joyGetPosEx
-joyGetThreshold
-joyReleaseCapture
-joySetCapture
-joySetThreshold
-;mci32Message
-mciDriverNotify
-mciDriverYield
-mciExecute
-mciFreeCommandResource
-mciGetCreatorTask
-mciGetDeviceIDA
-mciGetDeviceIDFromElementIDA
-mciGetDeviceIDFromElementIDW
-mciGetDeviceIDW
-mciGetDriverData
-mciGetErrorStringA
-mciGetErrorStringW
-mciGetYieldProc
-mciLoadCommandResource
-mciSendCommandA
-mciSendCommandW
-mciSendStringA
-mciSendStringW
-mciSetDriverData
-mciSetYieldProc
-;mid32Message
-midiConnect
-midiDisconnect
-midiInAddBuffer
-midiInClose
-midiInGetDevCapsA
-midiInGetDevCapsW
-midiInGetErrorTextA
-midiInGetErrorTextW
-midiInGetID
-midiInGetNumDevs
-midiInMessage
-midiInOpen
-midiInPrepareHeader
-midiInReset
-midiInStart
-midiInStop
-midiInUnprepareHeader
-midiOutCacheDrumPatches
-midiOutCachePatches
-midiOutClose
-midiOutGetDevCapsA
-midiOutGetDevCapsW
-midiOutGetErrorTextA
-midiOutGetErrorTextW
-midiOutGetID
-midiOutGetNumDevs
-midiOutGetVolume
-midiOutLongMsg
-midiOutMessage
-midiOutOpen
-midiOutPrepareHeader
-midiOutReset
-midiOutSetVolume
-midiOutShortMsg
-midiOutUnprepareHeader
-midiStreamClose
-midiStreamOpen
-midiStreamOut
-midiStreamPause
-midiStreamPosition
-midiStreamProperty
-midiStreamRestart
-midiStreamStop
-mixerClose
-mixerGetControlDetailsA
-mixerGetControlDetailsW
-mixerGetDevCapsA
-mixerGetDevCapsW
-mixerGetID
-mixerGetLineControlsA
-mixerGetLineControlsW
-mixerGetLineInfoA
-mixerGetLineInfoW
-mixerGetNumDevs
-mixerMessage
-mixerOpen
-mixerSetControlDetails
-;mmDrvInstall
-mmGetCurrentTask
-mmTaskBlock
-mmTaskCreate
-mmTaskSignal
-mmTaskYield
-mmioAdvance
-mmioAscend
-mmioClose
-mmioCreateChunk
-mmioDescend
-mmioFlush
-mmioGetInfo
-mmioInstallIOProcA
-mmioInstallIOProcW
-mmioOpenA
-mmioOpenW
-mmioRead
-mmioRenameA
-mmioRenameW
-mmioSeek
-mmioSendMessage
-mmioSetBuffer
-mmioSetInfo
-mmioStringToFOURCCA
-mmioStringToFOURCCW
-mmioWrite
-mmsystemGetVersion
-;mod32Message
-;mxd32Message
-sndPlaySoundA
-sndPlaySoundW
-;tid32Message
-timeBeginPeriod
-timeEndPeriod
-timeGetDevCaps
-timeGetSystemTime
-timeGetTime
-timeKillEvent
-timeSetEvent
-waveInAddBuffer
-waveInClose
-waveInGetDevCapsA
-waveInGetDevCapsW
-waveInGetErrorTextA
-waveInGetErrorTextW
-waveInGetID
-waveInGetNumDevs
-waveInGetPosition
-waveInMessage
-waveInOpen
-waveInPrepareHeader
-waveInReset
-waveInStart
-waveInStop
-waveInUnprepareHeader
-waveOutBreakLoop
-waveOutClose
-waveOutGetDevCapsA
-waveOutGetDevCapsW
-waveOutGetErrorTextA
-waveOutGetErrorTextW
-waveOutGetID
-waveOutGetNumDevs
-waveOutGetPitch
-waveOutGetPlaybackRate
-waveOutGetPosition
-waveOutGetVolume
-waveOutMessage
-waveOutOpen
-waveOutPause
-waveOutPrepareHeader
-waveOutReset
-waveOutRestart
-waveOutSetPitch
-waveOutSetPlaybackRate
-waveOutSetVolume
-waveOutUnprepareHeader
-waveOutWrite
-;wid32Message
-;winmmSetDebugLevel
-;wod32Message
-setPluginVolume
-setPluginMute
\ No newline at end of file
diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp
deleted file mode 100644
index 78f7a9b0dab5797a21b7a3c6a294540c0efb500f..0000000000000000000000000000000000000000
--- a/indra/media_plugins/winmmshim/winmm_shim.cpp
+++ /dev/null
@@ -1,219 +0,0 @@
-/** 
- * @file winmmshim.cpp
- * @brief controls volume level of process by intercepting calls to winmm.dll
- *
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010-2014, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-#include "forwarding_api.h"
-#include <xmmintrin.h>
-#include <map>
-#include <math.h>
-
-using std::wstring;
-
-static float sVolumeLevel = 1.f;		// Could be covered by critical section,
-static bool sMute = false;				// not needed with atomicity and alignment.
-static CRITICAL_SECTION sCriticalSection;
-
-BOOL APIENTRY DllMain( HMODULE hModule,
-                       DWORD  ul_reason_for_call,
-                       LPVOID lpReserved
-					 )
-{
-	if (ul_reason_for_call == DLL_PROCESS_ATTACH)
-	{
-		InitializeCriticalSection(&sCriticalSection);
-	}
-	return TRUE;
-}
-
-void ll_winmm_shim_initialize(){
-	static volatile bool initialized = false;
-
-	// do this only once using double-check locking
-	if (!initialized)
-	{
-		EnterCriticalSection(&sCriticalSection);
-		if (!initialized)
-		{	// bind to original winmm.dll
-			TCHAR system_path[MAX_PATH];
-			TCHAR dll_path[MAX_PATH];
-			::GetSystemDirectory(system_path, MAX_PATH);
-
-			// grab winmm.dll from system path, where it should live
-			wsprintf(dll_path, "%s\\winmm.dll", system_path);
-			HMODULE winmm_handle = ::LoadLibrary(dll_path);
-
-			if (winmm_handle != NULL)
-			{	// we have a dll, let's get out pointers!
-				init_function_pointers(winmm_handle);
-				::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n");
-				initialized = true;		// Last thing after completing setup
-			}
-			else
-			{
-				// failed to initialize real winmm.dll
-				::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n");
-			}
-		}
-		LeaveCriticalSection(&sCriticalSection);
-	}
-}
-
-
-extern "C" 
-{
-	// tracks the requested format for a given waveout buffer
-	struct WaveOutFormat
-	{
-		WaveOutFormat(int bits_per_sample)
-		:	mBitsPerSample(bits_per_sample)
-		{}
-		int	mBitsPerSample;
-	};
-	typedef std::map<HWAVEOUT, WaveOutFormat*> wave_out_map_t;
-	static wave_out_map_t sWaveOuts;						// Covered by sCriticalSection
-
-	MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
-	{
-		ll_winmm_shim_initialize();
-		if (pwfx->wFormatTag != WAVE_FORMAT_PCM
-			|| (pwfx->wBitsPerSample != 8 && pwfx->wBitsPerSample != 16))
-		{ // uncompressed 8 and 16 bit sound are the only types we support
-			return WAVERR_BADFORMAT;
-		}
-
-		MMRESULT result = waveOutOpen_orig(phwo, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen);
-		if (result == MMSYSERR_NOERROR 
-			&& ((fdwOpen & WAVE_FORMAT_QUERY) == 0)) // not just querying for format support
-		{	// remember the requested bits per sample, and associate with the given handle
-			WaveOutFormat* wave_outp = new WaveOutFormat(pwfx->wBitsPerSample);
-			EnterCriticalSection(&sCriticalSection);
-			sWaveOuts.insert(std::make_pair(*phwo, wave_outp));
-			LeaveCriticalSection(&sCriticalSection);
-		}
-		return result;
-	}
-
-	MMRESULT WINAPI waveOutClose( HWAVEOUT hwo)
-	{
-		ll_winmm_shim_initialize();
-		EnterCriticalSection(&sCriticalSection);
-		wave_out_map_t::iterator found_it = sWaveOuts.find(hwo);
-		if (found_it != sWaveOuts.end())
-		{	// forget what we know about this handle
-			delete found_it->second;
-			sWaveOuts.erase(found_it);
-		}
-		LeaveCriticalSection(&sCriticalSection);
-		return waveOutClose_orig(hwo);
-	}
-
-	MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
-	{
-		ll_winmm_shim_initialize();
-		MMRESULT result = MMSYSERR_NOERROR;
-
-		if (sMute)
-		{ // zero out the audio buffer when muted
-			memset(pwh->lpData, 0, pwh->dwBufferLength);
-		}
-		else if (sVolumeLevel != 1.f) 
-		{ // need to apply volume level
-			int bits_per_sample(0);
-			
-			EnterCriticalSection(&sCriticalSection);
-			wave_out_map_t::iterator found_it = sWaveOuts.find(hwo);
-			if (found_it != sWaveOuts.end())
-			{
-				bits_per_sample = found_it->second->mBitsPerSample;
-			}
-			LeaveCriticalSection(&sCriticalSection);
-			if (bits_per_sample)
-			{
-				switch (bits_per_sample)
-				{
-				case 8:
-					{
-						char volume = (char)(sVolumeLevel * 127.f);
-						for (unsigned int i = 0; i < pwh->dwBufferLength; i++)
-						{
-							// unsigned multiply doesn't use most significant bit, so shift by 7 bits
-							// to get resulting value back into 8 bits
-							pwh->lpData[i] = (pwh->lpData[i] * volume) >> 7;
-						}
-						break;
-					}
-				case 16:
-					{
-						short volume_16 = (short)(sVolumeLevel * 32767.f);
-
-						// copy volume level 4 times into 64 bit MMX register
-						__m64 volume_64 = _mm_set_pi16(volume_16, volume_16, volume_16, volume_16);
-						__m64* sample_64;
-						__m64* last_sample_64 =  (__m64*)(pwh->lpData + pwh->dwBufferLength - sizeof(__m64));
-						// for everything that can be addressed in 64 bit multiples...
-						for (sample_64 = (__m64*)pwh->lpData;
-							sample_64 <= last_sample_64;
-							++sample_64)
-						{
-							//...multiply the samples by the volume...
-							__m64 scaled_sample = _mm_mulhi_pi16(*sample_64, volume_64);
-							// ...and shift left 1 bit since an unsigned multiple loses the most significant bit
-							// 0x7FFF * 0x7FFF = 0x3fff0001
-							// 0x3fff0001 << 1 = 0x7ffe0002
-							// notice that the LSB is always 0...should consider dithering
-							*sample_64 =  _mm_slli_pi16(scaled_sample, 1); 
-						}
-
-						// the captain has turned off the MMX sign, you are now free to use floating point registers
-						_mm_empty();
-
-						// finish remaining samples that didn't fit into 64 bit register
-						for (short* sample_16 = (short*)sample_64;
-							sample_16 < (short*)(pwh->lpData + pwh->dwBufferLength);
-							++sample_16)
-						{	
-							*sample_16 = (*sample_16 * volume_16) >> 15;
-						}
-
-						break;
-					}
-				default:
-					// don't do anything
-					break;
-				}
-			}
-		}
-		return waveOutWrite_orig( hwo, pwh, cbwh);
-	}
-
-	void WINAPI setPluginVolume(float volume)
-	{
-		sVolumeLevel = volume;
-	}
-
-	void WINAPI setPluginMute(bool mute)
-	{
-		sMute = mute;
-	}
-}
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index b4e930d0625fb33d84a08e0f2bd137e8f8715e3d..e54c81991cc5cdeaabb50b153c30770414937a70 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -13,7 +13,6 @@ include(DragDrop)
 include(EXPAT)
 include(FMODEX)
 include(GLOD)
-include(GooglePerfTools)
 include(Hunspell)
 include(JsonCpp)
 include(LLAppearance)
@@ -1439,7 +1438,7 @@ if (WINDOWS)
         set(ICON_PATH "project")
         set(VIEWER_MACOSX_PHASE "a")
     endif()
-    message("Copying icons for ${ICON_PATH}")
+    message(STATUS "Copying icons for ${ICON_PATH}")
     execute_process(
       COMMAND ${CMAKE_COMMAND} -E copy_if_different
         "${CMAKE_CURRENT_SOURCE_DIR}/icons/${ICON_PATH}/secondlife.ico"
@@ -1690,7 +1689,7 @@ if (WINDOWS)
     set_target_properties(${VIEWER_BINARY_NAME}
         PROPERTIES
         # *TODO -reenable this once we get server usage sorted out
-        LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS ${TCMALLOC_LINK_FLAGS} /LARGEADDRESSAWARE"
+        LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /LARGEADDRESSAWARE"
         LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO /LARGEADDRESSAWARE"
         LINK_FLAGS_RELEASE "/FORCE:MULTIPLE /MAP\"secondlife-bin.MAP\" /OPT:REF /LARGEADDRESSAWARE"
         )
@@ -1710,20 +1709,8 @@ if (WINDOWS)
     # In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py
     # and have the build deps get tracked *please* tell me about it.
 
-    if(USE_TCMALLOC)
-      # Configure a var for tcmalloc location, if used.
-      # Note the need to specify multiple names explicitly.
-      set(GOOGLE_PERF_TOOLS_SOURCE
-        ${SHARED_LIB_STAGING_DIR}/Release/libtcmalloc_minimal.dll
-        ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libtcmalloc_minimal.dll
-        ${SHARED_LIB_STAGING_DIR}/Debug/libtcmalloc_minimal-debug.dll
-        )
-     endif(USE_TCMALLOC)
-
-
     set(COPY_INPUT_DEPENDENCIES
       # The following commented dependencies are determined at variably at build time. Can't do this here.
-      #${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libtcmalloc_minimal.dll => None ... Skipping libtcmalloc_minimal.dll
       ${CMAKE_SOURCE_DIR}/../etc/message.xml
       ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
       ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/llcommon.dll
@@ -1762,10 +1749,11 @@ if (WINDOWS)
       ${ARCH_PREBUILT_DIRS_RELEASE}/ssleay32.dll
       ${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll
       ${ARCH_PREBUILT_DIRS_DEBUG}/ssleay32.dll
+      ${viewer_APPSETTINGS_FILES}
       SLPlugin
-      media_plugin_quicktime
       media_plugin_cef
       media_plugin_libvlc
+      media_plugin_example
       winmm_shim
       windows-crash-logger
       )
@@ -1791,7 +1779,7 @@ if (WINDOWS)
         --configuration=${CMAKE_CFG_INTDIR}
         --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
         --grid=${GRID}
-        --channel=${VIEWER_CHANNEL}
+        "--channel=${VIEWER_CHANNEL}"
         --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
         --source=${CMAKE_CURRENT_SOURCE_DIR}
         --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/copy_touched.bat
@@ -1854,7 +1842,7 @@ if (WINDOWS)
           --artwork=${ARTWORK_DIR}
           --build=${CMAKE_CURRENT_BINARY_DIR}
           --buildtype=${CMAKE_BUILD_TYPE}
-          --channel=${VIEWER_CHANNEL}
+          "--channel=${VIEWER_CHANNEL}"
           --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
           --configuration=${CMAKE_CFG_INTDIR}
           --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
@@ -1965,7 +1953,6 @@ target_link_libraries(${VIEWER_BINARY_NAME}
     ${LLLOGIN_LIBRARIES}
     ${LLPHYSICS_LIBRARIES}
     ${LLPHYSICSEXTENSIONS_LIBRARIES}
-    ${TCMALLOC_LIBRARIES}
     ${LLAPPEARANCE_LIBRARIES}
     )
 
@@ -1994,7 +1981,7 @@ if (LINUX)
         --artwork=${ARTWORK_DIR}
         --build=${CMAKE_CURRENT_BINARY_DIR}
         --buildtype=${CMAKE_BUILD_TYPE}
-        --channel=${VIEWER_CHANNEL}
+        "--channel=${VIEWER_CHANNEL}"
         --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
         --configuration=${CMAKE_CFG_INTDIR}
         --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged
@@ -2022,7 +2009,7 @@ if (LINUX)
       --configuration=${CMAKE_CFG_INTDIR}
       --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged
       --grid=${GRID}
-      --channel=${VIEWER_CHANNEL}
+      "--channel=${VIEWER_CHANNEL}"
       --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
       --source=${CMAKE_CURRENT_SOURCE_DIR}
     DEPENDS
@@ -2081,7 +2068,7 @@ if (DARWIN)
       --configuration=${CMAKE_CFG_INTDIR}
       --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app
       --grid=${GRID}
-      --channel=${VIEWER_CHANNEL}
+      "--channel=${VIEWER_CHANNEL}"
       --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
       --source=${CMAKE_CURRENT_SOURCE_DIR}
     DEPENDS
@@ -2089,7 +2076,7 @@ if (DARWIN)
       ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
     )
 
-  add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_libvlc media_plugin_cef mac-crash-logger)
+  add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_libvlc media_plugin_cef mac-crash-logger)
   add_dependencies(${VIEWER_BINARY_NAME} mac-crash-logger)
 
   if (ENABLE_SIGNING)
@@ -2110,11 +2097,10 @@ if (DARWIN)
           --artwork=${ARTWORK_DIR}
           --build=${CMAKE_CURRENT_BINARY_DIR}
           --buildtype=${CMAKE_BUILD_TYPE}
-          --channel=${VIEWER_CHANNEL}
           --configuration=${CMAKE_CFG_INTDIR}
           --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app
           --grid=${GRID}
-          --channel=${VIEWER_CHANNEL}
+          "--channel=${VIEWER_CHANNEL}"
           --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
           --source=${CMAKE_CURRENT_SOURCE_DIR}
           --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
@@ -2131,9 +2117,10 @@ endif (INSTALL)
 
 if (PACKAGE)
   set(SYMBOL_SEARCH_DIRS "")
+  # Note that the path to VIEWER_SYMBOL_FILE must match that in ../../build.sh
   if (WINDOWS)
     list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
-    set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-windows.tar.bz2")
+    set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-windows-$ENV{AUTOBUILD_ADDRSIZE}.tar.bz2")
     # slplugin.exe failing symbols dump - need to debug, might have to do with updated version of google breakpad
     # set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe")
     set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX}")
@@ -2146,15 +2133,14 @@ if (PACKAGE)
     list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/llplugin/slplugin/${CMAKE_CFG_INTDIR}")
     list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_crash_logger/${CMAKE_CFG_INTDIR}")
     list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/gstreamer010/${CMAKE_CFG_INTDIR}")
-    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}")
-    set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-darwin.tar.bz2")
+    set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-darwin-$ENV{AUTOBUILD_ADDRSIZE}.tar.bz2")
     set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin mac-crash-logger")
     set(VIEWER_EXE_GLOBS "'Second Life' mac-crash-logger")
     set(VIEWER_LIB_GLOB "*.dylib")
   endif (DARWIN)
   if (LINUX)
     list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/packaged")
-    set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux.tar.bz2")
+    set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux-$ENV{AUTOBUILD_ADDRSIZE}.tar.bz2")
     set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin")
     set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin")
     set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*")
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index c20c645d7e49c40c6c3dc9bb4d3ae80b2cc37935..831446cbd27a6de403344b21c9fa93a25357f43d 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-5.0.6
+5.1.0
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index f4905514065710557e387b8ad40e5a5190ff817f..de31425c27026c4245af0e8e463c6337314e7fde 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2044,11 +2044,11 @@
       <key>Comment</key>
       <string>Size (in bytes) for each coroutine stack</string>
       <key>Persist</key>
-      <integer>0</integer>
+      <integer>1</integer>
       <key>Type</key>
       <string>S32</string>
       <key>Value</key>
-      <integer>262144</integer>
+      <integer>524288</integer>
     </map>
     <key>CrashOnStartup</key>
     <map>
@@ -6419,17 +6419,6 @@
       <key>Value</key>
       <integer>512</integer>
     </map>
-    <key>MemProfiling</key>
-    <map>
-      <key>Comment</key>
-      <string>You want to use tcmalloc's memory profiling options.</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>0</integer>
-    </map>
     <key>MenuAccessKeyTime</key>
     <map>
       <key>Comment</key>
@@ -10133,28 +10122,28 @@
     <key>Value</key>
     <integer>0</integer>
   </map>
-  <key>RenderUseFarClip</key>
-  <map>
-    <key>Comment</key>
-    <string>If false, frustum culling will ignore far clip plane.</string>
-    <key>Persist</key>
-    <integer>1</integer>
-    <key>Type</key>
-    <string>Boolean</string>
-    <key>Value</key>
-    <integer>1</integer>
-  </map>
-  <key>RenderUseImpostors</key>
-  <map>
-    <key>Comment</key>
+    <key>RenderUseFarClip</key>
+    <map>
+      <key>Comment</key>
+      <string>If false, frustum culling will ignore far clip plane.</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>RenderUseImpostors</key>
+    <map>
+      <key>Comment</key>
     <string>OBSOLETE and UNUSED. See RenderAvatarMaxNonImpostors and RenderAvatarMaxComplexity.</string>
-    <key>Persist</key>
+      <key>Persist</key>
     <integer>0</integer>
-    <key>Type</key>
-    <string>Boolean</string>
-    <key>Value</key>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
     <integer>0</integer>
-  </map>
+    </map>
   <key>RenderAutoMuteByteLimit</key>
   <map>
     <key>Comment</key>
diff --git a/indra/newview/installers/darwin/fix_application_icon_position.sh b/indra/newview/installers/darwin/fix_application_icon_position.sh
index 618e34820ceb6c7f90787ab04c6225b11c657e04..62abcdd07ee0b83234cc1e96cebce6e6cfc9430a 100755
--- a/indra/newview/installers/darwin/fix_application_icon_position.sh
+++ b/indra/newview/installers/darwin/fix_application_icon_position.sh
@@ -1,17 +1,23 @@
-# just run this script each time after you change the installer's name to fix the icon misalignment 
 #!/bin/bash
-cp -r ../../../../build-darwin-i386/newview/*.dmg ~/Desktop/TempBuild.dmg
-hdid ~/Desktop/TempBuild.dmg
-open -a finder /Volumes/Second\ Life\ Installer
-osascript dmg-cleanup.applescript
-umount /Volumes/Second\ Life\ Installer/
-hdid ~/Desktop/TempBuild.dmg
-open -a finder /Volumes/Second\ Life\ Installer
-#cp /Volumes/Second\ Life\ Installer/.DS_Store ~/Desktop/_DS_Store
+# just run this script each time after you change the installer's name to fix the icon misalignment 
+mydir="$(dirname "$0")"
+# If there's more than one DMG in more than one build directory, pick the most
+# recent one.
+dmgfile="$(ls -t "$mydir/../../../../build-darwin-*/newview/*.dmg" | head -n 1)"
+dmgwork="$HOME/Desktop/TempBuild.dmg"
+mounted="/Volumes/Second Life Installer"
+cp -r "$dmgfile" "$dmgwork"
+hdid "$dmgwork"
+open -a finder "$mounted"
+osascript "$mydir/dmg-cleanup.applescript"
+umount "$mounted"/
+hdid "$dmgwork"
+open -a finder "$mounted"
+#cp "$mounted"/.DS_Store ~/Desktop/_DS_Store
 #chflags nohidden ~/Desktop/_DS_Store
-#cp ~/Desktop/_DS_Store ./firstlook-dmg/_DS_Store
-#cp ~/Desktop/_DS_Store ./publicnightly-dmg/_DS_Store
-#cp ~/Desktop/_DS_Store ./release-dmg/_DS_Store
-#cp ~/Desktop/_DS_Store ./releasecandidate-dmg/_DS_Store
-#umount /Volumes/Second\ Life\ Installer/
-#rm ~/Desktop/_DS_Store ~/Desktop/TempBuild.dmg
+#cp ~/Desktop/_DS_Store "$mydir/firstlook-dmg/_DS_Store"
+#cp ~/Desktop/_DS_Store "$mydir/publicnightly-dmg/_DS_Store"
+#cp ~/Desktop/_DS_Store "$mydir/release-dmg/_DS_Store"
+#cp ~/Desktop/_DS_Store "$mydir/releasecandidate-dmg/_DS_Store"
+#umount "$mounted"/
+#rm ~/Desktop/_DS_Store "$dmgwork"
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index 89317f2793f7069123c54515cf6d9eaf4c8778ca..71a33a0dc0c0768ad4f695b696983e9946b9969a 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -90,8 +90,11 @@ InstProgressFlags smooth colored		# New colored smooth look
 SetOverwrite on							# Overwrite files by default
 AutoCloseWindow true					# After all files install, close window
 
-InstallDir "$PROGRAMFILES\${INSTNAME}"
-InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" ""
+# initial location of install (default when not already installed)
+#   note: Now we defer looking for existing install until onInit when we
+#   are able to engage the 32/64 registry function
+InstallDir "%%PROGRAMFILES%%\${INSTNAME}"
+
 UninstallText $(UninstallTextMsg)
 DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup)
 Page directory dirPre
@@ -118,6 +121,8 @@ Var DO_UNINSTALL_V2     # If non-null, path to a previous Viewer 2 installation
 !insertmacro GetParameters
 !insertmacro GetOptions
 !include WinVer.nsh			# For OS and SP detection
+!include 'LogicLib.nsh'     # for value comparison
+!include "x64.nsh"			# for 64bit detection
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Pre-directory page callback
@@ -136,6 +141,21 @@ FunctionEnd
 ;; entry to the language ID selector below
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 Function .onInit
+
+%%ENGAGEREGISTRY%%
+
+# read the current location of the install for this version
+# if $0 is empty, this is the first time for this viewer name
+ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\\Linden Research, Inc.\\${INSTNAME}" ""
+
+# viewer with this name not installed before
+${If} $0 == ""
+    # nothing to do here
+${Else}
+	# use the value we got from registry as install location
+    StrCpy $INSTDIR $0
+${EndIf}
+
 Call CheckCPUFlags							# Make sure we have SSE2 support
 Call CheckWindowsVersion					# Don't install On unsupported systems
     Push $0
@@ -194,6 +214,9 @@ FunctionEnd
 ;; Prep Uninstaller Section
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 Function un.onInit
+
+%%ENGAGEREGISTRY%%
+
 # Read language from registry and set for uninstaller. Key will be removed on successful uninstall
 	ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage"
     IfErrors lbl_end
@@ -318,6 +341,10 @@ WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninst
 WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" '"$INSTDIR\uninst.exe"'
 WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayVersion" "${VERSION_LONG}"
 WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "EstimatedSize" "0x0001D500"		# ~117 MB
+
+# from FS:Ansariel
+WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayIcon" '"$INSTDIR\$INSTEXE"'
+
 # BUG-2707 Disable SEHOP for installed viewer.
 WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\$INSTEXE" "DisableExceptionChainValidation" 1
 
@@ -559,7 +586,7 @@ FunctionEnd
 Function RemoveProgFilesOnInst
 
 # Remove old SecondLife.exe to invalidate any old shortcuts to it that may be in non-standard locations. See MAINT-3575
-Delete "$INSTDIR\SecondLife.exe"
+Delete "$INSTDIR\$INSTEXE"
 
 # Remove old shader files first so fallbacks will work. See DEV-5663
 RMDir /r "$INSTDIR\app_settings\shaders"
diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm
index 8188c6c3f99ca935900ad44e1b95a8aeec23d142..aebae4c4344a35fff4080e43e2c67f843769397e 100644
--- a/indra/newview/llappdelegate-objc.mm
+++ b/indra/newview/llappdelegate-objc.mm
@@ -97,7 +97,7 @@
 	callWindowUnhide();
 }
 
-- (NSApplicationDelegateReply) applicationShouldTerminate:(NSApplication *)sender
+- (NSApplicationTerminateReply) applicationShouldTerminate:(NSApplication *)sender
 {
 	// run one frame to assess state
 	if (!pumpMainLoop())
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index f53ba01d37c7864a370f067cff3014c0829e6131..a26ee2204b3b5df2a42cdde2cc5b0b65de9fe1af 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -125,10 +125,8 @@
 #include "llcoros.h"
 #include "llexception.h"
 #if !LL_LINUX
-#include "cef/llceflib.h"
-#if LL_WINDOWS
+#include "cef/dullahan.h"
 #include "vlc/libvlc_version.h"
-#endif // LL_WINDOWS
 #endif // LL_LINUX
 
 // Third party library includes
@@ -334,10 +332,10 @@ BOOL				gDisconnected = FALSE;
 // used to restore texture state after a mode switch
 LLFrameTimer	gRestoreGLTimer;
 BOOL			gRestoreGL = FALSE;
-BOOL			gUseWireframe = FALSE;
+bool			gUseWireframe = FALSE;
 
 //use for remember deferred mode in wireframe switch
-BOOL			gInitialDeferredModeForWireframe = FALSE;
+bool			gInitialDeferredModeForWireframe = FALSE;
 
 // VFS globals - see llappviewer.h
 LLVFS* gStaticVFS = NULL;
@@ -740,10 +738,7 @@ LLAppViewer::LLAppViewer()
 LLAppViewer::~LLAppViewer()
 {
 	delete mSettingsLocationList;
-	LLViewerEventRecorder::deleteSingleton();
 
-	LLLoginInstance::instance().setUpdaterService(0);
-	
 	destroyMainloopTimeout();
     
 	// If we got to this destructor somehow, the app didn't hang.
@@ -1104,7 +1099,7 @@ bool LLAppViewer::init()
 			minSpecs += "\n";
 			unsupported = true;
 		}
-		if(gSysMemory.getPhysicalMemoryClamped() < minRAM)
+		if(gSysMemory.getPhysicalMemoryKB() < minRAM)
 		{
 			minSpecs += LLNotifications::instance().getGlobalString("UnsupportedRAM");
 			minSpecs += "\n";
@@ -2112,20 +2107,15 @@ bool LLAppViewer::cleanup()
 	// realtime, or might throw an exception.
 	LLSingletonBase::cleanupAll();
 
+	// The logging subsystem depends on an LLSingleton. Any logging after
+	// LLSingletonBase::deleteAll() won't be recorded.
+	LL_INFOS() << "Goodbye!" << LL_ENDL;
+
 	// This calls every remaining LLSingleton's deleteSingleton() method.
 	// No class destructor should perform any cleanup that might take
 	// significant realtime, or throw an exception.
-	// LLSingleton machinery includes a last-gasp implicit deleteAll() call,
-	// so this explicit call shouldn't strictly be necessary. However, by the
-	// time the runtime engages that implicit call, it may already have
-	// destroyed things like std::cerr -- so the implicit deleteAll() refrains
-	// from logging anything. Since both cleanupAll() and deleteAll() call
-	// their respective cleanup methods in computed dependency order, it's
-	// probably useful to be able to log that order.
 	LLSingletonBase::deleteAll();
 
-	LL_INFOS() << "Goodbye!" << LL_ENDL;
-
 	removeDumpDir();
 
 	// return 0;
@@ -3114,7 +3104,12 @@ void LLAppViewer::initUpdater()
 	mUpdater->setAppExitCallback(boost::bind(&LLAppViewer::forceQuit, this));
 	mUpdater->initialize(channel, 
 						 version,
+// DRTVWR-418 transitional: query using "win64" until VMP is in place
+#if LL_WINDOWS && (ADDRESS_SIZE == 64)
+						 "win64",
+#else
 						 gPlatform,
+#endif
 						 getOSInfo().getOSVersionString(),
 						 unique_id,
 						 willing_to_test
@@ -3301,6 +3296,7 @@ LLSD LLAppViewer::getViewerInfo() const
 	info["VIEWER_VERSION"] = version;
 	info["VIEWER_VERSION_STR"] = LLVersionInfo::getVersion();
 	info["CHANNEL"] = LLVersionInfo::getChannel();
+    info["ADDRESS_SIZE"] = ADDRESS_SIZE;
     std::string build_config = LLVersionInfo::getBuildConfig();
     if (build_config != "Release")
     {
@@ -3392,20 +3388,33 @@ LLSD LLAppViewer::getViewerInfo() const
 	}
 
 #if !LL_LINUX
-	info["LLCEFLIB_VERSION"] = LLCEFLIB_VERSION;
-#else
-	info["LLCEFLIB_VERSION"] = "Undefined";
+	std::ostringstream cef_ver_codec;
+	cef_ver_codec << "Dullahan: ";
+	cef_ver_codec << DULLAHAN_VERSION_MAJOR;
+	cef_ver_codec << ".";
+	cef_ver_codec << DULLAHAN_VERSION_MINOR;
+	cef_ver_codec << ".";
+	cef_ver_codec << DULLAHAN_VERSION_BUILD;
+
+	cef_ver_codec << " / CEF: ";
+	cef_ver_codec << CEF_VERSION;
 
+	cef_ver_codec << " / Chrome: ";
+	cef_ver_codec << CHROME_VERSION_MAJOR;
+
+	info["LIBCEF_VERSION"] = cef_ver_codec.str();
+#else
+	info["LIBCEF_VERSION"] = "Undefined";
 #endif
 
-#if LL_WINDOWS
-	std::ostringstream ver_codec;
-	ver_codec << LIBVLC_VERSION_MAJOR;
-	ver_codec << ".";
-	ver_codec << LIBVLC_VERSION_MINOR;
-	ver_codec << ".";
-	ver_codec << LIBVLC_VERSION_REVISION;
-	info["LIBVLC_VERSION"] = ver_codec.str();
+#if !LL_LINUX
+	std::ostringstream vlc_ver_codec;
+	vlc_ver_codec << LIBVLC_VERSION_MAJOR;
+	vlc_ver_codec << ".";
+	vlc_ver_codec << LIBVLC_VERSION_MINOR;
+	vlc_ver_codec << ".";
+	vlc_ver_codec << LIBVLC_VERSION_REVISION;
+	info["LIBVLC_VERSION"] = vlc_ver_codec.str();
 #else
 	info["LIBVLC_VERSION"] = "Undefined";
 #endif
@@ -3732,11 +3741,10 @@ void LLAppViewer::handleViewerCrash()
 	{
 		gDebugInfo["Dynamic"]["ParcelMediaURL"] = parcel->getMediaURL();
 	}
-	
-	
+
 	gDebugInfo["Dynamic"]["SessionLength"] = F32(LLFrameTimer::getElapsedSeconds());
-	gDebugInfo["Dynamic"]["RAMInfo"]["Allocated"] = (LLSD::Integer) LLMemory::getCurrentRSS() >> 10;
-	
+	gDebugInfo["Dynamic"]["RAMInfo"]["Allocated"] = LLSD::Integer(LLMemory::getCurrentRSS() / 1024);
+
 	if(gLogoutInProgress)
 	{
 		gDebugInfo["Dynamic"]["LastExecEvent"] = LAST_EXEC_LOGOUT_CRASH;
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 7bb3c32c515466e5ac45885c0035721e2c9ca86b..16a00c8ceef53344ff9482726817d59e156c34bc 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -389,8 +389,8 @@ extern BOOL		gDisconnected;
 
 extern LLFrameTimer	gRestoreGLTimer;
 extern BOOL			gRestoreGL;
-extern BOOL		gUseWireframe;
-extern BOOL		gInitialDeferredModeForWireframe;
+extern bool		gUseWireframe;
+extern bool		gInitialDeferredModeForWireframe;
 
 // VFS globals - gVFS is for general use
 // gStaticVFS is read-only and is shipped w/ the viewer
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index 4fe1e31668b127316ebafb33292f2c4e455cdd9c..d472f8926b11855a4fbc8361388b1826d201e723 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -260,7 +260,7 @@ bool LLAppViewerMacOSX::restoreErrorTrap()
 	unsigned int reset_count = 0;
 	
 #define SET_SIG(S) 	sigaction(SIGABRT, &act, &old_act); \
-					if((unsigned int)act.sa_sigaction != (unsigned int) old_act.sa_sigaction) \
+					if(act.sa_sigaction != old_act.sa_sigaction) \
 						++reset_count;
 	// Synchronous signals
 	SET_SIG(SIGABRT)
@@ -302,7 +302,8 @@ void LLAppViewerMacOSX::initCrashReporting(bool reportFreeze)
     std::string appname = gDirUtilp->getExecutableFilename();
     std::string str[] = { "-pid", pid_str.str(), "-dumpdir", logdir, "-procname", appname.c_str() };
     std::vector< std::string > args( str, str + ( sizeof ( str ) /  sizeof ( std::string ) ) );
-    LL_WARNS() << "about to launch mac-crash-logger" << pid_str << " " << logdir << " " << appname << LL_ENDL;
+    LL_WARNS() << "about to launch mac-crash-logger" << pid_str.str()
+               << " " << logdir << " " << appname << LL_ENDL;
     launchApplication(&command_str, &args);
 }
 
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 5107030476eaf49e94a19eb0c84d783b3465a4a8..d6039f6d7f752f534e2339f6c1e788aefb38e53b 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -502,7 +502,8 @@ bool LLAppViewerWin32::init()
 	disableWinErrorReporting();
 
 #ifndef LL_RELEASE_FOR_DOWNLOAD
-	LLWinDebug::instance().init();
+	// Merely requesting the LLSingleton instance initializes it.
+	LLWinDebug::instance();
 #endif
 
 #if LL_WINDOWS
@@ -526,10 +527,6 @@ bool LLAppViewerWin32::cleanup()
 
 	gDXHardware.cleanup();
 
-#ifndef LL_RELEASE_FOR_DOWNLOAD
-	LLWinDebug::instance().cleanup();
-#endif
-
 	if (mIsConsoleAllocated)
 	{
 		FreeConsole();
diff --git a/indra/newview/llenvmanager.cpp b/indra/newview/llenvmanager.cpp
index 12c307047473bdd7c1fdfa47beba2bf59c34c11c..fa1c3b983ec2222f75a5025b0d63e16c4d151842 100644
--- a/indra/newview/llenvmanager.cpp
+++ b/indra/newview/llenvmanager.cpp
@@ -35,6 +35,22 @@
 #include "llwaterparammanager.h"
 #include "llwlhandlers.h"
 #include "llwlparammanager.h"
+#include "lltrans.h"
+
+std::string LLWLParamKey::toString() const
+{
+	switch (scope)
+	{
+	case SCOPE_LOCAL:
+		return name + std::string(" (") + LLTrans::getString("Local") + std::string(")");
+		break;
+	case SCOPE_REGION:
+		return name + std::string(" (") + LLTrans::getString("Region") + std::string(")");
+		break;
+	default:
+		return name + " (?)";
+	}
+}
 
 std::string LLEnvPrefs::getWaterPresetName() const
 {
diff --git a/indra/newview/llenvmanager.h b/indra/newview/llenvmanager.h
index 6a0a267f4e355b0d78945f2469c8dc423eca9ae3..54bbf85e867bcffdf1e7bf06e49c70cd68c4bd4d 100644
--- a/indra/newview/llenvmanager.h
+++ b/indra/newview/llenvmanager.h
@@ -48,6 +48,87 @@ struct LLEnvKey
 	} EScope;
 };
 
+struct LLWLParamKey : LLEnvKey
+{
+public:
+	// scope and source of a param set (WL sky preset)
+	std::string name;
+	EScope scope;
+
+	// for conversion from LLSD
+	static const int NAME_IDX = 0;
+	static const int SCOPE_IDX = 1;
+
+	inline LLWLParamKey(const std::string& n, EScope s)
+		: name(n), scope(s)
+	{
+	}
+
+	inline LLWLParamKey(LLSD llsd)
+		: name(llsd[NAME_IDX].asString()), scope(EScope(llsd[SCOPE_IDX].asInteger()))
+	{
+	}
+
+	inline LLWLParamKey() // NOT really valid, just so std::maps can return a default of some sort
+		: name(""), scope(SCOPE_LOCAL)
+	{
+	}
+
+	inline LLWLParamKey(std::string& stringVal)
+	{
+		size_t len = stringVal.length();
+		if (len > 0)
+		{
+			name = stringVal.substr(0, len - 1);
+			scope = (EScope) atoi(stringVal.substr(len - 1, len).c_str());
+		}
+	}
+
+	inline std::string toStringVal() const
+	{
+		std::stringstream str;
+		str << name << scope;
+		return str.str();
+	}
+
+	inline LLSD toLLSD() const
+	{
+		LLSD llsd = LLSD::emptyArray();
+		llsd.append(LLSD(name));
+		llsd.append(LLSD(scope));
+		return llsd;
+	}
+
+	inline void fromLLSD(const LLSD& llsd)
+	{
+		name = llsd[NAME_IDX].asString();
+		scope = EScope(llsd[SCOPE_IDX].asInteger());
+	}
+
+	inline bool operator <(const LLWLParamKey other) const
+	{
+		if (name < other.name)
+		{	
+			return true;
+		}
+		else if (name > other.name)
+		{
+			return false;
+		}
+		else
+		{
+			return scope < other.scope;
+		}
+	}
+
+	inline bool operator ==(const LLWLParamKey other) const
+	{
+		return (name == other.name) && (scope == other.scope);
+	}
+
+	std::string toString() const;
+};
+
 class LLEnvironmentSettings
 {
 public:
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 3d5e2d356ea955a23dcb40a43200c3617e2bb5c1..50a4925c37f8e5fc6841bc52b4edb555d63457ca 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -2133,7 +2133,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
 			LLVector4a src;
 
 			U32 vec[4];
-			vec[0] = vec[1] = vec[2] = vec[3] = color.mAll;
+			vec[0] = vec[1] = vec[2] = vec[3] = color.asRGBA();
 		
 			src.loadua((F32*) vec);
 
@@ -2169,7 +2169,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
 		
 			LLColor4U glow4u = LLColor4U(0,0,0,glow);
 
-			U32 glow32 = glow4u.mAll;
+			U32 glow32 = glow4u.asRGBA();
 
 			U32 vec[4];
 			vec[0] = vec[1] = vec[2] = vec[3] = glow32;
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index d4ba230feb24e60ead6609a40c539e332fef5657..ad048f6668f3df8873dc9c900e1e240138dcdb05 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -789,7 +789,7 @@ void LLFeatureManager::applyBaseMasks()
 	maskFeatures(gpustr);
 
 	// now mask cpu type ones
-	if (gSysMemory.getPhysicalMemoryClamped() <= U32Megabytes(256))
+	if (gSysMemory.getPhysicalMemoryKB() <= U32Megabytes(256))
 	{
 		maskFeatures("RAM256MB");
 	}
diff --git a/indra/newview/llfloaterbeacons.cpp b/indra/newview/llfloaterbeacons.cpp
index 316294a477408d700e5019d709b79232e7327aa0..cf38a004994bda5bf1b3eecf4ccc8726fa9e3f98 100644
--- a/indra/newview/llfloaterbeacons.cpp
+++ b/indra/newview/llfloaterbeacons.cpp
@@ -66,13 +66,13 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl)
 	std::string name = check->getName();
 	if(name == "touch_only")
 	{
-		LLPipeline::toggleRenderScriptedTouchBeacons(NULL);
+		LLPipeline::toggleRenderScriptedTouchBeacons();
 		// Don't allow both to be ON at the same time. Toggle the other one off if both now on.
 		if (
-			LLPipeline::getRenderScriptedTouchBeacons(NULL) &&
-			LLPipeline::getRenderScriptedBeacons(NULL) )
+			LLPipeline::getRenderScriptedTouchBeacons() &&
+			LLPipeline::getRenderScriptedBeacons() )
 		{
-			LLPipeline::setRenderScriptedBeacons(FALSE);
+			LLPipeline::setRenderScriptedBeacons(false);
 			getChild<LLCheckBoxCtrl>("scripted")->setControlValue(LLSD(FALSE));
 			getChild<LLCheckBoxCtrl>("scripted")->setValue(FALSE);
 			getChild<LLCheckBoxCtrl>("touch_only")->setControlValue(LLSD(TRUE)); // just to be sure it's in sync with llpipeline
@@ -81,13 +81,13 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl)
 	}
 	else if(name == "scripted")
 	{
-		LLPipeline::toggleRenderScriptedBeacons(NULL);
+		LLPipeline::toggleRenderScriptedBeacons();
 		// Don't allow both to be ON at the same time. Toggle the other one off if both now on.
 		if (
-			LLPipeline::getRenderScriptedTouchBeacons(NULL) &&
-			LLPipeline::getRenderScriptedBeacons(NULL) )
+			LLPipeline::getRenderScriptedTouchBeacons() &&
+			LLPipeline::getRenderScriptedBeacons() )
 		{
-			LLPipeline::setRenderScriptedTouchBeacons(FALSE);
+			LLPipeline::setRenderScriptedTouchBeacons(false);
 			getChild<LLCheckBoxCtrl>("touch_only")->setControlValue(LLSD(FALSE));
 			getChild<LLCheckBoxCtrl>("touch_only")->setValue(FALSE);
 			getChild<LLCheckBoxCtrl>("scripted")->setControlValue(LLSD(TRUE)); // just to be sure it's in sync with llpipeline
@@ -100,13 +100,13 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl)
 	else if(name == "moapbeacon")     LLPipeline::setRenderMOAPBeacons(check->get());
 	else if(name == "highlights")
 	{
-		LLPipeline::toggleRenderHighlights(NULL);
+		LLPipeline::toggleRenderHighlights();
 		// Don't allow both to be OFF at the same time. Toggle the other one on if both now off.
 		if (
-			!LLPipeline::getRenderBeacons(NULL) &&
-			!LLPipeline::getRenderHighlights(NULL) )
+			!LLPipeline::getRenderBeacons() &&
+			!LLPipeline::getRenderHighlights() )
 		{
-			LLPipeline::setRenderBeacons(TRUE);
+			LLPipeline::setRenderBeacons(true);
 			getChild<LLCheckBoxCtrl>("beacons")->setControlValue(LLSD(TRUE));
 			getChild<LLCheckBoxCtrl>("beacons")->setValue(TRUE);
 			getChild<LLCheckBoxCtrl>("highlights")->setControlValue(LLSD(FALSE)); // just to be sure it's in sync with llpipeline
@@ -115,13 +115,13 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl)
 	}
 	else if(name == "beacons")
 	{
-		LLPipeline::toggleRenderBeacons(NULL);
+		LLPipeline::toggleRenderBeacons();
 		// Don't allow both to be OFF at the same time. Toggle the other one on if both now off.
 		if (
-			!LLPipeline::getRenderBeacons(NULL) &&
-			!LLPipeline::getRenderHighlights(NULL) )
+			!LLPipeline::getRenderBeacons() &&
+			!LLPipeline::getRenderHighlights() )
 		{
-			LLPipeline::setRenderHighlights(TRUE);
+			LLPipeline::setRenderHighlights(true);
 			getChild<LLCheckBoxCtrl>("highlights")->setControlValue(LLSD(TRUE));
 			getChild<LLCheckBoxCtrl>("highlights")->setValue(TRUE);
 			getChild<LLCheckBoxCtrl>("beacons")->setControlValue(LLSD(FALSE)); // just to be sure it's in sync with llpipeline
diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp
index 957c91b2263eb4f16e74ccfc2197671711158d4c..33e4c7cd5fded23519bdd09ae71354cab3e104c0 100644
--- a/indra/newview/llfloaterbump.cpp
+++ b/indra/newview/llfloaterbump.cpp
@@ -184,7 +184,7 @@ void LLFloaterBump::onScrollListRightClicked(LLUICtrl* ctrl, S32 x, S32 y)
 
 			std::string mute_msg = (LLMuteList::getInstance()->isMuted(mItemUUID, mNames[mItemUUID])) ? "UnmuteAvatar" : "MuteAvatar";
 			mPopupMenu->getChild<LLUICtrl>("Avatar Mute")->setValue(LLTrans::getString(mute_msg));
-			mPopupMenu->setItemEnabled(std::string("Zoom In"), (BOOL)gObjectList.findObject(mItemUUID));
+			mPopupMenu->setItemEnabled(std::string("Zoom In"), bool(gObjectList.findObject(mItemUUID)));
 
 			((LLContextMenu*)mPopupMenu)->show(x, y);
 			LLMenuGL::showPopup(ctrl, mPopupMenu, x, y);
diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp
index 7895a5ff4827a1b7e55956501e7f3c5b879d9e5d..7bf4516d8c2aa30a9e15875dcba3530b0859f45d 100644
--- a/indra/newview/llfloaterimnearbychat.cpp
+++ b/indra/newview/llfloaterimnearbychat.cpp
@@ -282,7 +282,7 @@ void LLFloaterIMNearbyChat::onTearOffClicked()
 	LLFloaterIMSessionTab::onTearOffClicked();
 
 	// see CHUI-170: Save torn-off state of the nearby chat between sessions
-	BOOL in_the_multifloater = (BOOL)getHost();
+	bool in_the_multifloater(getHost());
 	gSavedPerAccountSettings.setBOOL("NearbyChatIsNotTornOff", in_the_multifloater);
 }
 
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index 333ff863e591ba9325d3b88cd7c503b32a35b036..fc2da772f347700277e6045c01f3226733f21b43 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -119,7 +119,7 @@ BOOL LLFloaterMap::handleDoubleClick(S32 x, S32 y, MASK mask)
 
 	LLVector3d pos_global = mMap->viewPosToGlobal(x, y);
 	
-	LLTracker::stopTracking(NULL);
+	LLTracker::stopTracking(false);
 	LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance();
 	if (world_map)
 	{
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index c0bd9b1c23862ca32831612d4be27ff4fbb7acc0..83f268818e219f24f0e434d7f32bd93e61ea4c60 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -558,7 +558,7 @@ void LLFloaterWorldMap::trackAvatar( const LLUUID& avatar_id, const std::string&
 	}
 	else
 	{
-		LLTracker::stopTracking(NULL);
+		LLTracker::stopTracking(false);
 	}
 	setDefaultBtn("Teleport");
 }
@@ -602,7 +602,7 @@ void LLFloaterWorldMap::trackLandmark( const LLUUID& landmark_item_id )
 	}
 	else
 	{
-		LLTracker::stopTracking(NULL);
+		LLTracker::stopTracking(false);
 	}
 	setDefaultBtn("Teleport");
 }
@@ -628,7 +628,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
 	if (!sim_info)
 	{
 		// We haven't found a region for that point yet, leave the tracking to the world map
-		LLTracker::stopTracking(NULL);
+		LLTracker::stopTracking(false);
 		LLWorldMap::getInstance()->setTracking(pos_global);
 		S32 world_x = S32(pos_global.mdV[0] / 256);
 		S32 world_y = S32(pos_global.mdV[1] / 256);
@@ -644,7 +644,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
 	{
 		// Down region. Show the blue circle of death!
 		// i.e. let the world map that this and tell it it's invalid
-		LLTracker::stopTracking(NULL);
+		LLTracker::stopTracking(false);
 		LLWorldMap::getInstance()->setTracking(pos_global);
 		LLWorldMap::getInstance()->setTrackingInvalid();
 		setDefaultBtn("");
@@ -863,7 +863,7 @@ void LLFloaterWorldMap::friendsChanged()
 		   (buddy_info && !buddy_info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)) ||
 		   gAgent.isGodlike())
 		{
-			LLTracker::stopTracking(NULL);
+			LLTracker::stopTracking(false);
 		}
 	}
 }
@@ -1070,7 +1070,7 @@ void LLFloaterWorldMap::onLandmarkComboPrearrange( )
 	
 	if( current_choice.isNull() || !list->setCurrentByID( current_choice ) )
 	{
-		LLTracker::stopTracking(NULL);
+		LLTracker::stopTracking(false);
 	}
 	
 }
@@ -1080,7 +1080,7 @@ void LLFloaterWorldMap::onComboTextEntry()
 	// Reset the tracking whenever we start typing into any of the search fields,
 	// so that hitting <enter> does an auto-complete versus teleporting us to the
 	// previously selected landmark/friend.
-	LLTracker::stopTracking(NULL);
+	LLTracker::stopTracking(false);
 }
 
 void LLFloaterWorldMap::onSearchTextEntry( )
@@ -1103,7 +1103,7 @@ void LLFloaterWorldMap::onLandmarkComboCommit()
 	LLUUID asset_id;
 	LLUUID item_id = list->getCurrentID();
 	
-	LLTracker::stopTracking(NULL);
+	LLTracker::stopTracking(false);
 	
 	//RN: stopTracking() clears current combobox selection, need to reassert it here
 	list->setCurrentByID(item_id);
@@ -1158,7 +1158,7 @@ void LLFloaterWorldMap::onAvatarComboPrearrange( )
 	
 	if( !list->setCurrentByID( current_choice ) || current_choice.isNull() )
 	{
-		LLTracker::stopTracking(NULL);
+		LLTracker::stopTracking(false);
 	}
 }
 
@@ -1271,7 +1271,7 @@ void LLFloaterWorldMap::onCoordinatesCommit()
 void LLFloaterWorldMap::onClearBtn()
 {
 	mTrackedStatus = LLTracker::TRACKING_NOTHING;
-	LLTracker::stopTracking((void *)(intptr_t)TRUE);
+	LLTracker::stopTracking(true);
 	LLWorldMap::getInstance()->cancelTracking();
 	mSLURL = LLSLURL();					// Clear the SLURL since it's invalid
 	mSetToUserPosition = TRUE;	// Revert back to the current user position
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 5abd99d36f93d23c4e84c9f22f9ee18b34049b29..c535fc1cdf49bdd49ae253dec8d17d85784f761f 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -951,7 +951,7 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params
 	//possibly a case of complex object names consisting of 3+ words
 	if (!has_name)
 	{
-		U32 divider_pos = stuff.find(NAME_TEXT_DIVIDER);
+		std::string::size_type divider_pos = stuff.find(NAME_TEXT_DIVIDER);
 		if (divider_pos != std::string::npos && divider_pos < (stuff.length() - NAME_TEXT_DIVIDER.length()))
 		{
 			im[LL_IM_FROM] = LLURI::unescape(stuff.substr(0, divider_pos));
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index b4d0bb6823f1492921169718393379043b230669..a49a9ca840a741dc63d00c885d3a9a8f1213a12c 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -606,6 +606,7 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
 	request_params["channel"] = LLVersionInfo::getChannel();
 	request_params["platform"] = mPlatform;
 	request_params["platform_version"] = mPlatformVersion;
+	request_params["address_size"] = ADDRESS_SIZE;
 	request_params["id0"] = mSerialNumber;
 	request_params["host_id"] = gSavedSettings.getString("HostID");
 	request_params["extended_errors"] = true; // request message_id and message_args
diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp
index f996557c17a01cb15e5593094b32befd0e00da58..ccbe13fb50c7ebf30eeead15561cdbe818d877e3 100644
--- a/indra/newview/llmaterialmgr.cpp
+++ b/indra/newview/llmaterialmgr.cpp
@@ -531,7 +531,7 @@ void LLMaterialMgr::onPutResponse(bool success, const LLSD& content)
 		LL_DEBUGS("Materials") << "response has "<< response_data.size() << " materials" << LL_ENDL;
 		for (LLSD::array_const_iterator faceIter = response_data.beginArray(); faceIter != response_data.endArray(); ++faceIter)
 		{
-#           ifndef LL_RELEASE_FOR_DOWNLOAD
+#           ifdef SHOW_ASSERT                  // same condition that controls llassert()
 			const LLSD& face_data = *faceIter; // conditional to avoid unused variable warning
 #           endif
 			llassert(face_data.isMap());
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 5fc73c67d1bfbbf4c17c1f0464bdfbe096274a51..248c361ca40eb084f039b0854c5eff292e9d525e 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -735,7 +735,7 @@ void LLNetMap::renderPoint(const LLVector3 &pos_local, const LLColor4U &color,
 				continue;
 			}
 			S32 offset = px + py * image_width;
-			((U32*)datap)[offset] = color.mAll;
+			((U32*)datap)[offset] = color.asRGBA();
 		}
 
 		// top line
@@ -748,7 +748,7 @@ void LLNetMap::renderPoint(const LLVector3 &pos_local, const LLColor4U &color,
 				continue;
 			}
 			S32 offset = px + py * image_width;
-			((U32*)datap)[offset] = color.mAll;
+			((U32*)datap)[offset] = color.asRGBA();
 		}
 	}
 	else
@@ -770,7 +770,7 @@ void LLNetMap::renderPoint(const LLVector3 &pos_local, const LLColor4U &color,
 					continue;
 				}
 				S32 offset = p_x + p_y * image_width;
-				((U32*)datap)[offset] = color.mAll;
+				((U32*)datap)[offset] = color.asRGBA();
 			}
 		}
 	}
@@ -988,6 +988,6 @@ void LLNetMap::handleStopTracking (const LLSD& userdata)
 	if (mPopupMenu)
 	{
 		mPopupMenu->setItemEnabled ("Stop Tracking", false);
-		LLTracker::stopTracking ((void*)LLTracker::isTracking(NULL));
+		LLTracker::stopTracking (LLTracker::isTracking(NULL));
 	}
 }
diff --git a/indra/newview/llpanelexperiencelisteditor.cpp b/indra/newview/llpanelexperiencelisteditor.cpp
index 32ec4930ab8ab024df4ce12b8ffd3b4e868ab3ab..0fdb9a57f3e25e2395eca615a11533c2383ca62d 100644
--- a/indra/newview/llpanelexperiencelisteditor.cpp
+++ b/indra/newview/llpanelexperiencelisteditor.cpp
@@ -39,6 +39,8 @@
 #include "llagent.h"
 #include "lltextbox.h"
 #include "lltrans.h"
+#include "llsdutil.h"
+#include <boost/foreach.hpp>
 
 
 static LLPanelInjector<LLPanelExperienceListEditor> t_panel_experience_list_editor("panel_experience_list_editor");
@@ -94,7 +96,12 @@ void LLPanelExperienceListEditor::addExperienceIds( const uuid_vec_t& experience
 void LLPanelExperienceListEditor::setExperienceIds( const LLSD& experience_ids )
 {
 	mExperienceIds.clear();
-	mExperienceIds.insert(experience_ids.beginArray(), experience_ids.endArray());
+	BOOST_FOREACH(LLSD uuid, llsd::inArray(experience_ids))
+	{
+		// Using insert(range) doesn't work here because the conversion from
+		// LLSD to LLUUID is ambiguous: have to specify asUUID() for each entry.
+		mExperienceIds.insert(uuid.asUUID());
+	}
 	onItems();
 }
 
diff --git a/indra/newview/llparcelselection.cpp b/indra/newview/llparcelselection.cpp
index 4d1901adc924ee68233cfc7c465bfb720c873a79..5c62159b9394874332f3f836de0c66a25c896655 100644
--- a/indra/newview/llparcelselection.cpp
+++ b/indra/newview/llparcelselection.cpp
@@ -31,13 +31,6 @@
 #include "llparcel.h"
 
 
-// static
-LLPointer<LLParcelSelection> LLParcelSelection::sNullSelection;
-
-template<>
-	const LLSafeHandle<LLParcelSelection>::NullFunc
-		LLSafeHandle<LLParcelSelection>::sNullFunc = LLParcelSelection::getNullParcelSelection;
-
 //
 // LLParcelSelection
 //
@@ -87,14 +80,3 @@ bool LLParcelSelection::hasOthersSelected() const
 {
 	return mSelectedOtherCount != 0;
 }
-
-// static
-LLParcelSelection* LLParcelSelection::getNullParcelSelection()
-{
-	if (sNullSelection.isNull())
-	{
-		sNullSelection = new LLParcelSelection;
-	}
-
-	return sNullSelection;
-}
diff --git a/indra/newview/llparcelselection.h b/indra/newview/llparcelselection.h
index 1cbdfc6f74bd5eeeedfccdeb5845b240c6ab9a19..06d9141efb1b08bf35996d7e0643293b25d060ff 100644
--- a/indra/newview/llparcelselection.h
+++ b/indra/newview/llparcelselection.h
@@ -35,6 +35,7 @@ class LLParcel;
 class LLParcelSelection : public LLRefCount
 {
 	friend class LLViewerParcelMgr;
+	friend class LLSafeHandle<LLParcelSelection>;
 
 protected:
 	~LLParcelSelection();
@@ -61,8 +62,6 @@ class LLParcelSelection : public LLRefCount
 	// Is the entire parcel selected, or just a part?
 	BOOL	getWholeParcelSelected() const;
 
-	static LLParcelSelection* getNullParcelSelection();
-
 private:
 	void setParcel(LLParcel* parcel) { mParcel = parcel; }
 
@@ -73,8 +72,6 @@ class LLParcelSelection : public LLRefCount
 	S32			mSelectedSelfCount;
 	S32			mSelectedOtherCount;
 	S32			mSelectedPublicCount;
-
-	static LLPointer<LLParcelSelection> sNullSelection;
 };
 
 typedef LLSafeHandle<LLParcelSelection> LLParcelSelectionHandle;
diff --git a/indra/newview/llpipelinelistener.cpp b/indra/newview/llpipelinelistener.cpp
index 20759239bf5f66663c8b77385d6bc56135b426da..dfbe689f56f4e444b444ce18391da219c223ee19 100644
--- a/indra/newview/llpipelinelistener.cpp
+++ b/indra/newview/llpipelinelistener.cpp
@@ -48,7 +48,7 @@ namespace {
 			U32 render_type = render_type_from_string( iter->asString() );
 			if ( render_type != 0 )
 			{
-				LLPipeline::toggleRenderTypeControl( (void*) render_type );
+				LLPipeline::toggleRenderTypeControl( render_type );
 			}
 		}
 	}
@@ -59,7 +59,7 @@ namespace {
 		U32 render_type = render_type_from_string( request["type"].asString() );
 		if ( render_type != 0 )
 		{
-			response["value"] = LLPipeline::hasRenderTypeControl( (void*) render_type );
+			response["value"] = LLPipeline::hasRenderTypeControl( render_type );
 		}
 		else
 		{
@@ -87,7 +87,7 @@ namespace {
 			U32 render_feature = feature_from_string( iter->asString() );
 			if ( render_feature != 0 )
 			{
-				LLPipeline::toggleRenderDebugControl( (void*) render_feature );
+				LLPipeline::toggleRenderDebugControl( render_feature );
 			}
 		}
 	}
@@ -126,7 +126,7 @@ namespace {
 			U32 info_display = info_display_from_string( iter->asString() );
 			if ( info_display != 0 )
 			{
-				LLPipeline::toggleRenderDebug( (void*) info_display );
+				LLPipeline::toggleRenderDebug( info_display );
 			}
 		}
 	}
diff --git a/indra/newview/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp
index f40b3e029522e2b0439c31394f95981d3b5883e3..76d721ecdc44ddd90e3f27345e83fc005b983c29 100644
--- a/indra/newview/llpresetsmanager.cpp
+++ b/indra/newview/llpresetsmanager.cpp
@@ -165,8 +165,8 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n
 	}
     else if(PRESETS_CAMERA == subdirectory)
 	{
-		name_list = boost::assign::list_of
-			("Placeholder");
+		name_list.clear();
+		name_list.push_back("Placeholder");
 	}
     else
     {
diff --git a/indra/newview/llsearchhistory.cpp b/indra/newview/llsearchhistory.cpp
index 0ea05a03d6775bf1aa6effa9eaf5c0f68c756dff..449e0080f0e52eea772ec4ea4a36cf4227b4368c 100644
--- a/indra/newview/llsearchhistory.cpp
+++ b/indra/newview/llsearchhistory.cpp
@@ -116,26 +116,26 @@ void LLSearchHistory::addEntry(const std::string& search_query)
 	mSearchHistory.push_front(item);
 }
 
-bool LLSearchHistory::LLSearchHistoryItem::operator < (const LLSearchHistory::LLSearchHistoryItem& right)
+bool LLSearchHistory::LLSearchHistoryItem::operator < (const LLSearchHistory::LLSearchHistoryItem& right) const
 {
 	S32 result = LLStringUtil::compareInsensitive(search_query, right.search_query);
 
 	return result < 0;
 }
 
-bool LLSearchHistory::LLSearchHistoryItem::operator > (const LLSearchHistory::LLSearchHistoryItem& right)
+bool LLSearchHistory::LLSearchHistoryItem::operator > (const LLSearchHistory::LLSearchHistoryItem& right) const
 {
 	S32 result = LLStringUtil::compareInsensitive(search_query, right.search_query);
 
 	return result > 0;
 }
 
-bool LLSearchHistory::LLSearchHistoryItem::operator==(const LLSearchHistory::LLSearchHistoryItem& right)
+bool LLSearchHistory::LLSearchHistoryItem::operator==(const LLSearchHistory::LLSearchHistoryItem& right) const
 {
 	return 0 == LLStringUtil::compareInsensitive(search_query, right.search_query);
 }
 
-bool LLSearchHistory::LLSearchHistoryItem::operator==(const std::string& right)
+bool LLSearchHistory::LLSearchHistoryItem::operator==(const std::string& right) const
 {
 	return 0 == LLStringUtil::compareInsensitive(search_query, right);
 }
diff --git a/indra/newview/llsearchhistory.h b/indra/newview/llsearchhistory.h
index 5aab5e6765ce4df17da7fdbb7911dfe289f89c3c..4ae6122396eb51b7a82864081939854cc9158910 100644
--- a/indra/newview/llsearchhistory.h
+++ b/indra/newview/llsearchhistory.h
@@ -99,16 +99,16 @@ class LLSearchHistory : public LLSingleton<LLSearchHistory>, private LLDestroyCl
 		/**
 		 * Allows std::list sorting
 		 */
-		bool operator < (const LLSearchHistory::LLSearchHistoryItem& right);
+		bool operator < (const LLSearchHistory::LLSearchHistoryItem& right) const;
 
 		/**
 		 * Allows std::list sorting
 		 */
-		bool operator > (const LLSearchHistory::LLSearchHistoryItem& right);
+		bool operator > (const LLSearchHistory::LLSearchHistoryItem& right) const;
 
-		bool operator==(const LLSearchHistoryItem& right);
+		bool operator==(const LLSearchHistoryItem& right) const;
 
-		bool operator==(const std::string& right);
+		bool operator==(const std::string& right) const;
 
 		/**
 		 * Serializes search history item to LLSD
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 983a7ca1aed294c2f688ec4916ee24e1fc2cb6fe..c44aca6fa500ad3c0b9031fd9cff1169a7f816c6 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -133,11 +133,6 @@ LLColor4 LLSelectMgr::sHighlightParentColor;
 LLColor4 LLSelectMgr::sHighlightChildColor;
 LLColor4 LLSelectMgr::sContextSilhouetteColor;
 
-static LLObjectSelection *get_null_object_selection();
-template<> 
-	const LLSafeHandle<LLObjectSelection>::NullFunc 
-		LLSafeHandle<LLObjectSelection>::sNullFunc = get_null_object_selection;
-
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // struct LLDeRezInfo
 //
@@ -157,27 +152,15 @@ struct LLDeRezInfo
 //
 
 
-static LLPointer<LLObjectSelection> sNullSelection;
-
 //
 // Functions
 //
 
 void LLSelectMgr::cleanupGlobals()
 {
-	sNullSelection = NULL;
 	LLSelectMgr::getInstance()->clearSelections();
 }
 
-LLObjectSelection *get_null_object_selection()
-{
-	if (sNullSelection.isNull())
-	{
-		sNullSelection = new LLObjectSelection;
-	}
-	return sNullSelection;
-}
-
 // Build time optimization, generate this function once here
 template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance();
 //-----------------------------------------------------------------------------
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 7ef00326454067e55c459faea3553a292f6c821b..e965dd80d5859135ed09f96d5601ae68e995e700 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -233,6 +233,7 @@ class LLSelectNode
 class LLObjectSelection : public LLRefCount
 {
 	friend class LLSelectMgr;
+	friend class LLSafeHandle<LLObjectSelection>;
 
 protected:
 	~LLObjectSelection();
diff --git a/indra/newview/llskinningutil.cpp b/indra/newview/llskinningutil.cpp
index cf09f6f9785a0c086b9aaf3c56cda128011e54da..dba690242ad2eea020e924b5d009936282535352 100644
--- a/indra/newview/llskinningutil.cpp
+++ b/indra/newview/llskinningutil.cpp
@@ -122,7 +122,7 @@ void LLSkinningUtil::initSkinningMatrixPalette(
 // static
 void LLSkinningUtil::checkSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin)
 {
-#ifndef LL_RELEASE_FOR_DOWNLOAD
+#ifdef SHOW_ASSERT                  // same condition that controls llassert()
 	const S32 max_joints = skin->mJointNames.size();
     for (U32 j=0; j<num_vertices; j++)
     {
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 0fd36766b3c9c68943a619dd9dcf9d7006333973..94b838e8291673cdc464e93501dddbd704863e97 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -61,9 +61,6 @@ extern bool gShiftFrame;
 static U32 sZombieGroups = 0;
 U32 LLSpatialGroup::sNodeCount = 0;
 
-U32 gOctreeMaxCapacity;
-F32 gOctreeMinSize;
-
 BOOL LLSpatialGroup::sNoDelete = FALSE;
 
 static F32 sLastMaxTexPriority = 1.f;
diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp
index b015cde45d699f75d62f78d4ea4dfefc7909181d..2ec5c41b8862ca77dc0841edc9f8eeb80d5ab771 100644
--- a/indra/newview/lltracker.cpp
+++ b/indra/newview/lltracker.cpp
@@ -100,9 +100,8 @@ LLTracker::~LLTracker()
 
 
 // static
-void LLTracker::stopTracking(void* userdata)
+void LLTracker::stopTracking(bool clear_ui)
 {
-	BOOL clear_ui = ((BOOL)(intptr_t)userdata);
 	instance()->stopTrackingAll(clear_ui);
 }
 
@@ -183,7 +182,7 @@ void LLTracker::render3D()
 		F32 dist = gFloaterWorldMap->getDistanceToDestination(pos_global, 0.5f);
 		if (dist < DESTINATION_REACHED_RADIUS)
 		{
-			instance()->stopTrackingLocation(FALSE,TRUE);
+			instance()->stopTrackingLocation(false,true);
 		}
 		else
 		{
@@ -606,7 +605,7 @@ void LLTracker::renderBeacon(LLVector3d pos_global,
 }
 
 
-void LLTracker::stopTrackingAll(BOOL clear_ui)
+void LLTracker::stopTrackingAll(bool clear_ui)
 {
 	switch (mTrackingStatus)
 	{
@@ -626,7 +625,7 @@ void LLTracker::stopTrackingAll(BOOL clear_ui)
 }
 
 
-void LLTracker::stopTrackingAvatar(BOOL clear_ui)
+void LLTracker::stopTrackingAvatar(bool clear_ui)
 {
 	LLAvatarTracker& av_tracker = LLAvatarTracker::instance();
 	if( !av_tracker.getAvatarID().isNull() )
@@ -640,7 +639,7 @@ void LLTracker::stopTrackingAvatar(BOOL clear_ui)
 }
 
 
-void LLTracker::stopTrackingLandmark(BOOL clear_ui)
+void LLTracker::stopTrackingLandmark(bool clear_ui)
 {
 	purgeBeaconText();
 	mTrackedLandmarkAssetID.setNull();
@@ -655,7 +654,7 @@ void LLTracker::stopTrackingLandmark(BOOL clear_ui)
 }
 
 
-void LLTracker::stopTrackingLocation(BOOL clear_ui, BOOL dest_reached)
+void LLTracker::stopTrackingLocation(bool clear_ui, bool dest_reached)
 {
 	purgeBeaconText();
 	mTrackedLocationName.assign("");
diff --git a/indra/newview/lltracker.h b/indra/newview/lltracker.h
index a1c5052c1b85a157c8b8a32e6bd456ba0833719f..4a6f10b767dda24893c8d494501227fec2f9137b 100644
--- a/indra/newview/lltracker.h
+++ b/indra/newview/lltracker.h
@@ -74,8 +74,8 @@ class LLTracker
 	// these are static so that they can be used a callbacks
 	static ETrackingStatus getTrackingStatus() { return instance()->mTrackingStatus; }
 	static ETrackingLocationType getTrackedLocationType() { return instance()->mTrackingLocationType; }
-	static BOOL isTracking(void*) { return instance()->mTrackingStatus != TRACKING_NOTHING; }
-	static void stopTracking(void*);
+	static bool isTracking(void*) { return instance()->mTrackingStatus != TRACKING_NOTHING; }
+	static void stopTracking(bool);
 	static void clearFocus();
 	
 	static const LLUUID& getTrackedLandmarkAssetID() { return instance()->mTrackedLandmarkAssetID; }
@@ -114,10 +114,10 @@ class LLTracker
 							 LLHUDText* hud_textp, 
 							 const std::string& label );
 
-	void stopTrackingAll(BOOL clear_ui = FALSE);
-	void stopTrackingAvatar(BOOL clear_ui = FALSE);
-	void stopTrackingLocation(BOOL clear_ui = FALSE, BOOL dest_reached = FALSE);
-	void stopTrackingLandmark(BOOL clear_ui = FALSE);
+	void stopTrackingAll(bool clear_ui = false);
+	void stopTrackingAvatar(bool clear_ui = false);
+	void stopTrackingLocation(bool clear_ui = false, bool dest_reached = false);
+	void stopTrackingLandmark(bool clear_ui = false);
 
 	void drawMarker(const LLVector3d& pos_global, const LLColor4& color);
 	void setLandmarkVisited();
diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp
index a0ca91672aa357f9743dba9cc0f58a4d58f06a11..375dce485d71b2eec8c332f686a689ecb4bb4b9d 100644
--- a/indra/newview/llversioninfo.cpp
+++ b/indra/newview/llversioninfo.cpp
@@ -99,10 +99,16 @@ const std::string &LLVersionInfo::getShortVersion()
 
 namespace
 {
+	// LL_VIEWER_CHANNEL is a macro defined on the compiler command line. The
+	// macro expands to the string name of the channel, but without quotes. We
+	// need to turn it into a quoted string. This macro trick does that.
+#define stringize_inner(x) #x
+#define stringize_outer(x) stringize_inner(x)
+
 	/// Storage of the channel name the viewer is using.
 	//  The channel name is set by hardcoded constant, 
 	//  or by calling LLVersionInfo::resetChannel()
-	std::string sWorkingChannelName(LL_VIEWER_CHANNEL);
+	std::string sWorkingChannelName(stringize_outer(LL_VIEWER_CHANNEL));
 
 	// Storage for the "version and channel" string.
 	// This will get reset too.
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index afa00e3e6e54dd6c68fe34250eda3c5536381e7b..960a36a251a717b81532962985937f6bf645467f 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -220,9 +220,9 @@ void display_stats()
 	F32 mem_log_freq = gSavedSettings.getF32("MemoryLogFrequency");
 	if (mem_log_freq > 0.f && gRecentMemoryTime.getElapsedTimeF32() >= mem_log_freq)
 	{
-		gMemoryAllocated = (U64Bytes)LLMemory::getCurrentRSS();
+		gMemoryAllocated = U64Bytes(LLMemory::getCurrentRSS());
 		U32Megabytes memory = gMemoryAllocated;
-		LL_INFOS() << llformat("MEMORY: %d MB", memory.value()) << LL_ENDL;
+		LL_INFOS() << "MEMORY: " << memory << LL_ENDL;
 		LLMemory::logMemoryInfo(TRUE) ;
 		gRecentMemoryTime.reset();
 	}
@@ -1107,7 +1107,7 @@ void render_hud_attachments()
 		bool has_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI);
 		if (has_ui)
 		{
-			gPipeline.toggleRenderDebugFeature((void*) LLPipeline::RENDER_DEBUG_FEATURE_UI);
+			gPipeline.toggleRenderDebugFeature(LLPipeline::RENDER_DEBUG_FEATURE_UI);
 		}
 
 		S32 use_occlusion = LLPipeline::sUseOcclusion;
@@ -1152,7 +1152,7 @@ void render_hud_attachments()
 
 		if (has_ui)
 		{
-			gPipeline.toggleRenderDebugFeature((void*) LLPipeline::RENDER_DEBUG_FEATURE_UI);
+			gPipeline.toggleRenderDebugFeature(LLPipeline::RENDER_DEBUG_FEATURE_UI);
 		}
 		LLPipeline::sUseOcclusion = use_occlusion;
 		LLPipeline::sRenderingHUDs = FALSE;
@@ -1230,13 +1230,13 @@ bool get_hud_matrices(glh::matrix4f &proj, glh::matrix4f &model)
 	return get_hud_matrices(whole_screen, proj, model);
 }
 
-BOOL setup_hud_matrices()
+bool setup_hud_matrices()
 {
 	LLRect whole_screen = get_whole_screen_region();
 	return setup_hud_matrices(whole_screen);
 }
 
-BOOL setup_hud_matrices(const LLRect& screen_region)
+bool setup_hud_matrices(const LLRect& screen_region)
 {
 	glh::matrix4f proj, model;
 	bool result = get_hud_matrices(screen_region, proj, model);
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 9f05ee61bde4c3ddd0f52586842890ef8efc7be2..900075488f4fe776150998ef78dcb197e2e1f286 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -604,7 +604,9 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
 	LLPluginProcessParent::setUseReadThread(gSavedSettings.getBOOL("PluginUseReadThread"));
 
 	// HACK: we always try to keep a spare running webkit plugin around to improve launch times.
-	createSpareBrowserMediaSource();
+	// 2017-04-19 Removed CP - this doesn't appear to buy us much and consumes a lot of resources so
+	// removing it for now.
+	//createSpareBrowserMediaSource();
 
 	sAnyMediaShowing = false;
 	sAnyMediaPlaying = false;
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index c68f6b8a156aa23ca19bded30c9c3b7ee2401b08..bae619c66da20b9db6de69511eea3a2ff5ae0534 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -794,7 +794,7 @@ class LLAdvancedToggleRenderType : public view_listener_t
 		U32 render_type = render_type_from_string( userdata.asString() );
 		if ( render_type != 0 )
 		{
-			LLPipeline::toggleRenderTypeControl( (void*)render_type );
+			LLPipeline::toggleRenderTypeControl( render_type );
 		}
 		return true;
 	}
@@ -810,7 +810,7 @@ class LLAdvancedCheckRenderType : public view_listener_t
 
 		if ( render_type != 0 )
 		{
-			new_value = LLPipeline::hasRenderTypeControl( (void*)render_type );
+			new_value = LLPipeline::hasRenderTypeControl( render_type );
 		}
 
 		return new_value;
@@ -869,7 +869,7 @@ class LLAdvancedToggleFeature : public view_listener_t
 		U32 feature = feature_from_string( userdata.asString() );
 		if ( feature != 0 )
 		{
-			LLPipeline::toggleRenderDebugFeature( (void*)feature );
+			LLPipeline::toggleRenderDebugFeature( feature );
 		}
 		return true;
 	}
@@ -884,7 +884,7 @@ class LLAdvancedCheckFeature : public view_listener_t
 
 	if ( feature != 0 )
 	{
-		new_value = LLPipeline::toggleRenderDebugFeatureControl( (void*)feature );
+		new_value = LLPipeline::toggleRenderDebugFeatureControl( feature );
 	}
 
 	return new_value;
@@ -925,7 +925,7 @@ class LLAdvancedSetDisplayTextureDensity : public view_listener_t
 		{
 			if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY) == TRUE) 
 			{
-				gPipeline.toggleRenderDebug((void*)LLPipeline::RENDER_DEBUG_TEXEL_DENSITY);
+				gPipeline.toggleRenderDebug(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY);
 			}
 			LLViewerTexture::sDebugTexelsMode = LLViewerTexture::DEBUG_TEXELS_OFF;
 		}
@@ -933,7 +933,7 @@ class LLAdvancedSetDisplayTextureDensity : public view_listener_t
 		{
 			if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY) == FALSE) 
 			{
-				gPipeline.toggleRenderDebug((void*)LLPipeline::RENDER_DEBUG_TEXEL_DENSITY);
+				gPipeline.toggleRenderDebug(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY);
 			}
 			LLViewerTexture::sDebugTexelsMode = LLViewerTexture::DEBUG_TEXELS_CURRENT;
 		}
@@ -941,7 +941,7 @@ class LLAdvancedSetDisplayTextureDensity : public view_listener_t
 		{
 			if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY) == FALSE) 
 			{
-				gPipeline.toggleRenderDebug((void*)LLPipeline::RENDER_DEBUG_TEXEL_DENSITY);
+				gPipeline.toggleRenderDebug(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY);
 			}
 			gPipeline.setRenderDebugFeatureControl(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY, true);
 			LLViewerTexture::sDebugTexelsMode = LLViewerTexture::DEBUG_TEXELS_DESIRED;
@@ -950,7 +950,7 @@ class LLAdvancedSetDisplayTextureDensity : public view_listener_t
 		{
 			if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY) == FALSE) 
 			{
-				gPipeline.toggleRenderDebug((void*)LLPipeline::RENDER_DEBUG_TEXEL_DENSITY);
+				gPipeline.toggleRenderDebug(LLPipeline::RENDER_DEBUG_TEXEL_DENSITY);
 			}
 			LLViewerTexture::sDebugTexelsMode = LLViewerTexture::DEBUG_TEXELS_FULL;
 		}
@@ -1093,7 +1093,7 @@ class LLAdvancedToggleInfoDisplay : public view_listener_t
 		
 		if ( info_display != 0 )
 		{
-			LLPipeline::toggleRenderDebug( (void*)info_display );
+			LLPipeline::toggleRenderDebug( info_display );
 		}
 
 		return true;
@@ -1110,7 +1110,7 @@ class LLAdvancedCheckInfoDisplay : public view_listener_t
 
 		if ( info_display != 0 )
 		{
-			new_value = LLPipeline::toggleRenderDebugControl( (void*)info_display );
+			new_value = LLPipeline::toggleRenderDebugControl( info_display );
 		}
 
 		return new_value;
@@ -1224,7 +1224,7 @@ class LLAdvancedToggleWireframe : public view_listener_t
 
 		gPipeline.resetVertexBuffers();
 
-		if (!gUseWireframe && !gInitialDeferredModeForWireframe && LLPipeline::sRenderDeferred != gInitialDeferredModeForWireframe && gPipeline.isInit())
+		if (!gUseWireframe && !gInitialDeferredModeForWireframe && LLPipeline::sRenderDeferred != bool(gInitialDeferredModeForWireframe) && gPipeline.isInit())
 		{
 			LLPipeline::refreshCachedSettings();
 			gPipeline.releaseGLBuffers();
@@ -8141,66 +8141,66 @@ class LLViewToggleBeacon : public view_listener_t
 		std::string beacon = userdata.asString();
 		if (beacon == "scriptsbeacon")
 		{
-			LLPipeline::toggleRenderScriptedBeacons(NULL);
-			gSavedSettings.setBOOL( "scriptsbeacon", LLPipeline::getRenderScriptedBeacons(NULL) );
+			LLPipeline::toggleRenderScriptedBeacons();
+			gSavedSettings.setBOOL( "scriptsbeacon", LLPipeline::getRenderScriptedBeacons() );
 			// toggle the other one off if it's on
-			if (LLPipeline::getRenderScriptedBeacons(NULL) && LLPipeline::getRenderScriptedTouchBeacons(NULL))
+			if (LLPipeline::getRenderScriptedBeacons() && LLPipeline::getRenderScriptedTouchBeacons())
 			{
-				LLPipeline::toggleRenderScriptedTouchBeacons(NULL);
-				gSavedSettings.setBOOL( "scripttouchbeacon", LLPipeline::getRenderScriptedTouchBeacons(NULL) );
+				LLPipeline::toggleRenderScriptedTouchBeacons();
+				gSavedSettings.setBOOL( "scripttouchbeacon", LLPipeline::getRenderScriptedTouchBeacons() );
 			}
 		}
 		else if (beacon == "physicalbeacon")
 		{
-			LLPipeline::toggleRenderPhysicalBeacons(NULL);
-			gSavedSettings.setBOOL( "physicalbeacon", LLPipeline::getRenderPhysicalBeacons(NULL) );
+			LLPipeline::toggleRenderPhysicalBeacons();
+			gSavedSettings.setBOOL( "physicalbeacon", LLPipeline::getRenderPhysicalBeacons() );
 		}
 		else if (beacon == "moapbeacon")
 		{
-			LLPipeline::toggleRenderMOAPBeacons(NULL);
-			gSavedSettings.setBOOL( "moapbeacon", LLPipeline::getRenderMOAPBeacons(NULL) );
+			LLPipeline::toggleRenderMOAPBeacons();
+			gSavedSettings.setBOOL( "moapbeacon", LLPipeline::getRenderMOAPBeacons() );
 		}
 		else if (beacon == "soundsbeacon")
 		{
-			LLPipeline::toggleRenderSoundBeacons(NULL);
-			gSavedSettings.setBOOL( "soundsbeacon", LLPipeline::getRenderSoundBeacons(NULL) );
+			LLPipeline::toggleRenderSoundBeacons();
+			gSavedSettings.setBOOL( "soundsbeacon", LLPipeline::getRenderSoundBeacons() );
 		}
 		else if (beacon == "particlesbeacon")
 		{
-			LLPipeline::toggleRenderParticleBeacons(NULL);
-			gSavedSettings.setBOOL( "particlesbeacon", LLPipeline::getRenderParticleBeacons(NULL) );
+			LLPipeline::toggleRenderParticleBeacons();
+			gSavedSettings.setBOOL( "particlesbeacon", LLPipeline::getRenderParticleBeacons() );
 		}
 		else if (beacon == "scripttouchbeacon")
 		{
-			LLPipeline::toggleRenderScriptedTouchBeacons(NULL);
-			gSavedSettings.setBOOL( "scripttouchbeacon", LLPipeline::getRenderScriptedTouchBeacons(NULL) );
+			LLPipeline::toggleRenderScriptedTouchBeacons();
+			gSavedSettings.setBOOL( "scripttouchbeacon", LLPipeline::getRenderScriptedTouchBeacons() );
 			// toggle the other one off if it's on
-			if (LLPipeline::getRenderScriptedBeacons(NULL) && LLPipeline::getRenderScriptedTouchBeacons(NULL))
+			if (LLPipeline::getRenderScriptedBeacons() && LLPipeline::getRenderScriptedTouchBeacons())
 			{
-				LLPipeline::toggleRenderScriptedBeacons(NULL);
-				gSavedSettings.setBOOL( "scriptsbeacon", LLPipeline::getRenderScriptedBeacons(NULL) );
+				LLPipeline::toggleRenderScriptedBeacons();
+				gSavedSettings.setBOOL( "scriptsbeacon", LLPipeline::getRenderScriptedBeacons() );
 			}
 		}
 		else if (beacon == "renderbeacons")
 		{
-			LLPipeline::toggleRenderBeacons(NULL);
-			gSavedSettings.setBOOL( "renderbeacons", LLPipeline::getRenderBeacons(NULL) );
+			LLPipeline::toggleRenderBeacons();
+			gSavedSettings.setBOOL( "renderbeacons", LLPipeline::getRenderBeacons() );
 			// toggle the other one on if it's not
-			if (!LLPipeline::getRenderBeacons(NULL) && !LLPipeline::getRenderHighlights(NULL))
+			if (!LLPipeline::getRenderBeacons() && !LLPipeline::getRenderHighlights())
 			{
-				LLPipeline::toggleRenderHighlights(NULL);
-				gSavedSettings.setBOOL( "renderhighlights", LLPipeline::getRenderHighlights(NULL) );
+				LLPipeline::toggleRenderHighlights();
+				gSavedSettings.setBOOL( "renderhighlights", LLPipeline::getRenderHighlights() );
 			}
 		}
 		else if (beacon == "renderhighlights")
 		{
-			LLPipeline::toggleRenderHighlights(NULL);
-			gSavedSettings.setBOOL( "renderhighlights", LLPipeline::getRenderHighlights(NULL) );
+			LLPipeline::toggleRenderHighlights();
+			gSavedSettings.setBOOL( "renderhighlights", LLPipeline::getRenderHighlights() );
 			// toggle the other one on if it's not
-			if (!LLPipeline::getRenderBeacons(NULL) && !LLPipeline::getRenderHighlights(NULL))
+			if (!LLPipeline::getRenderBeacons() && !LLPipeline::getRenderHighlights())
 			{
-				LLPipeline::toggleRenderBeacons(NULL);
-				gSavedSettings.setBOOL( "renderbeacons", LLPipeline::getRenderBeacons(NULL) );
+				LLPipeline::toggleRenderBeacons();
+				gSavedSettings.setBOOL( "renderbeacons", LLPipeline::getRenderBeacons() );
 			}
 		}
 
@@ -8279,7 +8279,7 @@ class LLViewCheckRenderType : public view_listener_t
 		bool new_value = false;
 		if (type == "hideparticles")
 		{
-			new_value = LLPipeline::toggleRenderTypeControlNegated((void *)LLPipeline::RENDER_TYPE_PARTICLES);
+			new_value = LLPipeline::toggleRenderTypeControlNegated(LLPipeline::RENDER_TYPE_PARTICLES);
 		}
 		return new_value;
 	}
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 507087d1ae9237624a3c08e51c7eb71a4fa7630f..9d02ec8a9a88df42289d61d5b5304f7eca957c88 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2618,7 +2618,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 
 			// The group notice packet does not have an AgentID.  Obtain one from the name cache.
 			// If last name is "Resident" strip it out so the cache name lookup works.
-			U32 index = original_name.find(" Resident");
+			std::string::size_type index = original_name.find(" Resident");
 			if (index != std::string::npos)
 			{
 				original_name = original_name.substr(0, index);
@@ -4220,7 +4220,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
 		LLVector3 beacon_dir(agent_pos.mV[VX] - (F32)fmod(beacon_pos.mdV[VX], 256.0), agent_pos.mV[VY] - (F32)fmod(beacon_pos.mdV[VY], 256.0), 0);
 		if (beacon_dir.magVecSquared() < 25.f)
 		{
-			LLTracker::stopTracking(NULL);
+			LLTracker::stopTracking(false);
 		}
 		else if ( is_teleport && !gAgent.getTeleportKeepsLookAt() && look_at.isExactlyZero())
 		{
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index a61181badacf39613fa81fe765b3d496ef461d84..f4d14a39fe8d26a87113c27c1b12a288c8071c31 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -2463,7 +2463,6 @@ void sanitize_corners(const LLVector3d &corner1,
 
 void LLViewerParcelMgr::cleanupGlobals()
 {
-	LLParcelSelection::sNullSelection = NULL;
 }
 
 LLViewerTexture* LLViewerParcelMgr::getBlockedImage() const
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index f52c82dab7db50ecd37f3d104264ff20e3df3fc0..8ff735a8c16917d7d0d3c4049dcad54102a41f31 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -307,7 +307,8 @@ U32Bytes				gTotalWorldData,
 U32								gSimPingCount = 0;
 U32Bits				gObjectData;
 F32Milliseconds		gAvgSimPing(0.f);
-U32Bytes			gTotalTextureBytesPerBoostLevel[LLViewerTexture::MAX_GL_IMAGE_CATEGORY] = {U32Bytes(0)};
+// rely on default initialization
+U32Bytes			gTotalTextureBytesPerBoostLevel[LLViewerTexture::MAX_GL_IMAGE_CATEGORY];
 
 extern U32  gVisCompared;
 extern U32  gVisTested;
@@ -491,6 +492,7 @@ void send_stats()
 	system["ram"] = (S32) gSysMemory.getPhysicalMemoryKB().value();
 	system["os"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
 	system["cpu"] = gSysCPU.getCPUString();
+	system["address_size"] = ADDRESS_SIZE;
 	unsigned char MACAddress[MAC_ADDRESS_BYTES];
 	LLUUID::getNodeID(MACAddress);
 	std::string macAddressString = llformat("%02x-%02x-%02x-%02x-%02x-%02x",
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index d7080051dabdfd007643cabff951e9c19b9bb19c..0a3012ffefe568fc644fc688bd0ac27166c9a4a6 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -1341,9 +1341,9 @@ LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImage
 // Returns min setting for TextureMemory (in MB)
 S32Megabytes LLViewerTextureList::getMinVideoRamSetting()
 {
-	S32Megabytes system_ram = gSysMemory.getPhysicalMemoryClamped();
+	U32Megabytes system_ram = gSysMemory.getPhysicalMemoryKB();
 	//min texture mem sets to 64M if total physical mem is more than 1.5GB
-	return (system_ram > S32Megabytes(1500)) ? S32Megabytes(64) : gMinVideoRam ;
+	return (system_ram > U32Megabytes(1500)) ? S32Megabytes(64) : gMinVideoRam ;
 }
 
 //static
@@ -1386,7 +1386,7 @@ S32Megabytes LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended, fl
 		LL_WARNS() << "VRAM amount not detected, defaulting to " << max_texmem << " MB" << LL_ENDL;
 	}
 
-	S32Megabytes system_ram = gSysMemory.getPhysicalMemoryClamped(); // In MB
+	S32Megabytes system_ram = gSysMemory.getPhysicalMemoryKB(); // In MB
 	//LL_INFOS() << "*** DETECTED " << system_ram << " MB of system memory." << LL_ENDL;
 	if (get_recommended)
 		max_texmem = llmin(max_texmem, system_ram/2);
@@ -1439,7 +1439,7 @@ void LLViewerTextureList::updateMaxResidentTexMem(S32Megabytes mem)
 	}
 
 	//system mem
-	S32Megabytes system_ram = gSysMemory.getPhysicalMemoryClamped();
+	S32Megabytes system_ram = gSysMemory.getPhysicalMemoryKB();
 
 	//minimum memory reserved for non-texture use.
 	//if system_raw >= 1GB, reserve at least 512MB for non-texture use;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 2d3b48bab3206d6c9418fc1e197d81970c6ae51f..feed5ba43dd1bf7e9c017b929e7a349036212ff5 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -53,6 +53,7 @@
 #include "llrender.h"
 
 #include "llvoiceclient.h"	// for push-to-talk button handling
+#include "stringize.h"
 
 //
 // TODO: Many of these includes are unnecessary.  Remove them.
@@ -394,7 +395,8 @@ class LLDebugText
 #if LL_WINDOWS
 		if (gSavedSettings.getBOOL("DebugShowMemory"))
 		{
-			addText(xpos, ypos, llformat("Memory: %d (KB)", LLMemory::getWorkingSetSize() / 1024)); 
+			addText(xpos, ypos,
+					STRINGIZE("Memory: " << (LLMemory::getCurrentRSS() / 1024) << " (KB)"));
 			ypos += y_inc;
 		}
 #endif
@@ -748,45 +750,45 @@ class LLDebugText
 		}
 
 		// only display these messages if we are actually rendering beacons at this moment
-		if (LLPipeline::getRenderBeacons(NULL) && LLFloaterReg::instanceVisible("beacons"))
+		if (LLPipeline::getRenderBeacons() && LLFloaterReg::instanceVisible("beacons"))
 		{
-			if (LLPipeline::getRenderMOAPBeacons(NULL))
+			if (LLPipeline::getRenderMOAPBeacons())
 			{
 				addText(xpos, ypos, "Viewing media beacons (white)");
 				ypos += y_inc;
 			}
 
-			if (LLPipeline::toggleRenderTypeControlNegated((void*)LLPipeline::RENDER_TYPE_PARTICLES))
+			if (LLPipeline::toggleRenderTypeControlNegated(LLPipeline::RENDER_TYPE_PARTICLES))
 			{
 				addText(xpos, ypos, particle_hiding);
 				ypos += y_inc;
 			}
 
-			if (LLPipeline::getRenderParticleBeacons(NULL))
+			if (LLPipeline::getRenderParticleBeacons())
 			{
 				addText(xpos, ypos, "Viewing particle beacons (blue)");
 				ypos += y_inc;
 			}
 
-			if (LLPipeline::getRenderSoundBeacons(NULL))
+			if (LLPipeline::getRenderSoundBeacons())
 			{
 				addText(xpos, ypos, "Viewing sound beacons (yellow)");
 				ypos += y_inc;
 			}
 
-			if (LLPipeline::getRenderScriptedBeacons(NULL))
+			if (LLPipeline::getRenderScriptedBeacons())
 			{
 				addText(xpos, ypos, beacon_scripted);
 				ypos += y_inc;
 			}
 			else
-				if (LLPipeline::getRenderScriptedTouchBeacons(NULL))
+				if (LLPipeline::getRenderScriptedTouchBeacons())
 				{
 					addText(xpos, ypos, beacon_scripted_touch);
 					ypos += y_inc;
 				}
 
-			if (LLPipeline::getRenderPhysicalBeacons(NULL))
+			if (LLPipeline::getRenderPhysicalBeacons())
 			{
 				addText(xpos, ypos, "Viewing physical object beacons (green)");
 				ypos += y_inc;
@@ -4517,7 +4519,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 
 	if ( prev_draw_ui != show_ui)
 	{
-		LLPipeline::toggleRenderDebugFeature((void*)LLPipeline::RENDER_DEBUG_FEATURE_UI);
+		LLPipeline::toggleRenderDebugFeature(LLPipeline::RENDER_DEBUG_FEATURE_UI);
 	}
 
 	BOOL hide_hud = !gSavedSettings.getBOOL("RenderHUDInSnapshot") && LLPipeline::sShowHUDAttachments;
@@ -4740,7 +4742,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 	// POST SNAPSHOT
 	if (!gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
 	{
-		LLPipeline::toggleRenderDebugFeature((void*)LLPipeline::RENDER_DEBUG_FEATURE_UI);
+		LLPipeline::toggleRenderDebugFeature(LLPipeline::RENDER_DEBUG_FEATURE_UI);
 	}
 
 	if (hide_hud)
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 4dab213fa0e8d16837edc650343a2e000d953ba6..6b4a450e6fe202537a3f4c79495ae488700de155 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -283,7 +283,7 @@ void LLSkyTex::create(const F32 brightness)
 			S32 offset = basic_offset * sComponents;
 			U32* pix = (U32*)(data + offset);
 			LLColor4U temp = LLColor4U(mSkyData[basic_offset]);
-			*pix = temp.mAll;
+			*pix = temp.asRGBA();
 		}
 	}
 	createGLImage(sCurrent);
diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h
index ee8e91fb71d3a869f6e844777665345e5c8d5678..9cfb9773bd8ccb16486e77d3aac7497b851db688 100644
--- a/indra/newview/llvosky.h
+++ b/indra/newview/llvosky.h
@@ -171,7 +171,7 @@ class LLSkyTex
 	{
 		S32 offset = (i * sResolution + j) * sComponents;
 		U32* pix = (U32*) &(mImageRaw[sCurrent]->getData()[offset]);
-		*pix = col.mAll;
+		*pix = col.asRGBA();
 	}
 
 	LLColor4U getPixel(const S32 i, const S32 j)
@@ -179,7 +179,7 @@ class LLSkyTex
 		LLColor4U col;
 		S32 offset = (i * sResolution + j) * sComponents;
 		U32* pix = (U32*) &(mImageRaw[sCurrent]->getData()[offset]);
-		col.mAll = *pix;
+		col.fromRGBA( *pix );
 		return col;
 	}
 
diff --git a/indra/newview/llwindebug.cpp b/indra/newview/llwindebug.cpp
index eff70ca0b2853bd3aab295aa6356cea3a0370aef..92c80ce53412f744d83ae4c66922eb01d528e7c2 100644
--- a/indra/newview/llwindebug.cpp
+++ b/indra/newview/llwindebug.cpp
@@ -90,7 +90,7 @@ LONG NTAPI vectoredHandler(PEXCEPTION_POINTERS exception_infop)
 }
 
 // static
-void  LLWinDebug::init()
+void  LLWinDebug::initSingleton()
 {
 	static bool s_first_run = true;
 	// Load the dbghelp dll now, instead of waiting for the crash.
@@ -135,7 +135,7 @@ void  LLWinDebug::init()
 	}
 }
 
-void LLWinDebug::cleanup ()
+void LLWinDebug::cleanupSingleton()
 {
 	gEmergencyMemoryReserve.release();
 }
diff --git a/indra/newview/llwindebug.h b/indra/newview/llwindebug.h
index 90882cf04a099baf97a8afb396f73f5ac90c5f9a..7e5818ba1c1d6bf4992e137a99972b3023f451a3 100644
--- a/indra/newview/llwindebug.h
+++ b/indra/newview/llwindebug.h
@@ -36,9 +36,9 @@ class LLWinDebug:
 {
 	LLSINGLETON_EMPTY_CTOR(LLWinDebug);
 public:
-	static void init();
+	void initSingleton();
 	static void generateMinidump(struct _EXCEPTION_POINTERS *pExceptionInfo = NULL);
-	static void cleanup();
+	void cleanupSingleton();
 private:
 	static void writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename);
 };
diff --git a/indra/newview/llwlanimator.h b/indra/newview/llwlanimator.h
index 810f4cf7e59f3d5ea928a5485835f4255b4d34d3..e2e49c73051555cddda76bfa33a6431b42b979e1 100644
--- a/indra/newview/llwlanimator.h
+++ b/indra/newview/llwlanimator.h
@@ -28,12 +28,11 @@
 #define LL_WL_ANIMATOR_H
 
 #include "llwlparamset.h"
+#include "llenvmanager.h"
 #include "llwaterparamset.h"
 #include <string>
 #include <map>
 
-struct LLWLParamKey;
-
 class LLWLAnimator {
 public:
 	typedef enum e_time
diff --git a/indra/newview/llwlparammanager.h b/indra/newview/llwlparammanager.h
index a8029839a7688794f137e9bf84b5633098b1456b..61f86b747fe05dccd337ea3d13de28b5426ab288 100644
--- a/indra/newview/llwlparammanager.h
+++ b/indra/newview/llwlparammanager.h
@@ -115,100 +115,6 @@ struct WLFloatControl {
 	}
 };
 
-struct LLWLParamKey : LLEnvKey
-{
-public:
-	// scope and source of a param set (WL sky preset)
-	std::string name;
-	EScope scope;
-
-	// for conversion from LLSD
-	static const int NAME_IDX = 0;
-	static const int SCOPE_IDX = 1;
-
-	inline LLWLParamKey(const std::string& n, EScope s)
-		: name(n), scope(s)
-	{
-	}
-
-	inline LLWLParamKey(LLSD llsd)
-		: name(llsd[NAME_IDX].asString()), scope(EScope(llsd[SCOPE_IDX].asInteger()))
-	{
-	}
-
-	inline LLWLParamKey() // NOT really valid, just so std::maps can return a default of some sort
-		: name(""), scope(SCOPE_LOCAL)
-	{
-	}
-
-	inline LLWLParamKey(std::string& stringVal)
-	{
-		size_t len = stringVal.length();
-		if (len > 0)
-		{
-			name = stringVal.substr(0, len - 1);
-			scope = (EScope) atoi(stringVal.substr(len - 1, len).c_str());
-		}
-	}
-
-	inline std::string toStringVal() const
-	{
-		std::stringstream str;
-		str << name << scope;
-		return str.str();
-	}
-
-	inline LLSD toLLSD() const
-	{
-		LLSD llsd = LLSD::emptyArray();
-		llsd.append(LLSD(name));
-		llsd.append(LLSD(scope));
-		return llsd;
-	}
-
-	inline void fromLLSD(const LLSD& llsd)
-	{
-		name = llsd[NAME_IDX].asString();
-		scope = EScope(llsd[SCOPE_IDX].asInteger());
-	}
-
-	inline bool operator <(const LLWLParamKey other) const
-	{
-		if (name < other.name)
-		{	
-			return true;
-		}
-		else if (name > other.name)
-		{
-			return false;
-		}
-		else
-		{
-			return scope < other.scope;
-		}
-	}
-
-	inline bool operator ==(const LLWLParamKey other) const
-	{
-		return (name == other.name) && (scope == other.scope);
-	}
-
-	inline std::string toString() const
-	{
-		switch (scope)
-		{
-		case SCOPE_LOCAL:
-			return name + std::string(" (") + LLTrans::getString("Local") + std::string(")");
-			break;
-		case SCOPE_REGION:
-			return name + std::string(" (") + LLTrans::getString("Region") + std::string(")");
-			break;
-		default:
-			return name + " (?)";
-		}
-	}
-};
-
 /// WindLight parameter manager class - what controls all the wind light shaders
 class LLWLParamManager : public LLSingleton<LLWLParamManager>
 {
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 19487c3230ef638163f2d2e88644c6b9fd2086f3..c38dafee536ddc0bbbc5a9ba39d96f004a9ce77a 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -130,26 +130,26 @@
 bool gShiftFrame = false;
 
 //cached settings
-BOOL LLPipeline::RenderAvatarVP;
-BOOL LLPipeline::VertexShaderEnable;
-BOOL LLPipeline::WindLightUseAtmosShaders;
-BOOL LLPipeline::RenderDeferred;
+bool LLPipeline::RenderAvatarVP;
+bool LLPipeline::VertexShaderEnable;
+bool LLPipeline::WindLightUseAtmosShaders;
+bool LLPipeline::RenderDeferred;
 F32 LLPipeline::RenderDeferredSunWash;
 U32 LLPipeline::RenderFSAASamples;
 U32 LLPipeline::RenderResolutionDivisor;
-BOOL LLPipeline::RenderUIBuffer;
+bool LLPipeline::RenderUIBuffer;
 S32 LLPipeline::RenderShadowDetail;
-BOOL LLPipeline::RenderDeferredSSAO;
+bool LLPipeline::RenderDeferredSSAO;
 F32 LLPipeline::RenderShadowResolutionScale;
-BOOL LLPipeline::RenderLocalLights;
-BOOL LLPipeline::RenderDelayCreation;
-BOOL LLPipeline::RenderAnimateRes;
-BOOL LLPipeline::FreezeTime;
+bool LLPipeline::RenderLocalLights;
+bool LLPipeline::RenderDelayCreation;
+bool LLPipeline::RenderAnimateRes;
+bool LLPipeline::FreezeTime;
 S32 LLPipeline::DebugBeaconLineWidth;
 F32 LLPipeline::RenderHighlightBrightness;
 LLColor4 LLPipeline::RenderHighlightColor;
 F32 LLPipeline::RenderHighlightThickness;
-BOOL LLPipeline::RenderSpotLightsInNondeferred;
+bool LLPipeline::RenderSpotLightsInNondeferred;
 LLColor4 LLPipeline::PreviewAmbientColor;
 LLColor4 LLPipeline::PreviewDiffuse0;
 LLColor4 LLPipeline::PreviewSpecular0;
@@ -169,8 +169,8 @@ S32 LLPipeline::RenderGlowResolutionPow;
 S32 LLPipeline::RenderGlowIterations;
 F32 LLPipeline::RenderGlowWidth;
 F32 LLPipeline::RenderGlowStrength;
-BOOL LLPipeline::RenderDepthOfField;
-BOOL LLPipeline::RenderDepthOfFieldInEditMode;
+bool LLPipeline::RenderDepthOfField;
+bool LLPipeline::RenderDepthOfFieldInEditMode;
 F32 LLPipeline::CameraFocusTransitionTime;
 F32 LLPipeline::CameraFNumber;
 F32 LLPipeline::CameraFocalLength;
@@ -191,7 +191,7 @@ F32 LLPipeline::RenderEdgeDepthCutoff;
 F32 LLPipeline::RenderEdgeNormCutoff;
 LLVector3 LLPipeline::RenderShadowGaussian;
 F32 LLPipeline::RenderShadowBlurDistFactor;
-BOOL LLPipeline::RenderDeferredAtmospheric;
+bool LLPipeline::RenderDeferredAtmospheric;
 S32 LLPipeline::RenderReflectionDetail;
 F32 LLPipeline::RenderHighlightFadeTime;
 LLVector3 LLPipeline::RenderShadowClipPlanes;
@@ -201,7 +201,7 @@ F32 LLPipeline::RenderFarClip;
 LLVector3 LLPipeline::RenderShadowSplitExponent;
 F32 LLPipeline::RenderShadowErrorCutoff;
 F32 LLPipeline::RenderShadowFOVCutoff;
-BOOL LLPipeline::CameraOffset;
+bool LLPipeline::CameraOffset;
 F32 LLPipeline::CameraMaxCoF;
 F32 LLPipeline::CameraDoFResScale;
 F32 LLPipeline::RenderAutoHideSurfaceAreaLimit;
@@ -216,9 +216,9 @@ extern S32 gBoxFrame;
 extern BOOL gDisplaySwapBuffers;
 extern BOOL gDebugGL;
 
-BOOL	gAvatarBacklight = FALSE;
+bool	gAvatarBacklight = false;
 
-BOOL	gDebugPipeline = FALSE;
+bool	gDebugPipeline = false;
 LLPipeline gPipeline;
 const LLMatrix4* gGLLastMatrix = NULL;
 
@@ -359,45 +359,45 @@ void display_update_camera();
 
 S32		LLPipeline::sCompiles = 0;
 
-BOOL	LLPipeline::sPickAvatar = TRUE;
-BOOL	LLPipeline::sDynamicLOD = TRUE;
-BOOL	LLPipeline::sShowHUDAttachments = TRUE;
-BOOL	LLPipeline::sRenderMOAPBeacons = FALSE;
-BOOL	LLPipeline::sRenderPhysicalBeacons = TRUE;
-BOOL	LLPipeline::sRenderScriptedBeacons = FALSE;
-BOOL	LLPipeline::sRenderScriptedTouchBeacons = TRUE;
-BOOL	LLPipeline::sRenderParticleBeacons = FALSE;
-BOOL	LLPipeline::sRenderSoundBeacons = FALSE;
-BOOL	LLPipeline::sRenderBeacons = FALSE;
-BOOL	LLPipeline::sRenderHighlight = TRUE;
+bool	LLPipeline::sPickAvatar = true;
+bool	LLPipeline::sDynamicLOD = true;
+bool	LLPipeline::sShowHUDAttachments = true;
+bool	LLPipeline::sRenderMOAPBeacons = false;
+bool	LLPipeline::sRenderPhysicalBeacons = true;
+bool	LLPipeline::sRenderScriptedBeacons = false;
+bool	LLPipeline::sRenderScriptedTouchBeacons = true;
+bool	LLPipeline::sRenderParticleBeacons = false;
+bool	LLPipeline::sRenderSoundBeacons = false;
+bool	LLPipeline::sRenderBeacons = false;
+bool	LLPipeline::sRenderHighlight = true;
 LLRender::eTexIndex LLPipeline::sRenderHighlightTextureChannel = LLRender::DIFFUSE_MAP;
-BOOL	LLPipeline::sForceOldBakedUpload = FALSE;
+bool	LLPipeline::sForceOldBakedUpload = false;
 S32		LLPipeline::sUseOcclusion = 0;
-BOOL	LLPipeline::sDelayVBUpdate = TRUE;
-BOOL	LLPipeline::sAutoMaskAlphaDeferred = TRUE;
-BOOL	LLPipeline::sAutoMaskAlphaNonDeferred = FALSE;
-BOOL	LLPipeline::sDisableShaders = FALSE;
-BOOL	LLPipeline::sRenderBump = TRUE;
-BOOL	LLPipeline::sBakeSunlight = FALSE;
-BOOL	LLPipeline::sNoAlpha = FALSE;
-BOOL	LLPipeline::sUseTriStrips = TRUE;
-BOOL	LLPipeline::sUseFarClip = TRUE;
-BOOL	LLPipeline::sShadowRender = FALSE;
-BOOL	LLPipeline::sWaterReflections = FALSE;
-BOOL	LLPipeline::sRenderGlow = FALSE;
-BOOL	LLPipeline::sReflectionRender = FALSE;
-BOOL	LLPipeline::sImpostorRender = FALSE;
-BOOL	LLPipeline::sImpostorRenderAlphaDepthPass = FALSE;
-BOOL	LLPipeline::sUnderWaterRender = FALSE;
-BOOL	LLPipeline::sTextureBindTest = FALSE;
-BOOL	LLPipeline::sRenderFrameTest = FALSE;
-BOOL	LLPipeline::sRenderAttachedLights = TRUE;
-BOOL	LLPipeline::sRenderAttachedParticles = TRUE;
-BOOL	LLPipeline::sRenderDeferred = FALSE;
-BOOL    LLPipeline::sMemAllocationThrottled = FALSE;
+bool	LLPipeline::sDelayVBUpdate = true;
+bool	LLPipeline::sAutoMaskAlphaDeferred = true;
+bool	LLPipeline::sAutoMaskAlphaNonDeferred = false;
+bool	LLPipeline::sDisableShaders = false;
+bool	LLPipeline::sRenderBump = true;
+bool	LLPipeline::sBakeSunlight = false;
+bool	LLPipeline::sNoAlpha = false;
+bool	LLPipeline::sUseTriStrips = true;
+bool	LLPipeline::sUseFarClip = true;
+bool	LLPipeline::sShadowRender = false;
+bool	LLPipeline::sWaterReflections = false;
+bool	LLPipeline::sRenderGlow = false;
+bool	LLPipeline::sReflectionRender = false;
+bool	LLPipeline::sImpostorRender = false;
+bool	LLPipeline::sImpostorRenderAlphaDepthPass = false;
+bool	LLPipeline::sUnderWaterRender = false;
+bool	LLPipeline::sTextureBindTest = false;
+bool	LLPipeline::sRenderFrameTest = false;
+bool	LLPipeline::sRenderAttachedLights = true;
+bool	LLPipeline::sRenderAttachedParticles = true;
+bool	LLPipeline::sRenderDeferred = false;
+bool    LLPipeline::sMemAllocationThrottled = false;
 S32		LLPipeline::sVisibleLightCount = 0;
 F32		LLPipeline::sMinRenderSize = 0.f;
-BOOL	LLPipeline::sRenderingHUDs;
+bool	LLPipeline::sRenderingHUDs;
 
 // EventHost API LLPipeline listener.
 static LLPipelineListener sPipelineListener;
@@ -414,14 +414,14 @@ bool addDeferredAttachments(LLRenderTarget& target)
 }
 
 LLPipeline::LLPipeline() :
-	mBackfaceCull(FALSE),
+	mBackfaceCull(false),
 	mMatrixOpCount(0),
 	mTextureMatrixOps(0),
 	mNumVisibleNodes(0),
 	mNumVisibleFaces(0),
 
-	mInitialized(FALSE),
-	mVertexShadersEnabled(FALSE),
+	mInitialized(false),
+	mVertexShadersEnabled(false),
 	mVertexShadersLoaded(0),
 	mTransformFeedbackPrimitives(0),
 	mRenderDebugFeatureMask(0),
@@ -486,7 +486,7 @@ void LLPipeline::init()
 	sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");
 	sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles");
 
-	mInitialized = TRUE;
+	mInitialized = true;
 	
 	stop_glerror();
 
@@ -539,7 +539,7 @@ void LLPipeline::init()
 
 	mOldRenderDebugMask = mRenderDebugMask;
 
-	mBackfaceCull = TRUE;
+	mBackfaceCull = true;
 
 	stop_glerror();
 	
@@ -724,7 +724,7 @@ void LLPipeline::cleanup()
 
 	mMovedBridge.clear();
 
-	mInitialized = FALSE;
+	mInitialized = false;
 
 	mDeferredVB = NULL;
 
@@ -760,7 +760,7 @@ void LLPipeline::destroyGL()
 static LLTrace::BlockTimerStatHandle FTM_RESIZE_SCREEN_TEXTURE("Resize Screen Texture");
 
 //static
-void LLPipeline::throttleNewMemoryAllocation(BOOL disable)
+void LLPipeline::throttleNewMemoryAllocation(bool disable)
 {
 	if(sMemAllocationThrottled != disable)
 	{
@@ -933,7 +933,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 	if (LLPipeline::sRenderDeferred)
 	{
 		S32 shadow_detail = RenderShadowDetail;
-		BOOL ssao = RenderDeferredSSAO;
+		bool ssao = RenderDeferredSSAO;
 		
 		const U32 occlusion_divisor = 3;
 
@@ -1059,19 +1059,19 @@ void LLPipeline::updateRenderBump()
 //static
 void LLPipeline::updateRenderDeferred()
 {
-	BOOL deferred = ((RenderDeferred && 
+	bool deferred = (bool(RenderDeferred && 
 					 LLRenderTarget::sUseFBO &&
 					 LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&	 
 					 LLPipeline::sRenderBump &&
 					 VertexShaderEnable && 
 					 RenderAvatarVP &&
-					 WindLightUseAtmosShaders) ? TRUE : FALSE) &&
+					 WindLightUseAtmosShaders)) &&
 					!gUseWireframe;
 
 	sRenderDeferred = deferred;	
 	if (deferred)
 	{ //must render glow when rendering deferred since post effect pass is needed to present any lighting at all
-		sRenderGlow = TRUE;
+		sRenderGlow = true;
 	}
 }
 
@@ -1414,7 +1414,7 @@ void LLPipeline::restoreGL()
 }
 
 
-BOOL LLPipeline::canUseVertexShaders()
+bool LLPipeline::canUseVertexShaders()
 {
 	static const std::string vertex_shader_enable_feature_string = "VertexShaderEnable";
 
@@ -1424,30 +1424,30 @@ BOOL LLPipeline::canUseVertexShaders()
 		!LLFeatureManager::getInstance()->isFeatureAvailable(vertex_shader_enable_feature_string) ||
 		(assertInitialized() && mVertexShadersLoaded != 1) )
 	{
-		return FALSE;
+		return false;
 	}
 	else
 	{
-		return TRUE;
+		return true;
 	}
 }
 
-BOOL LLPipeline::canUseWindLightShaders() const
+bool LLPipeline::canUseWindLightShaders() const
 {
 	return (!LLPipeline::sDisableShaders &&
 			gWLSkyProgram.mProgramObject != 0 &&
 			LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_WINDLIGHT) > 1);
 }
 
-BOOL LLPipeline::canUseWindLightShadersOnObjects() const
+bool LLPipeline::canUseWindLightShadersOnObjects() const
 {
 	return (canUseWindLightShaders() 
 		&& LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0);
 }
 
-BOOL LLPipeline::canUseAntiAliasing() const
+bool LLPipeline::canUseAntiAliasing() const
 {
-	return TRUE;
+	return true;
 }
 
 void LLPipeline::unloadShaders()
@@ -1464,7 +1464,7 @@ void LLPipeline::assertInitializedDoError()
 
 //============================================================================
 
-void LLPipeline::enableShadows(const BOOL enable_shadows)
+void LLPipeline::enableShadows(const bool enable_shadows)
 {
 	//should probably do something here to wrangle shadows....	
 }
@@ -2002,7 +2002,7 @@ void LLPipeline::updateMovedList(LLDrawable::drawable_vector_t& moved_list)
 	{
 		LLDrawable::drawable_vector_t::iterator curiter = iter++;
 		LLDrawable *drawablep = *curiter;
-		BOOL done = TRUE;
+		bool done = true;
 		if (!drawablep->isDead() && (!drawablep->isState(LLDrawable::EARLY_MOVE)))
 		{
 			done = drawablep->updateMove();
@@ -2330,7 +2330,7 @@ void LLPipeline::checkReferences(LLSpatialGroup* group)
 }
 
 
-BOOL LLPipeline::visibleObjectsInFrustum(LLCamera& camera)
+bool LLPipeline::visibleObjectsInFrustum(LLCamera& camera)
 {
 	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); 
 			iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
@@ -2346,17 +2346,17 @@ BOOL LLPipeline::visibleObjectsInFrustum(LLCamera& camera)
 				{
 					if (part->visibleObjectsInFrustum(camera))
 					{
-						return TRUE;
+						return true;
 					}
 				}
 			}
 		}
 	}
 
-	return FALSE;
+	return false;
 }
 
-BOOL LLPipeline::getVisibleExtents(LLCamera& camera, LLVector3& min, LLVector3& max)
+bool LLPipeline::getVisibleExtents(LLCamera& camera, LLVector3& min, LLVector3& max)
 {
 	const F32 X = 65536.f;
 
@@ -2366,7 +2366,7 @@ BOOL LLPipeline::getVisibleExtents(LLCamera& camera, LLVector3& min, LLVector3&
 	LLViewerCamera::eCameraID saved_camera_id = LLViewerCamera::sCurCameraID;
 	LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
 
-	BOOL res = TRUE;
+	bool res = true;
 
 	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); 
 			iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
@@ -2382,7 +2382,7 @@ BOOL LLPipeline::getVisibleExtents(LLCamera& camera, LLVector3& min, LLVector3&
 				{
 					if (!part->getVisibleExtents(camera, min, max))
 					{
-						res = FALSE;
+						res = false;
 					}
 				}
 			}
@@ -2409,7 +2409,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
 
 	sCull->clear();
 
-	BOOL to_texture =	LLPipeline::sUseOcclusion > 1 &&
+	bool to_texture =	LLPipeline::sUseOcclusion > 1 &&
 						!hasRenderType(LLPipeline::RENDER_TYPE_HUD) && 
 						LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD &&
 						gPipeline.canUseVertexShaders() &&
@@ -2789,9 +2789,9 @@ void LLPipeline::doOcclusion(LLCamera& camera)
 	}
 }
 	
-BOOL LLPipeline::updateDrawableGeom(LLDrawable* drawablep, BOOL priority)
+bool LLPipeline::updateDrawableGeom(LLDrawable* drawablep, bool priority)
 {
-	BOOL update_complete = drawablep->updateGeometry(priority);
+	bool update_complete = drawablep->updateGeometry(priority);
 	if (update_complete && assertInitialized())
 	{
 		drawablep->setState(LLDrawable::BUILT);
@@ -3078,7 +3078,7 @@ void LLPipeline::updateGeom(F32 max_dtime)
 		last_group = drawablep->getSpatialGroup();
 		last_bridge = bridge;
 
-		BOOL update_complete = TRUE;
+		bool update_complete = true;
 		if (!drawablep->isDead())
 		{
 			update_complete = updateDrawableGeom(drawablep, FALSE);
@@ -3135,7 +3135,7 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
 	}
 }
 
-void LLPipeline::markMoved(LLDrawable *drawablep, BOOL damped_motion)
+void LLPipeline::markMoved(LLDrawable *drawablep, bool damped_motion)
 {
 	if (!drawablep)
 	{
@@ -3169,7 +3169,7 @@ void LLPipeline::markMoved(LLDrawable *drawablep, BOOL damped_motion)
 		}
 		drawablep->setState(LLDrawable::ON_MOVE_LIST);
 	}
-	if (damped_motion == FALSE)
+	if (! damped_motion)
 	{
 		drawablep->setState(LLDrawable::MOVE_UNDAMPED); // UNDAMPED trumps DAMPED
 	}
@@ -3209,7 +3209,7 @@ void LLPipeline::shiftObjects(const LLVector3 &offset)
 	assertInitialized();
 
 	glClear(GL_DEPTH_BUFFER_BIT);
-	gDepthDirty = TRUE;
+	gDepthDirty = true;
 		
 	LLVector4a offseta;
 	offseta.load3(offset.mV);
@@ -3307,13 +3307,13 @@ void LLPipeline::markMeshDirty(LLSpatialGroup* group)
 	mMeshDirtyGroup.push_back(group);
 }
 
-void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)
+void LLPipeline::markRebuild(LLSpatialGroup* group, bool priority)
 {
 	if (group && !group->isDead() && group->getSpatialPartition())
 	{
 		if (group->getSpatialPartition()->mPartitionType == LLViewerRegion::PARTITION_HUD)
 		{
-			priority = TRUE;
+			priority = true;
 		}
 
 		if (priority)
@@ -3346,13 +3346,13 @@ void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)
 	}
 }
 
-void LLPipeline::markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag, BOOL priority)
+void LLPipeline::markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag, bool priority)
 {
 	if (drawablep && !drawablep->isDead() && assertInitialized())
 	{
 		if (!drawablep->isState(LLDrawable::BUILT))
 		{
-			priority = TRUE;
+			priority = true;
 		}
 		if (priority)
 		{
@@ -3721,17 +3721,17 @@ void renderMOAPBeacons(LLDrawable* drawablep)
 	if(!vobj || vobj->isAvatar())
 		return;
 
-	BOOL beacon=FALSE;
+	bool beacon=false;
 	U8 tecount=vobj->getNumTEs();
 	for(int x=0;x<tecount;x++)
 	{
 		if(vobj->getTE(x)->hasMedia())
 		{
-			beacon=TRUE;
+			beacon=true;
 			break;
 		}
 	}
-	if(beacon==TRUE)
+	if(beacon)
 	{
 		if (gPipeline.sRenderBeacons)
 		{
@@ -4310,7 +4310,7 @@ void LLPipeline::renderHighlights()
 //debug use
 U32 LLPipeline::sCurRenderPoolType = 0 ;
 
-void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
+void LLPipeline::renderGeom(LLCamera& camera, bool forceVBOUpdate)
 {
 	LL_RECORD_BLOCK_TIME(FTM_RENDER_GEOMETRY);
 
@@ -4367,13 +4367,13 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
 	// Toggle backface culling for debugging
 	LLGLEnable cull_face(mBackfaceCull ? GL_CULL_FACE : 0);
 	// Set fog
-	BOOL use_fog = hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FOG);
+	bool use_fog = hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FOG);
 	LLGLEnable fog_enable(use_fog &&
 						  !gPipeline.canUseWindLightShadersOnObjects() ? GL_FOG : 0);
 	gSky.updateFog(camera.getFar());
 	if (!use_fog)
 	{
-		sUnderWaterRender = FALSE;
+		sUnderWaterRender = false;
 	}
 
 	gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sDefaultImagep);
@@ -4410,7 +4410,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
 			setupHWLights(NULL);
 		}
 
-		BOOL occlude = sUseOcclusion > 1;
+		bool occlude = sUseOcclusion > 1;
 		U32 cur_type = 0;
 
 		pool_set_t::iterator iter1 = mPools.begin();
@@ -4425,7 +4425,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
 
 			if (occlude && cur_type >= LLDrawPool::POOL_GRASS)
 			{
-				occlude = FALSE;
+				occlude = false;
 				gGLLastMatrix = NULL;
 				gGL.loadMatrix(gGLModelView);
 				LLGLSLShader::bindNoShader();
@@ -4490,7 +4490,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
 
 		if (occlude)
 		{
-			occlude = FALSE;
+			occlude = false;
 			gGLLastMatrix = NULL;
 			gGL.loadMatrix(gGLModelView);
 			LLGLSLShader::bindNoShader();
@@ -4673,7 +4673,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera, bool do_occlusion)
 	gGL.setColorMask(true, false);
 
 	pool_set_t::iterator iter1 = mPools.begin();
-	BOOL occlude = LLPipeline::sUseOcclusion > 1 && do_occlusion;
+	bool occlude = LLPipeline::sUseOcclusion > 1 && do_occlusion;
 
 	while ( iter1 != mPools.end() )
 	{
@@ -4683,7 +4683,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera, bool do_occlusion)
 
 		if (occlude && cur_type >= LLDrawPool::POOL_GRASS)
 		{
-			occlude = FALSE;
+			occlude = false;
 			gGLLastMatrix = NULL;
 			gGL.loadMatrix(gGLModelView);
 			LLGLSLShader::bindNoShader();
@@ -4743,7 +4743,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera, bool do_occlusion)
 
 	if (occlude)
 	{
-		occlude = FALSE;
+		occlude = false;
 		gGLLastMatrix = NULL;
 		gGL.loadMatrix(gGLModelView);
 		LLGLSLShader::bindNoShader();
@@ -5885,7 +5885,7 @@ void LLPipeline::removeFromQuickLookup( LLDrawPool* poolp )
 	case LLDrawPool::POOL_TREE:
 		#ifdef _DEBUG
 			{
-				BOOL found = mTreePools.erase( (uintptr_t)poolp->getTexture() );
+				bool found = mTreePools.erase( (uintptr_t)poolp->getTexture() );
 				llassert( found );
 			}
 		#else
@@ -5896,7 +5896,7 @@ void LLPipeline::removeFromQuickLookup( LLDrawPool* poolp )
 	case LLDrawPool::POOL_TERRAIN:
 		#ifdef _DEBUG
 			{
-				BOOL found = mTerrainPools.erase( (uintptr_t)poolp->getTexture() );
+				bool found = mTerrainPools.erase( (uintptr_t)poolp->getTexture() );
 				llassert( found );
 			}
 		#else
@@ -5959,7 +5959,7 @@ void LLPipeline::resetDrawOrders()
 // Once-per-frame setup of hardware lights,
 // including sun/moon, avatar backlight, and up to 6 local lights
 
-void LLPipeline::setupAvatarLights(BOOL for_edit)
+void LLPipeline::setupAvatarLights(bool for_edit)
 {
 	assertInitialized();
 
@@ -6064,7 +6064,7 @@ static F32 calc_light_dist(LLVOVolume* light, const LLVector3& cam_pos, F32 max_
 		return max_dist;
 	}
 	F32 radius = light->getLightRadius();
-	BOOL selected = light->isSelected();
+	bool selected = light->isSelected();
 	LLVector3 dpos = light->getRenderPosition() - cam_pos;
 	F32 dist2 = dpos.lengthSquared();
 	if (!selected && dist2 > (max_dist + radius)*(max_dist + radius))
@@ -6659,9 +6659,9 @@ void LLPipeline::findReferences(LLDrawable *drawablep)
 	}
 }
 
-BOOL LLPipeline::verify()
+bool LLPipeline::verify()
 {
-	BOOL ok = assertInitialized();
+	bool ok = assertInitialized();
 	if (ok) 
 	{
 		for (pool_set_t::iterator iter = mPools.begin(); iter != mPools.end(); ++iter)
@@ -6669,7 +6669,7 @@ BOOL LLPipeline::verify()
 			LLDrawPool *poolp = *iter;
 			if (!poolp->verify())
 			{
-				ok = FALSE;
+				ok = false;
 			}
 		}
 	}
@@ -6714,7 +6714,7 @@ BOOL LLPipeline::verify()
 
 bool LLRayAABB(const LLVector3 &center, const LLVector3 &size, const LLVector3& origin, const LLVector3& dir, LLVector3 &coord, F32 epsilon)
 {
-	BOOL Inside = TRUE;
+	bool Inside = true;
 	LLVector3 MinB = center - size;
 	LLVector3 MaxB = center + size;
 	LLVector3 MaxT;
@@ -6726,7 +6726,7 @@ bool LLRayAABB(const LLVector3 &center, const LLVector3 &size, const LLVector3&
 		if(origin.mV[i] < MinB.mV[i])
 		{
 			coord.mV[i]	= MinB.mV[i];
-			Inside		= FALSE;
+			Inside		= false;
 
 			// Calculate T distances to candidate planes
 			if(IR(dir.mV[i]))	MaxT.mV[i] = (MinB.mV[i] - origin.mV[i]) / dir.mV[i];
@@ -6734,7 +6734,7 @@ bool LLRayAABB(const LLVector3 &center, const LLVector3 &size, const LLVector3&
 		else if(origin.mV[i] > MaxB.mV[i])
 		{
 			coord.mV[i]	= MaxB.mV[i];
-			Inside		= FALSE;
+			Inside		= false;
 
 			// Calculate T distances to candidate planes
 			if(IR(dir.mV[i]))	MaxT.mV[i] = (MaxB.mV[i] - origin.mV[i]) / dir.mV[i];
@@ -6780,7 +6780,7 @@ bool LLRayAABB(const LLVector3 &center, const LLVector3 &size, const LLVector3&
 //
 //
 
-void LLPipeline::setLight(LLDrawable *drawablep, BOOL is_light)
+void LLPipeline::setLight(LLDrawable *drawablep, bool is_light)
 {
 	if (drawablep && assertInitialized())
 	{
@@ -6808,9 +6808,8 @@ void LLPipeline::toggleRenderType(U32 type)
 }
 
 //static
-void LLPipeline::toggleRenderTypeControl(void* data)
+void LLPipeline::toggleRenderTypeControl(U32 type)
 {
-	U32 type = (U32)(intptr_t)data;
 	U32 bit = (1<<type);
 	if (gPipeline.hasRenderType(type))
 	{
@@ -6824,24 +6823,21 @@ void LLPipeline::toggleRenderTypeControl(void* data)
 }
 
 //static
-BOOL LLPipeline::hasRenderTypeControl(void* data)
+bool LLPipeline::hasRenderTypeControl(U32 type)
 {
-	U32 type = (U32)(intptr_t)data;
 	return gPipeline.hasRenderType(type);
 }
 
 // Allows UI items labeled "Hide foo" instead of "Show foo"
 //static
-BOOL LLPipeline::toggleRenderTypeControlNegated(void* data)
+bool LLPipeline::toggleRenderTypeControlNegated(S32 type)
 {
-	S32 type = (S32)(intptr_t)data;
 	return !gPipeline.hasRenderType(type);
 }
 
 //static
-void LLPipeline::toggleRenderDebug(void* data)
+void LLPipeline::toggleRenderDebug(U32 bit)
 {
-	U32 bit = (U32)(intptr_t)data;
 	if (gPipeline.hasRenderDebugMask(bit))
 	{
 		LL_INFOS() << "Toggling render debug mask " << std::hex << bit << " off" << std::dec << LL_ENDL;
@@ -6855,24 +6851,21 @@ void LLPipeline::toggleRenderDebug(void* data)
 
 
 //static
-BOOL LLPipeline::toggleRenderDebugControl(void* data)
+bool LLPipeline::toggleRenderDebugControl(U32 bit)
 {
-	U32 bit = (U32)(intptr_t)data;
 	return gPipeline.hasRenderDebugMask(bit);
 }
 
 //static
-void LLPipeline::toggleRenderDebugFeature(void* data)
+void LLPipeline::toggleRenderDebugFeature(U32 bit)
 {
-	U32 bit = (U32)(intptr_t)data;
 	gPipeline.mRenderDebugFeatureMask ^= bit;
 }
 
 
 //static
-BOOL LLPipeline::toggleRenderDebugFeatureControl(void* data)
+bool LLPipeline::toggleRenderDebugFeatureControl(U32 bit)
 {
-	U32 bit = (U32)(intptr_t)data;
 	return gPipeline.hasRenderDebugFeatureMask(bit);
 }
 
@@ -6905,145 +6898,145 @@ void LLPipeline::popRenderDebugFeatureMask()
 }
 
 // static
-void LLPipeline::setRenderScriptedBeacons(BOOL val)
+void LLPipeline::setRenderScriptedBeacons(bool val)
 {
 	sRenderScriptedBeacons = val;
 }
 
 // static
-void LLPipeline::toggleRenderScriptedBeacons(void*)
+void LLPipeline::toggleRenderScriptedBeacons()
 {
 	sRenderScriptedBeacons = !sRenderScriptedBeacons;
 }
 
 // static
-BOOL LLPipeline::getRenderScriptedBeacons(void*)
+bool LLPipeline::getRenderScriptedBeacons()
 {
 	return sRenderScriptedBeacons;
 }
 
 // static
-void LLPipeline::setRenderScriptedTouchBeacons(BOOL val)
+void LLPipeline::setRenderScriptedTouchBeacons(bool val)
 {
 	sRenderScriptedTouchBeacons = val;
 }
 
 // static
-void LLPipeline::toggleRenderScriptedTouchBeacons(void*)
+void LLPipeline::toggleRenderScriptedTouchBeacons()
 {
 	sRenderScriptedTouchBeacons = !sRenderScriptedTouchBeacons;
 }
 
 // static
-BOOL LLPipeline::getRenderScriptedTouchBeacons(void*)
+bool LLPipeline::getRenderScriptedTouchBeacons()
 {
 	return sRenderScriptedTouchBeacons;
 }
 
 // static
-void LLPipeline::setRenderMOAPBeacons(BOOL val)
+void LLPipeline::setRenderMOAPBeacons(bool val)
 {
 	sRenderMOAPBeacons = val;
 }
 
 // static
-void LLPipeline::toggleRenderMOAPBeacons(void*)
+void LLPipeline::toggleRenderMOAPBeacons()
 {
 	sRenderMOAPBeacons = !sRenderMOAPBeacons;
 }
 
 // static
-BOOL LLPipeline::getRenderMOAPBeacons(void*)
+bool LLPipeline::getRenderMOAPBeacons()
 {
 	return sRenderMOAPBeacons;
 }
 
 // static
-void LLPipeline::setRenderPhysicalBeacons(BOOL val)
+void LLPipeline::setRenderPhysicalBeacons(bool val)
 {
 	sRenderPhysicalBeacons = val;
 }
 
 // static
-void LLPipeline::toggleRenderPhysicalBeacons(void*)
+void LLPipeline::toggleRenderPhysicalBeacons()
 {
 	sRenderPhysicalBeacons = !sRenderPhysicalBeacons;
 }
 
 // static
-BOOL LLPipeline::getRenderPhysicalBeacons(void*)
+bool LLPipeline::getRenderPhysicalBeacons()
 {
 	return sRenderPhysicalBeacons;
 }
 
 // static
-void LLPipeline::setRenderParticleBeacons(BOOL val)
+void LLPipeline::setRenderParticleBeacons(bool val)
 {
 	sRenderParticleBeacons = val;
 }
 
 // static
-void LLPipeline::toggleRenderParticleBeacons(void*)
+void LLPipeline::toggleRenderParticleBeacons()
 {
 	sRenderParticleBeacons = !sRenderParticleBeacons;
 }
 
 // static
-BOOL LLPipeline::getRenderParticleBeacons(void*)
+bool LLPipeline::getRenderParticleBeacons()
 {
 	return sRenderParticleBeacons;
 }
 
 // static
-void LLPipeline::setRenderSoundBeacons(BOOL val)
+void LLPipeline::setRenderSoundBeacons(bool val)
 {
 	sRenderSoundBeacons = val;
 }
 
 // static
-void LLPipeline::toggleRenderSoundBeacons(void*)
+void LLPipeline::toggleRenderSoundBeacons()
 {
 	sRenderSoundBeacons = !sRenderSoundBeacons;
 }
 
 // static
-BOOL LLPipeline::getRenderSoundBeacons(void*)
+bool LLPipeline::getRenderSoundBeacons()
 {
 	return sRenderSoundBeacons;
 }
 
 // static
-void LLPipeline::setRenderBeacons(BOOL val)
+void LLPipeline::setRenderBeacons(bool val)
 {
 	sRenderBeacons = val;
 }
 
 // static
-void LLPipeline::toggleRenderBeacons(void*)
+void LLPipeline::toggleRenderBeacons()
 {
 	sRenderBeacons = !sRenderBeacons;
 }
 
 // static
-BOOL LLPipeline::getRenderBeacons(void*)
+bool LLPipeline::getRenderBeacons()
 {
 	return sRenderBeacons;
 }
 
 // static
-void LLPipeline::setRenderHighlights(BOOL val)
+void LLPipeline::setRenderHighlights(bool val)
 {
 	sRenderHighlight = val;
 }
 
 // static
-void LLPipeline::toggleRenderHighlights(void*)
+void LLPipeline::toggleRenderHighlights()
 {
 	sRenderHighlight = !sRenderHighlight;
 }
 
 // static
-BOOL LLPipeline::getRenderHighlights(void*)
+bool LLPipeline::getRenderHighlights()
 {
 	return sRenderHighlight;
 }
@@ -7097,8 +7090,8 @@ LLVOPartGroup* LLPipeline::lineSegmentIntersectParticle(const LLVector4a& start,
 }
 
 LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start, const LLVector4a& end,
-														BOOL pick_transparent,
-														BOOL pick_rigged,
+														bool pick_transparent,
+														bool pick_rigged,
 														S32* face_hit,
 														LLVector4a* intersection,         // return the intersection point
 														LLVector2* tex_coord,            // return the texture coordinates of the intersection point
@@ -7112,7 +7105,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start,
 
 	LLVector4a position;
 
-	sPickAvatar = FALSE; //LLToolMgr::getInstance()->inBuildMode() ? FALSE : TRUE;
+	sPickAvatar = false; //! LLToolMgr::getInstance()->inBuildMode();
 	
 	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); 
 			iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
@@ -7178,7 +7171,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start,
 		const F32 ATTACHMENT_OVERRIDE_DIST = 0.1f;
 
 		//check against avatars
-		sPickAvatar = TRUE;
+		sPickAvatar = true;
 		for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); 
 				iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
 		{
@@ -7250,7 +7243,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start,
 }
 
 LLViewerObject* LLPipeline::lineSegmentIntersectInHUD(const LLVector4a& start, const LLVector4a& end,
-													  BOOL pick_transparent,													
+													  bool pick_transparent,													
 													  S32* face_hit,
 													  LLVector4a* intersection,         // return the intersection point
 													  LLVector2* tex_coord,            // return the texture coordinates of the intersection point
@@ -7265,11 +7258,11 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInHUD(const LLVector4a& start, c
 	{
 		LLViewerRegion* region = *iter;
 
-		BOOL toggle = FALSE;
+		bool toggle = false;
 		if (!hasRenderType(LLPipeline::RENDER_TYPE_HUD))
 		{
 			toggleRenderType(LLPipeline::RENDER_TYPE_HUD);
-			toggle = TRUE;
+			toggle = true;
 		}
 
 		LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_HUD);
@@ -7418,7 +7411,7 @@ void LLPipeline::doResetVertexBuffers(bool forced)
 	LLVOPartGroup::restoreGL();
 }
 
-void LLPipeline::renderObjects(U32 type, U32 mask, BOOL texture, BOOL batch_texture)
+void LLPipeline::renderObjects(U32 type, U32 mask, bool texture, bool batch_texture)
 {
 	assertInitialized();
 	gGL.loadMatrix(gGLModelView);
@@ -7428,7 +7421,7 @@ void LLPipeline::renderObjects(U32 type, U32 mask, BOOL texture, BOOL batch_text
 	gGLLastMatrix = NULL;		
 }
 
-void LLPipeline::renderMaskedObjects(U32 type, U32 mask, BOOL texture, BOOL batch_texture)
+void LLPipeline::renderMaskedObjects(U32 type, U32 mask, bool texture, bool batch_texture)
 {
 	assertInitialized();
 	gGL.loadMatrix(gGLModelView);
@@ -7501,7 +7494,7 @@ void LLPipeline::bindScreenToTexture()
 
 static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Bloom");
 
-void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
+void LLPipeline::renderBloom(bool for_snapshot, F32 zoom_factor, int subfield)
 {
 	if (!(gPipeline.canUseVertexShaders() &&
 		sRenderGlow))
@@ -8617,7 +8610,7 @@ void LLPipeline::renderDeferredLighting()
 			gPipeline.popRenderTypeMask();
 		}
 
-		BOOL render_local = RenderLocalLights;
+		bool render_local = RenderLocalLights;
 				
 		if (render_local)
 		{
@@ -9170,7 +9163,7 @@ void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target)
 			gPipeline.popRenderTypeMask();
 		}
 
-		BOOL render_local = RenderLocalLights;
+		bool render_local = RenderLocalLights;
 				
 		if (render_local)
 		{
@@ -9729,10 +9722,10 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 {	
 	if (LLPipeline::sWaterReflections && assertInitialized() && LLDrawPoolWater::sNeedsReflectionUpdate)
 	{
-		BOOL skip_avatar_update = FALSE;
+		bool skip_avatar_update = false;
 		if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK || !LLVOAvatar::sVisibleInFirstPerson)
 		{
-			skip_avatar_update = TRUE;
+			skip_avatar_update = true;
 		}
 		
 		if (!skip_avatar_update)
@@ -9747,7 +9740,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 
 		LLCamera camera = camera_in;
 		camera.setFar(camera.getFar()*0.87654321f);
-		LLPipeline::sReflectionRender = TRUE;
+		LLPipeline::sReflectionRender = true;
 		
 		gPipeline.pushRenderTypeMask();
 
@@ -9933,7 +9926,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 
 		camera.setOrigin(camera_in.getOrigin());
 		//render distortion map
-		static BOOL last_update = TRUE;
+		static bool last_update = true;
 		if (last_update)
 		{
 			camera.setFar(camera_in.getFar());
@@ -9943,7 +9936,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 								END_RENDER_TYPES);	
 			stop_glerror();
 
-			LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater() ? FALSE : TRUE;
+			LLPipeline::sUnderWaterRender = ! LLViewerCamera::getInstance()->cameraUnderWater();
 
 			if (LLPipeline::sUnderWaterRender)
 			{
@@ -10005,12 +9998,12 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 			}
 
 			mWaterDis.flush();
-			LLPipeline::sUnderWaterRender = FALSE;
+			LLPipeline::sUnderWaterRender = false;
 			
 		}
 		last_update = LLDrawPoolWater::sNeedsReflectionUpdate && LLDrawPoolWater::sNeedsDistortionUpdate;
 
-		LLPipeline::sReflectionRender = FALSE;
+		LLPipeline::sReflectionRender = false;
 
 		if (!LLRenderTarget::sUseFBO)
 		{
@@ -10105,7 +10098,7 @@ static LLTrace::BlockTimerStatHandle FTM_SHADOW_RENDER("Render Shadows");
 static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA("Alpha Shadow");
 static LLTrace::BlockTimerStatHandle FTM_SHADOW_SIMPLE("Simple Shadow");
 
-void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& shadow_cam, LLCullResult &result, BOOL use_shader, BOOL use_occlusion, U32 target_width)
+void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& shadow_cam, LLCullResult &result, bool use_shader, bool use_occlusion, U32 target_width)
 {
 	LL_RECORD_BLOCK_TIME(FTM_SHADOW_RENDER);
 
@@ -10115,7 +10108,7 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
 	{
 		LLPipeline::sUseOcclusion = 0;
 	}
-	LLPipeline::sShadowRender = TRUE;
+	LLPipeline::sShadowRender = true;
 	
 	U32 types[] = { 
 		LLRenderPass::PASS_SIMPLE, 
@@ -10258,18 +10251,18 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
 	gGLLastMatrix = NULL;
 
 	LLPipeline::sUseOcclusion = occlude;
-	LLPipeline::sShadowRender = FALSE;
+	LLPipeline::sShadowRender = false;
 }
 
 static LLTrace::BlockTimerStatHandle FTM_VISIBLE_CLOUD("Visible Cloud");
-BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector3& max, std::vector<LLVector3>& fp, LLVector3 light_dir)
+bool LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector3& max, std::vector<LLVector3>& fp, LLVector3 light_dir)
 {
 	LL_RECORD_BLOCK_TIME(FTM_VISIBLE_CLOUD);
 	//get point cloud of intersection of frust and min, max
 
 	if (getVisibleExtents(camera, min, max))
 	{
-		return FALSE;
+		return false;
 	}
 
 	//get set of planes on bounding box
@@ -10427,10 +10420,10 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
 	
 	if (fp.empty())
 	{
-		return FALSE;
+		return false;
 	}
 	
-	return TRUE;
+	return true;
 }
 
 void LLPipeline::renderHighlight(const LLViewerObject* obj, F32 fade)
@@ -10522,11 +10515,11 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
 
 	LL_RECORD_BLOCK_TIME(FTM_GEN_SUN_SHADOW);
 
-	BOOL skip_avatar_update = FALSE;
+	bool skip_avatar_update = false;
 	if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK || !LLVOAvatar::sVisibleInFirstPerson)
 	{
 
-		skip_avatar_update = TRUE;
+		skip_avatar_update = true;
 	}
 
 	if (!skip_avatar_update)
@@ -11286,7 +11279,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
 	}
 }
 
-void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL texture)
+void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, U32 mask, bool texture)
 {
 	for (LLCullResult::sg_iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i)
 	{
@@ -11372,10 +11365,10 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
 	S32 occlusion = sUseOcclusion;
 	sUseOcclusion = 0;
 
-	sReflectionRender = sRenderDeferred ? FALSE : TRUE;
+	sReflectionRender = ! sRenderDeferred;
 
-	sShadowRender = TRUE;
-	sImpostorRender = TRUE;
+	sShadowRender = true;
+	sImpostorRender = true;
 
 	LLViewerCamera* viewer_camera = LLViewerCamera::getInstance();
 
@@ -11624,9 +11617,9 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
 
 	LLVOAvatar::sUseImpostors = true; // @TODO ???
 	sUseOcclusion = occlusion;
-	sReflectionRender = FALSE;
-	sImpostorRender = FALSE;
-	sShadowRender = FALSE;
+	sReflectionRender = false;
+	sImpostorRender = false;
+	sShadowRender = false;
 	popRenderTypeMask();
 
 	gGL.matrixMode(LLRender::MM_PROJECTION);
@@ -11643,7 +11636,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
 	LLGLState::checkClientArrays();
 }
 
-BOOL LLPipeline::hasRenderBatches(const U32 type) const
+bool LLPipeline::hasRenderBatches(const U32 type) const
 {
 	return sCull->getRenderMapSize(type) > 0;
 }
@@ -11668,12 +11661,12 @@ LLCullResult::sg_iterator LLPipeline::endAlphaGroups()
 	return sCull->endAlphaGroups();
 }
 
-BOOL LLPipeline::hasRenderType(const U32 type) const
+bool LLPipeline::hasRenderType(const U32 type) const
 {
     // STORM-365 : LLViewerJointAttachment::setAttachmentVisibility() is setting type to 0 to actually mean "do not render"
-    // We then need to test that value here and return FALSE to prevent attachment to render (in mouselook for instance)
-    // TODO: reintroduce RENDER_TYPE_NONE in LLRenderTypeMask and initialize its mRenderTypeEnabled[RENDER_TYPE_NONE] to FALSE explicitely
-	return (type == 0 ? FALSE : mRenderTypeEnabled[type]);
+    // We then need to test that value here and return false to prevent attachment to render (in mouselook for instance)
+    // TODO: reintroduce RENDER_TYPE_NONE in LLRenderTypeMask and initialize its mRenderTypeEnabled[RENDER_TYPE_NONE] to false explicitely
+	return (type == 0 ? false : mRenderTypeEnabled[type]);
 }
 
 void LLPipeline::setRenderTypeMask(U32 type, ...)
@@ -11683,7 +11676,7 @@ void LLPipeline::setRenderTypeMask(U32 type, ...)
 	va_start(args, type);
 	while (type < END_RENDER_TYPES)
 	{
-		mRenderTypeEnabled[type] = TRUE;
+		mRenderTypeEnabled[type] = true;
 		type = va_arg(args, U32);
 	}
 	va_end(args);
@@ -11694,7 +11687,7 @@ void LLPipeline::setRenderTypeMask(U32 type, ...)
 	}
 }
 
-BOOL LLPipeline::hasAnyRenderType(U32 type, ...) const
+bool LLPipeline::hasAnyRenderType(U32 type, ...) const
 {
 	va_list args;
 
@@ -11703,7 +11696,7 @@ BOOL LLPipeline::hasAnyRenderType(U32 type, ...) const
 	{
 		if (mRenderTypeEnabled[type])
 		{
-			return TRUE;
+			return true;
 		}
 		type = va_arg(args, U32);
 	}
@@ -11714,7 +11707,7 @@ BOOL LLPipeline::hasAnyRenderType(U32 type, ...) const
 		LL_ERRS() << "Invalid render type." << LL_ENDL;
 	}
 
-	return FALSE;
+	return false;
 }
 
 void LLPipeline::pushRenderTypeMask()
@@ -11739,10 +11732,10 @@ void LLPipeline::andRenderTypeMask(U32 type, ...)
 {
 	va_list args;
 
-	BOOL tmp[NUM_RENDER_TYPES];
+	bool tmp[NUM_RENDER_TYPES];
 	for (U32 i = 0; i < NUM_RENDER_TYPES; ++i)
 	{
-		tmp[i] = FALSE;
+		tmp[i] = false;
 	}
 
 	va_start(args, type);
@@ -11750,7 +11743,7 @@ void LLPipeline::andRenderTypeMask(U32 type, ...)
 	{
 		if (mRenderTypeEnabled[type]) 
 		{
-			tmp[type] = TRUE;
+			tmp[type] = true;
 		}
 
 		type = va_arg(args, U32);
@@ -11776,7 +11769,7 @@ void LLPipeline::clearRenderTypeMask(U32 type, ...)
 	va_start(args, type);
 	while (type < END_RENDER_TYPES)
 	{
-		mRenderTypeEnabled[type] = FALSE;
+		mRenderTypeEnabled[type] = false;
 		
 		type = va_arg(args, U32);
 	}
@@ -11792,7 +11785,7 @@ void LLPipeline::setAllRenderTypes()
 {
 	for (U32 i = 0; i < NUM_RENDER_TYPES; ++i)
 	{
-		mRenderTypeEnabled[i] = TRUE;
+		mRenderTypeEnabled[i] = true;
 	}
 }
 
@@ -11800,7 +11793,7 @@ void LLPipeline::clearAllRenderTypes()
 {
 	for (U32 i = 0; i < NUM_RENDER_TYPES; ++i)
 	{
-		mRenderTypeEnabled[i] = FALSE;
+		mRenderTypeEnabled[i] = false;
 	}
 }
 
@@ -11867,7 +11860,7 @@ void LLPipeline::restorePermanentObjects( const std::vector<U32>& restoreList )
 	skipRenderingOfTerrain( false );
 }
 
-void LLPipeline::skipRenderingOfTerrain( BOOL flag )
+void LLPipeline::skipRenderingOfTerrain( bool flag )
 {
 	pool_set_t::iterator iter = mPools.begin();
 	while ( iter != mPools.end() )
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index bba36351d9f374e9d18fd4f82a0fcd2f78493ac5..c9670a60f26cdcf265e3e5d810ceb02ffe2cf5d9 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -57,10 +57,10 @@ typedef enum e_avatar_skinning_method
 	SKIN_METHOD_VERTEX_PROGRAM
 } EAvatarSkinningMethod;
 
-BOOL compute_min_max(LLMatrix4& box, LLVector2& min, LLVector2& max); // Shouldn't be defined here!
+bool compute_min_max(LLMatrix4& box, LLVector2& min, LLVector2& max); // Shouldn't be defined here!
 bool LLRayAABB(const LLVector3 &center, const LLVector3 &size, const LLVector3& origin, const LLVector3& dir, LLVector3 &coord, F32 epsilon = 0);
-BOOL setup_hud_matrices(); // use whole screen to render hud
-BOOL setup_hud_matrices(const LLRect& screen_region); // specify portion of screen (in pixels) to render hud attachments from (for picking)
+bool setup_hud_matrices(); // use whole screen to render hud
+bool setup_hud_matrices(const LLRect& screen_region); // specify portion of screen (in pixels) to render hud attachments from (for picking)
 glh::matrix4f glh_copy_matrix(F32* src);
 glh::matrix4f glh_get_current_modelview();
 void glh_set_current_modelview(const glh::matrix4f& mat);
@@ -133,11 +133,11 @@ class LLPipeline
 	void resetVertexBuffers(LLDrawable* drawable);
 	void generateImpostor(LLVOAvatar* avatar);
 	void bindScreenToTexture();
-	void renderBloom(BOOL for_snapshot, F32 zoom_factor = 1.f, int subfield = 0);
+	void renderBloom(bool for_snapshot, F32 zoom_factor = 1.f, int subfield = 0);
 
 	void init();
 	void cleanup();
-	BOOL isInit() { return mInitialized; };
+	bool isInit() { return mInitialized; };
 
 	/// @brief Get a draw pool from pool type (POOL_SIMPLE, POOL_MEDIA) and texture.
 	/// @return Draw pool, or NULL if not found.
@@ -171,19 +171,19 @@ class LLPipeline
 	void		doOcclusion(LLCamera& camera, LLRenderTarget& source, LLRenderTarget& dest, LLRenderTarget* scratch_space = NULL);
 	void		doOcclusion(LLCamera& camera);
 	void		markNotCulled(LLSpatialGroup* group, LLCamera &camera);
-	void        markMoved(LLDrawable *drawablep, BOOL damped_motion = FALSE);
+	void        markMoved(LLDrawable *drawablep, bool damped_motion = false);
 	void        markShift(LLDrawable *drawablep);
 	void        markTextured(LLDrawable *drawablep);
 	void		markGLRebuild(LLGLUpdate* glu);
-	void		markRebuild(LLSpatialGroup* group, BOOL priority = FALSE);
-	void        markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag = LLDrawable::REBUILD_ALL, BOOL priority = FALSE);
+	void		markRebuild(LLSpatialGroup* group, bool priority = false);
+	void        markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag = LLDrawable::REBUILD_ALL, bool priority = false);
 	void		markPartitionMove(LLDrawable* drawablep);
 	void		markMeshDirty(LLSpatialGroup* group);
 
 	//get the object between start and end that's closest to start.
 	LLViewerObject* lineSegmentIntersectInWorld(const LLVector4a& start, const LLVector4a& end,
-												BOOL pick_transparent,
-												BOOL pick_rigged,
+												bool pick_transparent,
+												bool pick_rigged,
 												S32* face_hit,                          // return the face hit
 												LLVector4a* intersection = NULL,         // return the intersection point
 												LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point
@@ -197,7 +197,7 @@ class LLPipeline
 
 
 	LLViewerObject* lineSegmentIntersectInHUD(const LLVector4a& start, const LLVector4a& end,
-											  BOOL pick_transparent,
+											  bool pick_transparent,
 											  S32* face_hit,                          // return the face hit
 											  LLVector4a* intersection = NULL,         // return the intersection point
 											  LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point
@@ -212,20 +212,20 @@ class LLPipeline
 
 	U32         addObject(LLViewerObject *obj);
 
-	void		enableShadows(const BOOL enable_shadows);
+	void		enableShadows(const bool enable_shadows);
 
-// 	void		setLocalLighting(const BOOL local_lighting);
-// 	BOOL		isLocalLightingEnabled() const;
+// 	void		setLocalLighting(const bool local_lighting);
+// 	bool		isLocalLightingEnabled() const;
 	S32			setLightingDetail(S32 level);
 	S32			getLightingDetail() const { return mLightingDetail; }
 	S32			getMaxLightingDetail() const;
 		
-	void		setUseVertexShaders(BOOL use_shaders);
-	BOOL		getUseVertexShaders() const { return mVertexShadersEnabled; }
-	BOOL		canUseVertexShaders();
-	BOOL		canUseWindLightShaders() const;
-	BOOL		canUseWindLightShadersOnObjects() const;
-	BOOL		canUseAntiAliasing() const;
+	void		setUseVertexShaders(bool use_shaders);
+	bool		getUseVertexShaders() const { return mVertexShadersEnabled; }
+	bool		canUseVertexShaders();
+	bool		canUseWindLightShaders() const;
+	bool		canUseWindLightShadersOnObjects() const;
+	bool		canUseAntiAliasing() const;
 
 	// phases
 	void resetFrameStats();
@@ -234,9 +234,9 @@ class LLPipeline
 	void updateMoveNormalAsync(LLDrawable* drawablep);
 	void updateMovedList(LLDrawable::drawable_vector_t& move_list);
 	void updateMove();
-	BOOL visibleObjectsInFrustum(LLCamera& camera);
-	BOOL getVisibleExtents(LLCamera& camera, LLVector3 &min, LLVector3& max);
-	BOOL getVisiblePointCloud(LLCamera& camera, LLVector3 &min, LLVector3& max, std::vector<LLVector3>& fp, LLVector3 light_dir = LLVector3(0,0,0));
+	bool visibleObjectsInFrustum(LLCamera& camera);
+	bool getVisibleExtents(LLCamera& camera, LLVector3 &min, LLVector3& max);
+	bool getVisiblePointCloud(LLCamera& camera, LLVector3 &min, LLVector3& max, std::vector<LLVector3>& fp, LLVector3 light_dir = LLVector3(0,0,0));
 	void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0, LLPlane* plane = NULL);  //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane
 	void createObjects(F32 max_dtime);
 	void createObject(LLViewerObject* vobj);
@@ -259,10 +259,10 @@ class LLPipeline
 	void postSort(LLCamera& camera);
 	void forAllVisibleDrawables(void (*func)(LLDrawable*));
 
-	void renderObjects(U32 type, U32 mask, BOOL texture = TRUE, BOOL batch_texture = FALSE);
-	void renderMaskedObjects(U32 type, U32 mask, BOOL texture = TRUE, BOOL batch_texture = FALSE);
+	void renderObjects(U32 type, U32 mask, bool texture = true, bool batch_texture = false);
+	void renderMaskedObjects(U32 type, U32 mask, bool texture = true, bool batch_texture = false);
 
-	void renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL texture);
+	void renderGroups(LLRenderPass* pass, U32 type, U32 mask, bool texture);
 
 	void grabReferences(LLCullResult& result);
 	void clearReferences();
@@ -274,7 +274,7 @@ class LLPipeline
 	void checkReferences(LLSpatialGroup* group);
 
 
-	void renderGeom(LLCamera& camera, BOOL forceVBOUpdate = FALSE);
+	void renderGeom(LLCamera& camera, bool forceVBOUpdate = false);
 	void renderGeomDeferred(LLCamera& camera);
 	void renderGeomPostDeferred(LLCamera& camera, bool do_occlusion=true);
 	void renderGeomShadow(LLCamera& camera);
@@ -292,7 +292,7 @@ class LLPipeline
 	void setHighlightObject(LLDrawable* obj) { mHighlightObject = obj; }
 
 
-	void renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& camera, LLCullResult& result, BOOL use_shader, BOOL use_occlusion, U32 target_width);
+	void renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& camera, LLCullResult& result, bool use_shader, bool use_occlusion, U32 target_width);
 	void renderHighlights();
 	void renderDebug();
 	void renderPhysicsDisplay();
@@ -300,13 +300,13 @@ class LLPipeline
 	void rebuildPools(); // Rebuild pools
 
 	void findReferences(LLDrawable *drawablep);	// Find the lists which have references to this object
-	BOOL verify();						// Verify that all data in the pipeline is "correct"
+	bool verify();						// Verify that all data in the pipeline is "correct"
 
 	S32  getLightCount() const { return mLights.size(); }
 
 	void calcNearbyLights(LLCamera& camera);
 	void setupHWLights(LLDrawPool* pool);
-	void setupAvatarLights(BOOL for_edit = FALSE);
+	void setupAvatarLights(bool for_edit = false);
 	void enableLights(U32 mask);
 	void enableLightsStatic();
 	void enableLightsDynamic();
@@ -318,9 +318,9 @@ class LLPipeline
 
 	void shiftObjects(const LLVector3 &offset);
 
-	void setLight(LLDrawable *drawablep, BOOL is_light);
+	void setLight(LLDrawable *drawablep, bool is_light);
 	
-	BOOL hasRenderBatches(const U32 type) const;
+	bool hasRenderBatches(const U32 type) const;
 	LLCullResult::drawinfo_iterator beginRenderMap(U32 type);
 	LLCullResult::drawinfo_iterator endRenderMap(U32 type);
 	LLCullResult::sg_iterator beginAlphaGroups();
@@ -329,15 +329,15 @@ class LLPipeline
 
 	void addTrianglesDrawn(S32 index_count, U32 render_type = LLRender::TRIANGLES);
 
-	BOOL hasRenderDebugFeatureMask(const U32 mask) const	{ return (mRenderDebugFeatureMask & mask) ? TRUE : FALSE; }
-	BOOL hasRenderDebugMask(const U32 mask) const			{ return (mRenderDebugMask & mask) ? TRUE : FALSE; }
+	bool hasRenderDebugFeatureMask(const U32 mask) const	{ return bool(mRenderDebugFeatureMask & mask); }
+	bool hasRenderDebugMask(const U32 mask) const			{ return bool(mRenderDebugMask & mask); }
 	void setAllRenderDebugFeatures() { mRenderDebugFeatureMask = 0xffffffff; }
 	void clearAllRenderDebugFeatures() { mRenderDebugFeatureMask = 0x0; }
 	void setAllRenderDebugDisplays() { mRenderDebugMask = 0xffffffff; }
 	void clearAllRenderDebugDisplays() { mRenderDebugMask = 0x0; }
 
-	BOOL hasRenderType(const U32 type) const;
-	BOOL hasAnyRenderType(const U32 type, ...) const;
+	bool hasRenderType(const U32 type) const;
+	bool hasAnyRenderType(const U32 type, ...) const;
 
 	void setRenderTypeMask(U32 type, ...);
 	// This is equivalent to 'setRenderTypeMask'
@@ -356,53 +356,53 @@ class LLPipeline
 	static void toggleRenderType(U32 type);
 
 	// For UI control of render features
-	static BOOL hasRenderTypeControl(void* data);
-	static void toggleRenderDebug(void* data);
-	static void toggleRenderDebugFeature(void* data);
-	static void toggleRenderTypeControl(void* data);
-	static BOOL toggleRenderTypeControlNegated(void* data);
-	static BOOL toggleRenderDebugControl(void* data);
-	static BOOL toggleRenderDebugFeatureControl(void* data);
+	static bool hasRenderTypeControl(U32 data);
+	static void toggleRenderDebug(U32 data);
+	static void toggleRenderDebugFeature(U32 data);
+	static void toggleRenderTypeControl(U32 data);
+	static bool toggleRenderTypeControlNegated(S32 data);
+	static bool toggleRenderDebugControl(U32 data);
+	static bool toggleRenderDebugFeatureControl(U32 data);
 	static void setRenderDebugFeatureControl(U32 bit, bool value);
 
-	static void setRenderParticleBeacons(BOOL val);
-	static void toggleRenderParticleBeacons(void* data);
-	static BOOL getRenderParticleBeacons(void* data);
+	static void setRenderParticleBeacons(bool val);
+	static void toggleRenderParticleBeacons();
+	static bool getRenderParticleBeacons();
 
-	static void setRenderSoundBeacons(BOOL val);
-	static void toggleRenderSoundBeacons(void* data);
-	static BOOL getRenderSoundBeacons(void* data);
+	static void setRenderSoundBeacons(bool val);
+	static void toggleRenderSoundBeacons();
+	static bool getRenderSoundBeacons();
 
-	static void setRenderMOAPBeacons(BOOL val);
-	static void toggleRenderMOAPBeacons(void * data);
-	static BOOL getRenderMOAPBeacons(void * data);
+	static void setRenderMOAPBeacons(bool val);
+	static void toggleRenderMOAPBeacons();
+	static bool getRenderMOAPBeacons();
 
-	static void setRenderPhysicalBeacons(BOOL val);
-	static void toggleRenderPhysicalBeacons(void* data);
-	static BOOL getRenderPhysicalBeacons(void* data);
+	static void setRenderPhysicalBeacons(bool val);
+	static void toggleRenderPhysicalBeacons();
+	static bool getRenderPhysicalBeacons();
 
-	static void setRenderScriptedBeacons(BOOL val);
-	static void toggleRenderScriptedBeacons(void* data);
-	static BOOL getRenderScriptedBeacons(void* data);
+	static void setRenderScriptedBeacons(bool val);
+	static void toggleRenderScriptedBeacons();
+	static bool getRenderScriptedBeacons();
 
-	static void setRenderScriptedTouchBeacons(BOOL val);
-	static void toggleRenderScriptedTouchBeacons(void* data);
-	static BOOL getRenderScriptedTouchBeacons(void* data);
+	static void setRenderScriptedTouchBeacons(bool val);
+	static void toggleRenderScriptedTouchBeacons();
+	static bool getRenderScriptedTouchBeacons();
 
-	static void setRenderBeacons(BOOL val);
-	static void toggleRenderBeacons(void* data);
-	static BOOL getRenderBeacons(void* data);
+	static void setRenderBeacons(bool val);
+	static void toggleRenderBeacons();
+	static bool getRenderBeacons();
 
-	static void setRenderHighlights(BOOL val);
-	static void toggleRenderHighlights(void* data);
-	static BOOL getRenderHighlights(void* data);
+	static void setRenderHighlights(bool val);
+	static void toggleRenderHighlights();
+	static bool getRenderHighlights();
 	static void setRenderHighlightTextureChannel(LLRender::eTexIndex channel); // sets which UV setup to display in highlight overlay
 
 	static void updateRenderBump();
 	static void updateRenderDeferred();
 	static void refreshCachedSettings();
 
-	static void throttleNewMemoryAllocation(BOOL disable);
+	static void throttleNewMemoryAllocation(bool disable);
 
 	
 
@@ -410,7 +410,7 @@ class LLPipeline
 
 	void hidePermanentObjects( std::vector<U32>& restoreList );
 	void restorePermanentObjects( const std::vector<U32>& restoreList );
-	void skipRenderingOfTerrain( BOOL flag );
+	void skipRenderingOfTerrain( bool flag );
 	void hideObject( const LLUUID& id );
 	void restoreHiddenObject( const LLUUID& id );
 
@@ -418,7 +418,7 @@ class LLPipeline
 	void unloadShaders();
 	void addToQuickLookup( LLDrawPool* new_poolp );
 	void removeFromQuickLookup( LLDrawPool* poolp );
-	BOOL updateDrawableGeom(LLDrawable* drawable, BOOL priority);
+	bool updateDrawableGeom(LLDrawable* drawable, bool priority);
 	void assertInitializedDoError();
 	bool assertInitialized() { const bool is_init = isInit(); if (!is_init) assertInitializedDoError(); return is_init; };
 	void connectRefreshCachedSettingsSafe(const std::string name);
@@ -539,12 +539,12 @@ class LLPipeline
 	
 	LLSpatialPartition* getSpatialPartition(LLViewerObject* vobj);
 
-	void updateCamera(BOOL reset = FALSE);
+	void updateCamera(bool reset = false);
 	
 	LLVector3				mFlyCamPosition;
 	LLQuaternion			mFlyCamRotation;
 
-	BOOL					 mBackfaceCull;
+	bool					 mBackfaceCull;
 	S32						 mMatrixOpCount;
 	S32						 mTextureMatrixOps;
 	S32						 mNumVisibleNodes;
@@ -557,36 +557,36 @@ class LLPipeline
 
 	static S32				sCompiles;
 
-	static BOOL				sShowHUDAttachments;
-	static BOOL				sForceOldBakedUpload; // If true will not use capabilities to upload baked textures.
+	static bool				sShowHUDAttachments;
+	static bool				sForceOldBakedUpload; // If true will not use capabilities to upload baked textures.
 	static S32				sUseOcclusion;  // 0 = no occlusion, 1 = read only, 2 = read/write
-	static BOOL				sDelayVBUpdate;
-	static BOOL				sAutoMaskAlphaDeferred;
-	static BOOL				sAutoMaskAlphaNonDeferred;
-	static BOOL				sDisableShaders; // if TRUE, rendering will be done without shaders
-	static BOOL				sRenderBump;
-	static BOOL				sBakeSunlight;
-	static BOOL				sNoAlpha;
-	static BOOL				sUseTriStrips;
-	static BOOL				sUseFarClip;
-	static BOOL				sShadowRender;
-	static BOOL				sWaterReflections;
-	static BOOL				sDynamicLOD;
-	static BOOL				sPickAvatar;
-	static BOOL				sReflectionRender;
-	static BOOL				sImpostorRender;
-	static BOOL				sImpostorRenderAlphaDepthPass;
-	static BOOL				sUnderWaterRender;
-	static BOOL				sRenderGlow;
-	static BOOL				sTextureBindTest;
-	static BOOL				sRenderFrameTest;
-	static BOOL				sRenderAttachedLights;
-	static BOOL				sRenderAttachedParticles;
-	static BOOL				sRenderDeferred;
-	static BOOL             sMemAllocationThrottled;
+	static bool				sDelayVBUpdate;
+	static bool				sAutoMaskAlphaDeferred;
+	static bool				sAutoMaskAlphaNonDeferred;
+	static bool				sDisableShaders; // if true, rendering will be done without shaders
+	static bool				sRenderBump;
+	static bool				sBakeSunlight;
+	static bool				sNoAlpha;
+	static bool				sUseTriStrips;
+	static bool				sUseFarClip;
+	static bool				sShadowRender;
+	static bool				sWaterReflections;
+	static bool				sDynamicLOD;
+	static bool				sPickAvatar;
+	static bool				sReflectionRender;
+	static bool				sImpostorRender;
+	static bool				sImpostorRenderAlphaDepthPass;
+	static bool				sUnderWaterRender;
+	static bool				sRenderGlow;
+	static bool				sTextureBindTest;
+	static bool				sRenderFrameTest;
+	static bool				sRenderAttachedLights;
+	static bool				sRenderAttachedParticles;
+	static bool				sRenderDeferred;
+	static bool             sMemAllocationThrottled;
 	static S32				sVisibleLightCount;
 	static F32				sMinRenderSize;
-	static BOOL				sRenderingHUDs;
+	static bool				sRenderingHUDs;
 
 	static LLTrace::EventStatHandle<S64> sStatBatchSize;
 
@@ -659,13 +659,13 @@ class LLPipeline
 	LLVector3				mSunDir;
 	LLVector3				mTransformedSunDir;
 
-	BOOL					mInitialized;
-	BOOL					mVertexShadersEnabled;
+	bool					mInitialized;
+	bool					mVertexShadersEnabled;
 	S32						mVertexShadersLoaded; // 0 = no, 1 = yes, -1 = failed
 
 	U32						mTransformFeedbackPrimitives; //number of primitives expected to be generated by transform feedback
 protected:
-	BOOL					mRenderTypeEnabled[NUM_RENDER_TYPES];
+	bool					mRenderTypeEnabled[NUM_RENDER_TYPES];
 	std::stack<std::string> mRenderTypeEnableStack;
 
 	U32						mRenderDebugFeatureMask;
@@ -843,15 +843,15 @@ class LLPipeline
 	U32						mLightMovingMask;
 	S32						mLightingDetail;
 		
-	static BOOL				sRenderPhysicalBeacons;
-	static BOOL				sRenderMOAPBeacons;
-	static BOOL				sRenderScriptedTouchBeacons;
-	static BOOL				sRenderScriptedBeacons;
-	static BOOL				sRenderParticleBeacons;
-	static BOOL				sRenderSoundBeacons;
+	static bool				sRenderPhysicalBeacons;
+	static bool				sRenderMOAPBeacons;
+	static bool				sRenderScriptedTouchBeacons;
+	static bool				sRenderScriptedBeacons;
+	static bool				sRenderParticleBeacons;
+	static bool				sRenderSoundBeacons;
 public:
-	static BOOL				sRenderBeacons;
-	static BOOL				sRenderHighlight;
+	static bool				sRenderBeacons;
+	static bool				sRenderHighlight;
 
 	// Determines which set of UVs to use in highlight display
 	//
@@ -861,26 +861,26 @@ class LLPipeline
 	static U32              sCurRenderPoolType ;
 
 	//cached settings
-	static BOOL WindLightUseAtmosShaders;
-	static BOOL VertexShaderEnable;
-	static BOOL RenderAvatarVP;
-	static BOOL RenderDeferred;
+	static bool WindLightUseAtmosShaders;
+	static bool VertexShaderEnable;
+	static bool RenderAvatarVP;
+	static bool RenderDeferred;
 	static F32 RenderDeferredSunWash;
 	static U32 RenderFSAASamples;
 	static U32 RenderResolutionDivisor;
-	static BOOL RenderUIBuffer;
+	static bool RenderUIBuffer;
 	static S32 RenderShadowDetail;
-	static BOOL RenderDeferredSSAO;
+	static bool RenderDeferredSSAO;
 	static F32 RenderShadowResolutionScale;
-	static BOOL RenderLocalLights;
-	static BOOL RenderDelayCreation;
-	static BOOL RenderAnimateRes;
-	static BOOL FreezeTime;
+	static bool RenderLocalLights;
+	static bool RenderDelayCreation;
+	static bool RenderAnimateRes;
+	static bool FreezeTime;
 	static S32 DebugBeaconLineWidth;
 	static F32 RenderHighlightBrightness;
 	static LLColor4 RenderHighlightColor;
 	static F32 RenderHighlightThickness;
-	static BOOL RenderSpotLightsInNondeferred;
+	static bool RenderSpotLightsInNondeferred;
 	static LLColor4 PreviewAmbientColor;
 	static LLColor4 PreviewDiffuse0;
 	static LLColor4 PreviewSpecular0;
@@ -900,8 +900,8 @@ class LLPipeline
 	static S32 RenderGlowIterations;
 	static F32 RenderGlowWidth;
 	static F32 RenderGlowStrength;
-	static BOOL RenderDepthOfField;
-	static BOOL RenderDepthOfFieldInEditMode;
+	static bool RenderDepthOfField;
+	static bool RenderDepthOfFieldInEditMode;
 	static F32 CameraFocusTransitionTime;
 	static F32 CameraFNumber;
 	static F32 CameraFocalLength;
@@ -922,7 +922,7 @@ class LLPipeline
 	static F32 RenderEdgeNormCutoff;
 	static LLVector3 RenderShadowGaussian;
 	static F32 RenderShadowBlurDistFactor;
-	static BOOL RenderDeferredAtmospheric;
+	static bool RenderDeferredAtmospheric;
 	static S32 RenderReflectionDetail;
 	static F32 RenderHighlightFadeTime;
 	static LLVector3 RenderShadowClipPlanes;
@@ -932,7 +932,7 @@ class LLPipeline
 	static LLVector3 RenderShadowSplitExponent;
 	static F32 RenderShadowErrorCutoff;
 	static F32 RenderShadowFOVCutoff;
-	static BOOL CameraOffset;
+	static bool CameraOffset;
 	static F32 CameraMaxCoF;
 	static F32 CameraDoFResScale;
 	static F32 RenderAutoHideSurfaceAreaLimit;
@@ -942,7 +942,7 @@ void render_bbox(const LLVector3 &min, const LLVector3 &max);
 void render_hud_elements();
 
 extern LLPipeline gPipeline;
-extern BOOL gDebugPipeline;
+extern bool gDebugPipeline;
 extern const LLMatrix4* gGLLastMatrix;
 
 #endif
diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml
index 779b168ae01fc2b829d1668662220ad5d3fdf5ba..7654f0dcd6bdc36c994ad1903809069e0afcc7e6 100644
--- a/indra/newview/skins/default/xui/da/floater_about.xml
+++ b/indra/newview/skins/default/xui/da/floater_about.xml
@@ -24,7 +24,7 @@ Grafik kort: [GRAPHICS_CARD]
 
 J2C Decoder Version: [J2C_VERSION]
 Audio Driver Version: [AUDIO_DRIVER_VERSION]
-LLCEFLib/CEF Version: [LLCEFLIB_VERSION]
+CEF Version: [LIBCEF_VERSION]
 LibVLC Version: [LIBVLC_VERSION]
 Voice Server Version: [VOICE_VERSION]
 	</floater.string>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index ec3e68ce336847e3a80329b755f065d1c1cd7f6a..198dee0a1a3249a540e918dae56d6dfb748c5fe7 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -38,7 +38,7 @@
 		Grafikinitialisierung fehlgeschlagen. Bitte aktualisieren Sie Ihren Grafiktreiber.
 	</string>
 	<string name="AboutHeader">
-		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([CHANNEL])
+		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) ([CHANNEL])
 [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
 	</string>
 	<string name="BuildConfig">
@@ -79,7 +79,7 @@ Erstellungszeit VFS (Cache): [VFS_TIME]
 	<string name="AboutLibs">
 		J2C-Decoderversion: [J2C_VERSION]
 Audiotreiberversion: [AUDIO_DRIVER_VERSION]
-LLCEFLib/CEF-Version: [LLCEFLIB_VERSION]
+CEF-Version: [LIBCEF_VERSION]
 LibVLC-Version: [LIBVLC_VERSION]
 Voice-Server-Version: [VOICE_VERSION]
 	</string>
diff --git a/indra/newview/skins/default/xui/en/mime_types.xml b/indra/newview/skins/default/xui/en/mime_types.xml
index 8d8d546b249b2c0c4ae2c3513f9aafa91356b688..8a810f32a63c4ea981480500fffb9cd570d2045f 100644
--- a/indra/newview/skins/default/xui/en/mime_types.xml
+++ b/indra/newview/skins/default/xui/en/mime_types.xml
@@ -133,18 +133,29 @@
 			media_plugin_libvlc
 		</impl>
 	</scheme>
-  <scheme name="libvlc">
-    <label name="libvlc_label">
-      LibVLC supported media
-    </label>
-    <widgettype>
-      movie
-    </widgettype>
-    <impl>
-      media_plugin_libvlc
-    </impl>
-  </scheme>
-  <mimetype name="blank">
+	<scheme name="example">
+		<label name="example_label">
+			Example Plugin scheme trigger
+		</label>
+		<widgettype>
+			movie
+		</widgettype>
+		<impl>
+			media_plugin_example
+		</impl>
+	</scheme>
+	<scheme name="libvlc">
+		<label name="libvlc_label">
+			LibVLC supported media
+		</label>
+		<widgettype>
+			movie
+		</widgettype>
+		<impl>
+			media_plugin_libvlc
+		</impl>
+	</scheme>
+	<mimetype name="blank">
 		<label name="blank_label">
 			- None -
 		</label>
diff --git a/indra/newview/skins/default/xui/en/mime_types_mac.xml b/indra/newview/skins/default/xui/en/mime_types_mac.xml
index f71c24b2e4312f5a297ec8474c969bad59acf034..2d96708b86a220d32805b318aa65781678d20c32 100644
--- a/indra/newview/skins/default/xui/en/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/en/mime_types_mac.xml
@@ -130,7 +130,7 @@
 			movie
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</scheme>
 	<mimetype name="blank">
@@ -141,7 +141,7 @@
 			none
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</mimetype>
 	<mimetype name="none/none">
@@ -163,7 +163,7 @@
 			audio
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</mimetype>
 	<mimetype name="video/*">
@@ -174,7 +174,7 @@
 			movie
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</mimetype>
 	<mimetype name="image/*">
@@ -196,7 +196,7 @@
 			movie
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</mimetype>
 	<mimetype name="application/javascript">
@@ -218,7 +218,7 @@
 			audio
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</mimetype>
 	<mimetype name="application/pdf">
@@ -295,7 +295,7 @@
 			audio
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</mimetype>
 	<mimetype name="audio/mpeg">
@@ -306,7 +306,7 @@
 			audio
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</mimetype>
 	<mimetype name="audio/x-aiff">
@@ -317,7 +317,7 @@
 			audio
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</mimetype>
 	<mimetype name="audio/x-wav">
@@ -328,7 +328,7 @@
 			audio
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</mimetype>
 	<mimetype menu="1" name="image/bmp">
@@ -438,7 +438,7 @@
 			movie
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</mimetype>
 	<mimetype name="video/mp4">
@@ -449,7 +449,7 @@
 			movie
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</mimetype>
 	<mimetype menu="1" name="video/quicktime">
@@ -460,7 +460,7 @@
 			movie
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</mimetype>
 	<mimetype name="video/x-ms-asf">
@@ -471,7 +471,7 @@
 			movie
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</mimetype>
 	<mimetype name="video/x-ms-wmv">
@@ -482,7 +482,7 @@
 			movie
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</mimetype>
 	<mimetype menu="1" name="video/x-msvideo">
@@ -493,7 +493,7 @@
 			movie
 		</widgettype>
 		<impl>
-			media_plugin_quicktime
+			media_plugin_libvlc
 		</impl>
 	</mimetype>
 </mimetypes>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index c9be141427990d67aa5625174fb614511193dac6..f47f8e3dfad04df627db8db9733fb8868cc27240 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -22,7 +22,7 @@
 
 	<!-- about dialog/support string-->
 	<string name="AboutHeader">
-[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([CHANNEL])
+[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit)
 [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
 	</string>
     <string name="BuildConfig">Build Configuration [BUILD_CONFIG]</string>
@@ -61,7 +61,7 @@ VFS (cache) creation time: [VFS_TIME]
 	<string name="AboutLibs">
 J2C Decoder Version: [J2C_VERSION]
 Audio Driver Version: [AUDIO_DRIVER_VERSION]
-LLCEFLib/CEF Version: [LLCEFLIB_VERSION]
+[LIBCEF_VERSION]
 LibVLC Version: [LIBVLC_VERSION]
 Voice Server Version: [VOICE_VERSION]
 	</string>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 7cbd969ca04f30cffda434004ec96a8dcc9a0f56..67e45076e109390c9d675d32b780a3b84ddd9917 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -29,7 +29,7 @@
 		Error de inicialización de gráficos. Actualiza tu controlador de gráficos.
 	</string>
 	<string name="AboutHeader">
-		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([CHANNEL])
+		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) ([CHANNEL])
 [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
 	</string>
 	<string name="BuildConfig">
@@ -70,8 +70,8 @@ Tiempo de creación de VFS (caché): [VFS_TIME]
 	<string name="AboutLibs">
 		Versión de J2C Decoder: [J2C_VERSION]
 Versión de Audio Driver: [AUDIO_DRIVER_VERSION]
-Versión de LLCEFLib/CEF: [LLCEFLIB_VERSION]
-Versión de LibVLC: [LLCEFLIB_VERSION]
+Versión de CEF: [LIBCEF_VERSION]
+Versión de LibVLC: [LIBVLC_VERSION]
 Versión de Voice Server: [VOICE_VERSION]
 	</string>
 	<string name="AboutTraffic">
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 6f95039aea37fd7ea1196286b7a571c9bf33b824..c0cb0f9f69753b6cc9656c6a401c298da56c624b 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -38,7 +38,7 @@
 		Échec d&apos;initialisation des graphiques. Veuillez mettre votre pilote graphique à jour.
 	</string>
 	<string name="AboutHeader">
-		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([CHANNEL])
+		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) ([CHANNEL])
 [[VIEWER_RELEASE_NOTES_URL] [Notes de version]]
 	</string>
 	<string name="BuildConfig">
@@ -79,7 +79,7 @@ Durée de création VFS (cache) : [VFS_TIME]
 	<string name="AboutLibs">
 		Version J2C Decoder : [J2C_VERSION]
 Version Audio Driver : [AUDIO_DRIVER_VERSION]
-Version LLCEFLib/CEF : [LLCEFLIB_VERSION]
+Version CEF : [LIBCEF_VERSION]
 Version LibVLC : [LIBVLC_VERSION]
 Version serveur vocal : [VOICE_VERSION]
 	</string>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index e7dbc7d81744a32b7b8379fc81e2a6d7c042fd03..85dfd96173de562874deadb65250cb5556334d60 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -35,7 +35,7 @@
 		Inizializzazione grafica non riuscita. Aggiorna il driver della scheda grafica!
 	</string>
 	<string name="AboutHeader">
-		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([CHANNEL])
+		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) ([CHANNEL])
 [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
 	</string>
 	<string name="BuildConfig">
@@ -76,7 +76,7 @@ Data/ora creazione VFS (cache): [VFS_TIME]
 	<string name="AboutLibs">
 		Versione J2C Decoder: [J2C_VERSION]
 Versione Driver audio: [AUDIO_DRIVER_VERSION]
-Versione LLCEFLib/CEF: [LLCEFLIB_VERSION]
+Versione CEF: [LIBCEF_VERSION]
 Versione LibVLC: [LIBVLC_VERSION]
 Versione Server voice: [VOICE_VERSION]
 	</string>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index f3b3823e28dfdc3c4ff2bdea6f4a68a798495f94..0e08c4fafaf41f29af6fd7af046d84178275b9aa 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -38,7 +38,7 @@
 		グラフィックを初期化できませんでした。グラフィックドライバを更新してください。
 	</string>
 	<string name="AboutHeader">
-		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([CHANNEL])
+		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) ([CHANNEL])
 [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
 	</string>
 	<string name="BuildConfig">
@@ -79,7 +79,7 @@ VFS(キャッシュ)作成時間: [VFS_TIME]
 	<string name="AboutLibs">
 		J2C デコーダバージョン:[J2C_VERSION]
 オーディオドライババージョン:[AUDIO_DRIVER_VERSION]
-LLCEFLib/CEF バージョン: [LLCEFLIB_VERSION]
+CEF バージョン: [LIBCEF_VERSION]
 LibVLC バージョン: [LIBVLC_VERSION]
 ボイスサーバーバージョン:[VOICE_VERSION]
 	</string>
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index e9dd18043d698c0a5c07a28f2fd16fd8b27af40d..9aece1221d781a95cf99182997d37ec4dfdad929 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -43,7 +43,7 @@ Wersja OpenGL: [OPENGL_VERSION]
 
 Wersja dekodera J2C: [J2C_VERSION]
 Wersja sterownika dźwięku (Audio Driver): [AUDIO_DRIVER_VERSION]
-Wersja LLCEFLib/CEF: [LLCEFLIB_VERSION]
+Wersja CEF: [LIBCEF_VERSION]
 Wersja LibVLC: [LIBVLC_VERSION]
 Wersja serwera głosu (Voice Server): [VOICE_VERSION]
 	</string>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 0d50722cc52bd971f374f8e0ab0b2df60b45627d..6cae93e2eaa8c1b02bd3b97a2188b1433637a2a3 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -29,7 +29,7 @@
 		Falha na inicialização dos gráficos. Atualize seu driver gráfico!
 	</string>
 	<string name="AboutHeader">
-		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([CHANNEL])
+		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) ([CHANNEL])
 [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
 	</string>
 	<string name="BuildConfig">
@@ -70,7 +70,7 @@ Tempo de criação de VFS (cache): [VFS_TIME]
 	<string name="AboutLibs">
 		Versão do J2C Decoder: [J2C_VERSION]
 Versão do driver de áudio: [AUDIO_DRIVER_VERSION]
-Versão de LLCEFLib/CEF: [LLCEFLIB_VERSION]
+Versão de CEF: [LIBCEF_VERSION]
 Versão da LibVLC: [LIBVLC_VERSION]
 Versão do servidor de voz: [VOICE_VERSION]
 	</string>
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index 86ef6298acf6fbfb119496b1aed45d6d639aa40a..c8ab07bd43f76403f42a1becf22a159c28e89f06 100644
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -38,7 +38,7 @@
 		Ошибка инициализации графики. Обновите графический драйвер!
 	</string>
 	<string name="AboutHeader">
-		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([CHANNEL])
+		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) ([CHANNEL])
 [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
 	</string>
 	<string name="BuildConfig">
@@ -79,7 +79,7 @@ SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
 	<string name="AboutLibs">
 		Версия декодера J2C: [J2C_VERSION]
 Версия драйвера звука: [AUDIO_DRIVER_VERSION]
-Версия LLCEFLib/CEF: [LLCEFLIB_VERSION]
+Версия CEF: [LIBCEF_VERSION]
 Версия LibVLC: [LIBVLC_VERSION]
 Версия голосового сервера: [VOICE_VERSION]
 	</string>
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index 1b9ce239000619abcaac28fb773aa6e5e1c56ff8..3064520b1008de13cce466b4784aa23a86c2532b 100644
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -38,7 +38,7 @@
 		Grafik başlatma başarılamadı. Lütfen grafik sürücünüzü güncelleştirin!
 	</string>
 	<string name="AboutHeader">
-		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([CHANNEL])
+		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) ([CHANNEL])
 [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
 	</string>
 	<string name="BuildConfig">
@@ -79,7 +79,7 @@ VFS (önbellek) oluşturma zamanı: [VFS_TIME]
 	<string name="AboutLibs">
 		J2C Kod Çözücü Sürümü: [J2C_VERSION]
 Ses Sürücüsü Sürümü: [AUDIO_DRIVER_VERSION]
-LLCEFLib/CEF Sürümü: [LLCEFLIB_VERSION]
+CEF Sürümü: [LIBCEF_VERSION]
 LibVLC Sürümü: [LIBVLC_VERSION]
 Ses Sunucusu Sürümü: [VOICE_VERSION]
 	</string>
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
index c640c12143edb4bccd460f48aef611d1f15c6d5b..7490c01cc1aa645959f497d734b307906215f8a6 100644
--- a/indra/newview/skins/default/xui/zh/strings.xml
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -38,7 +38,7 @@
 		顯像初始化失敗。 請更新你的顯像卡驅動程式!
 	</string>
 	<string name="AboutHeader">
-		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([CHANNEL])
+		[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) ([CHANNEL])
 [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
 	</string>
 	<string name="BuildConfig">
@@ -79,7 +79,7 @@ VFS(快取)建立時間:[VFS_TIME]
 	<string name="AboutLibs">
 		J2C 解碼器版本: [J2C_VERSION]
 音效驅動程式版本: [AUDIO_DRIVER_VERSION]
-LLCEFLib/CEF版本:[LLCEFLIB_VERSION]
+CEF版本:[LIBCEF_VERSION]
 LibVLC版本:[LIBVLC_VERSION]N]
 語音伺服器版本: [VOICE_VERSION]
 	</string>
diff --git a/indra/newview/tests/llversioninfo_test.cpp b/indra/newview/tests/llversioninfo_test.cpp
index 6b0be29c2d284ab96b19ff4f8a2bff750196c8b9..f1f69f33f19b7ba2da08e56499e77434dce1e995 100644
--- a/indra/newview/tests/llversioninfo_test.cpp
+++ b/indra/newview/tests/llversioninfo_test.cpp
@@ -29,6 +29,13 @@
 
 #include "../llversioninfo.h"
 
+// LL_VIEWER_CHANNEL is a macro defined on the compiler command line. The
+// macro expands to the string name of the channel, but without quotes. We
+// need to turn it into a quoted string. This macro trick does that.
+#define stringize_inner(x) #x
+#define stringize_outer(x) stringize_inner(x)
+#define ll_viewer_channel stringize_outer(LL_VIEWER_CHANNEL)
+
 namespace tut
 {
     struct versioninfo
@@ -50,7 +57,7 @@ namespace tut
 			mShortVersion = stream.str();
 			stream.str("");
 
-			stream << LL_VIEWER_CHANNEL
+			stream << ll_viewer_channel
 				   << " "
 				   << mVersion;
 			mVersionAndChannel = stream.str();
@@ -89,7 +96,7 @@ namespace tut
 					  LL_VIEWER_VERSION_BUILD);
 		ensure_equals("Channel version", 
 					  LLVersionInfo::getChannel(), 
-					  LL_VIEWER_CHANNEL);
+					  ll_viewer_channel);
 		ensure_equals("Version String", 
 					  LLVersionInfo::getVersion(), 
 					  mVersion);
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 66d730d1aca8d0391944147c6328ed9e5ecc2513..142951da25b7301cb1933b651cbf010622c0a509 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -41,10 +41,7 @@
 # indra.util.llmanifest under their system Python!
 sys.path.insert(0, os.path.join(viewer_dir, os.pardir, "lib", "python"))
 from indra.util.llmanifest import LLManifest, main, path_ancestors, CHANNEL_VENDOR_BASE, RELEASE_CHANNEL, ManifestError
-try:
-    from llbase import llsd
-except ImportError:
-    from indra.base import llsd
+from llbase import llsd
 
 class ViewerManifest(LLManifest):
     def is_packaging_viewer(self):
@@ -287,7 +284,8 @@ def extract_names(self,src):
         random.shuffle(names)
         return ', '.join(names)
 
-class Windows_i686_Manifest(ViewerManifest):
+
+class WindowsManifest(ViewerManifest):
     def final_exe(self):
         return self.app_name_oneword()+".exe"
 
@@ -338,7 +336,7 @@ def test_for_no_msvcrt_manifest_and_copy_action(self, src, dst):
             print "Doesn't exist:", src
         
     def construct(self):
-        super(Windows_i686_Manifest, self).construct()
+        super(WindowsManifest, self).construct()
 
         pkgdir = os.path.join(self.args['build'], os.pardir, 'packages')
         relpkgdir = os.path.join(pkgdir, "lib", "release")
@@ -378,31 +376,24 @@ def construct(self):
 
             # Get fmodex dll, continue if missing
             try:
-                if self.args['configuration'].lower() == 'debug':
-                    self.path("fmodexL.dll")
+                if(self.args['arch'].lower() == 'x86_64'):
+                    self.path("fmodex64.dll")
                 else:
                     self.path("fmodex.dll")
             except:
                 print "Skipping fmodex audio library(assuming other audio engine)"
 
             # For textures
-            if self.args['configuration'].lower() == 'debug':
-                self.path("openjpegd.dll")
-            else:
-                self.path("openjpeg.dll")
+            self.path("openjpeg.dll")
 
             # These need to be installed as a SxS assembly, currently a 'private' assembly.
             # See http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx
             if self.args['configuration'].lower() == 'debug':
                  self.path("msvcr120d.dll")
                  self.path("msvcp120d.dll")
-                 self.path("msvcr100d.dll")
-                 self.path("msvcp100d.dll")
             else:
                  self.path("msvcr120.dll")
                  self.path("msvcp120.dll")
-                 self.path("msvcr100.dll")
-                 self.path("msvcp100.dll")
 
             # Vivox runtimes
             self.path("SLVoice.exe")
@@ -434,11 +425,6 @@ def construct(self):
         self.path("featuretable.txt")
         self.path("featuretable_xp.txt")
 
-        # Media plugins - QuickTime
-        if self.prefix(src='../media_plugins/quicktime/%s' % self.args['configuration'], dst="llplugin"):
-            self.path("media_plugin_quicktime.dll")
-            self.end_prefix()
-
         # Media plugins - CEF
         if self.prefix(src='../media_plugins/cef/%s' % self.args['configuration'], dst="llplugin"):
             self.path("media_plugin_cef.dll")
@@ -449,38 +435,39 @@ def construct(self):
             self.path("media_plugin_libvlc.dll")
             self.end_prefix()
 
-        # winmm.dll shim
-        if self.prefix(src='../media_plugins/winmmshim/%s' % self.args['configuration'], dst=""):
-            self.path("winmm.dll")
-            self.end_prefix()
+        # Media plugins - Example (useful for debugging - not shipped with release viewer)
+        if self.channel_type() != 'release':
+            if self.prefix(src='../media_plugins/example/%s' % self.args['configuration'], dst="llplugin"):
+                self.path("media_plugin_example.dll")
+                self.end_prefix()
 
         # CEF runtime files - debug
         if self.args['configuration'].lower() == 'debug':
             if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'debug'), dst="llplugin"):
+                self.path("chrome_elf.dll")
                 self.path("d3dcompiler_43.dll")
                 self.path("d3dcompiler_47.dll")
                 self.path("libcef.dll")
                 self.path("libEGL.dll")
                 self.path("libGLESv2.dll")
-                self.path("llceflib_host.exe")
+                self.path("dullahan_host.exe")
                 self.path("natives_blob.bin")
                 self.path("snapshot_blob.bin")
                 self.path("widevinecdmadapter.dll")
-                self.path("wow_helper.exe")
                 self.end_prefix()
         else:
         # CEF runtime files - not debug (release, relwithdebinfo etc.)
             if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"):
+                self.path("chrome_elf.dll")
                 self.path("d3dcompiler_43.dll")
                 self.path("d3dcompiler_47.dll")
                 self.path("libcef.dll")
                 self.path("libEGL.dll")
                 self.path("libGLESv2.dll")
-                self.path("llceflib_host.exe")
+                self.path("dullahan_host.exe")
                 self.path("natives_blob.bin")
                 self.path("snapshot_blob.bin")
                 self.path("widevinecdmadapter.dll")
-                self.path("wow_helper.exe")
                 self.end_prefix()
 
         # MSVC DLLs needed for CEF and have to be in same directory as plugin
@@ -648,6 +635,13 @@ def package_finish(self):
             Caption "%(caption)s"
             """
 
+        if(self.args['arch'].lower() == 'x86_64'):
+            engage_registry="SetRegView 64"
+            program_files="$PROGRAMFILES64"
+        else:
+            engage_registry="SetRegView 32"
+            program_files="$PROGRAMFILES32"
+
         tempfile = "secondlife_setup_tmp.nsi"
         # the following replaces strings in the nsi template
         # it also does python-style % substitution
@@ -656,6 +650,8 @@ def package_finish(self):
                 "%%SOURCE%%":self.get_src_prefix(),
                 "%%INST_VARS%%":inst_vars_template % substitution_strings,
                 "%%INSTALL_FILES%%":self.nsi_file_commands(True),
+                "%%PROGRAMFILES%%":program_files,
+                "%%ENGAGEREGISTRY%%":engage_registry,
                 "%%DELETE_FILES%%":self.nsi_file_commands(False)})
 
         # We use the Unicode version of NSIS, available from
@@ -671,7 +667,7 @@ def package_finish(self):
         while (not installer_created) and (nsis_attempts > 0):
             try:
                 nsis_attempts-=1;
-                self.run_command('"' + NSIS_path + '" ' + self.dst_path_of(tempfile))
+                self.run_command('"' + NSIS_path + '" /V2 ' + self.dst_path_of(tempfile))
                 installer_created=True # if no exception was raised, the codesign worked
             except ManifestError, err:
                 if nsis_attempts:
@@ -699,7 +695,17 @@ def package_finish(self):
         self.package_file = installer_file
 
 
-class Darwin_i386_Manifest(ViewerManifest):
+class Windows_i686_Manifest(WindowsManifest):
+    # specialize when we must
+    pass
+
+
+class Windows_x86_64_Manifest(WindowsManifest):
+    # specialize when we must
+    pass
+
+
+class DarwinManifest(ViewerManifest):
     def is_packaging_viewer(self):
         # darwin requires full app bundle packaging even for debugging.
         return True
@@ -725,7 +731,7 @@ def construct(self):
 
             # most everything goes in the Resources directory
             if self.prefix(src="", dst="Resources"):
-                super(Darwin_i386_Manifest, self).construct()
+                super(DarwinManifest, self).construct()
 
                 if self.prefix("cursors_mac"):
                     self.path("*.tif")
@@ -793,7 +799,7 @@ def path_optional(src, dst):
                                 "libapr-1.0.dylib",
                                 "libaprutil-1.0.dylib",
                                 "libcollada14dom.dylib",
-                                "libexpat.1.5.2.dylib",
+                                "libexpat.1.dylib",
                                 "libexception_handler.dylib",
                                 "libGLOD.dylib",
                                 ):
@@ -844,24 +850,58 @@ def path_optional(src, dst):
                         except OSError as err:
                             print "Can't symlink %s -> %s: %s" % (src, dst, err)
 
-                # LLCefLib helper apps go inside SLPlugin.app
+                # Dullahan helper apps go inside SLPlugin.app
                 if self.prefix(src="", dst="SLPlugin.app/Contents/Frameworks"):
-                    for helperappfile in ('LLCefLib Helper.app',
-                                          'LLCefLib Helper EH.app'):
+                    for helperappfile in ('DullahanHelper.app'):
                         self.path2basename(relpkgdir, helperappfile)
 
                     pluginframeworkpath = self.dst_path_of('Chromium Embedded Framework.framework');
+                    # Putting a Frameworks directory under Contents/MacOS
+                    # isn't canonical, but the path baked into Dullahan
+                    # Helper.app/Contents/MacOS/DullahanHelper is:
+                    # @executable_path/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework
+                    # (notice, not @executable_path/../Frameworks/etc.)
+                    # So we'll create a symlink (below) from there back to the
+                    # Frameworks directory nested under SLPlugin.app.
+                    helperframeworkpath = \
+                        self.dst_path_of('DullahanHelper.app/Contents/MacOS/'
+                                         'Frameworks/Chromium Embedded Framework.framework')
 
                     self.end_prefix()
 
+                    helperexecutablepath = self.dst_path_of('SLPlugin.app/Contents/Frameworks/DullahanHelper.app/Contents/MacOS/DullahanHelper')
+                    self.run_command('install_name_tool -change '
+                                     '"@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" '
+                                     '"@executable_path/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % helperexecutablepath)
+
                 # SLPlugin plugins
                 if self.prefix(src="", dst="llplugin"):
-                    self.path2basename("../media_plugins/quicktime/" + self.args['configuration'],
-                                       "media_plugin_quicktime.dylib")
                     self.path2basename("../media_plugins/cef/" + self.args['configuration'],
                                        "media_plugin_cef.dylib")
+
+                    # copy LibVLC plugin itself
+                    self.path2basename("../media_plugins/libvlc/" + self.args['configuration'],
+                                       "media_plugin_libvlc.dylib")
+
+                    # copy LibVLC dynamic libraries
+                    if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release' ), dst="lib"):
+                        self.path( "libvlc*.dylib*" )
+                        self.end_prefix()
+
+                    # copy LibVLC plugins folder
+                    if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release', 'plugins' ), dst="lib"):
+                        self.path( "*.dylib" )
+                        self.path( "plugins.dat" )
+                        self.end_prefix()
+
                     self.end_prefix("llplugin")
 
+                    # do this install_name_tool *after* media plugin is copied over
+                    dylibexecutablepath = self.dst_path_of('llplugin/media_plugin_cef.dylib')
+                    self.run_command('install_name_tool -change '
+                                     '"@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" '
+                                     '"@executable_path/../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % dylibexecutablepath)
+
                 self.end_prefix("Resources")
 
                 # CEF framework goes inside Second Life.app/Contents/Frameworks
@@ -879,16 +919,36 @@ def path_optional(src, dst):
                 # this symlink, Second Life web media can't possibly work.
                 # Real Framework folder:
                 #   Second Life.app/Contents/Frameworks/Chromium Embedded Framework.framework/
-                # Location of symlink and why it'ds relative 
+                # Location of symlink and why it's relative 
                 #   Second Life.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework/
                 # Real Frameworks folder, with the symlink inside the bundled SLPlugin.app (and why it's relative)
                 #   <top level>.app/Contents/Frameworks/Chromium Embedded Framework.framework/
                 #   <top level>.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework ->
-                frameworkpath = os.path.join(os.pardir, os.pardir, os.pardir, os.pardir, "Frameworks", "Chromium Embedded Framework.framework")
+                # It might seem simpler just to create a symlink Frameworks to
+                # the parent of Chromimum Embedded Framework.framework. But
+                # that would create a symlink cycle, which breaks our
+                # packaging step. So make a symlink from Chromium Embedded
+                # Framework.framework to the directory of the same name, which
+                # is NOT an ancestor of the symlink.
+                frameworkpath = os.path.join(os.pardir, os.pardir, os.pardir,
+                                             os.pardir, "Frameworks",
+                                             "Chromium Embedded Framework.framework")
                 try:
-                    symlinkf(frameworkpath, pluginframeworkpath)
+                    # from SLPlugin.app/Contents/Frameworks/Chromium Embedded
+                    # Framework.framework back to Second
+                    # Life.app/Contents/Frameworks/Chromium Embedded Framework.framework
+                    origin, target = pluginframeworkpath, frameworkpath
+                    symlinkf(target, origin)
+                    # from SLPlugin.app/Contents/Frameworks/Dullahan
+                    # Helper.app/Contents/MacOS/Frameworks/Chromium Embedded
+                    # Framework.framework back to
+                    # SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework
+                    self.cmakedirs(os.path.dirname(helperframeworkpath))
+                    origin = helperframeworkpath
+                    target = os.path.join(os.pardir, frameworkpath)
+                    symlinkf(target, origin)
                 except OSError as err:
-                    print "Can't symlink %s -> %s: %s" % (frameworkpath, pluginframeworkpath, err)
+                    print "Can't symlink %s -> %s: %s" % (origin, target, err)
                     raise
 
             self.end_prefix("Contents")
@@ -922,7 +982,7 @@ def package_finish(self):
         # make sure we don't have stale files laying about
         self.remove(sparsename, finalname)
 
-        self.run_command('hdiutil create %(sparse)r -volname %(vol)r -fs HFS+ -type SPARSE -megabytes 1000 -layout SPUD' % {
+        self.run_command('hdiutil create %(sparse)r -volname %(vol)r -fs HFS+ -type SPARSE -megabytes 1300 -layout SPUD' % {
                 'sparse':sparsename,
                 'vol':volname})
 
@@ -1052,6 +1112,20 @@ def package_finish(self):
         self.package_file = finalname
         self.remove(sparsename)
 
+
+class Darwin_i386_Manifest(DarwinManifest):
+    pass
+
+
+class Darwin_i686_Manifest(DarwinManifest):
+    """alias in case arch is passed as i686 instead of i386"""
+    pass
+
+
+class Darwin_x86_64_Manifest(DarwinManifest):
+    pass
+
+
 class LinuxManifest(ViewerManifest):
     def construct(self):
         super(LinuxManifest, self).construct()
diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt
index 55442b252160c55cff63a5b3f517a170b07f5f4a..8344cead57c32a8f80a01bea1a3f284b2fb11c52 100644
--- a/indra/test/CMakeLists.txt
+++ b/indra/test/CMakeLists.txt
@@ -102,7 +102,6 @@ target_link_libraries(lltest
     ${BOOST_CONTEXT_LIBRARY}
     ${BOOST_SYSTEM_LIBRARY}
     ${DL_LIBRARY}
-    ${GOOGLE_PERFTOOLS_LIBRARIES}
     )
 
 if (WINDOWS)
diff --git a/indra/test/llstreamtools_tut.cpp b/indra/test/llstreamtools_tut.cpp
index 0f6436f0f4a8b51e5d517ff85d2840c4895126da..2f027b688f35a231e39e8c08ca5eed74dafe69c1 100644
--- a/indra/test/llstreamtools_tut.cpp
+++ b/indra/test/llstreamtools_tut.cpp
@@ -149,10 +149,9 @@ namespace tut
 
 		is.clear();
 		is.str(str = "#    \r\n  #  SecondLife is a 3D World. ##");
-		skip_comments_and_emptyspace(is);
-		is.get(arr, 255, '\0');
-		expected_result = "";
-		ensure_equals("skip_comments_and_emptyspace: skip comment - 2", arr, expected_result);
+		ensure("should not be good()", ! skip_comments_and_emptyspace(is));
+		ensure("should be at eof()", is.eof());
+		// don't get(): given bad state, we can't rely on results
 
 		is.clear();
 		is.str(str = " \r\n  SecondLife is a 3D World. ##");
@@ -164,14 +163,12 @@ namespace tut
 		is.clear();
 		is.str(str = "");
 		ret = skip_comments_and_emptyspace(is);
-		is.get(arr, 255, '\0');
-		ensure("skip_comments_and_emptyspace: empty string", ret == false);
+		ensure("skip_comments_and_emptyspace: empty string", ! ret);
 
 		is.clear();
 		is.str(str = "  \r\n  \t # SecondLife is a 3D World");
 		ret = skip_comments_and_emptyspace(is);
-		is.get(arr, 255, '\0');
-		ensure("skip_comments_and_emptyspace: space newline comment empty", ret == false);
+		ensure("skip_comments_and_emptyspace: space newline comment empty", ! ret);
 	}
 	
 	//testcases for skip_line()
diff --git a/indra/test_apps/llplugintest/CMakeLists.txt b/indra/test_apps/llplugintest/CMakeLists.txt
deleted file mode 100644
index e682eacccaecf1098532be9ef707645014b4019e..0000000000000000000000000000000000000000
--- a/indra/test_apps/llplugintest/CMakeLists.txt
+++ /dev/null
@@ -1,336 +0,0 @@
-# -*- cmake -*-
-project(llplugintest)
-
-include(00-Common)
-include(OpenGL)
-include(LLCommon)
-include(LLPlugin)
-include(Linking)
-include(LLSharedLibs)
-include(PluginAPI)
-include(LLImage)
-include(LLMath)
-include(LLMessage)
-include(LLRender)
-include(LLWindow)
-include(Glut)
-include(Glui)
-
-include_directories(
-    ${LLPLUGIN_INCLUDE_DIRS}
-    ${LLCOMMON_INCLUDE_DIRS}
-    ${LLIMAGE_INCLUDE_DIRS}
-    ${LLMATH_INCLUDE_DIRS}
-    ${LLMESSAGE_INCLUDE_DIRS}
-    ${LLRENDER_INCLUDE_DIRS}
-    ${LLWINDOW_INCLUDE_DIRS}
-)
-include_directories(SYSTEM
-    ${LLCOMMON_SYSTEM_INCLUDE_DIRS}
-    )
-
-if (DARWIN)
-    include(CMakeFindFrameworks)
-    find_library(COREFOUNDATION_LIBRARY CoreFoundation)
-endif (DARWIN)
-
-### demo_plugin
-
-#set(demo_plugin_SOURCE_FILES
-#    demo_plugin.cpp
-#    )
-#
-#add_library(demo_plugin
-#    SHARED
-#    ${demo_plugin_SOURCE_FILES}
-#)
-#
-#target_link_libraries(demo_plugin
-#  ${LLPLUGIN_LIBRARIES}
-#  ${LLCOMMON_LIBRARIES}
-#  ${PLUGIN_API_WINDOWS_LIBRARIES}
-#)
-#
-#add_dependencies(demo_plugin
-#  ${LLPLUGIN_LIBRARIES}
-#  ${LLCOMMON_LIBRARIES}
-#)
-#
-#if (DARWIN)
-#  # Don't prepend 'lib' to the executable name, and don't embed a full path in the library's install name
-#  set_target_properties(
-#    demo_plugin
-#    PROPERTIES
-#    PREFIX ""
-#    BUILD_WITH_INSTALL_RPATH 1
-#    INSTALL_NAME_DIR "@executable_path"
-#  )
-#endif (DARWIN)
-
-### plugin_host
-
-#set(plugin_host_SOURCE_FILES
-#    plugin_host.cpp
-#    )
-#
-#add_executable(plugin_host
-#    WIN32
-#    ${plugin_host_SOURCE_FILES}
-#)
-#
-#set_target_properties(plugin_host
-#    PROPERTIES
-#    WIN32_EXECUTABLE
-#    FALSE
-#)
-#
-#target_link_libraries(plugin_host
-#  ${LLPLUGIN_LIBRARIES}
-#  ${LLCOMMON_LIBRARIES}
-#  ${PLUGIN_API_WINDOWS_LIBRARIES}
-#)
-#
-#add_dependencies(plugin_host
-#  demo_plugin
-#  ${LLPLUGIN_LIBRARIES}
-#  ${LLCOMMON_LIBRARIES}
-#)
-
-### plugin_process_launcher
-
-#set(plugin_process_launcher_SOURCE_FILES
-#    plugin_process_launcher.cpp
-#    )
-#
-#add_executable(plugin_process_launcher
-#    WIN32
-#    ${plugin_process_launcher_SOURCE_FILES}
-#)
-#
-#set_target_properties(plugin_process_launcher
-#    PROPERTIES
-#    WIN32_EXECUTABLE
-#    FALSE
-#)
-#
-#target_link_libraries(plugin_process_launcher
-#  ${LLPLUGIN_LIBRARIES}
-#  ${LLMESSAGE_LIBRARIES}
-#  ${LLCOMMON_LIBRARIES}
-#  ${PLUGIN_API_WINDOWS_LIBRARIES}
-#)
-#
-#add_dependencies(plugin_process_launcher
-#  SLPlugin
-#  demo_plugin
-#  ${LLPLUGIN_LIBRARIES}
-#  ${LLMESSAGE_LIBRARIES}
-#  ${LLCOMMON_LIBRARIES}
-#)
-
-### media_simple_test
-
-#set(media_simple_test_SOURCE_FILES
-#    media_simple_test.cpp
-#    )
-#
-#add_executable(media_simple_test
-#    WIN32
-#    ${media_simple_test_SOURCE_FILES}
-#)
-#
-#add_dependencies(media_simple_test stage_third_party_libs)
-#
-#set_target_properties(media_simple_test
-#    PROPERTIES
-#    WIN32_EXECUTABLE
-#    FALSE
-#)
-#
-#target_link_libraries(media_simple_test
-#  ${GLUT_LIBRARY}
-#  ${OPENGL_LIBRARIES}
-#  ${LLCOMMON_LIBRARIES}
-#)
-
-### media_plugin_test
-
-#set(media_plugin_test_SOURCE_FILES
-#    media_plugin_test.cpp
-#    )
-#
-#add_executable(media_plugin_test
-#    WIN32
-#    ${media_plugin_test_SOURCE_FILES}
-#)
-#
-#set_target_properties(media_plugin_test
-#    PROPERTIES
-#    WIN32_EXECUTABLE
-#    FALSE
-#)
-#
-#target_link_libraries(media_plugin_test
-#  ${GLUT_LIBRARY}
-#  ${OPENGL_LIBRARIES}
-#  ${LLPLUGIN_LIBRARIES}
-#  ${LLMESSAGE_LIBRARIES}
-#  ${LLCOMMON_LIBRARIES}
-#  ${PLUGIN_API_WINDOWS_LIBRARIES}
-#)
-#
-#add_dependencies(media_plugin_test
-#  stage_third_party_libs
-#  SLPlugin
-#  demo_media_plugin
-#  ${LLPLUGIN_LIBRARIES}
-#  ${LLMESSAGE_LIBRARIES}
-#  ${LLCOMMON_LIBRARIES}
-#)
-
-### demo_media_plugin
-
-#set(demo_media_plugin_SOURCE_FILES
-#    demo_media_plugin.cpp
-#    )
-#
-#add_library(demo_media_plugin
-#    SHARED
-#    ${demo_media_plugin_SOURCE_FILES}
-#)
-#
-#target_link_libraries(demo_media_plugin
-#  ${LLPLUGIN_LIBRARIES}
-#  ${LLCOMMON_LIBRARIES}
-#  ${PLUGIN_API_WINDOWS_LIBRARIES}
-#)
-#
-#add_dependencies(demo_media_plugin
-#  ${LLPLUGIN_LIBRARIES}
-#  ${LLCOMMON_LIBRARIES}
-#)
-#
-#if (DARWIN)
-#  # Don't prepend 'lib' to the executable name, and don't embed a full path in the library's install name
-#  set_target_properties(
-#    demo_media_plugin
-#    PROPERTIES
-#    PREFIX ""
-#    BUILD_WITH_INSTALL_RPATH 1
-#    INSTALL_NAME_DIR "@executable_path"
-#  )
-#endif (DARWIN)
-
-### demo_media_plugin_2
-
-#set(demo_media_plugin_2_SOURCE_FILES
-#    demo_media_plugin_2.cpp
-#    )
-#
-#add_library(demo_media_plugin_2
-#    SHARED
-#    ${demo_media_plugin_2_SOURCE_FILES}
-#)
-#
-#target_link_libraries(demo_media_plugin_2
-#  ${LLPLUGIN_LIBRARIES}
-#  ${LLCOMMON_LIBRARIES}
-#  ${PLUGIN_API_WINDOWS_LIBRARIES}
-#)
-#
-#add_dependencies(demo_media_plugin_2
-#  ${LLPLUGIN_LIBRARIES}
-#  ${LLCOMMON_LIBRARIES}
-#)
-#
-#if (DARWIN)
-#  # Don't prepend 'lib' to the executable name, and don't embed a full path in the library's install name
-#  set_target_properties(
-#    demo_media_plugin_2
-#    PROPERTIES
-#    PREFIX ""
-#    BUILD_WITH_INSTALL_RPATH 1
-#    INSTALL_NAME_DIR "@executable_path"
-#  )
-#endif (DARWIN)
-
-# Gather build products of the various dependencies into the build directory for the testbed.
-
-if(WINDOWS)
-  #********************
-  # Plugin test library deploy
-  #
-  # Debug config runtime files required for the plugin test mule
-  set(plugintest_debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}")
-  set(plugintest_debug_files
-    libeay32.dll
-    libglib-2.0-0.dll
-    libgmodule-2.0-0.dll
-    libgobject-2.0-0.dll
-    libgthread-2.0-0.dll
-    ssleay32.dll
-    )
-  copy_if_different(
-    ${plugintest_debug_src_dir}
-    "${CMAKE_CURRENT_BINARY_DIR}/Debug"
-    out_targets
-    ${plugintest_debug_files}
-    )
-  set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-  
-  # Release & ReleaseDebInfo config runtime files required for the plugin test mule
-  set(plugintest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
-  set(plugintest_release_files
-    libeay32.dll
-    libglib-2.0-0.dll
-    libgmodule-2.0-0.dll
-    libgobject-2.0-0.dll
-    libgthread-2.0-0.dll
-    ssleay32.dll
-    )
-  copy_if_different(
-    ${plugintest_release_src_dir}
-    "${CMAKE_CURRENT_BINARY_DIR}/Release"
-    out_targets
-    ${plugintest_release_files}
-    )
-  set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-
-  copy_if_different(
-    ${plugintest_release_src_dir}
-    "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo"
-    out_targets
-    ${plugintest_release_files}
-    )
-  set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-
-   add_custom_target(copy_plugintest_libs ALL
-     DEPENDS 
-     ${plugin_test_targets}
-     )
-
-endif(WINDOWS)
-
-if (DARWIN)
-  set(plugintest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
-  set(plugintest_release_files
-    libexception_handler.dylib
-    libaprutil-1.0.dylib
-    libapr-1.0.dylib
-    libexpat.1.5.2.dylib
-    )
-  copy_if_different(
-    ${plugintest_release_src_dir}
-    "${PLUGINS_DESTINATION_DIR}"
-    out_targets
-    ${plugintest_release_files}
-    )
-  set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-
-  add_custom_target(copy_plugintest_libs ALL
-    DEPENDS 
-    ${plugin_test_targets}
-    )
-
-endif (DARWIN)
-
diff --git a/indra/test_apps/llplugintest/README.Linden b/indra/test_apps/llplugintest/README.Linden
deleted file mode 100644
index 4a9f223c21f183528bc1edac3d1ba1f5592e84ae..0000000000000000000000000000000000000000
--- a/indra/test_apps/llplugintest/README.Linden
+++ /dev/null
@@ -1,21 +0,0 @@
-
-1.  Description
-
-    Exercises SLPlugin.  Demonstrates mediakit plugin reuse and
-    switchover as MIME type changes (web, quicktime, flash).
-
-
-2.  Running
-
-  2.1  Mac
-
-    Make certain '.' is included in PATH.  E.g.:
-
-       PATH=.:"$PATH" open build-darwin-i386/test_apps/llmediaplugintest/RelWithDebInfo/llmediaplugintest.app
-
-    Otherwise the program won't find SLPlugin and will timeout and
-    fail after 30 seconds and give you little information as to why.
-
-    Running 'dtruss' on plugin test applications will give you a great
-    deal of insight into why they aren't activating.
-
diff --git a/indra/test_apps/llplugintest/bookmarks.txt b/indra/test_apps/llplugintest/bookmarks.txt
deleted file mode 100644
index 2ff64f217f57aa331aee5b21c465c50b30e73d34..0000000000000000000000000000000000000000
--- a/indra/test_apps/llplugintest/bookmarks.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-# format is description, url (don't put ',' chars in description :)
-# if no ',' found, whole line is used for both description and url
-(WK) Google Home Page,http://www.google.com
-(WK) BBC News Home Page,http://news.bbc.co.uk
-(WK) Second Life,http://secondlife.com
-(WK) WebKit Home ,http://www.webkit.org
-(WK) Yahoo News,http://news.yahoo.com
-(WK) Canvas Paint (DHTML version of MS Paint),http://www.canvaspaint.org
-(WK) DHTML Lemmings!,http://www.elizium.nu/scripts/lemmings/
-(WK) DHTML graphics demos,http://www.dhteumeuleu.com/
-(WK) Shared paint app,http://colorillo.com/ac79?1l0q6cp
-(Flash) YouTube,http://youtube.com
-(Flash) Vimeo,http://www.vimeo.com/1778399
-(Flash) Simple whiteboard,http://www.imaginationcubed.com/
-(Flash) Dabble Board,http://www.dabbleboard.com/draw
-(Flash) Bubble Shooter game,http://www.wiicade.com/playGame.aspx?gameID=72&gameName=Bubble%20Shooter 
-(Flash) Pixlr photo editor,http://pixlr.com/editor/
-(Flash) Scribd,http://www.scribd.com/doc/14427744/Second-Life-Quickstart-Guide
-(Flash) MAME,http://yvern.com/fMAME/fMAME.html
-(QT) Local sample,file:///C|/Program Files/QuickTime/Sample.mov
-(QT) Movie - Watchmen Trailer,http://trailers.apple.com/movies/wb/watchmen/watchmen-tlr2_480p.mov
-(QT) Movie - Transformers - Revenge of the Fallen,http://trailers.apple.com/movies/paramount/transformers2/transformersrevengeofthefallen-tlr1_h.320.mov
-(QT) Movie - Terminator Salvation,http://trailers.apple.com/movies/wb/terminatorsalvation/terminatorsalvation-tlr3_h.320.mov
-(QT) Movie - Angels and Demons,http://trailers.apple.com/movies/sony_pictures/angelsanddemons/angelsanddemons-video_h.320.mov
-(QT) Movie - Sin City Trailer,http://trailers.apple.com/movies/miramax/sin_city/sin_city_480.mov
-(QT) Movie - The Incredibles Trailer,http://trailers.apple.com/movies/disney/the_incredibles/the_incredibles-tlr_a480.mov
-(QT) Movie - Streaming Apple Event,http://stream.qtv.apple.com/events/mar/0903lajkszg/m_090374535329zdwg_650_ref.mov
-(QT) Movie - MPEG-4 from Amazon S3,http://s3.amazonaws.com/callum-linden/flashdemo/interactive_flash_demo.mp4
-(QT) Movie - Star Trek,http://trailers.apple.com/movies/paramount/star_trek/startrek-tlr3_h.320.mov
-(QT) Movie - Ice Age 3,http://trailers.apple.com/movies/fox/ice_age_iii/iceage3-tlrd_h.320.mov
-(QT) Movie - AstroBoy,http://trailers.apple.com/movies/summit/astroboy/astroboy-tsr_h.320.mov
-(QT) Movie - Ante Up,http://trailers.apple.com/movies/independent/anteup/anteup_h.320.mov
-(QT) Movie - Every Little Step,http://trailers.apple.com/movies/sony/everylittlestep/everylittlestep-clip_h.320.mov
-(QT) Movie - The Informers,http://trailers.apple.com/movies/independent/theinformers/theinformers_h.320.mov
-(QT) Animated GIF,http://upload.wikimedia.org/wikipedia/commons/4/44/Optical.greysquares.arp-animated.gif
-(QT) Apple Text Descriptors,http://ubrowser.com/tmp/apple_text.txt
-(EX) Example Plugin,example://blah
diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp
index 1665e41e7029546e6b4281807adb6a8d9ad7d731..df021948c347668c948ab9fce08daf8ff386fa11 100644
--- a/indra/viewer_components/updater/llupdaterservice.cpp
+++ b/indra/viewer_components/updater/llupdaterservice.cpp
@@ -158,7 +158,8 @@ class LLUpdaterServiceImpl :
 private:
 	std::string mNewChannel;
 	std::string mNewVersion;
-	
+	LLTempBoundListener mMainLoopConnection;
+
 	void restartTimer(unsigned int seconds);
 	void setState(LLUpdaterService::eUpdaterState state);
 	void stopTimer();
@@ -179,7 +180,8 @@ LLUpdaterServiceImpl::LLUpdaterServiceImpl() :
 LLUpdaterServiceImpl::~LLUpdaterServiceImpl()
 {
 	LL_INFOS("UpdaterService") << "shutting down updater service" << LL_ENDL;
-	LLEventPumps::instance().obtain("mainloop").stopListening(sListenerName);
+	// Destroying an LLTempBoundListener implicitly disconnects. That's its
+	// whole purpose.
 }
 
 void LLUpdaterServiceImpl::initialize(const std::string&  channel,
@@ -560,7 +562,7 @@ void LLUpdaterServiceImpl::restartTimer(unsigned int seconds)
 	seconds << " seconds" << LL_ENDL; 
 	mTimer.start();
 	mTimer.setTimerExpirySec((F32)seconds);
-	LLEventPumps::instance().obtain("mainloop").listen(
+	mMainLoopConnection = LLEventPumps::instance().obtain("mainloop").listen(
 		sListenerName, boost::bind(&LLUpdaterServiceImpl::onMainLoop, this, _1));
 }
 
@@ -589,7 +591,7 @@ void LLUpdaterServiceImpl::setState(LLUpdaterService::eUpdaterState state)
 void LLUpdaterServiceImpl::stopTimer()
 {
 	mTimer.stop();
-	LLEventPumps::instance().obtain("mainloop").stopListening(sListenerName);
+	mMainLoopConnection.disconnect();
 }
 
 bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event)
diff --git a/scripts/packages-formatter.py b/scripts/packages-formatter.py
index 928d340b69b3976e04d65f8b55df77c20483bcc2..f91f5819b790417b47a2601afc27906c50231902 100755
--- a/scripts/packages-formatter.py
+++ b/scripts/packages-formatter.py
@@ -29,6 +29,12 @@
 import errno
 import re
 import subprocess
+import argparse
+
+parser = argparse.ArgumentParser(description='Format dependency version and copyright information for the viewer About box content')
+parser.add_argument('channel', help='viewer channel name')
+parser.add_argument('version', help='viewer version number')
+args = parser.parse_args()
 
 _autobuild=os.getenv('AUTOBUILD', 'autobuild')
 
@@ -50,9 +56,8 @@ def autobuild(*args):
             # Don't attempt to interpret anything but ENOENT
             raise
         # Here it's ENOENT: subprocess can't find the autobuild executable.
-        print >>sys.stderr, "packages-formatter on %s: can't run autobuild:\n%s\n%s" % \
-              (sys.platform, ' '.join(command), err)
-        sys.exit(1)
+        sys.exit("packages-formatter on %s: can't run autobuild:\n%s\n%s" % \
+                 (sys.platform, ' '.join(command), err))
 
     # no exceptions yet, let caller read stdout
     return child.stdout
@@ -84,6 +89,7 @@ def autobuild(*args):
     else:
         sys.exit("Unrecognized --copyrights output: %s" % line)
 
+print "%s %s" % (args.channel, args.version)
 print viewer_copyright
 for pkg in sorted(version):
     print ': '.join([pkg, version[pkg]])