diff --git a/.hgtags b/.hgtags
deleted file mode 100755
index beb2da41912f978861a92fa77dade6a14fd65577..0000000000000000000000000000000000000000
--- a/.hgtags
+++ /dev/null
@@ -1,559 +0,0 @@
-003dd9461bfa479049afcc34545ab3431b147c7c v2start
-52d96ad3d39be29147c5b2181b3bb46af6164f0e alpha-3
-d6781e22543acd7e21b967209f3c6e7003d380e3 fork to viewer-2-0
-7f16e79826d377f5f9f5b33dc721ab56d0d7dc8f alpha-4
-7f16e79826d377f5f9f5b33dc721ab56d0d7dc8f fork to viewer-20qa
-d40ac9dd949cba6dab1cc386da6a2027690c2519 alpha-5
-d2382d374139850efa5bb6adfb229e3e656cfc40 howard-demo
-b8419565906e4feb434426d8d9b17dd1458e24b2 alpha-6
-17fc2908e9a1ef34a9f53a41a393caf5c3cac390 beta-3-5
-3469d90a115b900f8f250e137bbd9b684130f5d2 beta-4
-12769e547e30067d494a6c01479a18107366ce2f beta-5
-4f777ffb99fefdc6497c61385c22688ff149c659 viewer-2-0-0
-668851b2ef0f8cf8df07a0fba429e4a6c1e70abb viewer-2-0-1
-08398e650c222336bb2b6de0cd3bba944aef11b4 2-1rn1
-80bc6cff515118a36108967af49d3f8105c95bc9 viewer-2-0-2-start
-46002088d9a4489e323b8d56131c680eaa21258c viewer-2-1-0-start
-3e4b947f79d88c385e8218cbc0731cef0e42cfc4 2-1-beta-1
-0962101bfa7df0643a6e625786025fe7f8a6dc97 2-1-beta-2
-1e2b517adc2ecb342cd3c865f2a6ccf82a3cf8d7 2-1-beta-3
-c6969fe44e58c542bfc6f1bd6c0be2fa860929ac 2-1-beta-4
-b03065d018b8a2e28b7de85b293a4c992cb4c12d 2-1-release
-19547b909b404552593be5ec7c18241e062a6d65 2-1-1-beta-1
-6e3b2e13906ba8ff22d3c8490b02d518adb2c907 2-1-1-beta-2
-bb38ff1a763738609e1b3cada6d15fa61e5e84b9 2-1-1-release
-bb38ff1a763738609e1b3cada6d15fa61e5e84b9 2.1.1-release
-c6e6324f5be1401f077ad18a4a0f6b46451c2f7b last_sprint
-7076e22f9f43f479a4ea75eac447a36364bead5a 2.2.0-beta1
-7076e22f9f43f479a4ea75eac447a36364bead5a DRTVWR-5_2.2.0-beta1
-7076e22f9f43f479a4ea75eac447a36364bead5a beta_2.1.3
-9822eb3e25f7fe0c28ffd8aba45c507caa383cbc 2.2.0-beta2
-9822eb3e25f7fe0c28ffd8aba45c507caa383cbc DRTVWR-3_2.2.0-beta2
-b0cd7e150009809a0b5b0a9d5785cd4bb230413a 2.2.0-beta3
-b0cd7e150009809a0b5b0a9d5785cd4bb230413a DRTVWR-7_2.2.0-beta3
-00a831292231faad7e44c69f76cb96f175b8dfad 2.2.0-beta4
-1415e6538d54fd5d568ee88343424d57c6803c2c 2.2.0-release
-1415e6538d54fd5d568ee88343424d57c6803c2c DRTVWR-8_2.2.0-release
-98e0d6df638429fd2f0476667504bd5a6b298def 2.3.0-start
-a3c12342b1af0951b8aa3b828aacef17fcea8178 2.3.0-beta1
-a3c12342b1af0951b8aa3b828aacef17fcea8178 DRTVWR-14_2.3.0-beta1
-db0fe9bb65187f365e58a717dd23d0f4754a9c1d 2.3.0-beta2
-db0fe9bb65187f365e58a717dd23d0f4754a9c1d DRTVWR-17_2.3.0-beta2
-6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 2.3.0-beta3
-6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 2.3.0-release
-6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 DRTVWR-13_2.3.0-release
-6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 DRTVWR-20_2.3.0-beta3
-dbc206fc61d89ff4cfe15aade0bf0c7bc7fee1c9 2.4.0-start
-3bc1f50a72e117f4d4ad8d555f0c785ea8cc201e 2.4.0-beta1
-3bc1f50a72e117f4d4ad8d555f0c785ea8cc201e DRTVWR-26_2.4.0-beta1
-25bd6007e3d2fc15db9326ed4b18a24a5969a46a 2.4.0-beta2
-25bd6007e3d2fc15db9326ed4b18a24a5969a46a DRTVWR-27_2.4.0-beta2
-1ed382c6a08ba3850b6ce9061bc551ddece0ea07 2.4.0-release
-1ed382c6a08ba3850b6ce9061bc551ddece0ea07 DRTVWR-25_2.4.0-release
-a82e5b1e22c7f90e3c7977d146b80588f004ed0d 2.5.0-start
-345b17e7cf630db77e840b4fe3451bd476d750a3 2.5.0-beta1
-345b17e7cf630db77e840b4fe3451bd476d750a3 DRTVWR-32_2.5.0-beta1
-54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f 2.5.0-beta2
-54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f DRTVWR-33--2.5.0beta2
-54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f DRTVWR-33_2.5.0-beta2
-b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-beta3
-b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-release
-b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-31_2.5.0-release
-b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-34_2.5.0-beta3
-b542f8134a2bb5dd054ff4e509a44b2ee463b1bf nat-eventapi2-base
-63a6aedfce785a6c760377bf685b2dae616797d2 2.5.1-start
-4dede9ae1ec74d41f6887719f6f1de7340d8578d 2.5.1-release
-4dede9ae1ec74d41f6887719f6f1de7340d8578d DRTVWR-37_2.5.1-release
-b53a0576eec80614d7767ed72b40ed67aeff27c9 2.5.2-release
-b53a0576eec80614d7767ed72b40ed67aeff27c9 DRTVWR-38_2.5.2-release
-4e9eec6a347f89b2b3f295beb72f1cf7837dff66 2.6.0-start
-9283d6d1d7eb71dfe4c330e7c9144857e7356bde 2.6.0-beta1
-9283d6d1d7eb71dfe4c330e7c9144857e7356bde DRTVWR-40_2.6.0-beta1
-461c8c65b5c799ddfe365422f9be9c0095d91e7d 2.6.0-beta1-tip
-9e4641f4a7870c0f565a25a2971368d5a29516a1 2.6.0-beta2
-9e4641f4a7870c0f565a25a2971368d5a29516a1 DRTVWR-41_2.6.0-beta2
-42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release
-42f32494bac475d0737799346f6831558ae8bf5d DRTVWR-39_2.6.0-release
-c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1
-c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-start
-c5bdef3aaa2744626aef3c217ce29e1900d357b3 DRTVWR-43_2.6.1-beta1
-c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release
-c9182ed77d427c759cfacf49a7b71a2e20d522aa DRTVWR-42_2.6.1-release
-56b2778c743c2a964d82e1caf11084d76a87de2c 2.6.2-start
-d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1
-d1203046bb653b763f835b04d184646949d8dd5c DRTVWR-45_2.6.2-beta1
-214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release
-214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release
-52b2263ab28f0976c689fd0b76c55a9eb027cdbf end-of-develop.py
-ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start
-d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1
-d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1
-0630e977504af5ea320c58d33cae4e1ddee793e9 2.6.3-beta2
-0630e977504af5ea320c58d33cae4e1ddee793e9 DRTVWR-48_2.6.3-beta2
-8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release
-8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release
-3178e311da3a8739a85363665006ea3c4610cad4 dons-headless-hackathon-work
-7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd 2.6.5-beta1
-7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd DRTVWR-50_2.6.5-beta1
-800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start
-bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 2.6.6-beta1
-bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 DRTVWR-52_2.6.6-beta1
-dac76a711da5f1489a01c1fa62ec97d99c25736d 2.6.6-release
-dac76a711da5f1489a01c1fa62ec97d99c25736d DRTVWR-51_2.6.6-release
-5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start
-beafa8a9bd1d1b670b7523d865204dc4a4b38eef 2.6.8-beta1
-beafa8a9bd1d1b670b7523d865204dc4a4b38eef DRTVWR-55_2.6.8-beta1
-be2000b946f8cb3de5f44b2d419287d4c48ec4eb 2.6.8-release
-be2000b946f8cb3de5f44b2d419287d4c48ec4eb DRTVWR-54_2.6.8-release
-e67da2c6e3125966dd49eef98b36317afac1fcfe 2.6.9-start
-77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-beta1
-77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-release
-77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-56_2.6.9-release
-77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-57_2.6.9-beta1
-8835e0e3c0d3a48244c287bc05811dfc2fba43ec 2.7.0-start
-43c7ee846b7eed80786acbbf35d03bd016a3e85d 2.7.0-beta1
-43c7ee846b7eed80786acbbf35d03bd016a3e85d DRTVWR-59_2.7.0-beta1
-54fd44ac92e4c61435ea33effe093a3527e18d98 2.7.1-start
-0c4d0c24278074f219e5a32e72b449e78301d11b 2.7.1-beta1
-0c4d0c24278074f219e5a32e72b449e78301d11b DRTVWR-61_2.7.1-beta1
-9f79a6ed8fdcd2f3dac33ea6b3236eeb278dccfe 2.7.2-start
-e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb 2.7.2-beta1
-e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb DRTVWR-63_2.7.2-beta1
-fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.1-release
-fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.2-release
-fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-60_2.7.1-release
-fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-62_2.7.2-release
-6a3e7e403bd19e45fdfc2fcc716867af3ab80861 2.7.3-start
-6af10678de4736222b2c3f7e010e984fb5b327de 2.7.4-start
-be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1
-be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1
-057f319dd8eccdf63a54d99686c68cdcb31b6abc 2.7.4-release
-057f319dd8eccdf63a54d99686c68cdcb31b6abc DRTVWR-66_2.7.4-release
-19a498fa62570f352d7d246f17e3c81cc1d82d8b 2.7.5-start
-09984bfa6cae17e0f72d02b75c1b7393c65eecfc 2.7.5-beta1
-09984bfa6cae17e0f72d02b75c1b7393c65eecfc DRTVWR-69_2.7.5-beta1
-6866d9df6efbd441c66451debd376d21211de39c 2.7.5-release
-6866d9df6efbd441c66451debd376d21211de39c DRTVWR-68_2.7.5-release
-e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-beta1
-e1ed60913230dd64269a7f7fc52cbc6004f6d52c 2.8.0-start
-e1ed60913230dd64269a7f7fc52cbc6004f6d52c DRTVWR-71_2.8.0-beta1
-493d9127ee50e84ba08a736a65a23ca86f7a5b01 2.8.0-release
-493d9127ee50e84ba08a736a65a23ca86f7a5b01 DRTVWR-70_2.8.0-release
-502f6a5deca9365ddae57db4f1e30172668e171e 2.8.1-start
-2c7e459e0c883f8e406b932e41e60097e9ee077e 2.8.1-beta1
-2c7e459e0c883f8e406b932e41e60097e9ee077e DRTVWR-73_2.8.1-beta1
-29e93d7e19991011bd12b5748142b11a5dcb4370 2.8.1-release
-29e93d7e19991011bd12b5748142b11a5dcb4370 DRTVWR-72_2.8.1-release
-4780e3bd2b3042f91be3426151f28c30d199bb3b 2.8.1-hotfix
-4780e3bd2b3042f91be3426151f28c30d199bb3b DRTVWR-76_2.8.1-hotfix
-54bc7823ad4e3a436fef79710f685a7372bbf795 2.8.2-start
-ac0f1a132d35c02a58861d37cca75b0429ac9137 2.8.3-start
-599677276b227357140dda35bea4a2c18e2e67b5 2.8.3-beta1
-599677276b227357140dda35bea4a2c18e2e67b5 DRTVWR-75_2.8.3-beta1
-fb85792b84bf28428889c4cc966469d92e5dac4c 2.8.3-release
-fb85792b84bf28428889c4cc966469d92e5dac4c DRTVWR-74_2.8.3-release
-6b678ea52f90d5c14181661dcd2546e25bde483e 3.0.0-start
-b0be6ce3adfef3a014a2389d360539f8a86c5439 3.0.0-beta1
-b0be6ce3adfef3a014a2389d360539f8a86c5439 DRTVWR-78_3.0.0-beta1
-1778f26b6d0ae762dec3ca37140f66620f2485d9 3.0.0-release
-1778f26b6d0ae762dec3ca37140f66620f2485d9 DRTVWR-77_3.0.0-release
-82a2079ffcb57ecb1b3849cb41376b443e1eb912 3.0.1-start
-364fd63517fbacbbcb9129d096187171ba8c9e48 3.0.1-beta1
-364fd63517fbacbbcb9129d096187171ba8c9e48 DRTVWR-81_3.0.1-beta1
-f2412ecd6740803ea9452f1d17fd872e263a0df7 3.0.2-start
-42784bf50fa01974bada2a1af3892ee09c93fcda 3.0.2-beta1
-42784bf50fa01974bada2a1af3892ee09c93fcda DRTVWR-83_3.0.2-beta1
-e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e 3.0.2-beta2
-e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e DRTVWR-86_3.0.2-beta2
-b95ddac176ac944efdc85cbee94ac2e1eab44c79 3.0.3-start
-6694f3f062aa45f64ab391d25a3eb3d5eb1b0871 3.0.3-beta1
-6694f3f062aa45f64ab391d25a3eb3d5eb1b0871 DRTVWR-85_3.0.3-beta1
-61aa7974df089e8621fe9a4c69bcdefdb3cc208a 3.0.3-beta2
-61aa7974df089e8621fe9a4c69bcdefdb3cc208a DRTVWR-89_3.0.3-beta2
-0496d2f74043cf4e6058e76ac3db03d44cff42ce 3.0.3-release
-0496d2f74043cf4e6058e76ac3db03d44cff42ce DRTVWR-84_3.0.3-release
-586907287be581817b2422b5137971b22d54ea48 3.0.4-start
-92a3aa04775438226399b19deee12ac3b5a62838 3.0.5-start
-c7282e59f374ee904bd793c3c444455e3399b0c5 3.1.0-start
-2657fa785bbfac115852c41bd0adaff74c2ad5da 3.1.0-beta1
-2657fa785bbfac115852c41bd0adaff74c2ad5da DRTVWR-93_3.1.0-beta1
-bc01ee26fd0f1866e266429e85f76340523e91f1 3.1.0-beta2
-bc01ee26fd0f1866e266429e85f76340523e91f1 DRTVWR-96_3.1.0-beta2
-ae2de7b0b33c03dc5bdf3a7bfa54463b512221b2 3.1.0-release
-ae2de7b0b33c03dc5bdf3a7bfa54463b512221b2 DRTVWR-92_3.1.0-release
-a8230590e28e4f30f5105549e0e43211d9d55711 3.2.0-start
-e440cd1dfbd128d7d5467019e497f7f803640ad6 3.2.0-beta1
-e440cd1dfbd128d7d5467019e497f7f803640ad6 DRTVWR-95_3.2.0-beta1
-9bcc2b7176634254e501e3fb4c5b56c1f637852e 3.2.0-beta2
-9bcc2b7176634254e501e3fb4c5b56c1f637852e DRTVWR-97_3.2.0-beta2
-2a13d30ee50ccfed50268238e36bb90d738ccc9e 3.2.0-beta3
-2a13d30ee50ccfed50268238e36bb90d738ccc9e DRTVWR-98_3.2.0-beta3
-3150219d229d628f0c15e58e8a51511cbd97e58d 3.2.0-release
-3150219d229d628f0c15e58e8a51511cbd97e58d DRTVWR-94_3.2.0-release
-c4911ec8cd81e676dfd2af438b3e065407a94a7a 3.2.1-start
-9e390d76807fa70d356b8716fb83b8ce42a629ef 3.2.1-beta1
-9e390d76807fa70d356b8716fb83b8ce42a629ef DRTVWR-100_3.2.1-beta1
-a8c7030d6845186fac7c188be4323a0e887b4184 3.2.1-release
-a8c7030d6845186fac7c188be4323a0e887b4184 DRTVWR-99_3.2.1-release
-40b46edba007d15d0059c80864b708b99c1da368 3.2.2-start
-523df3e67378541498d516d52af4402176a26bac 3.2.2-beta1
-523df3e67378541498d516d52af4402176a26bac DRTVWR-102_3.2.2-beta1
-80f3e30d8aa4d8f674a48bd742aaa6d8e9eae0b5 3.2.3-start
-3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-beta1
-3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-start
-3fe994349fae64fc40874bb59db387131eb35a41 DRTVWR-104_3.2.4-beta1
-bd6bcde2584491fd9228f1fa51c4575f4e764e19 3.2.4-release
-bd6bcde2584491fd9228f1fa51c4575f4e764e19 DRTVWR-103_3.2.4-release
-8a44ff3d2104269ce76145c2772cf1bdff2a2abe 3.2.5-start
-3d2d5d244c6398a4214c666d5dd3965b0918709a 3.2.5-beta1
-3d2d5d244c6398a4214c666d5dd3965b0918709a DRTVWR-106_3.2.5-beta1
-65a2c1c8d855b88edfbea4e16ef2f27e7cff8b1d 3.2.5-beta2
-65a2c1c8d855b88edfbea4e16ef2f27e7cff8b1d DRTVWR-107_3.2.5-beta2
-c6175c955a19e9b9353d242889ec1779b5762522 3.2.5-release
-c6175c955a19e9b9353d242889ec1779b5762522 DRTVWR-105_3.2.5-release
-2174ed1c7129562428a5cfe8651ed77b8d26ae18 3.2.6-start
-286d73ff5c19f6c00e023dc1b60975ed6bbe2872 3.2.6-beta1
-286d73ff5c19f6c00e023dc1b60975ed6bbe2872 DRTVWR-109_3.2.6-beta1
-4891c46a56fed7512c783b9cbe7cb7260727bf0c 3.2.7-start
-3d75c836d178c7c7e788f256afe195f6cab764a2 3.2.7-beta1
-3d75c836d178c7c7e788f256afe195f6cab764a2 DRTVWR-111_3.2.7-beta1
-89980333c99dbaf1787fe20784f1d8849e9b5d4f 3.2.8-start
-16f8e2915f3f2e4d732fb3125daf229cb0fd1875 3.2.8-beta1
-16f8e2915f3f2e4d732fb3125daf229cb0fd1875 DRTVWR-114_3.2.8-beta1
-987425b1acf4752379b2e1eb20944b4b35d67a85 3.2.8-beta2
-987425b1acf4752379b2e1eb20944b4b35d67a85 DRTVWR-115_3.2.8-beta2
-51b2fd52e36aab8f670e0874e7e1472434ec4b4a 3.2.8-release
-51b2fd52e36aab8f670e0874e7e1472434ec4b4a DRTVWR-113_3.2.8-release
-37dd400ad721e2a89ee820ffc1e7e433c68f3ca2 3.2.9-start
-e9c82fca5ae6fb8a8af29012d78fb194a29323f3 3.2.9-beta1
-e9c82fca5ae6fb8a8af29012d78fb194a29323f3 DRTVWR-117_3.2.9-beta1
-a01ef9bed28627f4ca543fbc1d70c79cc297a90f 3.2.9-beta2
-a01ef9bed28627f4ca543fbc1d70c79cc297a90f DRTVWR-118_3.2.9-beta2
-d5f263687f43f278107363365938f0a214920a4b 3.3.0-beta1
-d5f263687f43f278107363365938f0a214920a4b 3.3.0-start
-d5f263687f43f278107363365938f0a214920a4b DRTVWR-119
-5e8d2662f38a66eca6c591295f5880d47afc73f7 3.3.0-release
-3e2fca4ed1a0dc9fe6d8a6664e71098bb035a367 3.3.1-start
-3e2fca4ed1a0dc9fe6d8a6664e71098bb035a367 DRTVWR-125
-28b95a6a28dca3338d9a1f4f204b96678df9f6a5 3.3.1-beta1
-1dc545e44617975da2a4a32fe303386c687a6ca1 3.3.1-beta2
-1dc545e44617975da2a4a32fe303386c687a6ca1 DRTVWR-139
-1dc545e44617975da2a4a32fe303386c687a6ca1 viewer-beta-candidate
-c623bbc854b6f7ee1b33a3718f76715046aa2937 3.3.1-release
-d29a260119f8d5a5d168e25fed0c7ea6b3f40161 3.3.2-beta1
-675668bd24d3bea570814f71762a2a806f7e1b8d 3.3.2-beta2
-675668bd24d3bea570814f71762a2a806f7e1b8d 3.3.2-release
-15e90b52dc0297921b022b90d10d797436b8a1bd viewer-release-candidate
-bb9932a7a5fd00edf52d95f354e3b37ae6a942db DRTVWR-156
-6414ecdabc5d89515b08d1f872cf923ed3a5523a DRTVWR-148
-2a3965b3ad202df7ea25d2be689291bb14a1280e DRTVWR-155
-24a7281bef42bd4430ceb25db8b195449c2c7de3 DRTVWR-153
-5910f8063a7e1ddddf504c2f35ca831cc5e8f469 DRTVWR-160
-f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 3.3.3-beta1
-f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 DRTVWR-144
-2d6c0634b11e6f3df11002b8510a72a0433da00a DRTVWR-164
-600f3b3920d94de805ac6dc8bb6def9c069dd360 DRTVWR-162
-80b5e5e9775966d3839331ffa7a16a60f9d7c930 DRTVWR-165
-fdcc08a4f20ae9bb060f4693c8980d216534efdf 3.3.3-beta2
-af5f3e43e6e4424b1da19d9e16f6b853a7b822ed DRTVWR-169
-4b3c68199a86cabaa5d9466d7b0f7e141e901d7a 3.3.3-beta3
-6428242e124b523813bfaf4c45b3d422f0298c81 3.3.3-release
-a716684aa7c07c440b1de5815b8a1f3dd3fd8bfb DRTVWR-159
-9a78ac13f047056f788c4734dd91aebfe30970e3 DRTVWR-157
-089e5c84b2dece68f2b016c842ef9b5de4786842 DRTVWR-161
-c08e2ac17a99973b2a94477659220b99b8847ae2 DRTVWR-163
-b9d0170b62eb1c7c3adaa37a0b13a833e5e659f9 DRTVWR-171
-050e48759337249130f684b4a21080b683f61732 DRTVWR-168
-09ef7fd1b0781f33b8a3a9af6236b7bcb4831910 DRTVWR-170
-f87bfbe0b62d26f451d02a47c80ebef6b9168fc2 DRTVWR-158
-f91d003091a61937a044652c4c674447f7dcbb7a 3.3.4-beta1
-bce218b2b45b730b22cc51e4807aa8b571cadef3 DRTVWR-173
-cbea6356ce9cb0c313b6777f10c5c14783264fcc DRTVWR-174
-82b5330bc8b17d0d4b598832e9c5a92e90075682 3.3.4-beta2
-57d221de3df94f90b55204313c2cef044a3c0ae2 DRTVWR-176
-eb539c65e6ee26eea2bf373af2d0f4b52dc91289 DRTVWR-177
-a8057e1b9a1246b434a27405be35e030f7d28b0c 3.3.4-beta3
-4281aa899fb2cedb7a9ca7ce91c5c29d4aa69594 DRTVWR-180
-5c08e1d8edd871807153603b690e3ee9dbb548aa DRTVWR-183
-6c75f220b103db1420919c8b635fe53e2177f318 3.3.4-beta4
-9cd174d3a54d93d409a7c346a15b8bfb40fc58f4 DRTVWR-184
-ab2ffc547c8a8950ff187c4f6c95e5334fab597b 3.3.4-beta5
-28e100d0379a2b0710c57647a28fc5239d3d7b99 3.3.4-release
-6dfb0fba782c9233dd95f24ec48146db0d3f210b DRTVWR-199
-7c9102fb998885621919f2474a002c35b583539b 3.3.4-release2
-8c9085066c78ed5f6c9379dc054c82a6fcdb1851 DRTVWR-207
-351eea5f9dc192fc5ddea3b02958de97677a0a12 3.3.4-release3
-005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167
-888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175
-a8b3eca451a9eaab59987efb0ab1c4217e3f2dcc DRTVWR-182
-1f27cdfdc54246484f8afbbe42ce48e954175cbd 3.4.0-beta1
-9ee9387789701d597130f879d9011a4958753862 DRTVWR-189
-47f0d08ba7ade0a3905074009067c6d3df7e16ae DRTVWR-190
-421126293dcbde918e0da027ca0ab9deb5b4fbf2 DRTVWR-192
-33a2fc7a910ae29ff8b4850316ed7fbff9f64d33 DRTVWR-195
-e9732c739c8a72a590216951505ea9c76a526a84 DRTVWR-193
-7602f61c804a512764e349c034c02ddabeefebc4 DRTVWR-196
-ae5c83dd61d2d37c45f1d5b8bf2b036d87599f1b DRTVWR-198
-507bdfbd6bf844a511c1ffeda4baa80016ed1346 DRTVWR-197
-b1dbb1a83f48f93f6f878cff9e52d2cb635e145c 3.4.0-beta2
-37402e2b19af970d51b0a814d79892cc5647532b DRTVWR-200
-182a9bf30e81070361bb020a78003b1cf398e79c 3.4.0-beta3
-7649a3dff5ec22d3727377e5f02efd0f421e4cb5 DRTVWR-201
-84fb70dfe3444e75a44fb4bee43e2fc8221cebdd 3.4.0-beta4
-573e863be2f26d3687161def4b9fea9b7038dda8 3.4.0-beta5
-af7b28e75bd5a629cd9e0dc46fb3f1757626f493 DRTVWR-212
-015012c2b740ccdec8a8c3d6e5f898449ecfe0b8 DRTVWR-213
-62b07aa81b1957897c3846292bb9412977b0af6c 3.3.4-beta6
-ceed0b65a69f1eac20d523e0203320a32f9a3f3c DRTVWR-215
-733ceac77583874f3626ef7a15c105b83ef0f5bb 3.4.0-beta7
-97977c67245f52db20eb15f1918cc0f24778cabc 3.4.0-release
-5adb2b8f96c3cac88ad7c7d996d707f1b29df336 3.4.1-beta1
-b3f74858a1c8720c82d0978f3877a3fc8ba459ec 3.4.1-beta1a
-2b779f233ee6f38c89cb921650c773a96e63da92 DRTVWR-220
-0b9d95f4bfb6867cbf56eaec51633b0da2f1262d DRTVWR-221
-e6e553761829dc0270eaaa712b7cb0622535b076 3.4.1-beta3
-f00068a66a2e2f72acbe3f690b98b323e740b289 DRTVWR-222
-305950187c628a5d6743ee9ea711cc5b9177a18e 3.4.1-beta4
-dd23d4da3bcb2ffda58569e759feb7c119982973 DRTVWR-224
-0bd3744ff060452aa13ff4992eafb381df7b1012 3.4.1-beta5
-29075f8c1abed53dcf195a59f61744e27a91108f DRTVWR-226
-fba99f381b8d4ad1b7b42fa4993b29998d95be18 DRTVWR-179
-49ed253c80bed7410e238eeab35a9f14cb034364 3.4.1-beta6
-468ca3268229011a59df99229b24315844b33d34 DRTVWR-227
-524da902713e8b60322640b9825101add4a7c497 3.4.1-beta7
-173c2809f9873499c4b9d6bc044ec941c954d3fb DRTVWR-228
-1dc94555582f52718834081e7659e973ae4521f7 3.4.1-beta8
-52c164c8023a5e65f3dc1b0bbb7fa1dd0c631b6b DRTVWR-231
-464cf7a63a9a2f95bc4972dc022ca765e93de7d3 DRTVWR-233
-637fe8bbee5e24940448198c221d5ee0fa3247b4 3.4.1-beta9
-4e0d84e92132e9e95a1d52a1e49bad69c278ea05 3.4.1-beta10
-f7cbd60a3f57ff1101157eeb79ea21e8898bedae DRTVWR-235
-baf97f06ae17223614c5e31aa42e71d87cff07fe DRTVWR-236
-18498afcdb835d6fc4d36ed935347d3b65307bad 3.4.1-beta11
-b2f21e3442542283a80e7eaebae9f833e5a927b6 DRTVWR-237
-3f9be82de642d468c5fc272cb9d96b46b5498402 3.4.1-beta12
-e59ffd3fe0838ae6b09b242a6e9df71761b88f41 3.4.1-release
-81f6b745ef27f5915fd07f988fdec9944f2bb73e DRTVWR-186
-cc953f00956be52cc64c30637bbeec310eea603f DRTVWR-181
-c04e68e1b0034fd0a20815ae24c77e5f8428e822 DRTVWR-188
-4b2c52aecb7a75de31dbb12d9f5b9a251d8707be DRTVWR-191
-78ca0bbf43a92e8914d4cfa87d69a6717ef7d4cf DRTVWR-194
-248f4acd92a706c79e842bc83d80baa7369c0c2e DRTVWR-203
-de3be913f68813a9bac7d1c671fef96d1159bcd6 DRTVWR-202
-34dbbe2b00afe90352d3acf8290eb10ab90d1c8b oz-build-test-tag
-6ee71714935ffcd159db3d4f5800c1929aac54e1 DRTVWR-205
-7b22c612fc756e0ea63b10b163e81d107f85dbf8 DRTVWR-206
-b61afe175b829c149d369524a4e974dfda99facf DRTVWR-219
-32896d5e920ca9a29256ff3b747c2e99752aa5ae DRTVWR-217
-704bbae7b182a1f2811a47a054e680522966f54a 3.4.2-beta1
-288539fc0408ed4b69a99665de33bbbc2c3c08fe DRTVWR-216
-e664473c16df1d82ffaff382e7b3e023da202d52 3.4.2-beta2
-0891d7a773a31397dcad48be3fa66531d567a821 DRTVWR-242
-710785535362b3cb801b6a3dc4703be3373bd0cd 3.4.2-beta3
-e9a5886052433d5db9e504ffaca10890f9932979 DRTVWR-243
-73b84b9864dc650fe7c8fc9f52361450f0849004 3.4.2-beta4
-16310aabccf315870f7cc9bf966926c0ad6954fa 3.4.2-release
-d799593b53ed733862e9a13871e318e886469377 DRTVWR-208
-e497dcde7a3653e384eb223a8a460030e89c294c DRTVWR-223
-93ab02d83f51e30a3cabad98aff89601befd9413 DRTVWR-240
-2aa72e3372a83dece4df9cf72fb1e7c34f90b5e3 DRTVWR-209
-f7bedce18ad52283e6072814db23318907261487 DRTVWR-238
-7b64c96fbcadf360bd2feaae19d330166b70877c DRTVWR-210
-5e4e4128b256525bafc07a62e35ae8527aaa9c9d DRTVWR-241
-f1d3b3fcab28ed9ea532bf50db0ba96f5c8cc8e9 DRTVWR-232
-4918b150e75df6b516fb6c2616d32043fa6b4cac DRTVWR-245
-94ab2b49458ab372a95d2d6949fdf574f413068d 3.4.3-beta1
-965b9a35e260c0f53be1a25f0db7abc8a67eaf47 DRTVWR-252
-bb10adc4f76cf0067fca7075146f00cdc0740e9d DRTVWR-251
-ab0aa2f6ba22b52fed30a2337197f589156edc75 DRTVWR-253
-48382ec79741671d19ce4cc3e8cd59e9a521e4a7 DRTVWR-254
-937ec902bb9a1cbceff17bd89e3923352b0a5fbc DRTVWR-256
-44e764a6ac9e672a4f3bce821a4b6a218590c374 DRTVWR-258
-c23d734065ed593b2413385aecd8366d8e0ee96b DRTVWR-257
-452ce96d4046dc05a3ecaecc203e2cc8ddd72e76 DRTVWR-259
-daca610d840625b5bebb966a57cb49581852c417 DRTVWR-265
-9afbdc4e24cc04feacfb2b7a10b78a64f780901a DRTVWR-266
-73280db02501f5ad041fc18b1eba68e73a81996c DRTVWR-267
-870e2d79e0063fda87187f17bbc2747766733194 3.4.3-beta3
-0a2ca6546b499239afeb66d17b2fadbcdbe36ab1 3.4.3-release
-4c3460cb1fb7c6da9965e09c734d282a8e9c81f0 DRTVWR-229
-f4481df42f9a4a92bf475a80f0c51d1a4bbdfd59 DRTVWR-246
-39c5204b6e800983a41ccac8ad6dc993120197c6 DRTVWR-247
-7c7d57d393e8ae7b61623279de06eb4a62ccae6a DRTVWR-249
-f72b50ef168c159d6e79e97aa2bcafaf8577ab99 DRTVWR-230
-b418be80903520c492e1173f3afbc4021cad5d07 DRTVWR-255
-9aa1aa9f1fe13c194695a0b8f0af298296241dc2 DRTVWR-260
-84fbaf2d4141bd161731430e760949dc787ca206 DRTVWR-244
-083d2d36b5bb1c54fc3dd7caac0e7ac381a9cef0 3.4.4-beta1
-b634dec987c16e8c9c938e11e52591d9ead8fa9b DRTVWR-270
-cd39255bd23330fd30c04105f2811e941d8524fe 3.4.4-beta2
-2c4011bbc2b15b82198fd8b51f3a9fe765a08c4d DRTVWR-271
-2f8a3ef687bc55828abcb17ac1ad7cde70536d7e 3.4.4-beta3
-35cfd4cf5b895fa776592f2e630e330be7f0604e DRTVWR-273
-c374035d459af3c03dea2dd90880dfc25de64706 DRTVWR-275
-05d9f1dd7a954069af2a33abedb7713fa36a04cb 3.4.4-beta4
-e1bb1ae7d8b12faeb37933a737c199cc9b9f89cc 3.4.4-release
-391a8c74cec7275c5d26c85ad108d4782a3e3dd9 DRTVWR-268
-a36f1f354b02aa6e448ca13685de167d0a0a3d03 DRTVWR-272
-37dba00ad820de3a808d4039396b162a9c275b3e DRTVWR-269
-7c6dfdc1b7a2ce0d8e3a8f3ce3058547ea065c0f DRTVWR-250
-b9ff9730daa53a541925300cbd02bb14575a5705 DRTVWR-277
-af6b711a97073431953b55ee808aaa09900c27e5 DRTVWR-276
-8302fefde6c8f4a64bfc7f04929f8bc85f5c6c7b DRTVWR-279
-c296133849d1f103c0e2abc41e6599daed00b67b DRTVWR-280
-40a2265058abc9fde4914c10185f916435818621 3.4.5-beta1
-5df4802bec93c8d0a509946d826bb4c50c5442ec DRTVWR-281
-7c1c33ba4cfd2d15ca51cc1ac440eca551331a4a DRTVWR-283
-6b9c7dbebef793230d64e1b452577c8b142d4143 3.4.5-beta2
-ccf991e02dc2f63fb646324230d54832683f4a9b DRTVWR-286
-2d849850558a5a0324b398d1c102d30bcbdfb88f DRTVWR-287
-e06898df8644fe567bee94f817d03abc1c380993 3.4.5-beta3
-a676b4d6c037b39fe5b8e42cf8839a9303936089 DRTVWR-289
-28fa8b944a0c1869636ab00cc400f5aa71f6fa3c DRTVWR-290
-7f09bbc28c297f14b67961be7b6575445fa160e8 DRTVWR-291
-b23419a2748483c98f3b84b630468a21c88feba5 DRTVWR-292
-1567de5700c273b583dac41b64275c223287306e 3.4.5-beta4
-1cce8447f8f574673e3f47d6fe584262e6964fe2 DRTVWR-296
-0a5d409161ef2a89b28c9a741051dd2dedc707d6 DRTVWR-297
-852b69ef0b5fe6b13b69cc2217282cc64de6afab 3.4.5-beta5
-a49c715243a36a8a380504d14cb7416b3039c956 3.4.5-release
-37947e4f771f001b551581bf7cd0051c3153beed DRTVWR-282
-6482cceb91cda68b799f3e6cdc66d33bf123547a DRTVWR-284
-092a9effbedd1a0276fa5ced520992ce00f96fbf CHUI-PV-0
-279ef1dfc9b749a6cc499cf190fec0c090b6d682 DRTVWR-288
-9b19edaf1d8ddf435f60fbbb444dd25db8f63953 3.5.0-beta1
-c6b3561c7d7ad365eeba669db54eb57b5149ce75 3.5.0-beta2
-6d91ffd77bf2a20f18a2175eb7579da880ae12ac DRTVWR-302
-f6ca5bb75bca975ff0bc77e71e615f6478c4559c 3.5.0-beta3
-910b5fad950e343b58229f5a0aefa7729b9308b3 DRTVWR-303
-53cffdde0b3cc367ba9bb6abd5c83ae14df5e882 3.5.0-beta4
-4d5f6234dc59a0fb6ead5e02c7d343a0610e0488 DRTVWR-304
-dd058a6093c493120d67c8e02c812c0f7b2d3db0 3.5.0-beta5
-fd6b510e83f56830e45670c428653134899d3e25 DRTVWR-305
-55339537d99afc394d1bb7fdb7d074bf321ca62f 3.5.0-beta6
-902caf2b9fdbdbc5c399c4d5ebcecaf9cb97bab8 DRTVWR-306
-5c6098fd17d40ee3a38ca6b64f6be9db7f61f0a8 3.5.0-beta7
-adc360e6bf21390d2665380951d85937cd29a604 3.5.0-release
-1ada73295ed0eaa4a772ef079c29f57069342c32 DRTVWR-310
-20cdf370f5c8be6193bef6fb3a81cc3f81275191 3.5.1-beta1
-2319904200de367646b9a9442239a38d52c1eeb5 DRTVWR-313
-9d8726eca785acad694564516f16dd639faf45c0 3.5.1-beta2
-4b7fa963b80e2056ab648f83a4d61310b3cedb3d DRTVWR-314
-65ae89aeb7ea674a555e439e963f17949322ac94 3.5.1-beta3
-13149a524874b608aeb76325b35faff113a5ea53 3.5.1-release
-78a8fe6abf331944d6b6bb1ce1024a6bc08141f4 DRTVWR-298
-50ccc12f38c3c99f03b374e32429cb043b73e2a6 DRTVWR-294
-c2b1066514308dff1eeb91162392dfe08bf1c0fe DRTVWR-309
-e6b8a92acffd693cd1459e4212e3dff1050acf67 DRTVWR-278
-106f19cc011aafdfc9a6d12b641fe8db6e9735a7 3.5.2-beta1
-509b97acc4ca1f2644197f1b555773ac0bb6838c 3.5.2-beta2
-6cb3689d89c13876ce8fa8faefa7b05e4279502d DRTVWR-316
-cfc3e650e5b2063288e7b832e9c9f521bbdacc92 DRTVWR-315
-e6e35501f1fea252ef83080adcf30c3cb7c2f75c DRTVWR-299
-b6a4ac8f1916ede76e8a023e1cf35c045d0ac707 3.5.2-beta3
-a314f1c94374ab1f6633dd2983f7090a68663eb2 3.5.2-beta4
-1cfa86d604909dfdb8b372069ff61f9afaa2aac1 MAINT-2647
-895628bb5e162410cfdf4bca58f0a57d22ccfcde 3.5.2-beta5
-9013c07bfe1c51107233f1924dccdcc5057dd909 3.5.2-beta6
-9b1b6f33aa5394b27bb652b31b5cb81ef6060370 3.5.2-release
-a277b841729f2a62ba1e34acacc964bc13c1ad6f 3.5.3-release
-fb1630153bac5552046ea914af3f14deabc1def8 3.6.0-materials-beta1
-0a56f33ad6aa112032b14a41dad759ad377bdde9 3.6.0-release
-75cf8e855ae1af6895a35da475314c2b5acf1850 3.6.1-release
-f6741d5fe8d632651424484df0fe0cb4a01e9fbe 3.6.2-release
-fe4f7c5e9fd27e09d03deb1cc9ab3e5093f6309e 3.6.3-release
-83357f31d8dbf048a8bfdc323f363bf4d588aca1 CHOP-951-a
-91ed595b716f14f07409595b734fda891a59379e 3.6.4-release
-bf6d453046011a11de2643fac610cc5258650f82 3.6.5-release
-ae457ece77001767ae9613148c495e7b98cc0f4a 3.6.7-release
-d40c66e410741de7e90b1ed6dac28dd8a2d7e1f6 3.6.8-release
-70eda3721d36df3e00730629c42a1304e5bc65b8 3.6.9-release
-5b54b36862ff8bc3b6935673c9d1c1f22ee8d521 3.6.10-release
-2feb70a4cfde43f2898d95ff8fcae3e67805c7c2 3.6.11-release
-88bbfd7a6971033f3aa103f3a3500ceb4c73521b 3.6.12-release
-0d9b9e50f1a8880e05f15688a9ec7d09e0e81013 3.6.13-release
-5d746de933a98ca17887cde2fece80e9c7ab0b98 3.7.0-release
-dcb4981ce255841b6083d8f65444b65d5a733a17 3.7.1-release
-b842534cb4d76c9ef87676a62b1d2d19e79c015f 3.7.2-release
-962d3f98955bfc7310a7867c8cbc3df075e54aa9 3.7.3-release
-d076568ff7883b41c149e6afb421f39c29dbfe2b 3.7.4-release
-fc066b82343fca51f9c1b8eda0abc6bee9bb4503 3.7.5-release
-d029faf69f20a23007f32420a1ac6a3b89a6d441 3.7.6-release
-83959480cb986522d07b151a0c778ab7f920d41b 3.7.7-release
-bba9b3722eea08949e4ff69591f736bf0f808434 3.7.8-release
-a9f2d0cb11f73b06858e6083bb50083becc3f9cd 3.7.9-release
-91dae9494b4d147541c7a01902334ba19a7ec05e 3.7.10-release
-64799eb298834073a3e9992cd8d27c3cb9d30b10 3.7.11-release
-3b44ea8988cb902f0dda8429e8d5e4569e304532 3.7.12-release
-d86a7e1bc96d27b683f951d3701d5b7042158c68 3.7.13-release
-a7872554f3665588f1e8347d472cec3a299254b3 3.7.14-release
-3f11f57f2b4d15a9f987d12bc70ef507eefb5018 3.7.15-release
-562e7dace7465060ac9adb2e8eca800b699ff024 3.7.16-release
-bcc2770e21c125e0bab59141c51db9145aec068d 3.7.17-release
-2729c1daf0257d68a40bdbc4acf1a16184974bbd 3.7.18-release
-82973b38a6c9a457333e3519e4f2b16bb5eedf47 3.7.19-release
-27094824773b907c2e559396e6f9ec3a963de52d 3.7.20-release
-9ecab4b0c7d8614767724a3422d3c1dca6bd4e4f 3.7.21-release
-bc61801f614022c920cb5c3df1d7d67a9561ce1f 3.7.22-release
-3be800e1afad9615442159e388d6d137be7b951e 3.7.23-release
-d3d0101e980ec95043e0af9b7903045d3bc447e4 3.7.24-release
-9978a8c3a2ffce4a5e1c186256581c2ac139c9dc 3.7.25-release
-000e9dda4162cbf0a83ba88558b19473654a09a9 3.7.26-release
-afd8d4756e8eda3c8f760625d1c17a2ad40ad6c8 3.7.27-release
-566874eb5ab26c003ef7fb0e22ce40c5fa0013f4 3.7.28-release
-d07f76c5b9860fb87924d00ca729f7d4532534d6 3.7.29-release
-67edc442c80b8d2fadd2a6c4a7184b469906cdbf 3.7.30-release
-797ed69e6134ef48bb922577ab2540fb2d964668 3.8.0-release
-3f61ed662347dc7c6941b8266e72746a66d90e2a 3.8.1-release
-3a62616f3dd8bd512fcdfd29ef033b2505b11213 3.8.2-release
-60572f718879f786f6bc8b5c9373ebebf4693078 3.8.3-release
-27e3cf444c4cc645884960a61325a9ee0e9a2d0f 3.8.4-release
-e821ef17c6edea4a59997719d8ba416d8c16e143 3.8.5-release
-5a5bd148943bfb46cf2ff2ccf376c42dee93d19b 3.8.6-release
-ae3297cdd03ab14f19f3811acbc4acd3eb600336 4.0.0-release
-759710a9acef61aaf7b69f4bc4a5a913de87ad8a 4.0.1-release
-e9d350764dfbf5a46229e627547ef5c1b1eeef00 4.0.2-release
-86dfba7ec4332c323025ebeacd8bf343ed0d8cfd 4.0.3-release
-0a5de9ec2cb868f367501024d8d6958c20869053 4.0.4-release
-450de775fff66a011be1a001acd117cc623c445d 4.0.5-release
-4070611edd95eb3a683d1cd97c4c07fe67793812 4.0.6-release
-33981d8130f031597b4c7f4c981b18359afb61a0 4.0.7-release
-45eaee56883df7a439ed3300c44d3126f7e3a41e 4.0.8-release
-b280a1c797a3891e68dbc237e73de9cf19f426e9 4.1.1-release
-bfbba2244320dc2ae47758cd7edd8fa3b67dc756 4.1.2-release
-b41e1e7c7876f7656c505f552b5888b4e478f92b 5.0.0-release
-c9ce2295012995e3cf5c57bcffcb4870b94c649f 5.0.1-release
-cea1632c002c065985ebea15eeeb4aac90f50545 5.0.2-release
-02c24e9f4f7d8aa0de75f27817dda098582f4936 5.0.3-release
-022709ef76a331cac1ba6ef1a6da8a5e9ef63f5a 5.0.4-release
-b4d76b5590fdf8bab72c64442353753a527cbc44 5.0.5-release
-3e5035dfd8af49bd4c0009f0a76ef46a15991a45 5.0.6-release
-abcab37e1b29414ab8c03af9ca2ab489d809788a 5.0.7-release
-505a492f30bd925bb48e2e093ae77c3c2b4c740f 5.0.8-release
-40ca7118765be85a043b31b011e4ee6bd9e33c95 5.0.9-release
-ad0e15543836d64d6399d28b32852510435e344a 5.1.0-release
-26d9e9bb166a9a417f35b1863223a597af8185fd 5.1.1-release
-2eb917875efdfe920680b9049302d0f03721245d 5.1.2-release
-7c00e5b6cb3d95712e9d8e29277c805bca2bda90 5.1.3-release
-7b6b020fd5ad9a8dc3670c5c92d1ca92e55fc485 5.1.4-release
-2ea47f358b171178eb9a95503a1670d519c2886f 5.1.5-release
-04538b8157c1f5cdacd9403f0a395452d4a93689 5.1.6-release
-ac3b1332ad4f55b7182a8cbcc1254535a0069f75 5.1.7-release
-23ea0fe36fadf009a60c080392ce80e4bf8af8d9 5.1.8-release
-52422540bfe54b71155aa455360bee6e3ef1fd96 5.1.9-release
-1cfa567caf5088ae299271be08cc2d9f0801ff6a pre-Poseidon
-821edfcd14919c0e95c590866171c61fb57e8623 6.0.0-release
-21b7604680ef6b6ea67f8bebaaa588d6e263bdc1 6.0.1-release
-a3143db58a0f6b005232bf9018e7fef17ff9ec90 6.1.0-release
-50f0ece62ddb5a244ecb6d00ef5a89d80ad50efa 6.1.1-release
-82a89165e5929a6c3073d6cd60a543cb395f147b 6.2.0-release
-706bdc7e25c6e6b8fb56f4a13fcce2936e70a79c 6.2.1-release
-ec09daf1899c1c01c4ba0ba950fae572f2a612a8 6.2.2-release
-ab2ec5c5423b277d23fd0511ce50c15123ff2e03 6.2.3-release
-67297f9902857e357570c44722ad84de3aff974e 6.2.4-release
-9777aec6dc4a30a24537297ac040861ce16b82ae 6.3.0-release
-ece699718f163921717bb95a6131e94af4c4138f 6.3.1-release
-07f5d5bc9faebb45695853d40a9549773db816c0 6.3.2-release
-d9a4bd15e2c852953d6c8e84d6f3b7ca442c0e7f 6.3.3-release
-4033b3f57e76f087235145a3016886ccdc87ffa3 6.3.4-release
-27ca5834bfe9b80e82db5ea42f08b7eb990b722a 6.3.5-release
diff --git a/README.md b/README.md
index e4078770f3ce5ac1cc48f23ca44f8e3bd977bb9f..8813c2522815c116a2f14a59cb52cf52278ef2d5 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,39 @@
-Second Life Viewer
-====================
-This project manages the source code for the
-[Second Life](https://www.secondlife.com) Viewer.
+![Second Life Logo](doc/sl-logo.png)
 
-This source is available as open source; for details on licensing, see
-[the licensing page on the Second Life wiki](https://wiki.secondlife.com/wiki/Linden_Lab_Official:Second_Life_Viewer_Licensing_Program)
+**[Second Life][] is a free 3D virtual world where users can create, connect and chat with others from around the
+world.** This repository contains the source code for the official client.
 
-For information on how to use and contribute to this, see
-[the open source portal on the wiki](https://wiki.secondlife.com/wiki/Open_Source_Portal).
+## Open Source
 
-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)
+Second Life provides a huge variety of tools for expression, content creation, socialization and play. Its vibrancy is
+only possible because of input and contributions from its residents. The client codebase has been open source since
+2007 and is available under the LGPL license. The [Open Source Portal][] contains additional information about Linden
+Lab's open source history and projects.
+
+## Download
+
+Most people use a pre-built viewer release to access Second Life. Windows and macOS builds are
+[published on the official website][download]. More experimental viewers, such as release candidates and
+project viewers, are detailed on the [Alternate Viewers page](https://releasenotes.secondlife.com/viewer.html).
+
+### Third Party Viewers
+
+Third party maintained forks, which include Linux compatible builds, are indexed in the [Third Party Viewer Directory][tpv].
+
+## Build Instructions
+
+[Windows](https://wiki.secondlife.com/wiki/Build_the_Viewer_on_Windows)
+
+[Mac](https://wiki.secondlife.com/wiki/Build_the_Viewer_on_macOS)
+
+[Linux](https://wiki.secondlife.com/wiki/Build_the_Viewer_on_Linux)
+
+## Contribute
+
+Help make Second Life better! You can get involved with improvements by filing bugs, suggesting enhancements, submitting
+pull requests and more. See the [open source portal][] for details.
+
+[Second Life]: https://secondlife.com/
+[download]: https://secondlife.com/support/downloads/
+[tpv]: http://wiki.secondlife.com/wiki/Third_Party_Viewer_Directory
+[open source portal]: http://wiki.secondlife.com/wiki/Open_Source_Portal
diff --git a/autobuild.xml b/autobuild.xml
index a7a703668015953268eec96ab404489e13d0a121..e1e5c198711e05cb29e2ba38d9453d5d6f2ec59b 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -308,9 +308,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>02e6a8207dcdaf243dcb6da19b8c3534</string>
+              <string>f5a81594374c8a7f0825e2177510e079</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64099/601302/colladadom-2.3.545362-darwin64-545362.tar.bz2</string>
+              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82030/770590/colladadom-2.3.559710-darwin64-559710.tar.bz2</string>
             </map>
             <key>name</key>
             <string>darwin64</string>
@@ -344,9 +344,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>8a02a10fc69c8f504dc5335644db184a</string>
+              <string>5d0729b835d63b7fe69acdc6b7c60188</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64104/601313/colladadom-2.3.545362-windows-545362.tar.bz2</string>
+              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82050/770692/colladadom-2.3.559710-windows-559710.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
@@ -356,16 +356,16 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>742180324fca7ab92b6a61a36aab4f9d</string>
+              <string>985e3081e41c76b6176d39e44d7fb4b8</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64103/601314/colladadom-2.3.545362-windows64-545362.tar.bz2</string>
+              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82049/770686/colladadom-2.3.559710-windows64-559710.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows64</string>
           </map>
         </map>
         <key>version</key>
-        <string>2.3.545362</string>
+        <string>2.3.559710</string>
       </map>
       <key>curl</key>
       <map>
@@ -3206,9 +3206,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>6989053898b8e81e904e75553e378820</string>
+              <string>97fac6d88480445c856083ed20d78093</string>
               <key>url</key>
-              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/77523/735051/viewer_manager-2.0.556340-darwin64-556340.tar.bz2</string>
+              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/85206/790666/viewer_manager-2.0.562101-darwin64-562101.tar.bz2</string>
             </map>
             <key>name</key>
             <string>darwin64</string>
@@ -3230,9 +3230,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>3446c1e54bb32542677caad0ec0d42ac</string>
+              <string>3f6271ec0e2e2f0cc1067d4c4102bb4c</string>
               <key>url</key>
-              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/77525/735058/viewer_manager-2.0.556340-windows-556340.tar.bz2</string>
+              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/85208/790681/viewer_manager-2.0.562101-windows-562101.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
@@ -3243,7 +3243,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
         <key>source_type</key>
         <string>hg</string>
         <key>version</key>
-        <string>2.0.556340</string>
+        <string>2.0.562101</string>
       </map>
       <key>vlc-bin</key>
       <map>
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index ce54b54c6f107de19d88453456b9a243b6559ed4..0000000000000000000000000000000000000000
--- a/debian/changelog
+++ /dev/null
@@ -1,18 +0,0 @@
-secondlife-viewer (0.3) unstable; urgency=low
-
-  * Initial debian configuration
-
- -- Don Kjer <don@lindenlab.com>  Wed, 04 Jul 2012 00:43:03 +0000
-
-secondlife-viewer (0.2) unstable; urgency=low
-
-  * Adding default LSB headers for squeeze
-
- -- Tyler Kohler <tyler@lindenlab.com>  Thu, 24 Mar 2011 09:43:36 -0700
-
-secondlife-viewer (0.1) unstable; urgency=low
-
-  * Cloned from debian package skeleton.
-
- -- Lex Linden <lex@lindenlab.com>  Mon, 20 Sep 2010 08:01:59 -0700
-
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index 7ed6ff82de6bcc2a78243fc9c54d3ef5ac14da69..0000000000000000000000000000000000000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-5
diff --git a/debian/control b/debian/control
deleted file mode 100644
index 50b9ed9a264abf7dbf48dc789484056635f36753..0000000000000000000000000000000000000000
--- a/debian/control
+++ /dev/null
@@ -1,16 +0,0 @@
-Source: secondlife-viewer
-Section: unknown
-Priority: extra
-Maintainer: Don Linden <don@lindenlab.com>
-Build-Depends: debhelper (>= 5)
-Homepage: http://secondlife.com
-Standards-Version: 3.7.2
-
-Package: secondlife-viewer
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends},
- ia32-libs,
- ia32-libs-gtk
-Description: Second Life Viewer
- Second Life is an online virtual world developed by Linden Lab.
- 
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644
index 106fa3802f1b7d6b7550167cb8d928ef098ee197..0000000000000000000000000000000000000000
--- a/debian/copyright
+++ /dev/null
@@ -1,32 +0,0 @@
-Second Life Viewer Copyright: 2000-2012 Linden Research, Inc.
-
-License:
-
-3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
-APR Copyright (C) 2011 The Apache Software Foundation
-Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
-cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se)
-DBus/dbus-glib Copyright (C) 2002, 2003  CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
-expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
-FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, and Werner Lemberg.
-GL Copyright (C) 1999-2004 Brian Paul.
-GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
-google-perftools Copyright (c) 2005, Google Inc.
-Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
-jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
-jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
-ogg/vorbis Copyright (C) 2002, Xiphophorus
-OpenSSL Copyright (C) 1998-2008 The OpenSSL Project.
-PCRE Copyright (c) 1997-2012 University of Cambridge
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler.
-
-Second Life Viewer uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details.
-
-This software contains source code provided by NVIDIA Corporation.
-
-All rights reserved.  See licenses.txt for details.
-
-Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
diff --git a/debian/postinst b/debian/postinst
deleted file mode 100644
index 2c4f8ea8588b62b63d5ba8106d8e18964903307e..0000000000000000000000000000000000000000
--- a/debian/postinst
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/sh
-# postinst script for secondlife-viewer
-#
-# Delete this file if you don't need it.
-#
-# see: dh_installdeb(1)
-
-set -e
-
-# summary of how this script can be called:
-#        * <postinst> `configure' <most-recently-configured-version>
-#        * <old-postinst> `abort-upgrade' <new version>
-#        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
-#          <new-version>
-#        * <postinst> `abort-remove'
-#        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
-#          <failed-install-package> <version> `removing'
-#          <conflicting-package> <version>
-# for details, see http://www.debian.org/doc/debian-policy/ or
-# the debian-policy package
-
-
-case "$1" in
-    configure)
-    ;;
-
-    abort-upgrade|abort-remove|abort-deconfigure)
-    ;;
-
-    *)
-        echo "postinst called with unknown argument \`$1'" >&2
-        exit 1
-    ;;
-esac
-
-# dh_installdeb will replace this with shell code automatically
-# generated by other debhelper scripts.  Don't delete this!
-
-#DEBHELPER#
-
-exit 0
-
-
diff --git a/debian/postrm b/debian/postrm
deleted file mode 100644
index a575936ab04060765153060adf711ba28bb02890..0000000000000000000000000000000000000000
--- a/debian/postrm
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/sh
-# postrm script for secondlife-viewer
-#
-# Delete this file if you don't need it.
-#
-# see: dh_installdeb(1)
-
-set -e
-
-# summary of how this script can be called:
-#        * <postrm> `remove'
-#        * <postrm> `purge'
-#        * <old-postrm> `upgrade' <new-version>
-#        * <new-postrm> `failed-upgrade' <old-version>
-#        * <new-postrm> `abort-install'
-#        * <new-postrm> `abort-install' <old-version>
-#        * <new-postrm> `abort-upgrade' <old-version>
-#        * <disappearer's-postrm> `disappear' <overwriter>
-#          <overwriter-version>
-# for details, see http://www.debian.org/doc/debian-policy/ or
-# the debian-policy package
-
-
-case "$1" in
-    purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
-    ;;
-
-    *)
-        echo "postrm called with unknown argument \`$1'" >&2
-        exit 1
-    ;;
-esac
-
-# dh_installdeb will replace this with shell code automatically
-# generated by other debhelper scripts.  Don't delete this!
-
-#DEBHELPER#
-
-exit 0
-
-
diff --git a/debian/preinst b/debian/preinst
deleted file mode 100644
index f62243440f6cf253026d0926576fa0c99535e524..0000000000000000000000000000000000000000
--- a/debian/preinst
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/sh
-# preinst script for secondlife-viewer
-#
-# Delete this file if you don't need it.
-#
-# see: dh_installdeb(1)
-
-set -e
-
-# summary of how this script can be called:
-#        * <new-preinst> `install'
-#        * <new-preinst> `install' <old-version>
-#        * <new-preinst> `upgrade' <old-version>
-#        * <old-preinst> `abort-upgrade' <new-version>
-# for details, see http://www.debian.org/doc/debian-policy/ or
-# the debian-policy package
-
-
-case "$1" in
-    install|upgrade)
-    ;;
-
-    abort-upgrade)
-    ;;
-
-    *)
-        echo "preinst called with unknown argument \`$1'" >&2
-        exit 1
-    ;;
-esac
-
-# dh_installdeb will replace this with shell code automatically
-# generated by other debhelper scripts.  Don't delete this!
-
-#DEBHELPER#
-
-exit 0
-
-
diff --git a/debian/prerm b/debian/prerm
deleted file mode 100644
index 405b8f9c87bcfe6e3bcca23b7eb192a9dd6ee0e2..0000000000000000000000000000000000000000
--- a/debian/prerm
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/sh
-# prerm script for secondlife-viewer
-#
-# Delete this file if you don't need it.
-#
-# see: dh_installdeb(1)
-
-set -e
-
-# summary of how this script can be called:
-#        * <prerm> `remove'
-#        * <old-prerm> `upgrade' <new-version>
-#        * <new-prerm> `failed-upgrade' <old-version>
-#        * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
-#        * <deconfigured's-prerm> `deconfigure' `in-favour'
-#          <package-being-installed> <version> `removing'
-#          <conflicting-package> <version>
-# for details, see http://www.debian.org/doc/debian-policy/ or
-# the debian-policy package
-
-
-case "$1" in
-    remove|upgrade|deconfigure)
-    ;;
-
-    failed-upgrade)
-    ;;
-
-    *)
-        echo "prerm called with unknown argument \`$1'" >&2
-        exit 1
-    ;;
-esac
-
-# dh_installdeb will replace this with shell code automatically
-# generated by other debhelper scripts.  Don't delete this!
-
-#DEBHELPER#
-
-exit 0
-
-
diff --git a/debian/rules b/debian/rules
deleted file mode 100644
index 305fc58bb401b7ca74dbcabb111b80ea4f925530..0000000000000000000000000000000000000000
--- a/debian/rules
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/usr/bin/make -f
-# -*- makefile -*-
-# Sample debian/rules that uses debhelper.
-# This file was originally written by Joey Hess and Craig Small.
-# As a special exception, when this file is copied by dh-make into a
-# dh-make output file, you may use that output file without restriction.
-# This special exception was added by Craig Small in version 0.37 of dh-make.
-
-# Uncomment this to turn on verbose mode.
-#export DH_VERBOSE=1
-
-BASEDIR=opt/linden
-
-VIEWER_PKG=secondlife-viewer
-VIEWER_PACKAGEDIR=build-linux-i686/newview/packaged
-VIEWER_DESTDIR=$(CURDIR)/debian/$(VIEWER_PKG)
-VIEWER_VERSION:=$(shell dpkg-parsechangelog | grep ^Version | sed 's/^Version: //')
-VIEWER_INSTALLDIR:=$(BASEDIR)/viewer/SecondLife-i686-$(VIEWER_VERSION)
-
-configure: configure-stamp
-configure-stamp:
-	dh_testdir
-	# Add here commands to configure the package.
-
-	touch configure-stamp
-
-build: build-stamp
-
-build-stamp: configure-stamp 
-	dh_testdir
-
-	# Add here commands to compile the package.
-	#$(MAKE)
-	#docbook-to-man debian/secondlife-viewer.sgml > secondlife-viewer.1
-
-	touch $@
-
-clean:
-	dh_testdir
-	dh_testroot
-	rm -f build-stamp configure-stamp
-
-	# Add here commands to clean up after the build process.
-	#-$(MAKE) clean
-
-	dh_clean 
-
-install: build
-	dh_testdir
-	dh_testroot
-	dh_clean -k 
-	dh_installdirs
-
-	# Add here commands to install the package into debian/secondlife-viewer.
-	for file in $$(find $(VIEWER_PACKAGEDIR) -type f -o -type l | sed 's~$(VIEWER_PACKAGEDIR)/~~'); do \
-		# create containing directory \
-		install -v -m 755 -o root -g root -d "$$(dirname "$(VIEWER_DESTDIR)/$(VIEWER_INSTALLDIR)/$$file")"; \
-		PERM=644; \
-		if [ -x "$(VIEWER_PACKAGEDIR)/$$file" ]; then \
-			PERM=755; \
-		fi; \
-		if [ -L "$(VIEWER_PACKAGEDIR)/$$file" ]; then \
-			REAL="$$( readlink -f $(VIEWER_PACKAGEDIR)/$$file )"; \
-			RELATIVE="$$( echo $$REAL | sed 's~$(CURDIR)/$(VIEWER_PACKAGEDIR)/~~' )"; \
-			echo dh_link -p $(VIEWER_PKG) "$(VIEWER_INSTALLDIR)/$$RELATIVE" "$(VIEWER_INSTALLDIR)/$$file" ; \
-			dh_link -p $(VIEWER_PKG) "$(VIEWER_INSTALLDIR)/$$RELATIVE" "$(VIEWER_INSTALLDIR)/$$file" ; \
-		else \
-			install -v -m $$PERM -o root -g root "$(VIEWER_PACKAGEDIR)/$$file" "$(VIEWER_DESTDIR)/$(VIEWER_INSTALLDIR)/$$file"; \
-		fi; \
-	done
-	dh_link -p $(VIEWER_PKG) /$(VIEWER_INSTALLDIR)/secondlife /usr/bin/secondlife
-	dh_link -p $(VIEWER_PKG) $(BASEDIR)/viewer/SecondLife-i686-$(VIEWER_VERSION) $(BASEDIR)/viewer/SecondLife
-
-
-# Build architecture-independent files here.
-binary-indep: build install
-# We have nothing to do by default.
-
-# Build architecture-dependent files here.
-binary-arch: build install
-	dh_testdir
-	dh_testroot
-	dh_installchangelogs 
-	dh_installdocs
-	dh_installexamples
-#	dh_install
-#	dh_installmenu
-#	dh_installdebconf	
-#	dh_installlogrotate
-#	dh_installemacsen
-#	dh_installpam
-#	dh_installmime
-#	dh_python
-
-# To add an init script, uncomment this line and edit debian/init.d and 
-# customize debian/secondlife-viewer.default to suit your needs.
-#	dh_installinit
-
-# To add cron jobs, uncomment this line and make a crontab file named 
-# debian/cron.d, and it will be installed in /etc/cron.d/
-#	dh_installcron
-
-#	dh_installinfo
-	dh_installman
-	dh_link
-#	dh_strip
-	dh_compress
-#	dh_fixperms
-#	dh_perl
-#	dh_makeshlibs
-	dh_installdeb
-#	dh_shlibdeps
-	dh_gencontrol
-	dh_md5sums
-	dh_builddeb
-
-binary: binary-indep binary-arch
-.PHONY: build clean binary-indep binary-arch binary install configure
diff --git a/debian/source/lintian-overrides b/debian/source/lintian-overrides
deleted file mode 100644
index 661c20b572ed88732a6d221c7f2bf980cd6146c6..0000000000000000000000000000000000000000
--- a/debian/source/lintian-overrides
+++ /dev/null
@@ -1,8 +0,0 @@
-# Linden packages install in opt/linden
-secondlife-viewer: dir-or-file-in-opt
-secondlife-viewer: section-is-dh_make-template
-secondlife-viewer: binary-without-manpage
-secondlife-viewer: maintainer-script-empty postrm
-secondlife-viewer: maintainer-script-empty preinst
-secondlife-viewer: maintainer-script-empty prerm
-secondlife-viewer: unstripped-binary-or-object
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 1593e61a249bae19005ba1371b87b45a9504f311..cc68162c2d9af959f1e58af9956319ce075fd846 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -270,6 +270,7 @@ Beq Janus
 	SL-13583
 	SL-14766
 	SL-14927
+	SL-11300
 Beth Walcher
 Bezilon Kasei
 Biancaluce Robbiani
@@ -806,6 +807,7 @@ Jonathan Yap
 	STORM-2104
 	STORM-2142
 	SL-10089
+	BUG-229818
 Kadah Coba
 	STORM-1060
     STORM-1843
diff --git a/doc/sl-logo.png b/doc/sl-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9563c7ac73374b7fc8e2735f27bc9e2c59792e8
Binary files /dev/null and b/doc/sl-logo.png differ
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 8aea50e02b1a2167b2c0fe61aebace3db1943ef3..0da530c6a2cfb8bdd1ae9116283d156c18e7a60f 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -66,7 +66,8 @@ if (WINDOWS)
   # CP changed to only append the flag for 32bit builds - on 64bit builds,
   # locally at least, the build output is spammed with 1000s of 'D9002'
   # warnings about this switch being ignored.
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")  
+  # We need std::string_view, but that's not available without /std:c++17.
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /std:c++17")  
   if( ADDRESS_SIZE EQUAL 32 )
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /p:PreferredToolArchitecture=x64")  
   endif()
@@ -175,7 +176,7 @@ if (DARWIN)
   # 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_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${DARWIN_extra_cstar_flags} -std=c++17")
   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.
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index dd266630ea725c0753cb7ca19b4843935cc06dfb..bafa330f86ccb6c35fb6c0f368530bd3a330d708 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -210,9 +210,9 @@ set(llcommon_HEADER_FILES
     llqueuedthread.h
     llrand.h
     llrefcount.h
+    llregex.h
     llregistry.h
     llrun.h
-    llrefcount.h
     llsafehandle.h
     llsd.h
     llsdjson.h
diff --git a/indra/llcommon/llregex.h b/indra/llcommon/llregex.h
new file mode 100644
index 0000000000000000000000000000000000000000..2b7f5e47c2bb99186e5977306b3d28ea10cdb42d
--- /dev/null
+++ b/indra/llcommon/llregex.h
@@ -0,0 +1,89 @@
+/** 
+ * @file llregex.h
+ *
+ * $LicenseInfo:firstyear=2021&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2021, 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$
+ */
+
+#ifndef LLREGEX_H
+#define LLREGEX_H
+#include <boost/regex.hpp>
+
+template <typename S, typename M, typename R>
+LL_COMMON_API bool ll_regex_match(const S& string, M& match, const R& regex)
+{
+	try
+	{
+		return boost::regex_match(string, match, regex);
+	}
+	catch (const std::runtime_error& e)
+	{
+		LL_WARNS() << "error matching with '" << regex.str() << "': "
+			<< e.what() << ":\n'" << string << "'" << LL_ENDL;
+		return false;
+	}
+}
+
+template <typename S, typename R>
+LL_COMMON_API bool ll_regex_match(const S& string, const R& regex)
+{
+	try
+	{
+		return boost::regex_match(string, regex);
+	}
+	catch (const std::runtime_error& e)
+	{
+		LL_WARNS() << "error matching with '" << regex.str() << "': "
+			<< e.what() << ":\n'" << string << "'" << LL_ENDL;
+		return false;
+	}
+}
+
+template <typename S, typename M, typename R>
+bool ll_regex_search(const S& string, M& match, const R& regex)
+{
+	try
+	{
+		return boost::regex_search(string, match, regex);
+	}
+	catch (const std::runtime_error& e)
+	{
+		LL_WARNS() << "error searching with '" << regex.str() << "': "
+			<< e.what() << ":\n'" << string << "'" << LL_ENDL;
+		return false;
+	}
+}
+
+template <typename S, typename R>
+bool ll_regex_search(const S& string, const R& regex)
+{
+	try
+	{
+		return boost::regex_search(string, regex);
+	}
+	catch (const std::runtime_error& e)
+	{
+		LL_WARNS() << "error searching with '" << regex.str() << "': "
+			<< e.what() << ":\n'" << string << "'" << LL_ENDL;
+		return false;
+	}
+}
+#endif  // LLREGEX_H
diff --git a/indra/llcommon/llsd.h b/indra/llcommon/llsd.h
index 5b6d5545af11d61bfa2f9ca731e9f34c4091886d..6638b25febacf45f5453ebf15fd4493726ba940f 100644
--- a/indra/llcommon/llsd.h
+++ b/indra/llcommon/llsd.h
@@ -413,49 +413,6 @@ class LL_COMMON_API LLSD
 	static std::string		typeString(Type type);		// Return human-readable type as a string
 };
 
-struct llsd_select_bool : public std::unary_function<LLSD, LLSD::Boolean>
-{
-	LLSD::Boolean operator()(const LLSD& sd) const
-	{
-		return sd.asBoolean();
-	}
-};
-struct llsd_select_integer : public std::unary_function<LLSD, LLSD::Integer>
-{
-	LLSD::Integer operator()(const LLSD& sd) const
-	{
-		return sd.asInteger();
-	}
-};
-struct llsd_select_real : public std::unary_function<LLSD, LLSD::Real>
-{
-	LLSD::Real operator()(const LLSD& sd) const
-	{
-		return sd.asReal();
-	}
-};
-struct llsd_select_float : public std::unary_function<LLSD, F32>
-{
-	F32 operator()(const LLSD& sd) const
-	{
-		return (F32)sd.asReal();
-	}
-};
-struct llsd_select_uuid : public std::unary_function<LLSD, LLSD::UUID>
-{
-	LLSD::UUID operator()(const LLSD& sd) const
-	{
-		return sd.asUUID();
-	}
-};
-struct llsd_select_string : public std::unary_function<LLSD, LLSD::String>
-{
-	LLSD::String operator()(const LLSD& sd) const
-	{
-		return sd.asString();
-	}
-};
-
 LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLSD& llsd);
 
 namespace llsd
diff --git a/indra/llcommon/llstl.h b/indra/llcommon/llstl.h
index a90c2c7e087a0593f1194662eff34b15c841aaef..d28260b9f8216239d2d84d510a2aae0654db798e 100644
--- a/indra/llcommon/llstl.h
+++ b/indra/llcommon/llstl.h
@@ -40,30 +40,6 @@
 // <ND> For strcmp
 #include <string.h>
 #endif
-// Use to compare the first element only of a pair
-// e.g. typedef std::set<std::pair<int, Data*>, compare_pair<int, Data*> > some_pair_set_t; 
-template <typename T1, typename T2>
-struct compare_pair_first
-{
-	bool operator()(const std::pair<T1, T2>& a, const std::pair<T1, T2>& b) const
-	{
-		return a.first < b.first;
-	}
-};
-
-template <typename T1, typename T2>
-struct compare_pair_greater
-{
-	bool operator()(const std::pair<T1, T2>& a, const std::pair<T1, T2>& b) const
-	{
-		if (!(a.first < b.first))
-			return true;
-		else if (!(b.first < a.first))
-			return false;
-		else
-			return !(a.second < b.second);
-	}
-};
 
 // Use to compare the contents of two pointers (e.g. std::string*)
 template <typename T>
@@ -123,58 +99,6 @@ struct DeletePairedPointerArray
 };
 
 
-// Alternate version of the above so that has a more cumbersome
-// syntax, but it can be used with compositional functors.
-// NOTE: The functor retuns a bool because msdev bombs during the
-// composition if you return void. Once we upgrade to a newer
-// compiler, the second unary_function template parameter can be set
-// to void.
-//
-// Here's a snippet showing how you use this object:
-//
-// typedef std::map<int, widget*> map_type;
-// map_type widget_map;
-// ... // add elements
-// // delete them all
-// for_each(widget_map.begin(),
-//          widget_map.end(),
-//          llcompose1(DeletePointerFunctor<widget>(),
-//                     llselect2nd<map_type::value_type>()));
-
-template<typename T>
-struct DeletePointerFunctor : public std::unary_function<T*, bool>
-{
-	bool operator()(T* ptr) const
-	{
-		delete ptr;
-		return true;
-	}
-};
-
-// See notes about DeleteArray for why you should consider avoiding this.
-template<typename T>
-struct DeleteArrayFunctor : public std::unary_function<T*, bool>
-{
-	bool operator()(T* ptr) const
-	{
-		delete[] ptr;
-		return true;
-	}
-};
-
-// CopyNewPointer is a simple helper which accepts a pointer, and
-// returns a new pointer built with the copy constructor. Example:
-//
-//  transform(in.begin(), in.end(), out.end(), CopyNewPointer());
-
-struct CopyNewPointer
-{
-	template<typename T> T* operator()(const T* ptr) const
-	{
-		return new T(*ptr);
-	}
-};
-
 template<typename T, typename ALLOC>
 void delete_and_clear(std::list<T*, ALLOC>& list)
 {
@@ -363,161 +287,6 @@ OutputIter ll_transform_n(
 }
 
 
-
-/*
- *
- * Copyright (c) 1994
- * Hewlett-Packard Company
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Hewlett-Packard Company makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- *
- *
- * Copyright (c) 1996-1998
- * Silicon Graphics Computer Systems, Inc.
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Silicon Graphics makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- */
-
-
-// helper to deal with the fact that MSDev does not package
-// select... with the stl. Look up usage on the sgi website.
-
-template <class _Pair>
-struct _LLSelect1st : public std::unary_function<_Pair, typename _Pair::first_type> {
-  const typename _Pair::first_type& operator()(const _Pair& __x) const {
-    return __x.first;
-  }
-};
-
-template <class _Pair>
-struct _LLSelect2nd : public std::unary_function<_Pair, typename _Pair::second_type>
-{
-  const typename _Pair::second_type& operator()(const _Pair& __x) const {
-    return __x.second;
-  }
-};
-
-template <class _Pair> struct llselect1st : public _LLSelect1st<_Pair> {};
-template <class _Pair> struct llselect2nd : public _LLSelect2nd<_Pair> {};
-
-// helper to deal with the fact that MSDev does not package
-// compose... with the stl. Look up usage on the sgi website.
-
-template <class _Operation1, class _Operation2>
-class ll_unary_compose :
-	public std::unary_function<typename _Operation2::argument_type,
-							   typename _Operation1::result_type>
-{
-protected:
-  _Operation1 __op1;
-  _Operation2 __op2;
-public:
-  ll_unary_compose(const _Operation1& __x, const _Operation2& __y)
-    : __op1(__x), __op2(__y) {}
-  typename _Operation1::result_type
-  operator()(const typename _Operation2::argument_type& __x) const {
-    return __op1(__op2(__x));
-  }
-};
-
-template <class _Operation1, class _Operation2>
-inline ll_unary_compose<_Operation1,_Operation2>
-llcompose1(const _Operation1& __op1, const _Operation2& __op2)
-{
-  return ll_unary_compose<_Operation1,_Operation2>(__op1, __op2);
-}
-
-template <class _Operation1, class _Operation2, class _Operation3>
-class ll_binary_compose
-  : public std::unary_function<typename _Operation2::argument_type,
-							   typename _Operation1::result_type> {
-protected:
-  _Operation1 _M_op1;
-  _Operation2 _M_op2;
-  _Operation3 _M_op3;
-public:
-  ll_binary_compose(const _Operation1& __x, const _Operation2& __y,
-					const _Operation3& __z)
-    : _M_op1(__x), _M_op2(__y), _M_op3(__z) { }
-  typename _Operation1::result_type
-  operator()(const typename _Operation2::argument_type& __x) const {
-    return _M_op1(_M_op2(__x), _M_op3(__x));
-  }
-};
-
-template <class _Operation1, class _Operation2, class _Operation3>
-inline ll_binary_compose<_Operation1, _Operation2, _Operation3>
-llcompose2(const _Operation1& __op1, const _Operation2& __op2,
-         const _Operation3& __op3)
-{
-  return ll_binary_compose<_Operation1,_Operation2,_Operation3>
-    (__op1, __op2, __op3);
-}
-
-// helpers to deal with the fact that MSDev does not package
-// bind... with the stl. Again, this is from sgi.
-template <class _Operation>
-class llbinder1st :
-	public std::unary_function<typename _Operation::second_argument_type,
-							   typename _Operation::result_type> {
-protected:
-  _Operation op;
-  typename _Operation::first_argument_type value;
-public:
-  llbinder1st(const _Operation& __x,
-			  const typename _Operation::first_argument_type& __y)
-      : op(__x), value(__y) {}
-	typename _Operation::result_type
-	operator()(const typename _Operation::second_argument_type& __x) const {
-		return op(value, __x);
-	}
-};
-
-template <class _Operation, class _Tp>
-inline llbinder1st<_Operation>
-llbind1st(const _Operation& __oper, const _Tp& __x)
-{
-  typedef typename _Operation::first_argument_type _Arg1_type;
-  return llbinder1st<_Operation>(__oper, _Arg1_type(__x));
-}
-
-template <class _Operation>
-class llbinder2nd
-	: public std::unary_function<typename _Operation::first_argument_type,
-								 typename _Operation::result_type> {
-protected:
-	_Operation op;
-	typename _Operation::second_argument_type value;
-public:
-	llbinder2nd(const _Operation& __x,
-				const typename _Operation::second_argument_type& __y)
-		: op(__x), value(__y) {}
-	typename _Operation::result_type
-	operator()(const typename _Operation::first_argument_type& __x) const {
-		return op(__x, value);
-	}
-};
-
-template <class _Operation, class _Tp>
-inline llbinder2nd<_Operation>
-llbind2nd(const _Operation& __oper, const _Tp& __x)
-{
-  typedef typename _Operation::second_argument_type _Arg2_type;
-  return llbinder2nd<_Operation>(__oper, _Arg2_type(__x));
-}
-
 /**
  * Compare std::type_info* pointers a la std::less. We break this out as a
  * separate function for use in two different std::less specializations.
@@ -548,8 +317,7 @@ bool before(const std::type_info* lhs, const std::type_info* rhs)
 namespace std
 {
 	template <>
-	struct less<const std::type_info*>:
-		public std::binary_function<const std::type_info*, const std::type_info*, bool>
+	struct less<const std::type_info*>
 	{
 		bool operator()(const std::type_info* lhs, const std::type_info* rhs) const
 		{
@@ -558,8 +326,7 @@ namespace std
 	};
 
 	template <>
-	struct less<std::type_info*>:
-		public std::binary_function<std::type_info*, std::type_info*, bool>
+	struct less<std::type_info*>
 	{
 		bool operator()(std::type_info* lhs, std::type_info* rhs) const
 		{
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 4e61fb8a5805bce07f583e958675da0b33756a64..2ca15a31c627d909ed4f4a136605e552c9f03033 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -43,12 +43,12 @@
 #include "llerrorcontrol.h"
 #include "llevents.h"
 #include "llformat.h"
+#include "llregex.h"
 #include "lltimer.h"
 #include "llsdserialize.h"
 #include "llsdutil.h"
 #include <boost/bind.hpp>
 #include <boost/circular_buffer.hpp>
-#include <boost/regex.hpp>
 #include <boost/foreach.hpp>
 #include <boost/lexical_cast.hpp>
 #include <boost/range.hpp>
@@ -101,39 +101,6 @@ static const F32 MEM_INFO_THROTTLE = 20;
 // dropped below the login framerate, we'd have very little additional data.
 static const F32 MEM_INFO_WINDOW = 10*60;
 
-// Wrap boost::regex_match() with a function that doesn't throw.
-template <typename S, typename M, typename R>
-static bool regex_match_no_exc(const S& string, M& match, const R& regex)
-{
-    try
-    {
-        return boost::regex_match(string, match, regex);
-    }
-    catch (const std::runtime_error& e)
-    {
-        LL_WARNS("LLMemoryInfo") << "error matching with '" << regex.str() << "': "
-                                 << e.what() << ":\n'" << string << "'" << LL_ENDL;
-        return false;
-    }
-}
-
-// Wrap boost::regex_search() with a function that doesn't throw.
-template <typename S, typename M, typename R>
-static bool regex_search_no_exc(const S& string, M& match, const R& regex)
-{
-    try
-    {
-        return boost::regex_search(string, match, regex);
-    }
-    catch (const std::runtime_error& e)
-    {
-        LL_WARNS("LLMemoryInfo") << "error searching with '" << regex.str() << "': "
-                                 << e.what() << ":\n'" << string << "'" << LL_ENDL;
-        return false;
-    }
-}
-
-
 LLOSInfo::LLOSInfo() :
 	mMajorVer(0), mMinorVer(0), mBuild(0), mOSVersionString("")	 
 {
@@ -377,7 +344,7 @@ LLOSInfo::LLOSInfo() :
 	boost::smatch matched;
 
 	std::string glibc_version(gnu_get_libc_version());
-	if ( regex_match_no_exc(glibc_version, matched, os_version_parse) )
+	if ( ll_regex_match(glibc_version, matched, os_version_parse) )
 	{
 		LL_INFOS("AppInit") << "Using glibc version '" << glibc_version << "' as OS version" << LL_ENDL;
 	
@@ -1045,7 +1012,7 @@ LLSD LLMemoryInfo::loadStatsMap()
 		while (std::getline(meminfo, line))
 		{
 			LL_DEBUGS("LLMemoryInfo") << line << LL_ENDL;
-			if (regex_match_no_exc(line, matched, stat_rx))
+			if (ll_regex_match(line, matched, stat_rx))
 			{
 				// e.g. "MemTotal:		4108424 kB"
 				LLSD::String key(matched[1].first, matched[1].second);
diff --git a/indra/llcommon/tests/llleap_test.cpp b/indra/llcommon/tests/llleap_test.cpp
index 9d71e327d88a0a3c5b3e78e7c40b9e3dbbea6e72..fd96aa01d537abf90aba2f9800f0a7675133675e 100644
--- a/indra/llcommon/tests/llleap_test.cpp
+++ b/indra/llcommon/tests/llleap_test.cpp
@@ -530,7 +530,7 @@ namespace tut
         result.ensure();
     }
 
-    struct TestLargeMessage: public std::binary_function<size_t, size_t, bool>
+    struct TestLargeMessage
     {
         TestLargeMessage(const std::string& PYTHON_, const std::string& reader_module_,
                          const std::string& test_name_):
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index aed89434391e43f1e38253d0315e7bf252cc2769..983c7c2406ec2bffc4131661b138c403f1b51be8 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -1456,7 +1456,7 @@ bool LLImageRaw::scale( S32 new_width, S32 new_height, bool scale_image_data )
             setDataAndSize(new_data, new_width, new_height, components); 
 		}
 	}
-	else
+	else try
 	{
 		// copy	out	existing image data
 		S32	temp_data_size = old_width * old_height	* components;
@@ -1490,6 +1490,11 @@ bool LLImageRaw::scale( S32 new_width, S32 new_height, bool scale_image_data )
             }
         }
 	}
+    catch (std::bad_alloc&) // for temp_buffer
+    {
+        LL_WARNS() << "Failed to allocate temporary image buffer" << LL_ENDL;
+        return false;
+    }
 
 	return true ;
 }
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index e2469f3c7e651275c33b67c54138e04a0dba8526..2f577bfb079a727a8334a6e571bc3859a6897079 100644
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -1268,5 +1268,5 @@ U32 LLParcel::countExperienceKeyType( U32 type )
 	return std::count_if(
 		boost::begin(mExperienceKeys | boost::adaptors::map_values), 
 		boost::end(mExperienceKeys | boost::adaptors::map_values), 
-		std::bind2nd(std::equal_to<U32>(), type));
+		[type](U32 key){ return key == type; });
 }
diff --git a/indra/llinventory/llsettingsbase.cpp b/indra/llinventory/llsettingsbase.cpp
index 61b59e35aacd523ea90f693108896098f5b4f557..8a8e2bb340949a6e86a910b48df4b5599f953c86 100644
--- a/indra/llinventory/llsettingsbase.cpp
+++ b/indra/llinventory/llsettingsbase.cpp
@@ -395,7 +395,7 @@ bool LLSettingsBase::validate()
 
 LLSD LLSettingsBase::settingValidation(LLSD &settings, validation_list_t &validations, bool partial)
 {
-    static Validator  validateName(SETTING_NAME, false, LLSD::TypeString, boost::bind(&Validator::verifyStringLength, _1, 63));
+    static Validator  validateName(SETTING_NAME, false, LLSD::TypeString, boost::bind(&Validator::verifyStringLength, _1, _2, 63));
     static Validator  validateId(SETTING_ID, false, LLSD::TypeUUID);
     static Validator  validateHash(SETTING_HASH, false, LLSD::TypeInteger);
     static Validator  validateType(SETTING_TYPE, false, LLSD::TypeString);
@@ -534,7 +534,7 @@ bool LLSettingsBase::Validator::verify(LLSD &data, U32 flags)
         return false;
     }
 
-    if (!mVerify.empty() && !mVerify(data[mName]))
+    if (!mVerify.empty() && !mVerify(data[mName], flags))
     {
         LL_WARNS("SETTINGS") << "Setting '" << mName << "' fails validation." << LL_ENDL;
         return false;
@@ -543,17 +543,17 @@ bool LLSettingsBase::Validator::verify(LLSD &data, U32 flags)
     return true;
 }
 
-bool LLSettingsBase::Validator::verifyColor(LLSD &value)
+bool LLSettingsBase::Validator::verifyColor(LLSD &value, U32)
 {
     return (value.size() == 3 || value.size() == 4);
 }
 
-bool LLSettingsBase::Validator::verifyVector(LLSD &value, S32 length)
+bool LLSettingsBase::Validator::verifyVector(LLSD &value, U32, S32 length)
 {
     return (value.size() == length);
 }
 
-bool LLSettingsBase::Validator::verifyVectorNormalized(LLSD &value, S32 length)
+bool LLSettingsBase::Validator::verifyVectorNormalized(LLSD &value, U32, S32 length)
 {
     if (value.size() != length)
         return false;
@@ -596,7 +596,7 @@ bool LLSettingsBase::Validator::verifyVectorNormalized(LLSD &value, S32 length)
     return true;
 }
 
-bool LLSettingsBase::Validator::verifyVectorMinMax(LLSD &value, LLSD minvals, LLSD maxvals)
+bool LLSettingsBase::Validator::verifyVectorMinMax(LLSD &value, U32, LLSD minvals, LLSD maxvals)
 {
     for (S32 index = 0; index < value.size(); ++index)
     {
@@ -619,12 +619,12 @@ bool LLSettingsBase::Validator::verifyVectorMinMax(LLSD &value, LLSD minvals, LL
     return true;
 }
 
-bool LLSettingsBase::Validator::verifyQuaternion(LLSD &value)
+bool LLSettingsBase::Validator::verifyQuaternion(LLSD &value, U32)
 {
     return (value.size() == 4);
 }
 
-bool LLSettingsBase::Validator::verifyQuaternionNormal(LLSD &value)
+bool LLSettingsBase::Validator::verifyQuaternionNormal(LLSD &value, U32)
 {
     if (value.size() != 4)
         return false;
@@ -642,7 +642,7 @@ bool LLSettingsBase::Validator::verifyQuaternionNormal(LLSD &value)
     return true;
 }
 
-bool LLSettingsBase::Validator::verifyFloatRange(LLSD &value, LLSD range)
+bool LLSettingsBase::Validator::verifyFloatRange(LLSD &value, U32, LLSD range)
 {
     F64 real = value.asReal();
 
@@ -655,7 +655,7 @@ bool LLSettingsBase::Validator::verifyFloatRange(LLSD &value, LLSD range)
     return true;
 }
 
-bool LLSettingsBase::Validator::verifyIntegerRange(LLSD &value, LLSD range)
+bool LLSettingsBase::Validator::verifyIntegerRange(LLSD &value, U32, LLSD range)
 {
     S32 ival = value.asInteger();
 
@@ -668,7 +668,7 @@ bool LLSettingsBase::Validator::verifyIntegerRange(LLSD &value, LLSD range)
     return true;
 }
 
-bool LLSettingsBase::Validator::verifyStringLength(LLSD &value, S32 length)
+bool LLSettingsBase::Validator::verifyStringLength(LLSD &value, U32, S32 length)
 {
     std::string sval = value.asString();
 
diff --git a/indra/llinventory/llsettingsbase.h b/indra/llinventory/llsettingsbase.h
index f7a9d5b7cd262dc387ff62249c91057fc6222a18..1f0589f5718aafa8c5bc87147471cae06a1e6b82 100644
--- a/indra/llinventory/llsettingsbase.h
+++ b/indra/llinventory/llsettingsbase.h
@@ -270,7 +270,7 @@ class LLSettingsBase :
     public:
         static const U32 VALIDATION_PARTIAL;
         
-        typedef boost::function<bool(LLSD &)> verify_pr;
+        typedef boost::function<bool(LLSD &, U32)> verify_pr;
 
         Validator(std::string name, bool required, LLSD::Type type, verify_pr verify = verify_pr(), LLSD defval = LLSD())  :
             mName(name),
@@ -287,15 +287,15 @@ class LLSettingsBase :
         bool        verify(LLSD &data, U32 flags);
 
         // Some basic verifications
-        static bool verifyColor(LLSD &value);
-        static bool verifyVector(LLSD &value, S32 length);
-        static bool verifyVectorMinMax(LLSD &value, LLSD minvals, LLSD maxvals);
-        static bool verifyVectorNormalized(LLSD &value, S32 length);
-        static bool verifyQuaternion(LLSD &value);
-        static bool verifyQuaternionNormal(LLSD &value);
-        static bool verifyFloatRange(LLSD &value, LLSD range);
-        static bool verifyIntegerRange(LLSD &value, LLSD range);
-        static bool verifyStringLength(LLSD &value, S32 length);
+        static bool verifyColor(LLSD &value, U32 flags);
+        static bool verifyVector(LLSD &value, U32 flags, S32 length);
+        static bool verifyVectorMinMax(LLSD &value, U32 flags, LLSD minvals, LLSD maxvals);
+        static bool verifyVectorNormalized(LLSD &value, U32 flags, S32 length);
+        static bool verifyQuaternion(LLSD &value, U32 flags);
+        static bool verifyQuaternionNormal(LLSD &value, U32 flags);
+        static bool verifyFloatRange(LLSD &value, U32 flags, LLSD range);
+        static bool verifyIntegerRange(LLSD &value, U32 flags, LLSD range);
+        static bool verifyStringLength(LLSD &value, U32 flags, S32 length);
 
     private:
         std::string mName;
diff --git a/indra/llinventory/llsettingsdaycycle.cpp b/indra/llinventory/llsettingsdaycycle.cpp
index a687fd840d022f9c340c6c76587e80f291270087..2bb03e8391dc2920c2d822a5b2d794923bede8e5 100644
--- a/indra/llinventory/llsettingsdaycycle.cpp
+++ b/indra/llinventory/llsettingsdaycycle.cpp
@@ -460,7 +460,7 @@ void LLSettingsDay::blend(const LLSettingsBase::ptr_t &other, F64 mix)
 
 namespace
 {
-    bool validateDayCycleTrack(LLSD &value)
+    bool validateDayCycleTrack(LLSD &value, U32 flags)
     {
         // Trim extra tracks.
         while (value.size() > LLSettingsDay::TRACK_MAX)
@@ -531,7 +531,7 @@ namespace
         return true;
     }
 
-    bool validateDayCycleFrames(LLSD &value)
+    bool validateDayCycleFrames(LLSD &value, U32 flags)
     {
         bool hasSky(false);
         bool hasWater(false);
@@ -544,7 +544,7 @@ namespace
             if (ftype == "sky")
             {
                 LLSettingsSky::validation_list_t valid_sky = LLSettingsSky::validationList();
-                LLSD res_sky = LLSettingsBase::settingValidation(frame, valid_sky);
+                LLSD res_sky = LLSettingsBase::settingValidation(frame, valid_sky, flags);
                 
                 if (res_sky["success"].asInteger() == 0)
                 {
@@ -557,7 +557,7 @@ namespace
             else if (ftype == "water")
             {
                 LLSettingsWater::validation_list_t valid_h2o = LLSettingsWater::validationList();
-                LLSD res_h2o = LLSettingsBase::settingValidation(frame, valid_h2o);
+                LLSD res_h2o = LLSettingsBase::settingValidation(frame, valid_h2o, flags);
                 if (res_h2o["success"].asInteger() == 0)
                 {
                     LL_WARNS("SETTINGS") << "Water setting named '" << (*itf).first << "' validation failed!: " << res_h2o << LL_ENDL;
@@ -573,18 +573,20 @@ namespace
             }
         }
 
-        if (!hasSky)
+        if ((flags & LLSettingsBase::Validator::VALIDATION_PARTIAL) == 0)
         {
-            LL_WARNS("SETTINGS") << "No skies defined." << LL_ENDL;
-            return false;
-        }
+            if (!hasSky)
+            {
+                LL_WARNS("SETTINGS") << "No skies defined." << LL_ENDL;
+                return false;
+            }
 
-        if (!hasWater)
-        {
-            LL_WARNS("SETTINGS") << "No waters defined." << LL_ENDL;
-            return false;
+            if (!hasWater)
+            {
+                LL_WARNS("SETTINGS") << "No waters defined." << LL_ENDL;
+                return false;
+            }
         }
-
         return true;
     }
 }
diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp
index 81937dbda529ccbb6475e1d045e27d05274a6e81..1470edbf385131a48d54d05a51b23ab8305ec6bd 100644
--- a/indra/llinventory/llsettingssky.cpp
+++ b/indra/llinventory/llsettingssky.cpp
@@ -156,25 +156,25 @@ LLSettingsSky::validation_list_t legacyHazeValidationList()
     if (legacyHazeValidation.empty())
     {
         legacyHazeValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_AMBIENT,             false,  LLSD::TypeArray, 
-            boost::bind(&LLSettingsBase::Validator::verifyVectorMinMax, _1,
+            boost::bind(&LLSettingsBase::Validator::verifyVectorMinMax, _1, _2,
                 LLSD(LLSDArray(0.0f)(0.0f)(0.0f)("*")),
                 LLSD(LLSDArray(3.0f)(3.0f)(3.0f)("*")))));
         legacyHazeValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_BLUE_DENSITY,        false,  LLSD::TypeArray, 
-            boost::bind(&LLSettingsBase::Validator::verifyVectorMinMax, _1,
+            boost::bind(&LLSettingsBase::Validator::verifyVectorMinMax, _1, _2,
                 LLSD(LLSDArray(0.0f)(0.0f)(0.0f)("*")),
                 LLSD(LLSDArray(3.0f)(3.0f)(3.0f)("*")))));
         legacyHazeValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_BLUE_HORIZON,        false,  LLSD::TypeArray, 
-            boost::bind(&LLSettingsBase::Validator::verifyVectorMinMax, _1,
+            boost::bind(&LLSettingsBase::Validator::verifyVectorMinMax, _1, _2,
                 LLSD(LLSDArray(0.0f)(0.0f)(0.0f)("*")),
                 LLSD(LLSDArray(3.0f)(3.0f)(3.0f)("*")))));
         legacyHazeValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_HAZE_DENSITY,        false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(5.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(5.0f)))));
         legacyHazeValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_HAZE_HORIZON,        false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(5.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(5.0f)))));
         legacyHazeValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_MULTIPLIER,  false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0001f)(2.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0001f)(2.0f)))));
         legacyHazeValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DISTANCE_MULTIPLIER, false,  LLSD::TypeReal,
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0001f)(1000.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0001f)(1000.0f)))));
     }
     return legacyHazeValidation;
 }
@@ -185,19 +185,19 @@ LLSettingsSky::validation_list_t rayleighValidationList()
     if (rayleighValidation.empty())
     {
         rayleighValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH,      false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(32768.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(32768.0f)))));
 
         rayleighValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM,   false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(2.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(2.0f)))));
         
         rayleighValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR, false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(-1.0f)(1.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(-1.0f)(1.0f)))));
 
         rayleighValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM, false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(2.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(2.0f)))));
 
         rayleighValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_CONSTANT_TERM, false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
     }
     return rayleighValidation;
 }
@@ -208,19 +208,19 @@ LLSettingsSky::validation_list_t absorptionValidationList()
     if (absorptionValidation.empty())
     {
         absorptionValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH,      false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(32768.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(32768.0f)))));
 
         absorptionValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM,   false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(2.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(2.0f)))));
         
         absorptionValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR, false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(-1.0f)(1.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(-1.0f)(1.0f)))));
 
         absorptionValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM, false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(2.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(2.0f)))));
 
         absorptionValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_CONSTANT_TERM, false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
     }
     return absorptionValidation;
 }
@@ -231,31 +231,31 @@ LLSettingsSky::validation_list_t mieValidationList()
     if (mieValidation.empty())
     {
         mieValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH,      false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(32768.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(32768.0f)))));
 
         mieValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM,   false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(2.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(2.0f)))));
         
         mieValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR, false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(-1.0f)(1.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(-1.0f)(1.0f)))));
 
         mieValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM, false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(2.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(2.0f)))));
 
         mieValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_DENSITY_PROFILE_CONSTANT_TERM, false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
 
         mieValidation.push_back(LLSettingsBase::Validator(LLSettingsSky::SETTING_MIE_ANISOTROPY_FACTOR, false,  LLSD::TypeReal,  
-            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
+            boost::bind(&LLSettingsBase::Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
     }
     return mieValidation;
 }
 
-bool validateLegacyHaze(LLSD &value)
+bool validateLegacyHaze(LLSD &value, U32 flags)
 {
     LLSettingsSky::validation_list_t legacyHazeValidations = legacyHazeValidationList();
     llassert(value.type() == LLSD::TypeMap);
-    LLSD result = LLSettingsBase::settingValidation(value, legacyHazeValidations);
+    LLSD result = LLSettingsBase::settingValidation(value, legacyHazeValidations, flags);
     if (result["errors"].size() > 0)
     {
         LL_WARNS("SETTINGS") << "Legacy Haze Config Validation errors: " << result["errors"] << LL_ENDL;
@@ -269,7 +269,7 @@ bool validateLegacyHaze(LLSD &value)
     return true;
 }
 
-bool validateRayleighLayers(LLSD &value)
+bool validateRayleighLayers(LLSD &value, U32 flags)
 {
     LLSettingsSky::validation_list_t rayleighValidations = rayleighValidationList();
     if (value.isArray())
@@ -280,24 +280,24 @@ bool validateRayleighLayers(LLSD &value)
             LLSD& layerConfig = (*itf);
             if (layerConfig.type() == LLSD::TypeMap)
             {
-                if (!validateRayleighLayers(layerConfig))
+                if (!validateRayleighLayers(layerConfig, flags))
                 {
                     allGood = false;
                 }
             }
             else if (layerConfig.type() == LLSD::TypeArray)
             {
-                return validateRayleighLayers(layerConfig);
+                return validateRayleighLayers(layerConfig, flags);
             }
             else
             {
-                return LLSettingsBase::settingValidation(value, rayleighValidations);
+                return LLSettingsBase::settingValidation(value, rayleighValidations, flags);
             }
         }
         return allGood;
     }    
     llassert(value.type() == LLSD::TypeMap);
-    LLSD result = LLSettingsBase::settingValidation(value, rayleighValidations);
+    LLSD result = LLSettingsBase::settingValidation(value, rayleighValidations, flags);
     if (result["errors"].size() > 0)
     {
         LL_WARNS("SETTINGS") << "Rayleigh Config Validation errors: " << result["errors"] << LL_ENDL;
@@ -311,7 +311,7 @@ bool validateRayleighLayers(LLSD &value)
     return true;
 }
 
-bool validateAbsorptionLayers(LLSD &value)
+bool validateAbsorptionLayers(LLSD &value, U32 flags)
 {
     LLSettingsBase::validation_list_t absorptionValidations = absorptionValidationList();
     if (value.isArray())
@@ -322,24 +322,24 @@ bool validateAbsorptionLayers(LLSD &value)
             LLSD& layerConfig = (*itf);
             if (layerConfig.type() == LLSD::TypeMap)
             {
-                if (!validateAbsorptionLayers(layerConfig))
+                if (!validateAbsorptionLayers(layerConfig, flags))
                 {
                     allGood = false;
                 }
             }
             else if (layerConfig.type() == LLSD::TypeArray)
             {
-                return validateAbsorptionLayers(layerConfig);
+                return validateAbsorptionLayers(layerConfig, flags);
             }
             else
             {
-                return LLSettingsBase::settingValidation(value, absorptionValidations);
+                return LLSettingsBase::settingValidation(value, absorptionValidations, flags);
             }
         }
         return allGood;
     }
     llassert(value.type() == LLSD::TypeMap);
-    LLSD result = LLSettingsBase::settingValidation(value, absorptionValidations);
+    LLSD result = LLSettingsBase::settingValidation(value, absorptionValidations, flags);
     if (result["errors"].size() > 0)
     {
         LL_WARNS("SETTINGS") << "Absorption Config Validation errors: " << result["errors"] << LL_ENDL;
@@ -353,7 +353,7 @@ bool validateAbsorptionLayers(LLSD &value)
     return true;
 }
 
-bool validateMieLayers(LLSD &value)
+bool validateMieLayers(LLSD &value, U32 flags)
 {
     LLSettingsBase::validation_list_t mieValidations = mieValidationList();
     if (value.isArray())
@@ -364,23 +364,23 @@ bool validateMieLayers(LLSD &value)
             LLSD& layerConfig = (*itf);
             if (layerConfig.type() == LLSD::TypeMap)
             {
-                if (!validateMieLayers(layerConfig))
+                if (!validateMieLayers(layerConfig, flags))
                 {
                     allGood = false;
                 }
             }
             else if (layerConfig.type() == LLSD::TypeArray)
             {
-                return validateMieLayers(layerConfig);
+                return validateMieLayers(layerConfig, flags);
             }
             else
             {
-                return LLSettingsBase::settingValidation(value, mieValidations);
+                return LLSettingsBase::settingValidation(value, mieValidations, flags);
             }
         }
         return allGood;
     }
-    LLSD result = LLSettingsBase::settingValidation(value, mieValidations);
+    LLSD result = LLSettingsBase::settingValidation(value, mieValidations, flags);
     if (result["errors"].size() > 0)
     {
         LL_WARNS("SETTINGS") << "Mie Config Validation errors: " << result["errors"] << LL_ENDL;
@@ -559,80 +559,80 @@ LLSettingsSky::validation_list_t LLSettingsSky::validationList()
         validation.push_back(Validator(SETTING_HALO_TEXTUREID,      false,  LLSD::TypeUUID));
 
         validation.push_back(Validator(SETTING_CLOUD_COLOR,         true,  LLSD::TypeArray, 
-            boost::bind(&Validator::verifyVectorMinMax, _1,
+            boost::bind(&Validator::verifyVectorMinMax, _1, _2,
                 LLSD(LLSDArray(0.0f)(0.0f)(0.0f)("*")),
                 LLSD(LLSDArray(1.0f)(1.0f)(1.0f)("*")))));
         validation.push_back(Validator(SETTING_CLOUD_POS_DENSITY1,  true,  LLSD::TypeArray, 
-            boost::bind(&Validator::verifyVectorMinMax, _1,
+            boost::bind(&Validator::verifyVectorMinMax, _1, _2,
                 LLSD(LLSDArray(0.0f)(0.0f)(0.0f)("*")),
                 LLSD(LLSDArray(1.0f)(1.0f)(3.0f)("*")))));
         validation.push_back(Validator(SETTING_CLOUD_POS_DENSITY2,  true,  LLSD::TypeArray, 
-            boost::bind(&Validator::verifyVectorMinMax, _1,
+            boost::bind(&Validator::verifyVectorMinMax, _1, _2,
                 LLSD(LLSDArray(0.0f)(0.0f)(0.0f)("*")),
                 LLSD(LLSDArray(1.0f)(1.0f)(1.0f)("*")))));
         validation.push_back(Validator(SETTING_CLOUD_SCALE,         true,  LLSD::TypeReal,  
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.001f)(3.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.001f)(3.0f)))));
         validation.push_back(Validator(SETTING_CLOUD_SCROLL_RATE,   true,  LLSD::TypeArray, 
-            boost::bind(&Validator::verifyVectorMinMax, _1,
+            boost::bind(&Validator::verifyVectorMinMax, _1, _2,
                 LLSD(LLSDArray(-50.0f)(-50.0f)),
                 LLSD(LLSDArray(50.0f)(50.0f)))));
         validation.push_back(Validator(SETTING_CLOUD_SHADOW,        true,  LLSD::TypeReal,  
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
         validation.push_back(Validator(SETTING_CLOUD_TEXTUREID,     false, LLSD::TypeUUID));
         validation.push_back(Validator(SETTING_CLOUD_VARIANCE,      false,  LLSD::TypeReal,  
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
 
         validation.push_back(Validator(SETTING_DOME_OFFSET,         false, LLSD::TypeReal,  
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
         validation.push_back(Validator(SETTING_DOME_RADIUS,         false, LLSD::TypeReal,  
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(1000.0f)(2000.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(1000.0f)(2000.0f)))));
         validation.push_back(Validator(SETTING_GAMMA,               true,  LLSD::TypeReal,  
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(20.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(20.0f)))));
         validation.push_back(Validator(SETTING_GLOW,                true,  LLSD::TypeArray, 
-            boost::bind(&Validator::verifyVectorMinMax, _1,
+            boost::bind(&Validator::verifyVectorMinMax, _1, _2,
                 LLSD(LLSDArray(0.2f)("*")(-10.0f)("*")),
                 LLSD(LLSDArray(40.0f)("*")(10.0f)("*")))));
         
         validation.push_back(Validator(SETTING_MAX_Y,               true,  LLSD::TypeReal,  
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(10000.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(10000.0f)))));
         validation.push_back(Validator(SETTING_MOON_ROTATION,       true,  LLSD::TypeArray, &Validator::verifyQuaternionNormal));
         validation.push_back(Validator(SETTING_MOON_SCALE,          false, LLSD::TypeReal,
-                boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.25f)(20.0f))), LLSD::Real(1.0)));
+                boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.25f)(20.0f))), LLSD::Real(1.0)));
         validation.push_back(Validator(SETTING_MOON_TEXTUREID,      false, LLSD::TypeUUID));
         validation.push_back(Validator(SETTING_MOON_BRIGHTNESS,     false,  LLSD::TypeReal, 
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
 
         validation.push_back(Validator(SETTING_STAR_BRIGHTNESS,     true,  LLSD::TypeReal, 
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(500.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(500.0f)))));
         validation.push_back(Validator(SETTING_SUNLIGHT_COLOR,      true,  LLSD::TypeArray, 
-            boost::bind(&Validator::verifyVectorMinMax, _1,
+            boost::bind(&Validator::verifyVectorMinMax, _1, _2,
                 LLSD(LLSDArray(0.0f)(0.0f)(0.0f)("*")),
                 LLSD(LLSDArray(3.0f)(3.0f)(3.0f)("*")))));
         validation.push_back(Validator(SETTING_SUN_ROTATION,        true,  LLSD::TypeArray, &Validator::verifyQuaternionNormal));
         validation.push_back(Validator(SETTING_SUN_SCALE,           false, LLSD::TypeReal,
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.25f)(20.0f))), LLSD::Real(1.0)));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.25f)(20.0f))), LLSD::Real(1.0)));
         validation.push_back(Validator(SETTING_SUN_TEXTUREID, false, LLSD::TypeUUID));
 
         validation.push_back(Validator(SETTING_PLANET_RADIUS,       true,  LLSD::TypeReal,  
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(1000.0f)(32768.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(1000.0f)(32768.0f)))));
 
         validation.push_back(Validator(SETTING_SKY_BOTTOM_RADIUS,   true,  LLSD::TypeReal,  
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(1000.0f)(32768.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(1000.0f)(32768.0f)))));
 
         validation.push_back(Validator(SETTING_SKY_TOP_RADIUS,       true,  LLSD::TypeReal,  
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(1000.0f)(32768.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(1000.0f)(32768.0f)))));
 
         validation.push_back(Validator(SETTING_SUN_ARC_RADIANS,      true,  LLSD::TypeReal,  
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(0.1f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(0.1f)))));
 
         validation.push_back(Validator(SETTING_SKY_MOISTURE_LEVEL,      false,  LLSD::TypeReal,  
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
 
         validation.push_back(Validator(SETTING_SKY_DROPLET_RADIUS,      false,  LLSD::TypeReal,  
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(5.0f)(1000.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(5.0f)(1000.0f)))));
 
         validation.push_back(Validator(SETTING_SKY_ICE_LEVEL,      false,  LLSD::TypeReal,  
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
 
         validation.push_back(Validator(SETTING_RAYLEIGH_CONFIG, true, LLSD::TypeArray, &validateRayleighLayers));
         validation.push_back(Validator(SETTING_ABSORPTION_CONFIG, true, LLSD::TypeArray, &validateAbsorptionLayers));
diff --git a/indra/llinventory/llsettingswater.cpp b/indra/llinventory/llsettingswater.cpp
index 0eb95dcd8958f269caf108375a2e8259d9ed4a38..1ae8d78b22ca40ee1a7347d26b417f3d0b1e954e 100644
--- a/indra/llinventory/llsettingswater.cpp
+++ b/indra/llinventory/llsettingswater.cpp
@@ -236,34 +236,34 @@ LLSettingsWater::validation_list_t LLSettingsWater::validationList()
         // in deeply nested arrays like this [[[[[[[[[[v1,v2,v3]]]]]]]]]]
 
         validation.push_back(Validator(SETTING_BLUR_MULTIPLIER, true, LLSD::TypeReal,
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(-0.5f)(0.5f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(-0.5f)(0.5f)))));
         validation.push_back(Validator(SETTING_FOG_COLOR, true, LLSD::TypeArray,
-            boost::bind(&Validator::verifyVectorMinMax, _1,
+            boost::bind(&Validator::verifyVectorMinMax, _1, _2,
                 LLSD(LLSDArray(0.0f)(0.0f)(0.0f)(1.0f)),
                 LLSD(LLSDArray(1.0f)(1.0f)(1.0f)(1.0f)))));
         validation.push_back(Validator(SETTING_FOG_DENSITY, true, LLSD::TypeReal,
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(-10.0f)(10.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(-10.0f)(10.0f)))));
         validation.push_back(Validator(SETTING_FOG_MOD, true, LLSD::TypeReal,
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(20.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(20.0f)))));
         validation.push_back(Validator(SETTING_FRESNEL_OFFSET, true, LLSD::TypeReal,
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
         validation.push_back(Validator(SETTING_FRESNEL_SCALE, true, LLSD::TypeReal,
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(1.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(1.0f)))));
         validation.push_back(Validator(SETTING_NORMAL_MAP, true, LLSD::TypeUUID));
         validation.push_back(Validator(SETTING_NORMAL_SCALE, true, LLSD::TypeArray,
-            boost::bind(&Validator::verifyVectorMinMax, _1,
+            boost::bind(&Validator::verifyVectorMinMax, _1, _2,
                 LLSD(LLSDArray(0.0f)(0.0f)(0.0f)),
                 LLSD(LLSDArray(10.0f)(10.0f)(10.0f)))));
         validation.push_back(Validator(SETTING_SCALE_ABOVE, true, LLSD::TypeReal,
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(3.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(3.0f)))));
         validation.push_back(Validator(SETTING_SCALE_BELOW, true, LLSD::TypeReal,
-            boost::bind(&Validator::verifyFloatRange, _1, LLSD(LLSDArray(0.0f)(3.0f)))));
+            boost::bind(&Validator::verifyFloatRange, _1, _2, LLSD(LLSDArray(0.0f)(3.0f)))));
         validation.push_back(Validator(SETTING_WAVE1_DIR, true, LLSD::TypeArray,
-            boost::bind(&Validator::verifyVectorMinMax, _1,
+            boost::bind(&Validator::verifyVectorMinMax, _1, _2,
                 LLSD(LLSDArray(-20.0f)(-20.0f)),
                 LLSD(LLSDArray(20.0f)(20.0f)))));
         validation.push_back(Validator(SETTING_WAVE2_DIR, true, LLSD::TypeArray,
-            boost::bind(&Validator::verifyVectorMinMax, _1,
+            boost::bind(&Validator::verifyVectorMinMax, _1, _2,
                 LLSD(LLSDArray(-20.0f)(-20.0f)),
                 LLSD(LLSDArray(20.0f)(20.0f)))));
     }
diff --git a/indra/llmessage/llcircuit.cpp b/indra/llmessage/llcircuit.cpp
index 8baa2e328b99d3157be5e25c185a72ceaf2086d7..a39989515e65d4a539fb5798b7e1fd8d917def6e 100644
--- a/indra/llmessage/llcircuit.cpp
+++ b/indra/llmessage/llcircuit.cpp
@@ -436,12 +436,11 @@ LLCircuit::LLCircuit(const F32Seconds circuit_heartbeat_interval, const F32Secon
 
 LLCircuit::~LLCircuit()
 {
-	// delete pointers in the map.
-	std::for_each(mCircuitData.begin(),
-				  mCircuitData.end(),
-				  llcompose1(
-					  DeletePointerFunctor<LLCircuitData>(),
-					  llselect2nd<circuit_data_map::value_type>()));
+    // delete pointers in the map.
+    for (auto circ_pair : mCircuitData)
+    {
+        delete circ_pair.second;
+    }
 }
 
 LLCircuitData *LLCircuit::addCircuitData(const LLHost &host, TPACKETID in_id)
diff --git a/indra/llmessage/lldispatcher.cpp b/indra/llmessage/lldispatcher.cpp
index 717ef10f70283c1b319cf57a2fa381277fa3fbeb..8dfd924f311eff104d4249c92f7b079df801d645 100644
--- a/indra/llmessage/lldispatcher.cpp
+++ b/indra/llmessage/lldispatcher.cpp
@@ -62,7 +62,7 @@ void LLDispatcher::copyAllHandlerNames(keys_t& names) const
 		mHandlers.begin(),
 		mHandlers.end(),
 		std::back_insert_iterator<keys_t>(names),
-		llselect1st<dispatch_map_t::value_type>());
+		[](const dispatch_map_t::value_type& pair){ return pair.first; });
 }
 
 bool LLDispatcher::dispatch(
diff --git a/indra/llmessage/llmessagethrottle.cpp b/indra/llmessage/llmessagethrottle.cpp
index 579d6d718788a0f43515ea6280ed1124cdb3ff8a..c5ae8b45474c52b6a356ae567632ec5e63ffbc05 100644
--- a/indra/llmessage/llmessagethrottle.cpp
+++ b/indra/llmessage/llmessagethrottle.cpp
@@ -32,18 +32,8 @@
 #include "llframetimer.h"
 
 // This is used for the stl search_n function.
-#if _MSC_VER >= 1500 // VC9 has a bug in search_n
-struct eq_message_throttle_entry : public std::binary_function< LLMessageThrottleEntry, LLMessageThrottleEntry, bool >
-{
-	bool operator()(const LLMessageThrottleEntry& a, const LLMessageThrottleEntry& b) const
-	{
-		return a.getHash() == b.getHash();
-	}
-};
-#else
 bool eq_message_throttle_entry(LLMessageThrottleEntry a, LLMessageThrottleEntry b)
  		{ return a.getHash() == b.getHash(); }
-#endif
 
 const U64 SEC_TO_USEC = 1000000;
 		
@@ -118,14 +108,8 @@ BOOL LLMessageThrottle::addViewerAlert(const LLUUID& to, const std::string& mesg
 	LLMessageThrottleEntry entry(hash, LLFrameTimer::getTotalTime());
 
 	// Check if this message is already in the list.
-#if _MSC_VER >= 1500 // VC9 has a bug in search_n
-	// SJB: This *should* work but has not been tested yet *TODO: Test!
-	message_list_iterator_t found = std::find_if(message_list->begin(), message_list->end(),
-												 std::bind2nd(eq_message_throttle_entry(), entry));
-#else
  	message_list_iterator_t found = std::search_n(message_list->begin(), message_list->end(),
  												  1, entry, eq_message_throttle_entry);
-#endif
 	if (found == message_list->end())
 	{
 		// This message was not found.  Add it to the list.
@@ -152,14 +136,8 @@ BOOL LLMessageThrottle::addAgentAlert(const LLUUID& agent, const LLUUID& task, c
 	LLMessageThrottleEntry entry(hash, LLFrameTimer::getTotalTime());
 
 	// Check if this message is already in the list.
-#if _MSC_VER >= 1500 // VC9 has a bug in search_n
-	// SJB: This *should* work but has not been tested yet *TODO: Test!
-	message_list_iterator_t found = std::find_if(message_list->begin(), message_list->end(),
-												 std::bind2nd(eq_message_throttle_entry(), entry));
-#else
 	message_list_iterator_t found = std::search_n(message_list->begin(), message_list->end(),
 												  1, entry, eq_message_throttle_entry);
-#endif
 	
 	if (found == message_list->end())
 	{
diff --git a/indra/llprimitive/llmediaentry.cpp b/indra/llprimitive/llmediaentry.cpp
index 02aba2bd83f3ace6ae59459a6f444ad3cf587efc..53e9555c6a63c2f5dae602ea04ae4de72942cdff 100644
--- a/indra/llprimitive/llmediaentry.cpp
+++ b/indra/llprimitive/llmediaentry.cpp
@@ -27,8 +27,7 @@
 #include "linden_common.h"
 #include "llmediaentry.h"
 #include "lllslconstants.h"
-
-#include <boost/regex.hpp>
+#include "llregex.h"
 
 // LLSD key defines
 // DO NOT REORDER OR REMOVE THESE!
@@ -456,7 +455,7 @@ static bool pattern_match(const std::string &candidate_str, const std::string &p
                     
     // case-insensitive matching:
     boost::regex regexp(expression, boost::regex::perl|boost::regex::icase);
-    return boost::regex_match(candidate_str, regexp);
+    return ll_regex_match(candidate_str, regexp);
 }
 
 bool LLMediaEntry::checkCandidateUrl(const std::string& url) const
diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h
index 89c9852f4af3349fe8e3f4bd53ea889205954c15..1110342f0865cc5283f830a8ebc9134912efac33 100644
--- a/indra/llui/lldockablefloater.h
+++ b/indra/llui/lldockablefloater.h
@@ -108,7 +108,7 @@ class LLDockableFloater : public LLFloater
 	 *
 	 * By default returns false.
 	 */
-	virtual bool overlapsScreenChannel() { return mOverlapsScreenChannel && getVisible() && isDocked(); }
+	virtual bool overlapsScreenChannel() const { return mOverlapsScreenChannel && getVisible() && isDocked(); }
 	virtual void setOverlapsScreenChannel(bool overlaps) { mOverlapsScreenChannel = overlaps; }
 
 	bool getUniqueDocking() { return mUniqueDocking;	}
@@ -131,7 +131,7 @@ class LLDockableFloater : public LLFloater
 	boost::function<BOOL ()> mIsDockedStateForcedCallback;
 
 private:
-	std::auto_ptr<LLDockControl> mDockControl;
+	std::unique_ptr<LLDockControl> mDockControl;
 	LLUIImagePtr mDockTongue;
 	static LLHandle<LLFloater> sInstanceHandle;
 	/**
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 602aede827366c9f18dbd4b3951769f484fa205f..38495e1e0b023fbfa5df2c1df942e6c4a0df229d 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -35,6 +35,7 @@
 
 #include "llavatarnamecache.h"
 #include "llcachename.h"
+#include "llregex.h"
 #include "lltrans.h"
 #include "lluicolortable.h"
 #include "message.h"
@@ -1456,7 +1457,7 @@ std::string LLUrlEntryIcon::getIcon(const std::string &url)
 	// Grep icon info between <icon>...</icon> tags
 	// matches[1] contains the icon name/path
 	boost::match_results<std::string::const_iterator> matches;
-	mIcon = (boost::regex_match(url, matches, mPattern) && matches[1].matched)
+	mIcon = (ll_regex_match(url, matches, mPattern) && matches[1].matched)
 		? matches[1]
 		: LLStringUtil::null;
 	LLStringUtil::trim(mIcon);
diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp
index 321a0ec5b9b75d916fff7151aac4777261ddcc2b..bfcd970529454c89aa2f09d981f38008144b02b7 100644
--- a/indra/llui/llurlregistry.cpp
+++ b/indra/llui/llurlregistry.cpp
@@ -26,10 +26,10 @@
  */
 
 #include "linden_common.h"
+#include "llregex.h"
 #include "llurlregistry.h"
 #include "lluriparser.h"
 
-#include <boost/regex.hpp>
 
 // default dummy callback that ignores any label updates from the server
 void LLUrlRegistryNullCallback(const std::string &url, const std::string &label, const std::string& icon)
@@ -108,15 +108,7 @@ static bool matchRegex(const char *text, boost::regex regex, U32 &start, U32 &en
 	boost::cmatch result;
 	bool found;
 
-	// regex_search can potentially throw an exception, so check for it
-	try
-	{
-		found = boost::regex_search(text, result, regex);
-	}
-	catch (std::runtime_error &)
-	{
-		return false;
-	}
+	found = ll_regex_search(text, result, regex);
 
 	if (! found)
 	{
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index 7a30cd4cea46bedf7fbf2c0ac02b3de407f3746b..69b23f9cf882c43afa137e919f2cc35a7b772f06 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -337,6 +337,11 @@ const std::string &LLDir::getDumpDir() const
 	return LLDir::sDumpDir;
 }
 
+bool LLDir::dumpDirExists() const
+{
+    return !sDumpDir.empty();
+}
+
 const std::string &LLDir::getPerAccountChatLogsDir() const
 {
 	return mPerAccountChatLogsDir;
diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h
index c114f9957b52c84c8b37e59f2e46b52320e1e6b8..b9a046ba33e6a9090e57d1d6796426b5d3fca020 100644
--- a/indra/llvfs/lldir.h
+++ b/indra/llvfs/lldir.h
@@ -90,6 +90,7 @@ class LLDir
 	const std::string &getLindenUserDir() const;	// Location of the Linden user dir.
 	const std::string &getChatLogsDir() const;	// Location of the chat logs dir.
 	const std::string &getDumpDir() const;	// Location of the per-run dump dir.
+	bool              dumpDirExists() const;
 	const std::string &getPerAccountChatLogsDir() const;	// Location of the per account chat logs dir.
 	const std::string &getTempDir() const;			// Common temporary directory
 	const std::string  getCacheDir(bool get_default = false) const;	// Location of the cache.
diff --git a/indra/llvfs/lldiriterator.cpp b/indra/llvfs/lldiriterator.cpp
index 3eb64e69d9ab23df63242cbd236d15bd6eed6ddd..f57bf4ebc60afb37bf5c1794ceb6dcad2c4d99d4 100644
--- a/indra/llvfs/lldiriterator.cpp
+++ b/indra/llvfs/lldiriterator.cpp
@@ -27,8 +27,8 @@
 #include "lldiriterator.h"
 
 #include "fix_macros.h"
+#include "llregex.h"
 #include <boost/filesystem.hpp>
-#include <boost/regex.hpp>
 
 namespace fs = boost::filesystem;
 
@@ -131,7 +131,7 @@ bool LLDirIterator::Impl::next(std::string &fname)
 		{
 			boost::smatch match;
 			std::string name = mIter->path().filename().string();
-			found = boost::regex_match(name, match, mFilterExp);
+			found = ll_regex_match(name, match, mFilterExp);
 			if (found)
 			{
 				fname = name;
diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index d2c5b11c3d1899ff7b3db870eba8bb53083ab004..f9b387b00ba6b19c5d797dc91382d734d7444de4 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -494,7 +494,8 @@ attributedStringInfo getSegments(NSAttributedString *str)
     // e.g. OS Window for upload something or Input Window...
     // mModifiers instance variable is for insertText: or insertText:replacementRange:  (by Pell Smit)
 	mModifiers = [theEvent modifierFlags];
-    bool acceptsText = mHasMarkedText ? false : callKeyDown(&eventData, keycode, mModifiers);
+
+    bool acceptsText = mHasMarkedText ? false : callKeyDown(&eventData, keycode, mModifiers, [[theEvent characters] characterAtIndex:0]);
     unichar ch;
     if (acceptsText &&
         !mMarkedTextAllowed &&
@@ -537,7 +538,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
     if (mModifiers & mask)
     {
         eventData.mKeyEvent = NativeKeyEventData::KEYDOWN;
-        callKeyDown(&eventData, [theEvent keyCode], 0);
+        callKeyDown(&eventData, [theEvent keyCode], 0, [[theEvent characters] characterAtIndex:0]);
     }
     else
     {
diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h
index 44fd4127ce5a06b0e1694828b1eb9fe0b00c7f92..43edc0110d6a34d7831d78f66e8abf7eaf0c5fad 100644
--- a/indra/llwindow/llwindowmacosx-objc.h
+++ b/indra/llwindow/llwindowmacosx-objc.h
@@ -131,7 +131,7 @@ void setupInputWindow(NSWindowRef window, GLViewRef view);
 // These are all implemented in llwindowmacosx.cpp.
 // This is largely for easier interop between Obj-C and C++ (at least in the viewer's case due to the BOOL vs. BOOL conflict)
 bool callKeyUp(NSKeyEventRef event, unsigned short key, unsigned int mask);
-bool callKeyDown(NSKeyEventRef event, unsigned short key, unsigned int mask);
+bool callKeyDown(NSKeyEventRef event, unsigned short key, unsigned int mask, wchar_t character);
 void callResetKeys();
 bool callUnicodeCallback(wchar_t character, unsigned int mask);
 void callRightMouseDown(float *pos, unsigned int mask);
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index 0d0607a0bb1e195fa3e651575f3a35ef8abb122f..dfdfe4aa3350dbd4acd571cb6d10169e681d22e4 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -208,8 +208,17 @@ bool callKeyUp(NSKeyEventRef event, unsigned short key, unsigned int mask)
     return retVal;
 }
 
-bool callKeyDown(NSKeyEventRef event, unsigned short key, unsigned int mask)
+bool callKeyDown(NSKeyEventRef event, unsigned short key, unsigned int mask, wchar_t character)
 {
+    if((key == gKeyboard->inverseTranslateKey('Z')) && (character == 'y'))
+    {
+        key = gKeyboard->inverseTranslateKey('Y');
+    }
+    else if ((key == gKeyboard->inverseTranslateKey('Y')) && (character == 'z'))
+    {
+        key = gKeyboard->inverseTranslateKey('Z');
+    }
+
     mRawKeyEvent = event;
 	bool retVal = gKeyboard->handleKeyDown(key, mask);
     mRawKeyEvent = NULL;
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 5bbf1a7b4475e7871561886bf65056db5db5f52a..eeb7e6f0aabeb4c88db6966e2e5595c9d668d035 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1584,10 +1584,11 @@
       <key>Value</key>
       <real>1.0</real>
     </map>
-    <key>CameraPreset</key>  <!-- deprecated (see SL-12429) -->
+    <key>CameraPreset</key>
+    <!-- deprecated (see SL-12429) -->
     <map>
       <key>Comment</key>
-      <string>Preset camera position - view (0 - rear, 1 - front, 2 - group)</string>
+      <string>(Deprecated) Preset camera position - view (0 - rear, 1 - front, 2 - group)</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -2494,10 +2495,11 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
-    <key>DEPRECATED: DebugShowPrivateMem</key>  <!-- deprecated (see MAINT-8091) -->
+    <key>DebugShowPrivateMem</key>
+    <!-- deprecated (see MAINT-8091) -->
     <map>
       <key>Comment</key>
-      <string>Show Private Mem Info</string>
+      <string>(Deprecated) Show Private Mem Info</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -5808,7 +5810,7 @@
   <key>LoginSRVPump</key>
   <map>
     <key>Comment</key>
-    <string>Name of the message pump that handles SRV request (deprecated)</string>
+    <string>(Deprecated) Name of the message pump that handles SRV request)</string>
     <key>Persist</key>
     <integer>0</integer>
     <key>Type</key>
@@ -6619,10 +6621,11 @@
         <key>Value</key>
             <real>600.0</real>
         </map>
-    <key>MemoryPrivatePoolEnabled</key>  <!-- deprecated (see MAINT-8091) -->
+    <key>MemoryPrivatePoolEnabled</key>
+    <!-- deprecated (see MAINT-8091) -->
     <map>
       <key>Comment</key>
-      <string>DEPRECATED: Enable the private memory pool management</string>
+      <string>(Deprecated) Enable the private memory pool management</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -6630,10 +6633,11 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
-    <key>MemoryPrivatePoolSize</key>  <!-- deprecated (see MAINT-8091) -->
+    <key>MemoryPrivatePoolSize</key>
+    <!-- deprecated (see MAINT-8091) -->
     <map>
       <key>Comment</key>
-      <string>DEPRECATED: Size of the private memory pool in MB (min. value is 256)</string>
+      <string>(Deprecated) Size of the private memory pool in MB (min. value is 256)</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -8326,7 +8330,7 @@
     <key>QAModeEventHostPort</key>
     <map>
       <key>Comment</key>
-      <string>DEPRECATED: Port on which lleventhost should listen</string>
+      <string>(Deprecated) Port on which lleventhost should listen</string>
       <key>Persist</key>
       <integer>0</integer>
       <key>Type</key>
@@ -14071,10 +14075,11 @@
       <key>Value</key>
       <string>Default</string>
     </map>
-    <key>UseExternalBrowser</key> <!-- deprecated (see MAINT-4127) -->
+    <key>UseExternalBrowser</key>
+    <!-- deprecated (see MAINT-4127) -->
     <map>
       <key>Comment</key>
-      <string>Use default browser when opening web pages instead of in-world browser.</string>
+      <string>(Deprecated) Use default browser when opening web pages instead of in-world browser.</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -14480,6 +14485,7 @@
     <integer>0</integer>
   </map>
   <key>VoiceCallsFriendsOnly</key>
+  <!-- deprecated (see SL-12871) -->
     <map>
       <key>Comment</key>
       <string>(Deprecated) Only accept voice calls from residents on your friends list</string>
diff --git a/indra/newview/llappcorehttp.cpp b/indra/newview/llappcorehttp.cpp
index 3da87e657c2a6a90f8ca9c6b36106f93a5c0e603..ef56478106532885bdf1c9fdc5ed88197a31c5f5 100644
--- a/indra/newview/llappcorehttp.cpp
+++ b/indra/newview/llappcorehttp.cpp
@@ -271,20 +271,13 @@ void LLAppCoreHttp::init()
 						<< LL_ENDL;
 	}
 
-	// Signal for global pipelining preference from settings
+	// Global pipelining setting
 	static const std::string http_pipelining("HttpPipelining");
 	if (gSavedSettings.controlExists(http_pipelining))
 	{
-		LLPointer<LLControlVariable> cntrl_ptr = gSavedSettings.getControl(http_pipelining);
-		if (cntrl_ptr.isNull())
-		{
-			LL_WARNS("Init") << "Unable to set signal on global setting '" << http_pipelining
-							 << "'" << LL_ENDL;
-		}
-		else
-		{
-			mPipelinedSignal = cntrl_ptr->getCommitSignal()->connect(boost::bind(&setting_changed));
-		}
+		// Default to true (in ctor) if absent.
+		mPipelined = gSavedSettings.getBOOL(http_pipelining);
+		LL_INFOS("Init") << "HTTP Pipelining " << (mPipelined ? "enabled" : "disabled") << "!" << LL_ENDL;
 	}
 
 	// Register signals for settings and state changes
@@ -398,21 +391,6 @@ void LLAppCoreHttp::refreshSettings(bool initial)
 {
 	LLCore::HttpStatus status;
 
-	// Global pipelining setting
-	bool pipeline_changed(false);
-	static const std::string http_pipelining("HttpPipelining");
-	if (gSavedSettings.controlExists(http_pipelining))
-	{
-		// Default to true (in ctor) if absent.
-		bool pipelined(gSavedSettings.getBOOL(http_pipelining));
-		if (pipelined != mPipelined)
-		{
-			mPipelined = pipelined;
-			pipeline_changed = true;
-		}
-        LL_INFOS("Init") << "HTTP Pipelining " << (mPipelined ? "enabled" : "disabled") << "!" << LL_ENDL;
-	}
-	
 	for (int i(0); i < LL_ARRAY_SIZE(init_data); ++i)
 	{
 		const EAppPolicy app_policy(static_cast<EAppPolicy>(i));
@@ -441,7 +419,7 @@ void LLAppCoreHttp::refreshSettings(bool initial)
 		// Init- or run-time settings.  Must use the queued request API.
 
 		// Pipelining changes
-		if (initial || pipeline_changed)
+		if (initial)
 		{
 			const bool to_pipeline(mPipelined && init_data[i].mPipelined);
 			if (to_pipeline != mHttpClasses[app_policy].mPipelined)
@@ -484,7 +462,7 @@ void LLAppCoreHttp::refreshSettings(bool initial)
 			}
 		}
 
-		if (initial || setting != mHttpClasses[app_policy].mConnLimit || pipeline_changed)
+		if (initial || setting != mHttpClasses[app_policy].mConnLimit)
 		{
 			// Set it and report.  Strategies depend on pipelining:
 			//
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index fd712ea5d0127c8e82e67c0aea16c968ea084ecf..39c9fa1bca4ab4d240743fd258ddfcfc7a5b7694 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -2347,6 +2347,52 @@ void LLAppearanceMgr::enforceCOFItemRestrictions(LLPointer<LLInventoryCallback>
 	}
 }
 
+bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInventoryItem* item2)
+{
+	if (!item1 || !item2)
+	{
+		LL_WARNS() << "item1, item2 cannot be null, something is very wrong" << LL_ENDL;
+		return true;
+	}
+
+	return item1->getLinkedUUID() < item2->getLinkedUUID();
+}
+
+void get_sorted_base_and_cof_items(LLInventoryModel::item_array_t& cof_item_array, LLInventoryModel::item_array_t& outfit_item_array)
+{
+	LLUUID base_outfit_id = LLAppearanceMgr::instance().getBaseOutfitUUID();
+
+	if (base_outfit_id.notNull())
+	{
+		LLIsValidItemLink collector;
+		LLInventoryModel::cat_array_t sub_cat_array;
+
+		gInventory.collectDescendents(base_outfit_id,
+			sub_cat_array,
+			outfit_item_array,
+			LLInventoryModel::EXCLUDE_TRASH);
+
+		LLInventoryModel::cat_array_t cof_cats;
+
+		gInventory.collectDescendentsIf(LLAppearanceMgr::instance().getCOF(), cof_cats, cof_item_array,
+			LLInventoryModel::EXCLUDE_TRASH, collector);
+
+		for (U32 i = 0; i < outfit_item_array.size(); ++i)
+		{
+			LLViewerInventoryItem* linked_item = outfit_item_array.at(i)->getLinkedItem();
+			if (linked_item != NULL && linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+			{
+				outfit_item_array.erase(outfit_item_array.begin() + i);
+				break;
+			}
+		}
+
+		std::sort(cof_item_array.begin(), cof_item_array.end(), sort_by_linked_uuid);
+		std::sort(outfit_item_array.begin(), outfit_item_array.end(), sort_by_linked_uuid);
+	}
+}
+
+
 void LLAppearanceMgr::updateAppearanceFromCOF(bool enforce_item_restrictions,
 											  bool enforce_ordering,
 											  nullary_func_t post_update_func)
@@ -2388,7 +2434,30 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool enforce_item_restrictions,
 
 	if (!validateClothingOrderingInfo())
 	{
-		LL_WARNS() << "Clothing ordering error" << LL_ENDL;
+			
+		LLInventoryModel::item_array_t outfit_item_array;
+		LLInventoryModel::item_array_t cof_item_array;
+		get_sorted_base_and_cof_items(cof_item_array, outfit_item_array);
+
+		if (outfit_item_array.size() == cof_item_array.size())
+		{
+			for (U32 i = 0; i < cof_item_array.size(); ++i)
+			{
+				LLViewerInventoryItem *cof_it = cof_item_array.at(i);
+				LLViewerInventoryItem *base_it = outfit_item_array.at(i);
+
+				if (cof_it->getActualDescription() != base_it->getActualDescription())
+				{
+					if (cof_it->getLinkedUUID() == base_it->getLinkedUUID())
+					{
+						cof_it->setDescription(base_it->getActualDescription());
+						gInventory.updateItem(cof_it);
+					}
+				}
+			}
+			LLAppearanceMgr::getInstance()->updateIsDirty();
+		}
+
 	}
 
 	BoolSetter setIsInUpdateAppearanceFromCOF(mIsInUpdateAppearanceFromCOF);
@@ -3017,17 +3086,6 @@ void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type, LLPointer
 	}
 }
 
-bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInventoryItem* item2)
-{
-	if (!item1 || !item2)
-	{
-		LL_WARNS() << "item1, item2 cannot be null, something is very wrong" << LL_ENDL;
-		return true;
-	}
-
-	return item1->getLinkedUUID() < item2->getLinkedUUID();
-}
-
 void LLAppearanceMgr::updateIsDirty()
 {
 	LLUUID cof = getCOF();
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 8a55a848db426bb2ffd4a14f63907a7e81024375..a5265a392f86166226e51813e798bf74a75adb22 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -276,7 +276,7 @@ class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr>
 	
 	LLUUID mCOFImageID;
 
-	std::auto_ptr<LLOutfitUnLockTimer> mUnlockOutfitTimer;
+	std::unique_ptr<LLOutfitUnLockTimer> mUnlockOutfitTimer;
 
 	// Set of temp attachment UUIDs that should be removed
 	typedef std::set<LLUUID> doomed_temp_attachments_t;
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 2cc8375541632f1a7bd35998ffde321c6f319e3c..1c67cc97057f9455cc8035a4e6be69d39834b516 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1108,19 +1108,27 @@ bool LLAppViewer::init()
             if (count > 0 && v1 <= 10)
             {
                 LL_INFOS("AppInit") << "Detected obsolete intel driver: " << driver << LL_ENDL;
-                LLUIString details = LLNotifications::instance().getGlobalString("UnsupportedIntelDriver");
-                std::string gpu_name = ll_safe_string((const char *)glGetString(GL_RENDERER));
-                details.setArg("[VERSION]", driver);
-                details.setArg("[GPUNAME]", gpu_name);
-                S32 button = OSMessageBox(details.getString(),
-                                          LLStringUtil::null,
-                                          OSMB_YESNO);
-                if (OSBTN_YES == button && gViewerWindow)
+
+                if (!gViewerWindow->getInitAlert().empty() // graphic initialization crashed on last run
+                    || LLVersionInfo::getInstance()->getChannelAndVersion() != gLastRunVersion // viewer was updated
+                    || mNumSessions % 20 == 0 //periodically remind user to update driver
+                    )
                 {
-                    std::string url = LLWeb::escapeURL(LLTrans::getString("IntelDriverPage"));
-                    if (gViewerWindow->getWindow())
+                    LLUIString details = LLNotifications::instance().getGlobalString("UnsupportedIntelDriver");
+                    std::string gpu_name = ll_safe_string((const char *)glGetString(GL_RENDERER));
+                    LL_INFOS("AppInit") << "Notifying user about obsolete intel driver for " << gpu_name << LL_ENDL;
+                    details.setArg("[VERSION]", driver);
+                    details.setArg("[GPUNAME]", gpu_name);
+                    S32 button = OSMessageBox(details.getString(),
+                        LLStringUtil::null,
+                        OSMB_YESNO);
+                    if (OSBTN_YES == button && gViewerWindow)
                     {
-                        gViewerWindow->getWindow()->spawnWebBrowser(url, false);
+                        std::string url = LLWeb::escapeURL(LLTrans::getString("IntelDriverPage"));
+                        if (gViewerWindow->getWindow())
+                        {
+                            gViewerWindow->getWindow()->spawnWebBrowser(url, false);
+                        }
                     }
                 }
             }
@@ -3114,6 +3122,15 @@ bool LLAppViewer::initWindow()
 
 void LLAppViewer::writeDebugInfo(bool isStatic)
 {
+#if LL_WINDOWS && LL_BUGSPLAT
+    // bugsplat does not create dump folder and debug logs are written directly
+    // to logs folder, so it conflicts with main instance
+    if (mSecondInstance)
+    {
+        return;
+    }
+#endif
+
     //Try to do the minimum when writing data during a crash.
     std::string* debug_filename;
     debug_filename = ( isStatic
@@ -3442,7 +3459,7 @@ void LLAppViewer::writeSystemInfo()
     if (! gDebugInfo.has("Dynamic") )
         gDebugInfo["Dynamic"] = LLSD::emptyMap();
 
-#if LL_WINDOWS
+#if LL_WINDOWS && !LL_BUGSPLAT
 	gDebugInfo["SLLog"] = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,"SecondLife.log");
 #else
     //Not ideal but sufficient for good reporting.
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index d4b3a4a7323a2f6ffce56d8fa52f20694491c202..1896248502c6f3cb28080c20ef546853f7b5a2b1 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -118,16 +118,20 @@ namespace
     {
         if (nCode == MDSCB_EXCEPTIONCODE)
         {
-            // send the main viewer log file
-            // widen to wstring, convert to __wchar_t, then pass c_str()
-            sBugSplatSender->sendAdditionalFile(
-                WCSTR(LLError::logFileName()));
+            // second instance does not have own log files
+            if (!LLAppViewer::instance()->isSecondInstance())
+            {
+                // send the main viewer log file
+                // widen to wstring, convert to __wchar_t, then pass c_str()
+                sBugSplatSender->sendAdditionalFile(
+                    WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife.log")));
 
-            sBugSplatSender->sendAdditionalFile(
-                WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "settings.xml")));
+                sBugSplatSender->sendAdditionalFile(
+                    WCSTR(*LLAppViewer::instance()->getStaticDebugFile()));
+            }
 
             sBugSplatSender->sendAdditionalFile(
-                WCSTR(*LLAppViewer::instance()->getStaticDebugFile()));
+                WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "settings.xml")));
 
             // We don't have an email address for any user. Hijack this
             // metadata field for the platform identifier.
diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp
index 8881d118023c2efac9f2c77d896fe628a5cf219e..cc2b1cc42cda139aca739f1fad3d20f5cfa770d1 100644
--- a/indra/newview/llenvironment.cpp
+++ b/indra/newview/llenvironment.cpp
@@ -2079,7 +2079,15 @@ void LLEnvironment::coroUpdateEnvironment(S32 parcel_id, S32 track_no, UpdateInf
         LL_WARNS("ENVIRONMENT") << "Couldn't update Windlight settings for " << ((parcel_id == INVALID_PARCEL_ID) ? ("region!") : ("parcel!")) << LL_ENDL;
 
         notify = LLSD::emptyMap();
-        notify["FAIL_REASON"] = result["message"].asString();
+        std::string reason = result["message"].asString();
+        if (reason.empty())
+        {
+            notify["FAIL_REASON"] = status.toString();
+        }
+        else
+        {
+            notify["FAIL_REASON"] = reason;
+        }
     }
     else if (LLApp::isExiting())
     {
@@ -2145,7 +2153,15 @@ void LLEnvironment::coroResetEnvironment(S32 parcel_id, S32 track_no, environmen
         LL_WARNS("ENVIRONMENT") << "Couldn't reset Windlight settings in " << ((parcel_id == INVALID_PARCEL_ID) ? ("region!") : ("parcel!")) << LL_ENDL;
 
         notify = LLSD::emptyMap();
-        notify["FAIL_REASON"] = result["message"].asString();
+        std::string reason = result["message"].asString();
+        if (reason.empty())
+        {
+            notify["FAIL_REASON"] = status.toString();
+        }
+        else
+        {
+            notify["FAIL_REASON"] = reason;
+        }
     }
     else if (LLApp::isExiting())
     {
diff --git a/indra/newview/llexperiencelog.cpp b/indra/newview/llexperiencelog.cpp
index ee5d56192776fc818cda6fe505688beca82a92ff..c441fbc09fbdf01d40a5c852b136a028f1e31346 100644
--- a/indra/newview/llexperiencelog.cpp
+++ b/indra/newview/llexperiencelog.cpp
@@ -149,10 +149,6 @@ std::string LLExperienceLog::getPermissionString( const LLSD& message, const std
 		{
 			buf.str(entry);
 		}
-		else
-		{
-			buf.str();
-		}
 	}
 
 	if(buf.str().empty())
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index cca6b9ce32bf00af74d47f50d4178330a04448f2..a7147c3f046fccdc22213714504aae808ae60f40 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -841,7 +841,7 @@ void LLFavoritesBarCtrl::updateButtons(bool force_update)
 		{
 			//find last visible child to get the rightest button offset
 			child_list_const_reverse_iter_t last_visible_it = std::find_if(childs->rbegin(), childs->rend(), 
-					std::mem_fun(&LLView::getVisible));
+					[](child_list_t::value_type child){ return child->getVisible(); });
 			if(last_visible_it != childs->rend())
 			{
 				last_right_edge = (*last_visible_it)->getRect().mRight;
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 0a0e5ffc0619e96779b64b7eaa0cc691616e07c5..464e7ff4a23118d32773bd3118e0619f4cd710d4 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -996,7 +996,8 @@ void LLFloaterBuyLandUI::draw()
 // virtual
 BOOL LLFloaterBuyLandUI::canClose()
 {
-	bool can_close = (mTransaction ? FALSE : TRUE) && mCurrency.canCancel();
+	// mTransactionType check for pre-buy estimation stage and mCurrency to allow exit after transaction
+	bool can_close = !mTransaction && (mTransactionType != TransactionBuy || mCurrency.canCancel());
 	if (!can_close)
 	{
 		// explain to user why they can't do this, see DEV-9605
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 17e55b5f2ca0125f0f935d11bc385e1dd2113f14..a10ba7a39dd8be262bdfb6b35ce927e1fb5e545e 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -659,9 +659,7 @@ void LLFloaterRegionInfo::refreshFromRegion(LLViewerRegion* region)
 	std::for_each(
 		mInfoPanels.begin(),
 		mInfoPanels.end(),
-		llbind2nd(
-			std::mem_fun(&LLPanelRegionInfo::refreshFromRegion),
-			region));
+		[region](info_panels_t::value_type panel){ panel->refreshFromRegion(region); });
     mEnvironmentPanel->refreshFromRegion(region);
 }
 
diff --git a/indra/newview/llfloaterwindowsize.cpp b/indra/newview/llfloaterwindowsize.cpp
index ec161018b843a1933aeb8f61bda2729a60253b11..863b7cbb1237a9e5fc127c8b7b81eee1007e440c 100644
--- a/indra/newview/llfloaterwindowsize.cpp
+++ b/indra/newview/llfloaterwindowsize.cpp
@@ -34,18 +34,16 @@
 #include "llcombobox.h"
 #include "llfloater.h"
 #include "llfloaterreg.h"
+#include "llregex.h"
 #include "lluictrl.h"
 
-// System libraries
-#include <boost/regex.hpp>
-
 // Extract from strings of the form "<width> x <height>", e.g. "640 x 480".
 bool extractWindowSizeFromString(const std::string& instr, U32 *width, U32 *height)
 {
 	boost::cmatch what;
 	// matches (any number)(any non-number)(any number)
 	const boost::regex expression("([0-9]+)[^0-9]+([0-9]+)");
-	if (boost::regex_match(instr.c_str(), what, expression))
+	if (ll_regex_match(instr.c_str(), what, expression))
 	{
 		*width = atoi(what[1].first);
 		*height = atoi(what[2].first);
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 950a6cfaef5b053b630bd70f9126baf8cfdcde4f..eb0e77311b99cd571737fc10f251d53d11b311c5 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -752,7 +752,7 @@ S32 LLGestureMgr::getPlayingCount() const
 }
 
 
-struct IsGesturePlaying : public std::unary_function<LLMultiGesture*, bool>
+struct IsGesturePlaying
 {
 	bool operator()(const LLMultiGesture* gesture) const
 	{
diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index 1e43e4ea3a9abaa6452dd015c1968e19b3836da3..0524313a5cc678f2babda97e72b6e0ee0d1b45a6 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -42,6 +42,7 @@
 #include "llnotificationsutil.h"
 #include "llnotificationmanager.h"
 #include "llpanelgroup.h"
+#include "llregex.h"
 #include "llregionhandle.h"
 #include "llsdserialize.h"
 #include "llslurl.h"
@@ -55,7 +56,6 @@
 #include "llviewerregion.h"
 #include "llvoavatarself.h"
 
-#include <boost/regex.hpp>
 #include "boost/lexical_cast.hpp"
 #if LL_MSVC
 // disable boost::lexical_cast warning
@@ -122,7 +122,7 @@ static std::string clean_name_from_task_im(const std::string& msg,
     boost::smatch match;
     static const boost::regex returned_exp(
         "(.*been returned to your inventory lost and found folder by )(.+)( (from|near).*)");
-    if (boost::regex_match(msg, match, returned_exp))
+    if (ll_regex_match(msg, match, returned_exp))
     {
         // match objects are 1-based for groups
         std::string final = match[1].str();
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 411311bbea82b8f6ef94f29c840c4eb64e1f7fec..3b5ba24b9f7cbd6a33ae5de8e1072bc05e00ce51 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -36,13 +36,14 @@
 #include "llinventorymodelbackgroundfetch.h"
 #include "llinventoryfunctions.h"
 #include "llmarketplacefunctions.h"
+#include "llregex.h"
 #include "llviewercontrol.h"
 #include "llfolderview.h"
 #include "llinventorybridge.h"
 #include "llviewerfoldertype.h"
 #include "llradiogroup.h"
 #include "llstartup.h"
-#include <boost/regex.hpp>
+
 // linden library includes
 #include "llclipboard.h"
 #include "lltrans.h"
@@ -879,7 +880,7 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)
 			boost::regex mPattern = boost::regex("\"\\s*([^<]*)?\\s*\"",
 				boost::regex::perl | boost::regex::icase);
 			boost::match_results<std::string::const_iterator> matches;
-			mExactToken = (boost::regex_match(filter_sub_string_new, matches, mPattern) && matches[1].matched)
+			mExactToken = (ll_regex_match(filter_sub_string_new, matches, mPattern) && matches[1].matched)
 				? matches[1]
 				: LLStringUtil::null;
 			if ((old_token.empty() && !mExactToken.empty()) 
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 28db6a58084dee8de33250f8087e22c9c78d9bf3..ba453471c6da0650879974b66846a38cc92625f1 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -487,7 +487,8 @@ const LLUUID LLInventoryModel::findCategoryUUIDForTypeInRoot(
 			S32 count = cats->size();
 			for(S32 i = 0; i < count; ++i)
 			{
-				if(cats->at(i)->getPreferredType() == preferred_type)
+				LLViewerInventoryCategory* p_cat = cats->at(i);
+				if(p_cat && p_cat->getPreferredType() == preferred_type)
 				{
 					const LLUUID& folder_id = cats->at(i)->getUUID();
 					if (rv.isNull() || folder_id < rv)
@@ -1659,9 +1660,18 @@ void LLInventoryModel::notifyObservers()
 		iter = mObservers.upper_bound(observer); 
 	}
 
-	mModifyMask = LLInventoryObserver::NONE;
+	// If there were any changes that arrived during notifyObservers,
+	// shedule them for next loop
+	mModifyMask = mModifyMaskBacklog;
 	mChangedItemIDs.clear();
+	mChangedItemIDs.insert(mChangedItemIDsBacklog.begin(), mChangedItemIDsBacklog.end());
 	mAddedItemIDs.clear();
+	mAddedItemIDs.insert(mAddedItemIDsBacklog.begin(), mAddedItemIDsBacklog.end());
+
+	mModifyMaskBacklog = LLInventoryObserver::NONE;
+	mChangedItemIDsBacklog.clear();
+	mAddedItemIDsBacklog.clear();
+
 	mIsNotifyObservers = FALSE;
 }
 
@@ -1673,8 +1683,10 @@ void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent)
 	{
 		// Something marked an item for change within a call to notifyObservers
 		// (which is in the process of processing the list of items marked for change).
-		// This means the change may fail to be processed.
-		LL_WARNS(LOG_INV) << "Adding changed mask within notify observers!  Change will likely be lost." << LL_ENDL;
+		// This means the change will have to be processed later.
+		// It's preferable for this not to happen, but it's not an issue unless code
+		// specifically wants to notifyObservers immediately (changes won't happen untill later)
+		LL_WARNS(LOG_INV) << "Adding changed mask within notify observers! Change's processing will be performed on idle." << LL_ENDL;
 		LLViewerInventoryItem *item = getItem(referent);
 		if (item)
 		{
@@ -1689,17 +1701,40 @@ void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent)
 			}
 		}
 	}
-	
-	mModifyMask |= mask;
+
+    if (mIsNotifyObservers)
+    {
+        mModifyMaskBacklog |= mask;
+    }
+    else
+    {
+        mModifyMask |= mask;
+    }
+
 	if (referent.notNull() && (mChangedItemIDs.find(referent) == mChangedItemIDs.end()))
 	{
-		mChangedItemIDs.insert(referent);
+        if (mIsNotifyObservers)
+        {
+            mChangedItemIDsBacklog.insert(referent);
+        }
+        else
+        {
+            mChangedItemIDs.insert(referent);
+        }
+
         update_marketplace_category(referent, false);
 
-		if (mask & LLInventoryObserver::ADD)
-		{
-			mAddedItemIDs.insert(referent);
-		}
+        if (mask & LLInventoryObserver::ADD)
+        {
+            if (mIsNotifyObservers)
+            {
+                mAddedItemIDsBacklog.insert(referent);
+            }
+            else
+            {
+                mAddedItemIDs.insert(referent);
+            }
+        }
 	
 		// Update all linked items.  Starting with just LABEL because I'm
 		// not sure what else might need to be accounted for this.
@@ -2660,7 +2695,10 @@ void LLInventoryModel::createCommonSystemCategories()
 	gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true);
 	gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD,true);
 	gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS,true);
+	gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, true);
+	gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, true); // folder should exist before user tries to 'landmark this'
     gInventory.findCategoryUUIDForType(LLFolderType::FT_SETTINGS, true);
+    gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, true);
 }
 
 struct LLUUIDAndName
@@ -3705,17 +3743,18 @@ void LLInventoryModel::dumpInventory() const
 // returning an overall good/bad flag.
 bool LLInventoryModel::validate() const
 {
-	bool valid = true;
+    const S32 MAX_VERBOSE_ERRORS = 40; // too many errors can cause disconect or freeze
+    S32 error_count = 0;
 
 	if (getRootFolderID().isNull())
 	{
 		LL_WARNS() << "no root folder id" << LL_ENDL;
-		valid = false;
+        error_count++;
 	}
 	if (getLibraryRootFolderID().isNull())
 	{
 		LL_WARNS() << "no root folder id" << LL_ENDL;
-		valid = false;
+        error_count++;
 	}
 
 	if (mCategoryMap.size() + 1 != mParentChildCategoryTree.size())
@@ -3723,7 +3762,7 @@ bool LLInventoryModel::validate() const
 		// ParentChild should be one larger because of the special entry for null uuid.
 		LL_INFOS() << "unexpected sizes: cat map size " << mCategoryMap.size()
 				<< " parent/child " << mParentChildCategoryTree.size() << LL_ENDL;
-		valid = false;
+        error_count++;
 	}
 	S32 cat_lock = 0;
 	S32 item_lock = 0;
@@ -3735,23 +3774,32 @@ bool LLInventoryModel::validate() const
 		const LLViewerInventoryCategory *cat = cit->second;
 		if (!cat)
 		{
-			LL_WARNS() << "invalid cat" << LL_ENDL;
-			valid = false;
+            if (error_count < MAX_VERBOSE_ERRORS)
+            {
+                LL_WARNS() << "invalid cat" << LL_ENDL;
+            }
+            error_count++;
 			continue;
 		}
 		if (cat_id != cat->getUUID())
 		{
-			LL_WARNS() << "cat id/index mismatch " << cat_id << " " << cat->getUUID() << LL_ENDL;
-			valid = false;
+            if (error_count < MAX_VERBOSE_ERRORS)
+            {
+                LL_WARNS() << "cat id/index mismatch " << cat_id << " " << cat->getUUID() << LL_ENDL;
+            }
+            error_count++;
 		}
 
 		if (cat->getParentUUID().isNull())
 		{
 			if (cat_id != getRootFolderID() && cat_id != getLibraryRootFolderID())
 			{
-				LL_WARNS() << "cat " << cat_id << " has no parent, but is not root ("
-						<< getRootFolderID() << ") or library root ("
-						<< getLibraryRootFolderID() << ")" << LL_ENDL;
+                if (error_count < MAX_VERBOSE_ERRORS)
+                {
+                    LL_WARNS() << "cat " << cat_id << " has no parent, but is not root ("
+                        << getRootFolderID() << ") or library root ("
+                        << getLibraryRootFolderID() << ")" << LL_ENDL;
+                }
 			}
 		}
 		cat_array_t* cats;
@@ -3759,8 +3807,11 @@ bool LLInventoryModel::validate() const
 		getDirectDescendentsOf(cat_id,cats,items);
 		if (!cats || !items)
 		{
-			LL_WARNS() << "invalid direct descendents for " << cat_id << LL_ENDL;
-			valid = false;
+            if (error_count < MAX_VERBOSE_ERRORS)
+            {
+                LL_WARNS() << "invalid direct descendents for " << cat_id << LL_ENDL;
+            }
+            error_count++;
 			continue;
 		}
 		if (cat->getDescendentCount() == LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN)
@@ -3769,12 +3820,15 @@ bool LLInventoryModel::validate() const
 		}
 		else if (cats->size() + items->size() != cat->getDescendentCount())
 		{
-			LL_WARNS() << "invalid desc count for " << cat_id << " name [" << cat->getName()
-					<< "] parent " << cat->getParentUUID()
-					<< " cached " << cat->getDescendentCount()
-					<< " expected " << cats->size() << "+" << items->size()
-					<< "=" << cats->size() +items->size() << LL_ENDL;
-			valid = false;
+            if (error_count < MAX_VERBOSE_ERRORS)
+            {
+                LL_WARNS() << "invalid desc count for " << cat_id << " name [" << cat->getName()
+                    << "] parent " << cat->getParentUUID()
+                    << " cached " << cat->getDescendentCount()
+                    << " expected " << cats->size() << "+" << items->size()
+                    << "=" << cats->size() + items->size() << LL_ENDL;
+            }
+            error_count++;
 		}
 		if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
 		{
@@ -3794,8 +3848,11 @@ bool LLInventoryModel::validate() const
 
 			if (!item)
 			{
-				LL_WARNS() << "null item at index " << i << " for cat " << cat_id << LL_ENDL;
-				valid = false;
+                if (error_count < MAX_VERBOSE_ERRORS)
+                {
+                    LL_WARNS() << "null item at index " << i << " for cat " << cat_id << LL_ENDL;
+                }
+                error_count++;
 				continue;
 			}
 
@@ -3803,10 +3860,13 @@ bool LLInventoryModel::validate() const
 			
 			if (item->getParentUUID() != cat_id)
 			{
-				LL_WARNS() << "wrong parent for " << item_id << " found "
-						<< item->getParentUUID() << " expected " << cat_id
-						<< LL_ENDL;
-				valid = false;
+                if (error_count < MAX_VERBOSE_ERRORS)
+                {
+                    LL_WARNS() << "wrong parent for " << item_id << " found "
+                        << item->getParentUUID() << " expected " << cat_id
+                        << LL_ENDL;
+                }
+                error_count++;
 			}
 
 
@@ -3814,17 +3874,24 @@ bool LLInventoryModel::validate() const
 			item_map_t::const_iterator it = mItemMap.find(item_id);
 			if (it == mItemMap.end())
 			{
-				LL_WARNS() << "item " << item_id << " found as child of "
-						<< cat_id << " but not in top level mItemMap" << LL_ENDL;
-				valid = false;
+
+                if (error_count < MAX_VERBOSE_ERRORS)
+                {
+                    LL_WARNS() << "item " << item_id << " found as child of "
+                        << cat_id << " but not in top level mItemMap" << LL_ENDL;
+                }
+                error_count++;
 			}
 			else
 			{
 				LLViewerInventoryItem *top_item = it->second;
 				if (top_item != item)
 				{
-					LL_WARNS() << "item mismatch, item_id " << item_id
-							<< " top level entry is different, uuid " << top_item->getUUID() << LL_ENDL;
+                    if (error_count < MAX_VERBOSE_ERRORS)
+                    {
+                        LL_WARNS() << "item mismatch, item_id " << item_id
+                            << " top level entry is different, uuid " << top_item->getUUID() << LL_ENDL;
+                    }
 				}
 			}
 
@@ -3833,19 +3900,25 @@ bool LLInventoryModel::validate() const
 			bool found = getObjectTopmostAncestor(item_id, topmost_ancestor_id);
 			if (!found)
 			{
-				LL_WARNS() << "unable to find topmost ancestor for " << item_id << LL_ENDL;
-				valid = false;
+                if (error_count < MAX_VERBOSE_ERRORS)
+                {
+                    LL_WARNS() << "unable to find topmost ancestor for " << item_id << LL_ENDL;
+                }
+                error_count++;
 			}
 			else
 			{
 				if (topmost_ancestor_id != getRootFolderID() &&
 					topmost_ancestor_id != getLibraryRootFolderID())
 				{
-					LL_WARNS() << "unrecognized top level ancestor for " << item_id
-							<< " got " << topmost_ancestor_id
-							<< " expected " << getRootFolderID()
-							<< " or " << getLibraryRootFolderID() << LL_ENDL;
-					valid = false;
+                    if (error_count < MAX_VERBOSE_ERRORS)
+                    {
+                        LL_WARNS() << "unrecognized top level ancestor for " << item_id
+                            << " got " << topmost_ancestor_id
+                            << " expected " << getRootFolderID()
+                            << " or " << getLibraryRootFolderID() << LL_ENDL;
+                    }
+                    error_count++;
 				}
 			}
 		}
@@ -3859,9 +3932,12 @@ bool LLInventoryModel::validate() const
 			getDirectDescendentsOf(parent_id,cats,items);
 			if (!cats)
 			{
-				LL_WARNS() << "cat " << cat_id << " name [" << cat->getName()
-						<< "] orphaned - no child cat array for alleged parent " << parent_id << LL_ENDL;
-				valid = false;
+                if (error_count < MAX_VERBOSE_ERRORS)
+                {
+                    LL_WARNS() << "cat " << cat_id << " name [" << cat->getName()
+                        << "] orphaned - no child cat array for alleged parent " << parent_id << LL_ENDL;
+                }
+                error_count++;
 			}
 			else
 			{
@@ -3877,8 +3953,11 @@ bool LLInventoryModel::validate() const
 				}
 				if (!found)
 				{
-					LL_WARNS() << "cat " << cat_id << " name [" << cat->getName()
-							<< "] orphaned - not found in child cat array of alleged parent " << parent_id << LL_ENDL;
+                    if (error_count < MAX_VERBOSE_ERRORS)
+                    {
+                        LL_WARNS() << "cat " << cat_id << " name [" << cat->getName()
+                            << "] orphaned - not found in child cat array of alleged parent " << parent_id << LL_ENDL;
+                    }
 				}
 			}
 		}
@@ -3890,24 +3969,33 @@ bool LLInventoryModel::validate() const
 		LLViewerInventoryItem *item = iit->second;
 		if (item->getUUID() != item_id)
 		{
-			LL_WARNS() << "item_id " << item_id << " does not match " << item->getUUID() << LL_ENDL;
-			valid = false;
+            if (error_count < MAX_VERBOSE_ERRORS)
+            {
+                LL_WARNS() << "item_id " << item_id << " does not match " << item->getUUID() << LL_ENDL;
+            }
+            error_count++;
 		}
 
 		const LLUUID& parent_id = item->getParentUUID();
 		if (parent_id.isNull())
 		{
-			LL_WARNS() << "item " << item_id << " name [" << item->getName() << "] has null parent id!" << LL_ENDL;
+            if (error_count < MAX_VERBOSE_ERRORS)
+            {
+                LL_WARNS() << "item " << item_id << " name [" << item->getName() << "] has null parent id!" << LL_ENDL;
+            }
 		}
-		else
+		else if (error_count < MAX_VERBOSE_ERRORS)
 		{
 			cat_array_t* cats;
 			item_array_t* items;
 			getDirectDescendentsOf(parent_id,cats,items);
 			if (!items)
 			{
-				LL_WARNS() << "item " << item_id << " name [" << item->getName()
-						<< "] orphaned - alleged parent has no child items list " << parent_id << LL_ENDL;
+                if (error_count < MAX_VERBOSE_ERRORS)
+                {
+                    LL_WARNS() << "item " << item_id << " name [" << item->getName()
+                        << "] orphaned - alleged parent has no child items list " << parent_id << LL_ENDL;
+                }
 			}
 			else
 			{
@@ -3922,63 +4010,70 @@ bool LLInventoryModel::validate() const
 				}
 				if (!found)
 				{
-					LL_WARNS() << "item " << item_id << " name [" << item->getName()
-							<< "] orphaned - not found as child of alleged parent " << parent_id << LL_ENDL;
+                    if (error_count < MAX_VERBOSE_ERRORS)
+                    {
+                        LL_WARNS() << "item " << item_id << " name [" << item->getName()
+                            << "] orphaned - not found as child of alleged parent " << parent_id << LL_ENDL;
+                    }
 				}
 			}
 				
 		}
-		// Link checking
-		if (item->getIsLinkType())
-		{
-			const LLUUID& link_id = item->getUUID();
-			const LLUUID& target_id = item->getLinkedUUID();
-			LLViewerInventoryItem *target_item = getItem(target_id);
-			LLViewerInventoryCategory *target_cat = getCategory(target_id);
-			// Linked-to UUID should have back reference to this link.
-			if (!hasBacklinkInfo(link_id, target_id))
-			{
-				LL_WARNS() << "link " << item->getUUID() << " type " << item->getActualType()
-						<< " missing backlink info at target_id " << target_id
-						<< LL_ENDL;
-			}
-			// Links should have referents.
-			if (item->getActualType() == LLAssetType::AT_LINK && !target_item)
-			{
-				LL_WARNS() << "broken item link " << item->getName() << " id " << item->getUUID() << LL_ENDL;
-			}
-			else if (item->getActualType() == LLAssetType::AT_LINK_FOLDER && !target_cat)
-			{
-				LL_WARNS() << "broken folder link " << item->getName() << " id " << item->getUUID() << LL_ENDL;
-			}
-			if (target_item && target_item->getIsLinkType())
-			{
-				LL_WARNS() << "link " << item->getName() << " references a link item "
-						<< target_item->getName() << " " << target_item->getUUID() << LL_ENDL;
-			}
 
-			// Links should not have backlinks.
-			std::pair<backlink_mmap_t::const_iterator, backlink_mmap_t::const_iterator> range = mBacklinkMMap.equal_range(link_id);
-			if (range.first != range.second)
-			{
-				LL_WARNS() << "Link item " << item->getName() << " has backlinks!" << LL_ENDL;
-			}
-		}
-		else
-		{
-			// Check the backlinks of a non-link item.
-			const LLUUID& target_id = item->getUUID();
-			std::pair<backlink_mmap_t::const_iterator, backlink_mmap_t::const_iterator> range = mBacklinkMMap.equal_range(target_id);
-			for (backlink_mmap_t::const_iterator it = range.first; it != range.second; ++it)
-			{
-				const LLUUID& link_id = it->second;
-				LLViewerInventoryItem *link_item = getItem(link_id);
-				if (!link_item || !link_item->getIsLinkType())
-				{
-					LL_WARNS() << "invalid backlink from target " << item->getName() << " to " << link_id << LL_ENDL;
-				}
-			}
-		}
+		// Link checking
+        if (error_count < MAX_VERBOSE_ERRORS)
+        {
+            if (item->getIsLinkType())
+            {
+                const LLUUID& link_id = item->getUUID();
+                const LLUUID& target_id = item->getLinkedUUID();
+                LLViewerInventoryItem *target_item = getItem(target_id);
+                LLViewerInventoryCategory *target_cat = getCategory(target_id);
+                // Linked-to UUID should have back reference to this link.
+                if (!hasBacklinkInfo(link_id, target_id))
+                {
+                    LL_WARNS() << "link " << item->getUUID() << " type " << item->getActualType()
+                        << " missing backlink info at target_id " << target_id
+                        << LL_ENDL;
+                }
+                // Links should have referents.
+                if (item->getActualType() == LLAssetType::AT_LINK && !target_item)
+                {
+                    LL_WARNS() << "broken item link " << item->getName() << " id " << item->getUUID() << LL_ENDL;
+                }
+                else if (item->getActualType() == LLAssetType::AT_LINK_FOLDER && !target_cat)
+                {
+                    LL_WARNS() << "broken folder link " << item->getName() << " id " << item->getUUID() << LL_ENDL;
+                }
+                if (target_item && target_item->getIsLinkType())
+                {
+                    LL_WARNS() << "link " << item->getName() << " references a link item "
+                        << target_item->getName() << " " << target_item->getUUID() << LL_ENDL;
+                }
+
+                // Links should not have backlinks.
+                std::pair<backlink_mmap_t::const_iterator, backlink_mmap_t::const_iterator> range = mBacklinkMMap.equal_range(link_id);
+                if (range.first != range.second)
+                {
+                    LL_WARNS() << "Link item " << item->getName() << " has backlinks!" << LL_ENDL;
+                }
+            }
+            else
+            {
+                // Check the backlinks of a non-link item.
+                const LLUUID& target_id = item->getUUID();
+                std::pair<backlink_mmap_t::const_iterator, backlink_mmap_t::const_iterator> range = mBacklinkMMap.equal_range(target_id);
+                for (backlink_mmap_t::const_iterator it = range.first; it != range.second; ++it)
+                {
+                    const LLUUID& link_id = it->second;
+                    LLViewerInventoryItem *link_item = getItem(link_id);
+                    if (!link_item || !link_item->getIsLinkType())
+                    {
+                        LL_WARNS() << "invalid backlink from target " << item->getName() << " to " << link_id << LL_ENDL;
+                    }
+                }
+            }
+        }
 	}
 	
 	if (cat_lock > 0 || item_lock > 0)
@@ -3995,9 +4090,9 @@ bool LLInventoryModel::validate() const
 		LL_INFOS() << "Found " << version_unknown_count << " cats with unknown version" << LL_ENDL;
 	}
 
-	LL_INFOS() << "Validate done, valid = " << (U32) valid << LL_ENDL;
+	LL_INFOS() << "Validate done, found " << error_count << " errors" << LL_ENDL;
 
-	return valid;
+	return error_count == 0;
 }
 
 ///----------------------------------------------------------------------------
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index a4326aaeed9708a41e836f05f4f6798f96ed89d3..4dcd9332be2159d1eb4ff56e70f91757e335f690 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -538,6 +538,10 @@ class LLInventoryModel
 	U32 mModifyMask;
 	changed_items_t mChangedItemIDs;
 	changed_items_t mAddedItemIDs;
+    // Fallback when notifyObservers is in progress
+    U32 mModifyMaskBacklog;
+    changed_items_t mChangedItemIDsBacklog;
+    changed_items_t mAddedItemIDsBacklog;
 	
 	
 	//--------------------------------------------------------------------
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 3608f9e23f3c97d51d6cfc7f0f8c3a6f54d16008..05d9fec701cbe3ead9bc7d012b6e3e0e3eaad9ed 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -44,6 +44,7 @@
 #include "llinventoryfunctions.h"
 #include "llinventorymodelbackgroundfetch.h"
 #include "llnotificationsutil.h"
+#include "llpanelmaininventory.h"
 #include "llpreview.h"
 #include "llsidepanelinventory.h"
 #include "llstartup.h"
@@ -1614,7 +1615,7 @@ void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const L
 
 	bool in_inbox = (gInventory.isObjectDescendentOf(obj_id, gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX)));
 
-	if (main_panel && !in_inbox)
+	if (!in_inbox && (main_panel || !sidepanel_inventory->getMainInventoryPanel()->isRecentItemsPanelSelected()))
 	{
 		sidepanel_inventory->selectAllItemsPanel();
 	}
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index eebc2486a234fa0f1c4c37027c9ee63502302fd5..fb9885b454d930c13aba8ab5b93a0d2663519020 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -30,6 +30,7 @@
 #include "llagentui.h"
 #include "llavatarnamecache.h"
 #include "lllogchat.h"
+#include "llregex.h"
 #include "lltrans.h"
 #include "llviewercontrol.h"
 
@@ -40,7 +41,6 @@
 
 #include <boost/algorithm/string/trim.hpp>
 #include <boost/algorithm/string/replace.hpp>
-#include <boost/regex.hpp>
 #include <boost/regex/v4/match_results.hpp>
 #include <boost/foreach.hpp>
 
@@ -250,8 +250,8 @@ std::string LLLogChat::makeLogFileName(std::string filename)
 	 **/
 
 	boost::match_results<std::string::const_iterator> matches;
-	bool inboundConf = boost::regex_match(filename, matches, INBOUND_CONFERENCE);
-	bool outboundConf = boost::regex_match(filename, matches, OUTBOUND_CONFERENCE);
+	bool inboundConf = ll_regex_match(filename, matches, INBOUND_CONFERENCE);
+	bool outboundConf = ll_regex_match(filename, matches, OUTBOUND_CONFERENCE);
 	if (!(inboundConf || outboundConf))
 	{
 		if( gSavedPerAccountSettings.getBOOL("LogFileNamewithDate") )
@@ -837,7 +837,7 @@ bool LLLogChat::isTranscriptFileFound(std::string fullname)
 		{
 			//matching a timestamp
 			boost::match_results<std::string::const_iterator> matches;
-			if (boost::regex_match(remove_utf8_bom(buffer), matches, TIMESTAMP))
+			if (ll_regex_match(remove_utf8_bom(buffer), matches, TIMESTAMP))
 			{
 				result = true;
 			}
@@ -917,7 +917,7 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params
 
 	//matching a timestamp
 	boost::match_results<std::string::const_iterator> matches;
-	if (!boost::regex_match(raw, matches, TIMESTAMP_AND_STUFF)) return false;
+	if (!ll_regex_match(raw, matches, TIMESTAMP_AND_STUFF)) return false;
 	
 	bool has_timestamp = matches[IDX_TIMESTAMP].matched;
 	if (has_timestamp)
@@ -950,7 +950,7 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params
 	//matching a name and a text
 	std::string stuff = matches[IDX_STUFF];
 	boost::match_results<std::string::const_iterator> name_and_text;
-	if (!boost::regex_match(stuff, name_and_text, NAME_AND_TEXT)) return false;
+	if (!ll_regex_match(stuff, name_and_text, NAME_AND_TEXT)) return false;
 
 	bool has_name = name_and_text[IDX_NAME].matched;
 	std::string name = LLURI::unescape(name_and_text[IDX_NAME]);
diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp
index c7a066563016466c95ae67edc925a69136644dc3..89eb94110688d0fcc320c2dca858994a630526f4 100644
--- a/indra/newview/llmachineid.cpp
+++ b/indra/newview/llmachineid.cpp
@@ -30,7 +30,6 @@
 #if	LL_WINDOWS
 #define _WIN32_DCOM
 #include <iostream>
-using namespace std;
 #include <comdef.h>
 #include <Wbemidl.h>
 #elif LL_DARWIN
@@ -89,7 +88,7 @@ void LLWMIMethods::initCOMObjects()
     mHR = CoInitializeEx(0, COINIT_MULTITHREADED);
     if (FAILED(mHR))
     {
-        LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x" << hex << mHR << LL_ENDL;
+        LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x" << std::hex << mHR << LL_ENDL;
         return;
     }
 
@@ -114,7 +113,7 @@ void LLWMIMethods::initCOMObjects()
 
     if (FAILED(mHR))
     {
-        LL_WARNS("AppInit") << "Failed to initialize security. Error code = 0x" << hex << mHR << LL_ENDL;
+        LL_WARNS("AppInit") << "Failed to initialize security. Error code = 0x" << std::hex << mHR << LL_ENDL;
         CoUninitialize();
         return;               // Program has failed.
     }
@@ -130,7 +129,7 @@ void LLWMIMethods::initCOMObjects()
 
     if (FAILED(mHR))
     {
-        LL_WARNS("AppInit") << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << mHR << LL_ENDL;
+        LL_WARNS("AppInit") << "Failed to create IWbemLocator object." << " Err code = 0x" << std::hex << mHR << LL_ENDL;
         CoUninitialize();
         return;               // Program has failed.
     }
@@ -154,7 +153,7 @@ void LLWMIMethods::initCOMObjects()
 
     if (FAILED(mHR))
     {
-        LL_WARNS("AppInit") << "Could not connect. Error code = 0x" << hex << mHR << LL_ENDL;
+        LL_WARNS("AppInit") << "Could not connect. Error code = 0x" << std::hex << mHR << LL_ENDL;
         pLoc->Release();
         CoUninitialize();
         return;               // Program has failed.
@@ -178,7 +177,7 @@ void LLWMIMethods::initCOMObjects()
 
     if (FAILED(mHR))
     {
-        LL_WARNS("AppInit") << "Could not set proxy blanket. Error code = 0x" << hex << mHR << LL_ENDL;
+        LL_WARNS("AppInit") << "Could not set proxy blanket. Error code = 0x" << std::hex << mHR << LL_ENDL;
         cleanCOMObjects();
         return;               // Program has failed.
     }
@@ -247,7 +246,7 @@ bool LLWMIMethods::getGenericSerialNumber(const BSTR &select, const LPCWSTR &var
 
     if (FAILED(hres))
     {
-        LL_WARNS("AppInit") << "Query for operating system name failed." << " Error code = 0x" << hex << hres << LL_ENDL;
+        LL_WARNS("AppInit") << "Query for operating system name failed." << " Error code = 0x" << std::hex << hres << LL_ENDL;
         return false;               // Program has failed.
     }
 
@@ -274,7 +273,7 @@ bool LLWMIMethods::getGenericSerialNumber(const BSTR &select, const LPCWSTR &var
         hr = pclsObj->Get(variable, 0, &vtProp, 0, 0);
         if (FAILED(hr))
         {
-            LL_WARNS() << "Failed to get SerialNumber. Error code = 0x" << hex << hres << LL_ENDL;
+            LL_WARNS() << "Failed to get SerialNumber. Error code = 0x" << std::hex << hres << LL_ENDL;
             pclsObj->Release();
             pclsObj = NULL;
             continue;
diff --git a/indra/newview/llpanelexperiencepicker.cpp b/indra/newview/llpanelexperiencepicker.cpp
index 80aeee6da1687b22a4ea6e3caac701919828b07b..6dfdbaf63fd790227fca090464b16e012d7e6822 100644
--- a/indra/newview/llpanelexperiencepicker.cpp
+++ b/indra/newview/llpanelexperiencepicker.cpp
@@ -41,8 +41,8 @@
 #include "llcombobox.h"
 #include "llviewercontrol.h"
 #include "llfloater.h"
+#include "llregex.h"
 #include "lltrans.h"
-#include <boost/regex.hpp>
 
 #define BTN_FIND		"find"
 #define BTN_OK			"ok_btn"
@@ -116,7 +116,7 @@ void LLPanelExperiencePicker::onBtnFind()
 	boost::cmatch what;
 	std::string text = getChild<LLUICtrl>(TEXT_EDIT)->getValue().asString();
 	const boost::regex expression("secondlife:///app/experience/[\\da-f-]+/profile");
-	if (boost::regex_match(text.c_str(), what, expression))
+	if (ll_regex_match(text.c_str(), what, expression))
 	{
 		LLURI uri(text);
 		LLSD path_array = uri.pathArray();
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index e9c9c451a2456ae26f39ea386ff7614495536431..1a1792fb60d61d6526a528341950a20f47f91a71 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -62,15 +62,11 @@
 
 const std::string FILTERS_FILENAME("filters.xml");
 
-static LLPanelInjector<LLPanelMainInventory> t_inventory("panel_main_inventory");
+const std::string ALL_ITEMS("All Items");
+const std::string RECENT_ITEMS("Recent Items");
+const std::string WORN_ITEMS("Worn Items");
 
-void on_file_loaded_for_save(BOOL success, 
-							 LLViewerFetchedTexture *src_vi,
-							 LLImageRaw* src, 
-							 LLImageRaw* aux_src, 
-							 S32 discard_level,
-							 BOOL final,
-							 void* userdata);
+static LLPanelInjector<LLPanelMainInventory> t_inventory("panel_main_inventory");
 
 ///----------------------------------------------------------------------------
 /// LLFloaterInventoryFinder
@@ -149,7 +145,7 @@ BOOL LLPanelMainInventory::postBuild()
 	//panel->getFilter().markDefault();
 
 	// Set up the default inv. panel/filter settings.
-	mActivePanel = getChild<LLInventoryPanel>("All Items");
+	mActivePanel = getChild<LLInventoryPanel>(ALL_ITEMS);
 	if (mActivePanel)
 	{
 		// "All Items" is the previous only view, so it gets the InventorySortOrder
@@ -159,7 +155,7 @@ BOOL LLPanelMainInventory::postBuild()
 		mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2));
 		mResortActivePanel = true;
 	}
-	LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
+	LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>(RECENT_ITEMS);
 	if (recent_items_panel)
 	{
 		// assign default values until we will be sure that we have setting to restore
@@ -174,7 +170,7 @@ BOOL LLPanelMainInventory::postBuild()
 		recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2));
 	}
 
-	mWornItemsPanel = getChild<LLInventoryPanel>("Worn Items");
+	mWornItemsPanel = getChild<LLInventoryPanel>(WORN_ITEMS);
 	if (mWornItemsPanel)
 	{
 		U32 filter_types = 0x0;
@@ -271,7 +267,7 @@ LLPanelMainInventory::~LLPanelMainInventory( void )
 	// for example, LLParamSDParser doesn't know about U64,
 	// so some FilterOps params should be revised.
 	LLSD filterRoot;
-	LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items");
+	LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>(ALL_ITEMS);
 	if (all_items_panel)
 	{
 		LLSD filterState;
@@ -285,7 +281,7 @@ LLPanelMainInventory::~LLPanelMainInventory( void )
 		}
 	}
 
-	LLInventoryPanel* panel = findChild<LLInventoryPanel>("Recent Items");
+	LLInventoryPanel* panel = findChild<LLInventoryPanel>(RECENT_ITEMS);
 	if (panel)
 	{
 		LLSD filterState;
@@ -316,7 +312,7 @@ LLPanelMainInventory::~LLPanelMainInventory( void )
 
 LLInventoryPanel* LLPanelMainInventory::getAllItemsPanel()
 {
-	return  getChild<LLInventoryPanel>("All Items");
+	return  getChild<LLInventoryPanel>(ALL_ITEMS);
 }
 
 void LLPanelMainInventory::selectAllItemsPanel()
@@ -324,6 +320,11 @@ void LLPanelMainInventory::selectAllItemsPanel()
 	mFilterTabs->selectFirstTab();
 }
 
+bool LLPanelMainInventory::isRecentItemsPanelSelected()
+{
+	return (RECENT_ITEMS == getActivePanel()->getName());
+}
+
 void LLPanelMainInventory::startSearch()
 {
 	// this forces focus to line editor portion of search editor
@@ -439,7 +440,7 @@ void LLPanelMainInventory::setSortBy(const LLSD& userdata)
 	}
 
 	getActivePanel()->setSortOrder(sort_order_mask);
-    if ("Recent Items" == getActivePanel()->getName())
+    if (isRecentItemsPanelSelected())
     {
         gSavedSettings.setU32("RecentItemsSortOrder", sort_order_mask);
     }
@@ -801,8 +802,8 @@ void LLPanelMainInventory::toggleFindOptions()
 
 void LLPanelMainInventory::setSelectCallback(const LLFolderView::signal_t::slot_type& cb)
 {
-	getChild<LLInventoryPanel>("All Items")->setSelectCallback(cb);
-	getChild<LLInventoryPanel>("Recent Items")->setSelectCallback(cb);
+	getChild<LLInventoryPanel>(ALL_ITEMS)->setSelectCallback(cb);
+	getChild<LLInventoryPanel>(RECENT_ITEMS)->setSelectCallback(cb);
 }
 
 void LLPanelMainInventory::onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action)
@@ -1200,11 +1201,11 @@ void LLPanelMainInventory::onAddButtonClick()
 {
 // Gray out the "New Folder" option when the Recent tab is active as new folders will not be displayed
 // unless "Always show folders" is checked in the filter options.
-	bool recent_active = ("Recent Items" == mActivePanel->getName());
+
 	LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get();
 	if (menu)
 	{
-		menu->getChild<LLMenuItemGL>("New Folder")->setEnabled(!recent_active);
+		menu->getChild<LLMenuItemGL>("New Folder")->setEnabled(!isRecentItemsPanelSelected());
 
 		setUploadCostIfNeeded();
 
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index dfb8db9d122f8eb4d4b51f58f30b2978caecb3ab..257bce930ccaba8cdbb98e4a6187c83c5e1cc57f 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -81,6 +81,8 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver
 	void selectAllItemsPanel();
 	const LLInventoryPanel* getActivePanel() const { return mActivePanel; }
 
+	bool isRecentItemsPanelSelected();
+
 	const std::string& getFilterText() const { return mFilterText; }
 	
 	void setSelectCallback(const LLFolderView::signal_t::slot_type& cb);
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 6bff95ab36a2acc8c85f1c0f733ff81a071b9675..831c89b00528402aaceb9dc75accf48ad0586bf5 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -896,7 +896,7 @@ void LLPanelObject::getState( )
 		mSpinScaleY->setMaxValue(OBJECT_MAX_HOLE_SIZE_Y);
 		break;
 	default:
-		if (editable)
+		if (editable && single_volume)
 		{
 			mSpinScaleX->set( 1.f - scale_x );
 			mSpinScaleY->set( 1.f - scale_y );
diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp
index b8aa976657fc0316f8e06b851d337c01e6a90721..05fa2b58b181d11974140c34582fca7745af0500 100644
--- a/indra/newview/llpanelsnapshotpostcard.cpp
+++ b/indra/newview/llpanelsnapshotpostcard.cpp
@@ -38,6 +38,7 @@
 #include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model
 #include "llpanelsnapshot.h"
 #include "llpostcard.h"
+#include "llregex.h"
 #include "llsnapshotlivepreview.h"
 #include "llviewercontrol.h" // gSavedSettings
 #include "llviewerwindow.h"
@@ -229,7 +230,7 @@ void LLPanelSnapshotPostcard::onSend()
 
 	boost::regex email_format("[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}(,[ \t]*[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,})*");
 
-	if (to.empty() || !boost::regex_match(to, email_format))
+	if (to.empty() || !ll_regex_match(to, email_format))
 	{
 		LLNotificationsUtil::add("PromptRecipientEmail");
 		return;
diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h
index 14059f828a424dea7cbb8569c7d5c316046c63b7..3a7b06c55aefb02ee59ca82bd49c5e75bbcc8e31 100644
--- a/indra/newview/llsecapi.h
+++ b/indra/newview/llsecapi.h
@@ -264,7 +264,9 @@ class LLCertificateStore : virtual public LLCertificateVector
 	virtual void validate(int validation_policy,
 						  LLPointer<LLCertificateChain> cert_chain,
 						  const LLSD& validation_params) =0;
-	
+
+    // Clear cache if any
+    virtual void clearSertCache()=0;
 };
 
 
diff --git a/indra/newview/llsechandler_basic.h b/indra/newview/llsechandler_basic.h
index b21a5d08f9743d38b4216f57461b7aa848aca2eb..0ff5e30c9b419aa5c36e71125adebc5c364a0d50 100644
--- a/indra/newview/llsechandler_basic.h
+++ b/indra/newview/llsechandler_basic.h
@@ -177,7 +177,10 @@ class LLBasicCertificateStore : virtual public LLBasicCertificateVector, public
 	virtual void validate(int validation_policy,
 						  LLPointer<LLCertificateChain> ca_chain,
 						  const LLSD& validation_params);
-	
+
+	// Clears cache of certs validated agains store
+	virtual void clearSertCache() { mTrustedCertCache.clear(); }
+
 protected:
 	std::vector<LLPointer<LLCertificate> >            mCerts;
 	
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 50884762a850854bff8ae28798080ce06fbf3383..5bbdeb1f9827027d0b32a2a4ddf6b18123387e2d 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -1368,11 +1368,8 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &
 			}
 			break;
 		case SELECT_TYPE_HUD:
-			// use HUD-scaled grid
-			mGridScale = LLVector3(0.25f, 0.25f, 0.25f);
-			break;
 		case SELECT_TYPE_WORLD:
-			mGridScale = LLVector3(1.f, 1.f, 1.f) * gSavedSettings.getF32("GridResolution");
+			mGridScale = LLVector3(1.f, 1.f, 1.f) * llmin(gSavedSettings.getF32("GridResolution"), 0.5f);
 			break;
 		}
 	}
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 124213153414253e0623749b13f5bc8dfc45de10..f22be6481a4fe0b726568a78837c77fdc873a220 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -2817,6 +2817,11 @@ void reset_login()
 	// Hide any other stuff
 	LLFloaterReg::hideVisibleInstances();
     LLStartUp::setStartupState( STATE_BROWSER_INIT );
+
+    // Clear any verified certs and verify them again on next login
+    // to ensure cert matches server instead of just getting reused
+    LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore("");
+    store->clearSertCache();
 }
 
 //---------------------------------------------------------------------------
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index 69074b1670548593f16f5a058eb1805d1c9ba1ea..2b1fedf74d1a5dbf48bb79d3dd4b2d844fdcd900 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -222,7 +222,7 @@ class LLToast : public LLModalDialog, public LLInstanceTracker<LLToast>
 	LLPanel*	 mWrapperPanel;
 
 	// timer counts a lifetime of a toast
-	std::auto_ptr<LLToastLifeTimer> mTimer;
+	std::unique_ptr<LLToastLifeTimer> mTimer;
 
 	F32			mToastLifetime; // in seconds
 	F32			mToastFadingTime; // in seconds
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 585988f4bf98df0f2d1ef4aa1dc81b4d5daa1e69..54ff7d295ee7a4bbe1d551199c69afa56f8c0c41 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -460,8 +460,9 @@ BOOL LLToolPie::useClickAction(MASK mask,
 			&& object
 			&& !object->isAttachment() 
 			&& LLPrimitive::isPrimitive(object->getPCode())
-			&& (object->getClickAction() 
-				|| parent->getClickAction());
+				// useClickAction does not handle Touch (0) or Disabled action
+			&& ((object->getClickAction() && object->getClickAction() != CLICK_ACTION_DISABLED)
+				|| (parent && parent->getClickAction() && parent->getClickAction() != CLICK_ACTION_DISABLED));
 
 }
 
@@ -472,18 +473,18 @@ U8 final_click_action(LLViewerObject* obj)
 
 	U8 click_action = CLICK_ACTION_TOUCH;
 	LLViewerObject* parent = obj->getRootEdit();
-	if (obj->getClickAction()
-	    || (parent && parent->getClickAction()))
-	{
-		if (obj->getClickAction())
-		{
-			click_action = obj->getClickAction();
-		}
-		else if (parent && parent->getClickAction())
-		{
-			click_action = parent->getClickAction();
-		}
-	}
+    U8 object_action = obj->getClickAction();
+    U8 parent_action = parent ? parent->getClickAction() : CLICK_ACTION_TOUCH;
+    if (parent_action == CLICK_ACTION_DISABLED || object_action)
+    {
+        // CLICK_ACTION_DISABLED ("None" in UI) is intended for child action to
+        // override parent's action when assigned to parent or to child
+        click_action = object_action;
+    }
+    else if (parent_action)
+    {
+        click_action = parent_action;
+    }
 	return click_action;
 }
 
@@ -657,9 +658,10 @@ bool LLToolPie::teleportToClickedLocation()
     bool is_land = mHoverPick.mPickType == LLPickInfo::PICK_LAND;
     bool pos_non_zero = !mHoverPick.mPosGlobal.isExactlyZero();
     bool has_touch_handler = (objp && objp->flagHandleTouch()) || (parentp && parentp->flagHandleTouch());
-    bool has_click_action = final_click_action(objp);
+    U8 click_action = final_click_action(objp); // default action: 0 - touch
+    bool has_click_action = (click_action || has_touch_handler) && click_action != CLICK_ACTION_DISABLED;
 
-    if (pos_non_zero && (is_land || (is_in_world && !has_touch_handler && !has_click_action)))
+    if (pos_non_zero && (is_land || (is_in_world && !has_click_action)))
     {
         LLVector3d pos = mHoverPick.mPosGlobal;
         pos.mdV[VZ] += gAgentAvatarp->getPelvisToFoot();
@@ -790,7 +792,8 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
 			LL_DEBUGS("UserInput") << "hover handled by LLToolPie (inactive)" << LL_ENDL;
 		}
 		else if ((!object || !object->isAttachment() || object->getClickAction() != CLICK_ACTION_DISABLED)
-				 && ((object && object->flagHandleTouch()) || (parent && parent->flagHandleTouch())))
+				 && ((object && object->flagHandleTouch()) || (parent && parent->flagHandleTouch()))
+				 && (!object || !object->isAvatar()))
 		{
 			show_highlight = true;
 			gViewerWindow->setCursor(UI_CURSOR_HAND);
diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp
index 553a3cd086134065f0c83148d5f1f8b497f7b613..a2c696c762fbcb9599da8452643e696e1cf81b7a 100644
--- a/indra/newview/lltranslate.cpp
+++ b/indra/newview/lltranslate.cpp
@@ -197,6 +197,11 @@ void LLTranslationAPIHandler::translateMessageCoro(LanguagePair_t fromTo, std::s
 
     LLSD result = httpAdapter->getRawAndSuspend(httpRequest, url, httpOpts, httpHeaders);
 
+    if (LLApp::isQuitting())
+    {
+        return;
+    }
+
     LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
     LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
 
@@ -207,7 +212,22 @@ void LLTranslationAPIHandler::translateMessageCoro(LanguagePair_t fromTo, std::s
     const LLSD::Binary &rawBody = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_RAW].asBinary();
     std::string body(rawBody.begin(), rawBody.end());
 
-    if (this->parseResponse(parseResult, body, translation, detected_lang, err_msg))
+    bool res = false;
+
+    try
+    {
+        res = this->parseResponse(parseResult, body, translation, detected_lang, err_msg);
+    }
+    catch (std::out_of_range&)
+    {
+        LL_WARNS() << "Out of range exception on string " << body << LL_ENDL;
+    }
+    catch (...)
+    {
+        LOG_UNHANDLED_EXCEPTION( "Exception on string " + body );
+    }
+
+    if (res)
     {
         // Fix up the response
         LLStringUtil::replaceString(translation, "&lt;", "<");
diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp
index 4720a989b0d4ddb741a7be344644a9b9673359aa..376a7fce7619374663dfc4e981816740a914eb32 100644
--- a/indra/newview/llversioninfo.cpp
+++ b/indra/newview/llversioninfo.cpp
@@ -28,9 +28,9 @@
 #include "llviewerprecompiledheaders.h"
 #include "llevents.h"
 #include "lleventfilter.h"
+#include "llregex.h"
 #include "llversioninfo.h"
 #include "stringize.h"
-#include <boost/regex.hpp>
 
 #if ! defined(LL_VIEWER_CHANNEL)       \
  || ! defined(LL_VIEWER_VERSION_MAJOR) \
@@ -139,19 +139,19 @@ LLVersionInfo::ViewerMaturity LLVersionInfo::getViewerMaturity()
 	static const boost::regex is_project_channel("\\bProject\\b");
 	static const boost::regex is_release_channel("\\bRelease\\b");
 
-    if (boost::regex_search(channel, is_release_channel))
+    if (ll_regex_search(channel, is_release_channel))
     {
         maturity = RELEASE_VIEWER;
     }
-    else if (boost::regex_search(channel, is_beta_channel))
+    else if (ll_regex_search(channel, is_beta_channel))
     {
         maturity = BETA_VIEWER;
     }
-    else if (boost::regex_search(channel, is_project_channel))
+    else if (ll_regex_search(channel, is_project_channel))
     {
         maturity = PROJECT_VIEWER;
     }
-    else if (boost::regex_search(channel, is_test_channel))
+    else if (ll_regex_search(channel, is_test_channel))
     {
         maturity = TEST_VIEWER;
     }
diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp
index bc07821ccd9e231bd3582be35e1d62b8ba712280..0df6811f6a6f6207ef05847b9b64e60eec27d546 100644
--- a/indra/newview/llviewerassetupload.cpp
+++ b/indra/newview/llviewerassetupload.cpp
@@ -793,7 +793,7 @@ void LLViewerAssetUpload::AssetInventoryUploadCoproc(LLCoreHttpUtil::HttpCorouti
             // Show the preview panel for textures and sounds to let
             // user know that the image (or snapshot) arrived intact.
             LLInventoryPanel* panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
-            LLInventoryPanel::openInventoryPanelAndSetSelection(TRUE, serverInventoryItem, TRUE, TAKE_FOCUS_NO, (panel == NULL));
+            LLInventoryPanel::openInventoryPanelAndSetSelection(TRUE, serverInventoryItem, FALSE, TAKE_FOCUS_NO, (panel == NULL));
 
             // restore keyboard focus
             gFocusMgr.setKeyboardFocus(focus);
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index cb20801756162acdc62b78f58a3382fee5a25d95..f97ba0930e21817aa8dcb29fcd7b081b2fae3af4 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -81,7 +81,7 @@ void LLViewerAudio::registerIdleListener()
 	}
 }
 
-void LLViewerAudio::startInternetStreamWithAutoFade(std::string streamURI)
+void LLViewerAudio::startInternetStreamWithAutoFade(const std::string &streamURI)
 {
 	// Old and new stream are identical
 	if (mNextStreamURI == streamURI)
diff --git a/indra/newview/llvieweraudio.h b/indra/newview/llvieweraudio.h
index 16f9b63113d88699a0ffb8d74fe459decc9e8366..782285ce36ffab98d09a9e2be047d2a396f28b04 100644
--- a/indra/newview/llvieweraudio.h
+++ b/indra/newview/llvieweraudio.h
@@ -55,7 +55,7 @@ class LLViewerAudio : public LLSingleton<LLViewerAudio>
 		FADE_OUT,
 	};
 
-	void startInternetStreamWithAutoFade(std::string streamURI);
+	void startInternetStreamWithAutoFade(const std::string &streamURI);
 	void stopInternetStreamWithAutoFade();
 	
 	bool onIdleUpdate();
@@ -65,7 +65,8 @@ class LLViewerAudio : public LLSingleton<LLViewerAudio>
 	F32 getFadeVolume();
 	bool getForcedTeleportFade() { return mForcedTeleportFade; };
 	void setForcedTeleportFade(bool fade) { mForcedTeleportFade = fade;} ;
-	void setNextStreamURI(std::string stream) { mNextStreamURI = stream; } ;
+	std::string getNextStreamURI() { return mNextStreamURI; };
+	void setNextStreamURI(const std::string &stream) { mNextStreamURI = stream; } ;
 	void setWasPlaying(bool playing) { mWasPlaying = playing;} ;
 
 private:
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 8837bda63d726710575886d4e44b370c8270e04f..635b7311937889c79f4f182cab623a75d24b995e 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -7290,7 +7290,7 @@ namespace
 	};
 }
 
-void queue_actions(LLFloaterScriptQueue* q, const std::string& msg)
+bool queue_actions(LLFloaterScriptQueue* q, const std::string& msg)
 {
 	QueueObjects func(q);
 	LLSelectMgr *mgr = LLSelectMgr::getInstance();
@@ -7312,6 +7312,7 @@ void queue_actions(LLFloaterScriptQueue* q, const std::string& msg)
 		{
 			LL_ERRS() << "Bad logic." << LL_ENDL;
 		}
+		q->closeFloater();
 	}
 	else
 	{
@@ -7320,6 +7321,7 @@ void queue_actions(LLFloaterScriptQueue* q, const std::string& msg)
 			LL_WARNS() << "Unexpected script compile failure." << LL_ENDL;
 		}
 	}
+	return !fail;
 }
 
 class LLToolsSelectedScriptAction : public view_listener_t
@@ -7367,8 +7369,10 @@ class LLToolsSelectedScriptAction : public view_listener_t
 		if (queue)
 		{
 			queue->setMono(mono);
-			queue_actions(queue, msg);
-			queue->setTitle(title);
+			if (queue_actions(queue, msg))
+			{
+				queue->setTitle(title);
+			}			
 		}
 		else
 		{
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 06172e366d7a141d592fa1bd68778960cbdd9977..56370df7513638ff54198a47c4f440de5d9b04f5 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1888,7 +1888,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
 			if (parcel)
 			{
                 // Only update stream if parcel changed (recreated) or music is playing (enabled)
-                if (!agent_parcel_update || gSavedSettings.getBOOL("MediaTentativeAutoPlay"))
+                static LLCachedControl<bool> already_playing(gSavedSettings, "MediaTentativeAutoPlay", true);
+                if (!agent_parcel_update || already_playing)
                 {
                     LLViewerParcelAskPlay::getInstance()->cancelNotification();
                     std::string music_url_raw = parcel->getMusicURL();
@@ -1906,7 +1907,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
                             LLViewerRegion *region = LLWorld::getInstance()->getRegion(msg->getSender());
                             if (region)
                             {
-                                optionally_start_music(music_url, parcel->mLocalID, region->getRegionID());
+                                optionallyStartMusic(music_url, parcel->mLocalID, region->getRegionID(), !agent_parcel_update);
                             }
                         }
                         else
@@ -1943,9 +1944,13 @@ void LLViewerParcelMgr::onStartMusicResponse(const LLUUID &region_id, const S32
         LL_INFOS("ParcelMgr") << "Starting parcel music " << url << LL_ENDL;
         LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(url);
     }
+    else
+    {
+        LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
+    }
 }
 
-void LLViewerParcelMgr::optionally_start_music(const std::string &music_url, const S32 &local_id, const LLUUID &region_id)
+void LLViewerParcelMgr::optionallyStartMusic(const std::string &music_url, const S32 &local_id, const LLUUID &region_id, bool switched_parcel)
 {
 	static LLCachedControl<bool> streaming_music(gSavedSettings, "AudioStreamingMusic", true);
 	if (streaming_music)
@@ -1955,25 +1960,35 @@ void LLViewerParcelMgr::optionally_start_music(const std::string &music_url, con
 		// only play music when you enter a new parcel if the UI control for this
 		// was not *explicitly* stopped by the user. (part of SL-4878)
 		LLPanelNearByMedia* nearby_media_panel = gStatusBar->getNearbyMediaPanel();
+        LLViewerAudio* viewer_audio = LLViewerAudio::getInstance();
 
         // ask mode //todo constants
         if (autoplay_mode == 2)
         {
-            // stop previous stream
-            LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
-
             // if user set media to play - ask
             if ((nearby_media_panel && nearby_media_panel->getParcelAudioAutoStart())
                 || (!nearby_media_panel && tentative_autoplay))
             {
-                LLViewerParcelAskPlay::getInstance()->askToPlay(region_id,
-                    local_id,
-                    music_url,
-                    onStartMusicResponse);
+                // user did not stop audio
+                if (switched_parcel || music_url != viewer_audio->getNextStreamURI())
+                {
+                    viewer_audio->startInternetStreamWithAutoFade(LLStringUtil::null);
+
+                    LLViewerParcelAskPlay::getInstance()->askToPlay(region_id,
+                        local_id,
+                        music_url,
+                        onStartMusicResponse);
+                }
+                // else do nothing:
+                // Parcel properties changed, but not url.
+                // We are already playing this url and asked about it when agent entered parcel
+                // or user started audio manually at some point
             }
             else
             {
+                // stopped by the user, do not autoplay
                 LLViewerParcelAskPlay::getInstance()->cancelNotification();
+                viewer_audio->startInternetStreamWithAutoFade(LLStringUtil::null);
             }
         }
         // autoplay
@@ -1985,11 +2000,12 @@ void LLViewerParcelMgr::optionally_start_music(const std::string &music_url, con
                      && tentative_autoplay))
 		{
 			LL_INFOS("ParcelMgr") << "Starting parcel music " << music_url << LL_ENDL;
-			LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(music_url);
+			viewer_audio->startInternetStreamWithAutoFade(music_url);
 		}
-		else
+		// autoplay off
+		else if(switched_parcel || music_url != viewer_audio->getNextStreamURI())
 		{
-			LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
+			viewer_audio->startInternetStreamWithAutoFade(LLStringUtil::null);
 		}
 	}
 }
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 508a63c3981db9fe687ed1d12df0931b8b4044b7..6ce389ab88860c60cd4cd104d8a127746bab8240 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -271,7 +271,7 @@ class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr>
 	//void makeLandmarkAtSelection();
 
 	static void onStartMusicResponse(const LLUUID &region_id, const S32 &parcel_id, const std::string &url, const bool &play);
-	static void optionally_start_music(const std::string &music_url, const S32 &local_id, const LLUUID &region_id);
+	static void optionallyStartMusic(const std::string &music_url, const S32 &local_id, const LLUUID &region_id, bool switched_parcel);
 
 	static void processParcelOverlay(LLMessageSystem *msg, void **user_data);
 	static void processParcelProperties(LLMessageSystem *msg, void **user_data);
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 738a2e95c789c15ca9fe0b9339e8ee392c2c16ad..198fe1563ccd050c7fd9325932864fa20636bfe0 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -187,7 +187,7 @@ class LLViewerRegionImpl
         mLandp(NULL)
 	{}
 
-	void buildCapabilityNames(LLSD& capabilityNames);
+	static void buildCapabilityNames(LLSD& capabilityNames);
 
 	// The surfaces and other layers
 	LLSurface*	mLandp;
@@ -260,6 +260,12 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)
     // This loop is used for retrying a capabilities request.
     do
     {
+        if (STATE_WORLD_INIT > LLStartUp::getStartupState())
+        {
+            LL_INFOS("AppInit", "Capabilities") << "Aborting capabilities request, reason: returned to login screen" << LL_ENDL;
+            return;
+        }
+
         regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle);
         if (!regionp) //region was removed
         {
@@ -308,13 +314,19 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)
         regionp = NULL;
         result = httpAdapter->postAndSuspend(httpRequest, url, capabilityNames);
 
-        ++mSeedCapAttempts;
+        if (STATE_WORLD_INIT > LLStartUp::getStartupState())
+        {
+            LL_INFOS("AppInit", "Capabilities") << "Aborting capabilities request, reason: returned to login screen" << LL_ENDL;
+            return;
+        }
 
-        if (LLApp::isExiting())
+        if (LLApp::isExiting() || gDisconnected)
         {
             return;
         }
 
+        ++mSeedCapAttempts;
+
         regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle);
         if (!regionp) //region was removed
         {
@@ -429,7 +441,7 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCompleteCoro(U64 regionHandle)
             break;  // no retry
         }
 
-        if (LLApp::isExiting())
+        if (LLApp::isExiting() || gDisconnected)
         {
             break;
         }
@@ -537,7 +549,7 @@ void LLViewerRegionImpl::requestSimulatorFeatureCoro(std::string url, U64 region
             continue;  
         }
 
-        if (LLApp::isExiting())
+        if (LLApp::isExiting() || gDisconnected)
         {
             break;
         }
@@ -2924,6 +2936,7 @@ void LLViewerRegion::unpackRegionHandshake()
 	mRegionTimer.reset(); //reset region timer.
 }
 
+// static
 void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
 {
 	capabilityNames.append("AbuseCategories");
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index f0638005870b0f16bf0e239484acccf8a91c970c..ca5305b169369abc17013a1557b286ef02b536e7 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -377,6 +377,18 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
 				{
 					delete mTextureAnimp;
 					mTextureAnimp = NULL;
+
+                    for (S32 i = 0; i < getNumTEs(); i++)
+                    {
+                        LLFace* facep = mDrawable->getFace(i);
+                        if (facep && facep->mTextureMatrix)
+                        {
+                            // delete or reset
+                            delete facep->mTextureMatrix;
+                            facep->mTextureMatrix = NULL;
+                        }
+                    }
+
 					gPipeline.markTextured(mDrawable);
 					mFaceMappingChanged = TRUE;
 					mTexAnimMode = 0;
@@ -476,6 +488,18 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
 			{
 				delete mTextureAnimp;
 				mTextureAnimp = NULL;
+
+                for (S32 i = 0; i < getNumTEs(); i++)
+                {
+                    LLFace* facep = mDrawable->getFace(i);
+                    if (facep && facep->mTextureMatrix)
+                    {
+                        // delete or reset
+                        delete facep->mTextureMatrix;
+                        facep->mTextureMatrix = NULL;
+                    }
+                }
+
 				gPipeline.markTextured(mDrawable);
 				mFaceMappingChanged = TRUE;
 				mTexAnimMode = 0;
diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp
index 0aa0280b25720b304c00ad249e4be4de8bfd9f70..a3036ff6d06cfcfd27c4505f5a1067cdbc8dcf55 100644
--- a/indra/newview/llwatchdog.cpp
+++ b/indra/newview/llwatchdog.cpp
@@ -224,7 +224,7 @@ void LLWatchdog::run()
 		LL_INFOS() << "Watchdog thread delayed: resetting entries." << LL_ENDL;
 		std::for_each(mSuspects.begin(), 
 			mSuspects.end(), 
-			std::mem_fun(&LLWatchdogEntry::reset)
+			[](SuspectsRegistry::value_type suspect){ suspect->reset(); }
 			);
 	}
 	else
@@ -232,7 +232,7 @@ void LLWatchdog::run()
 		SuspectsRegistry::iterator result = 
 			std::find_if(mSuspects.begin(), 
 				mSuspects.end(), 
-				std::not1(std::mem_fun(&LLWatchdogEntry::isAlive))
+				[](SuspectsRegistry::value_type suspect){ return ! suspect->isAlive(); }
 				);
 		if(result != mSuspects.end())
 		{
diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp
index d019b400e8a9d4a6d5b2c2e3f031836fc9259957..b8f1ec35f6dd707a296fd31dda90a554dcafa987 100644
--- a/indra/newview/llweb.cpp
+++ b/indra/newview/llweb.cpp
@@ -38,6 +38,7 @@
 #include "llfloaterreg.h"
 #include "lllogininstance.h"
 #include "llparcel.h"
+#include "llregex.h"
 #include "llsd.h"
 #include "llui.h"
 #include "lluri.h"
@@ -51,8 +52,6 @@
 #include "lluriparser.h"
 #include "uriparser/Uri.h"
 
-#include <boost/regex.hpp>
-
 bool on_load_url_external_response(const LLSD& notification, const LLSD& response, bool async );
 
 
@@ -239,13 +238,13 @@ bool LLWeb::useExternalBrowser(const std::string &url)
 
 		boost::regex pattern = boost::regex("\\b(lindenlab.com|secondlife.com|secondlife.io)$", boost::regex::perl|boost::regex::icase);
 		boost::match_results<std::string::const_iterator> matches;
-		return !(boost::regex_search(uri_string, matches, pattern));
+		return !(ll_regex_search(uri_string, matches, pattern));
 	}
 	else
 	{
 		boost::regex pattern = boost::regex("^mailto:", boost::regex::perl | boost::regex::icase);
 		boost::match_results<std::string::const_iterator> matches;
-		return boost::regex_search(url, matches, pattern);
+		return ll_regex_search(url, matches, pattern);
 	}
 #endif
 }
diff --git a/indra/test/lldoubledispatch_tut.cpp b/indra/test/lldoubledispatch_tut.cpp
index ad8f6454d4caa5604a1e7a96f7eb1377b914f8f1..e38d0e92a37df87af763c7f450738f20e9e598a2 100644
--- a/indra/test/lldoubledispatch_tut.cpp
+++ b/indra/test/lldoubledispatch_tut.cpp
@@ -135,10 +135,10 @@ namespace tut
 
         // Instantiate a few GameObjects.  Make sure we refer to them
         // polymorphically, and don't let them leak.
-        std::auto_ptr<GameObject> home;
-        std::auto_ptr<GameObject> obstacle;
-        std::auto_ptr<GameObject> tug;
-        std::auto_ptr<GameObject> patrol;
+        std::unique_ptr<GameObject> home;
+        std::unique_ptr<GameObject> obstacle;
+        std::unique_ptr<GameObject> tug;
+        std::unique_ptr<GameObject> patrol;
 
         // prototype objects
         Asteroid dummyAsteroid;