diff --git a/.hgtags b/.hgtags
index 495d6f6958bdae39271852083c43bec272dd39c4..1fc2b2edba4597e3d2251b24f6b5434fed97ed74 100755
--- a/.hgtags
+++ b/.hgtags
@@ -72,35 +72,35 @@ b53a0576eec80614d7767ed72b40ed67aeff27c9 DRTVWR-38_2.5.2-release
 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
+42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release
+42f32494bac475d0737799346f6831558ae8bf5d DRTVWR-39_2.6.0-release
+c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release
+c9182ed77d427c759cfacf49a7b71a2e20d522aa DRTVWR-42_2.6.1-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
+214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release
+214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release
 7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd 2.6.5-beta1
 7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd DRTVWR-50_2.6.5-beta1
+8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release
+8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release
 800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start
 bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 2.6.6-beta1
 bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 DRTVWR-52_2.6.6-beta1
+5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start
 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
@@ -119,50 +119,50 @@ e67da2c6e3125966dd49eef98b36317afac1fcfe 2.6.9-start
 9f79a6ed8fdcd2f3dac33ea6b3236eeb278dccfe 2.7.2-start
 e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb 2.7.2-beta1
 e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb DRTVWR-63_2.7.2-beta1
+6a3e7e403bd19e45fdfc2fcc716867af3ab80861 2.7.3-start
 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
+057f319dd8eccdf63a54d99686c68cdcb31b6abc 2.7.4-release
+057f319dd8eccdf63a54d99686c68cdcb31b6abc DRTVWR-66_2.7.4-release
+6866d9df6efbd441c66451debd376d21211de39c 2.7.5-release
+6866d9df6efbd441c66451debd376d21211de39c DRTVWR-68_2.7.5-release
 502f6a5deca9365ddae57db4f1e30172668e171e 2.8.1-start
 2c7e459e0c883f8e406b932e41e60097e9ee077e 2.8.1-beta1
 2c7e459e0c883f8e406b932e41e60097e9ee077e DRTVWR-73_2.8.1-beta1
+493d9127ee50e84ba08a736a65a23ca86f7a5b01 2.8.0-release
+493d9127ee50e84ba08a736a65a23ca86f7a5b01 DRTVWR-70_2.8.0-release
+54bc7823ad4e3a436fef79710f685a7372bbf795 2.8.2-start
+ac0f1a132d35c02a58861d37cca75b0429ac9137 2.8.3-start
 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
+fb85792b84bf28428889c4cc966469d92e5dac4c 2.8.3-release
+fb85792b84bf28428889c4cc966469d92e5dac4c DRTVWR-74_2.8.3-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
+1778f26b6d0ae762dec3ca37140f66620f2485d9 3.0.0-release
+1778f26b6d0ae762dec3ca37140f66620f2485d9 DRTVWR-77_3.0.0-release
 e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e 3.0.2-beta2
 e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e DRTVWR-86_3.0.2-beta2
 b95ddac176ac944efdc85cbee94ac2e1eab44c79 3.0.3-start
@@ -170,9 +170,9 @@ b95ddac176ac944efdc85cbee94ac2e1eab44c79 3.0.3-start
 6694f3f062aa45f64ab391d25a3eb3d5eb1b0871 DRTVWR-85_3.0.3-beta1
 61aa7974df089e8621fe9a4c69bcdefdb3cc208a 3.0.3-beta2
 61aa7974df089e8621fe9a4c69bcdefdb3cc208a DRTVWR-89_3.0.3-beta2
+586907287be581817b2422b5137971b22d54ea48 3.0.4-start
 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
@@ -193,11 +193,11 @@ e440cd1dfbd128d7d5467019e497f7f803640ad6 DRTVWR-95_3.2.0-beta1
 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
+a8c7030d6845186fac7c188be4323a0e887b4184 3.2.1-release
+a8c7030d6845186fac7c188be4323a0e887b4184 DRTVWR-99_3.2.1-release
 80f3e30d8aa4d8f674a48bd742aaa6d8e9eae0b5 3.2.3-start
 3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-beta1
 3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-start
@@ -248,68 +248,58 @@ bb9932a7a5fd00edf52d95f354e3b37ae6a942db DRTVWR-156
 6414ecdabc5d89515b08d1f872cf923ed3a5523a DRTVWR-148
 2a3965b3ad202df7ea25d2be689291bb14a1280e DRTVWR-155
 24a7281bef42bd4430ceb25db8b195449c2c7de3 DRTVWR-153
-a716684aa7c07c440b1de5815b8a1f3dd3fd8bfb DRTVWR-159
-9a78ac13f047056f788c4734dd91aebfe30970e3 DRTVWR-157
 5910f8063a7e1ddddf504c2f35ca831cc5e8f469 DRTVWR-160
 f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 3.3.3-beta1
 f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 DRTVWR-144
-089e5c84b2dece68f2b016c842ef9b5de4786842 DRTVWR-161
-600f3b3920d94de805ac6dc8bb6def9c069dd360 DRTVWR-162
-c08e2ac17a99973b2a94477659220b99b8847ae2 DRTVWR-163
 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
-005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167
 bce218b2b45b730b22cc51e4807aa8b571cadef3 DRTVWR-173
 cbea6356ce9cb0c313b6777f10c5c14783264fcc DRTVWR-174
 82b5330bc8b17d0d4b598832e9c5a92e90075682 3.3.4-beta2
 57d221de3df94f90b55204313c2cef044a3c0ae2 DRTVWR-176
 eb539c65e6ee26eea2bf373af2d0f4b52dc91289 DRTVWR-177
 a8057e1b9a1246b434a27405be35e030f7d28b0c 3.3.4-beta3
-888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175
 4281aa899fb2cedb7a9ca7ce91c5c29d4aa69594 DRTVWR-180
 5c08e1d8edd871807153603b690e3ee9dbb548aa DRTVWR-183
 6c75f220b103db1420919c8b635fe53e2177f318 3.3.4-beta4
 9cd174d3a54d93d409a7c346a15b8bfb40fc58f4 DRTVWR-184
 ab2ffc547c8a8950ff187c4f6c95e5334fab597b 3.3.4-beta5
 28e100d0379a2b0710c57647a28fc5239d3d7b99 3.3.4-release
+005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167
+888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175
 a8b3eca451a9eaab59987efb0ab1c4217e3f2dcc DRTVWR-182
 1f27cdfdc54246484f8afbbe42ce48e954175cbd 3.4.0-beta1
-81f6b745ef27f5915fd07f988fdec9944f2bb73e DRTVWR-186
-47f0d08ba7ade0a3905074009067c6d3df7e16ae DRTVWR-190
-cc953f00956be52cc64c30637bbeec310eea603f DRTVWR-181
-c04e68e1b0034fd0a20815ae24c77e5f8428e822 DRTVWR-188
 9ee9387789701d597130f879d9011a4958753862 DRTVWR-189
+47f0d08ba7ade0a3905074009067c6d3df7e16ae DRTVWR-190
 421126293dcbde918e0da027ca0ab9deb5b4fbf2 DRTVWR-192
-4b2c52aecb7a75de31dbb12d9f5b9a251d8707be DRTVWR-191
 33a2fc7a910ae29ff8b4850316ed7fbff9f64d33 DRTVWR-195
 e9732c739c8a72a590216951505ea9c76a526a84 DRTVWR-193
-78ca0bbf43a92e8914d4cfa87d69a6717ef7d4cf DRTVWR-194
 7602f61c804a512764e349c034c02ddabeefebc4 DRTVWR-196
 ae5c83dd61d2d37c45f1d5b8bf2b036d87599f1b DRTVWR-198
 507bdfbd6bf844a511c1ffeda4baa80016ed1346 DRTVWR-197
 b1dbb1a83f48f93f6f878cff9e52d2cb635e145c 3.4.0-beta2
 37402e2b19af970d51b0a814d79892cc5647532b DRTVWR-200
 182a9bf30e81070361bb020a78003b1cf398e79c 3.4.0-beta3
-248f4acd92a706c79e842bc83d80baa7369c0c2e DRTVWR-203
 6dfb0fba782c9233dd95f24ec48146db0d3f210b DRTVWR-199
 7c9102fb998885621919f2474a002c35b583539b 3.3.4-release2
 7649a3dff5ec22d3727377e5f02efd0f421e4cb5 DRTVWR-201
 84fb70dfe3444e75a44fb4bee43e2fc8221cebdd 3.4.0-beta4
 092a9effbedd1a0276fa5ced520992ce00f96fbf CHUI-PV-0
-de3be913f68813a9bac7d1c671fef96d1159bcd6 DRTVWR-202
 573e863be2f26d3687161def4b9fea9b7038dda8 3.4.0-beta5
-34dbbe2b00afe90352d3acf8290eb10ab90d1c8b oz-build-test-tag
-6ee71714935ffcd159db3d4f5800c1929aac54e1 DRTVWR-205
-7b22c612fc756e0ea63b10b163e81d107f85dbf8 DRTVWR-206
 8c9085066c78ed5f6c9379dc054c82a6fcdb1851 DRTVWR-207
 351eea5f9dc192fc5ddea3b02958de97677a0a12 3.3.4-release3
 af7b28e75bd5a629cd9e0dc46fb3f1757626f493 DRTVWR-212
@@ -320,7 +310,6 @@ ceed0b65a69f1eac20d523e0203320a32f9a3f3c DRTVWR-215
 97977c67245f52db20eb15f1918cc0f24778cabc 3.4.0-release
 5adb2b8f96c3cac88ad7c7d996d707f1b29df336 3.4.1-beta1
 b3f74858a1c8720c82d0978f3877a3fc8ba459ec 3.4.1-beta1a
-b61afe175b829c149d369524a4e974dfda99facf DRTVWR-219
 2b779f233ee6f38c89cb921650c773a96e63da92 DRTVWR-220
 0b9d95f4bfb6867cbf56eaec51633b0da2f1262d DRTVWR-221
 e6e553761829dc0270eaaa712b7cb0622535b076 3.4.1-beta3
@@ -345,21 +334,42 @@ baf97f06ae17223614c5e31aa42e71d87cff07fe DRTVWR-236
 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
-d799593b53ed733862e9a13871e318e886469377 DRTVWR-208
-e497dcde7a3653e384eb223a8a460030e89c294c DRTVWR-223
 288539fc0408ed4b69a99665de33bbbc2c3c08fe DRTVWR-216
 e664473c16df1d82ffaff382e7b3e023da202d52 3.4.2-beta2
-93ab02d83f51e30a3cabad98aff89601befd9413 DRTVWR-240
 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
-e9a5886052433d5db9e504ffaca10890f9932979 DRTVWR-243
-73b84b9864dc650fe7c8fc9f52361450f0849004 3.4.2-beta4
 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
+5cba5f39d0a81d659f24ebc4b5efd025a39e3db1 3.4.3-release
diff --git a/indra/llcorehttp/_httpinternal.h b/indra/llcorehttp/_httpinternal.h
index 465e2036b3217c04db379d62e3a4e58fc685b2c0..14f744a9f1e078b6fd8fb4567fe09affe22490b2 100644
--- a/indra/llcorehttp/_httpinternal.h
+++ b/indra/llcorehttp/_httpinternal.h
@@ -111,7 +111,15 @@ const int HTTP_TRACE_MIN = HTTP_TRACE_OFF;
 const int HTTP_TRACE_MAX = HTTP_TRACE_CURL_BODIES;
 
 // Request retry limits
-const int HTTP_RETRY_COUNT_DEFAULT = 5;
+//
+// At a minimum, retries need to extend past any throttling
+// window we're expecting from central services.  In the case
+// of Linden services running through the caps routers, there's
+// a five-second or so window for throttling with some spillover.
+// We want to span a few windows to allow transport to slow
+// after onset of the throttles and then recover without a final
+// failure.  Other systems may need other constants.
+const int HTTP_RETRY_COUNT_DEFAULT = 8;
 const int HTTP_RETRY_COUNT_MIN = 0;
 const int HTTP_RETRY_COUNT_MAX = 100;
 
diff --git a/indra/llcorehttp/examples/http_texture_load.cpp b/indra/llcorehttp/examples/http_texture_load.cpp
index 998dc9240b19ee34eed2ff53da0d516fedb306e8..40ad4f047dfcc0141cadaa25eb638bd6f278f8af 100644
--- a/indra/llcorehttp/examples/http_texture_load.cpp
+++ b/indra/llcorehttp/examples/http_texture_load.cpp
@@ -153,6 +153,7 @@ class Metrics
 //
 int main(int argc, char** argv)
 {
+	LLCore::HttpStatus status;
 	bool do_random(false);
 	bool do_verbose(false);
 	
@@ -215,6 +216,9 @@ int main(int argc, char** argv)
 	// Initialization
 	init_curl();
 	LLCore::HttpRequest::createService();
+	LLCore::HttpRequest::setPolicyClassOption(LLCore::HttpRequest::DEFAULT_POLICY_ID,
+											  LLCore::HttpRequest::CP_CONNECTION_LIMIT,
+											  concurrency_limit);
 	LLCore::HttpRequest::startThread();
 	
 	// Get service point
@@ -228,7 +232,7 @@ int main(int argc, char** argv)
 	ws.loadTextureUuids(uuids);
 	ws.mRandomRange = do_random;
 	ws.mVerbose = do_verbose;
-	ws.mMaxConcurrency = concurrency_limit;
+	ws.mMaxConcurrency = 100;
 	
 	if (! ws.mTextures.size())
 	{
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index 846311a8d045cf459ede3a0e9c22ea7596c68671..c1b96a43da4439b5cc47a796174db2e215d9981f 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -51,11 +51,13 @@ void check_framebuffer_status()
 }
 
 bool LLRenderTarget::sUseFBO = false;
+U32 LLRenderTarget::sCurFBO = 0;
 
 LLRenderTarget::LLRenderTarget() :
 	mResX(0),
 	mResY(0),
 	mFBO(0),
+	mPreviousFBO(0),
 	mDepth(0),
 	mStencil(0),
 	mUseDepth(false),
@@ -107,6 +109,9 @@ void LLRenderTarget::resize(U32 resx, U32 resy, U32 color_fmt)
 
 bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples)
 {
+	resx = llmin(resx, (U32) 4096);
+	resy = llmin(resy, (U32) 4096);
+
 	stop_glerror();
 	release();
 	stop_glerror();
@@ -146,7 +151,7 @@ bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, boo
 				glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
 				stop_glerror();
 			}
-			glBindFramebuffer(GL_FRAMEBUFFER, 0);
+			glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
 		}
 		
 		stop_glerror();
@@ -233,7 +238,7 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)
 
 		check_framebuffer_status();
 		
-		glBindFramebuffer(GL_FRAMEBUFFER, 0);
+		glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
 	}
 
 	mTex.push_back(tex);
@@ -322,7 +327,7 @@ void LLRenderTarget::shareDepthBuffer(LLRenderTarget& target)
 
 		check_framebuffer_status();
 
-		glBindFramebuffer(GL_FRAMEBUFFER, 0);
+		glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
 
 		target.mUseDepth = true;
 	}
@@ -385,9 +390,13 @@ void LLRenderTarget::bindTarget()
 {
 	if (mFBO)
 	{
+		mPreviousFBO = sCurFBO;
+
 		stop_glerror();
 		
 		glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+		sCurFBO = mFBO;
+
 		stop_glerror();
 		if (gGLManager.mHasDrawBuffers)
 		{ //setup multiple render targets
@@ -413,16 +422,6 @@ void LLRenderTarget::bindTarget()
 	sBoundTarget = this;
 }
 
-// static
-void LLRenderTarget::unbindTarget()
-{
-	if (gGLManager.mHasFramebufferObject)
-	{
-		glBindFramebuffer(GL_FRAMEBUFFER, 0);
-	}
-	sBoundTarget = NULL;
-}
-
 void LLRenderTarget::clear(U32 mask_in)
 {
 	U32 mask = GL_COLOR_BUFFER_BIT;
@@ -488,7 +487,8 @@ void LLRenderTarget::flush(bool fetch_depth)
 	else
 	{
 		stop_glerror();
-		glBindFramebuffer(GL_FRAMEBUFFER, 0);
+		glBindFramebuffer(GL_FRAMEBUFFER, mPreviousFBO);
+		sCurFBO = mPreviousFBO;
 		stop_glerror();
 	}
 }
@@ -518,7 +518,7 @@ void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0,
 		stop_glerror();
 		glCopyTexSubImage2D(LLTexUnit::getInternalType(mUsage), 0, srcX0, srcY0, dstX0, dstY0, dstX1, dstY1);
 		stop_glerror();
-		glBindFramebuffer(GL_FRAMEBUFFER, 0);
+		glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
 		stop_glerror();
 	}
 	else
@@ -535,7 +535,7 @@ void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0,
 		stop_glerror();
 		glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
 		stop_glerror();
-		glBindFramebuffer(GL_FRAMEBUFFER, 0);
+		glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
 		stop_glerror();
 	}
 }
@@ -561,7 +561,7 @@ void LLRenderTarget::copyContentsToFramebuffer(LLRenderTarget& source, S32 srcX0
 		stop_glerror();
 		glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
 		stop_glerror();
-		glBindFramebuffer(GL_FRAMEBUFFER, 0);
+		glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
 		stop_glerror();
 	}
 }
diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h
index e1a51304f1747f0be9a10c00450f2f3355c370ee..cf15f66d318c8902bff8d4fd74cd33736d8c591c 100644
--- a/indra/llrender/llrendertarget.h
+++ b/indra/llrender/llrendertarget.h
@@ -63,6 +63,7 @@ class LLRenderTarget
 	//whether or not to use FBO implementation
 	static bool sUseFBO; 
 	static U32 sBytesAllocated;
+	static U32 sCurFBO;
 
 	LLRenderTarget();
 	~LLRenderTarget();
@@ -96,9 +97,6 @@ class LLRenderTarget
 	//applies appropriate viewport
 	void bindTarget();
 
-	//unbind target for rendering
-	static void unbindTarget();
-	
 	//clear render targer, clears depth buffer if present,
 	//uses scissor rect if in copy-to-texture mode
 	void clear(U32 mask = 0xFFFFFFFF);
@@ -148,6 +146,7 @@ class LLRenderTarget
 	std::vector<U32> mTex;
 	std::vector<U32> mInternalFormat;
 	U32 mFBO;
+	U32 mPreviousFBO;
 	U32 mDepth;
 	bool mStencil;
 	bool mUseDepth;
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 423e5a00df23f8ed55264c9e813b32723a81f948..3e0de834b45b20ef5c17d1342c8b6f849b9cbf61 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -14290,5 +14290,17 @@
         <real>1.0</real>
       </array>
     </map>
+
+  <key>SimulateFBOFailure</key>
+  <map>
+    <key>Comment</key>
+    <string>[DEBUG] Make allocateScreenBuffer return false.  Used to test error handling.</string>
+    <key>Persist</key>
+    <integer>0</integer>
+    <key>Type</key>
+    <string>Boolean</string>
+    <key>Value</key>
+    <integer>0</integer>
+  </map>
 </map>
 </llsd>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
index e02a7b405b866b7d18bec0698475a0dfafdbe474..2cef8f2a5d2a61b2d9857a91e2ac3ae4163da7e4 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
@@ -2093,7 +2093,6 @@ uniform sampler2D diffuseMap;
 uniform vec2 rcp_screen_res;
 uniform vec4 rcp_frame_opt;
 uniform vec4 rcp_frame_opt2;
-uniform vec2 screen_res;
 VARYING vec2 vary_fragcoord;
 VARYING vec2 vary_tc;
 
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index 5e8189caa5f9ff1c11d6c8e049eac016bfff8162..4c39014c8b5238a1cdfc75d41fd96fad94ccab47 100644
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -70,11 +70,11 @@ ATI ASUS EAH58xx						.*ATI.*ASUS.*EAH58.*					5	1	1	4.1
 ATI ASUS EAH62xx						.*ATI.*ASUS.*EAH62.*					2	1	0	0
 ATI ASUS EAH63xx						.*ATI.*ASUS.*EAH63.*					2	1	0	0
 ATI ASUS EAH64xx						.*ATI.*ASUS.*EAH64.*					2	1	0	0
-ATI ASUS EAH65xx						.*ATI.*ASUS.*EAH65.*					2	1	0	0
-ATI ASUS EAH66xx						.*ATI.*ASUS.*EAH66.*					3	1	0	0
+ATI ASUS EAH65xx						.*ATI.*ASUS.*EAH65.*					2	1	0	4.1
+ATI ASUS EAH66xx						.*ATI.*ASUS.*EAH66.*					3	1	0	4.1
 ATI ASUS EAH67xx						.*ATI.*ASUS.*EAH67.*					3	1	0	0
-ATI ASUS EAH68xx						.*ATI.*ASUS.*EAH68.*					5	1	0	0
-ATI ASUS EAH69xx						.*ATI.*ASUS.*EAH69.*					5	1	0	0
+ATI ASUS EAH68xx						.*ATI.*ASUS.*EAH68.*					5	1	0	4
+ATI ASUS EAH69xx						.*ATI.*ASUS.*EAH69.*					5	1	0	4.1
 ATI ASUS Radeon X1xxx					.*ATI.*ASUS.*X1.*						2	1	1	2.1
 ATI Radeon X7xx							.*ATI.*ASUS.*X7.*						1	1	0	0
 ATI Radeon X19xx						.*ATI.*(Radeon|Diamond) X19.* ?.*		2	1	1	2.1
@@ -108,13 +108,22 @@ ATI Radeon HD 65xx						.*ATI.*AMD Radeon.* HD [67]5..[MG]		2	1	1	4.2
 ATI Radeon HD 66xx						.*ATI.*AMD Radeon.* HD [67]6..[MG]		3	1	1	4.2
 ATI Radeon HD 7100						.*ATI.*AMD Radeon.* HD 71.*				2	1	0	0
 ATI Radeon HD 7200						.*ATI.*AMD Radeon.* HD 72.*				2	1	0	0
-ATI Radeon HD 7300						.*ATI.*AMD Radeon.* HD 73.*				2	1	0	0
-ATI Radeon HD 7400						.*ATI.*AMD Radeon.* HD 74.*				2	1	0	0
+ATI Radeon HD 7300						.*ATI.*AMD Radeon.* HD 73.*				2	1	0	4.2
+ATI Radeon HD 7400						.*ATI.*AMD Radeon.* HD 74.*				2	1	0	4.2
 ATI Radeon HD 7500						.*ATI.*AMD Radeon.* HD 75.*				3	1	1	4.2
-ATI Radeon HD 7600						.*ATI.*AMD Radeon.* HD 76.*				3	1	0	0
+ATI Radeon HD 7600						.*ATI.*AMD Radeon.* HD 76.*				3	1	0	4.2
 ATI Radeon HD 7700						.*ATI.*AMD Radeon.* HD 77.*				4	1	1	4.2
 ATI Radeon HD 7800						.*ATI.*AMD Radeon.* HD 78.*				5	1	1	4.2
 ATI Radeon HD 7900						.*ATI.*AMD Radeon.* HD 79.*				5	1	1	4.2
+ATI ASUS HD7100							.*ATI.*ASUS.* HD71.*					2	1	0	0
+ATI ASUS HD7200							.*ATI.*ASUS.* HD72.*					2	1	0	0
+ATI ASUS HD7300							.*ATI.*ASUS.* HD73.*					2	1	0	0
+ATI ASUS HD7400							.*ATI.*ASUS.* HD74.*					2	1	0	0
+ATI ASUS HD7500							.*ATI.*ASUS.* HD75.*					3	1	1	4.2
+ATI ASUS HD7600							.*ATI.*ASUS.* HD76.*					3	1	0	0
+ATI ASUS HD7700							.*ATI.*ASUS.* HD77.*					4	1	1	4.2
+ATI ASUS HD7800							.*ATI.*ASUS.* HD78.*					5	1	1	4.2
+ATI ASUS HD7900							.*ATI.*ASUS.* HD79.*					5	1	1	4.2
 ATI Mobility Radeon 4100				.*ATI.*Mobility.*41..					1	1	1	3.3
 ATI Mobility Radeon 7xxx				.*ATI.*Mobility.*Radeon 7.*				0	1	1	1.3
 ATI Mobility Radeon 8xxx				.*ATI.*Mobility.*Radeon 8.*				0	1	0	0
@@ -167,6 +176,7 @@ ATI Radeon HD 3400						.*ATI.*Radeon HD *34..					1	1	1	4
 ATI Radeon HD 3500						.*ATI.*Radeon HD *35..					2	1	0	0
 ATI Radeon HD 3600						.*ATI.*Radeon HD *36..					3	1	1	3.3
 ATI Radeon HD 3700						.*ATI.*Radeon HD *37..					3	1	0	0
+ATI HD3700								.*ATI.* HD37..							3	1	0	3.3
 ATI Radeon HD 3800						.*ATI.*Radeon HD *38..					3	1	1	4
 ATI Radeon HD 4100						.*ATI.*Radeon HD *41..					1	1	0	0
 ATI Radeon HD 4200						.*ATI.*Radeon HD *42..					1	1	1	4
@@ -176,8 +186,10 @@ ATI Radeon HD 4500						.*ATI.*Radeon HD *45..					2	1	1	3.3
 ATI Radeon HD 4600						.*ATI.*Radeon HD *46..					3	1	1	4
 ATI Radeon HD 4700						.*ATI.*Radeon HD *47..					3	1	1	3.3
 ATI Radeon HD 4800						.*ATI.*Radeon HD *48..					3	1	1	4
+ATI ASUS EAH5400						.*ATI.*ASUS EAH54..						3	1	1	4.2
 ATI Radeon HD 5400						.*ATI.*Radeon HD *54..					3	1	1	4.2
 ATI Radeon HD 5500						.*ATI.*Radeon HD *55..					3	1	1	4.2
+ATI ASUS EAH5500						.*ATI.*ASUS EAH55..						3	1	1	4.2
 ATI Radeon HD 5600						.*ATI.*Radeon HD *56..					3	1	1	4.2
 ATI Radeon HD 5700						.*ATI.*Radeon HD *57..					3	1	1	4.2
 ATI Radeon HD 5800						.*ATI.*Radeon HD *58..					4	1	1	4.2
@@ -270,7 +282,7 @@ ATI FirePro 5000						.*ATI.*FirePro V5.*						3	1	0	0
 ATI FirePro 7000						.*ATI.*FirePro V7.*						3	1	0	0
 ATI FirePro M							.*ATI.*FirePro M.*						3	1	1	4.2
 ATI R300 (9700)							.*R300.*								0	1	1	2.1
-ATI Radeon								.*ATI.*(Diamond|Radeon).*				0	1	0	0
+ATI Radeon								.*ATI.*(Diamond|Radeon).*				0	1	0	4.2
 Intel X3100								.*Intel.*X3100.*						1	1	1	2.1
 Intel GMA 3600							.*Intel.* 3600.*						0	1	1	3
 Intel 830M								.*Intel.*830M							0	0	0	0
@@ -293,9 +305,9 @@ Intel Brookdale							.*Intel.*Brookdale.*					0	0	1	1.3
 Intel Cantiga							.*Intel.*Cantiga.*						0	0	1	2
 Intel Eaglelake							.*Intel.*Eaglelake.*					1	1	1	2
 Intel Graphics Media HD					.*Intel.*Graphics Media.*HD.*			1	1	1	2.1
-Intel HD Graphics 2000					.*Intel.*HD Graphics 2.*				2	1	0	0
+Intel HD Graphics 2000					.*Intel.*HD Graphics 2.*				2	1	0	4
 Intel HD Graphics 3000					.*Intel.*HD Graphics 3.*				3	1	1	3.1
-Intel HD Graphics 4000					.*Intel.*HD Graphics 4.*				3	1	1	3.3
+Intel HD Graphics 4000					.*Intel.*HD Graphics 4.*				3	1	1	4
 Intel HD2000							.*Intel.*HD2000.*						2	1	0	0
 Intel HD3000							.*Intel.*HD3000.*						3	1	0	0
 Intel HD Graphics						.*Intel.*HD Graphics.*					2	1	1	4
@@ -341,8 +353,8 @@ NVIDIA GT 325M							.*NVIDIA .*GT *32*M.*					3	1	1	3.3
 NVIDIA GT 330M							.*NVIDIA .*GT *33*M.*					3	1	1	3.3
 NVIDIA GT 340M							.*NVIDIA .*GT *34*M.*					4	1	1	3.3
 NVIDIA GTS 350M							.*NVIDIA .*GTS *35*M.*					4	1	1	3.3
-NVIDIA GTS 360M							.*NVIDIA .*GTS *36*M.*					5	1	1	3.3
-NVIDIA 405M								.*NVIDIA .* 40*M.*						2	1	0	0
+NVIDIA GTS 360M							.*NVIDIA .*GTS *360M.*					5	1	1	3.3
+NVIDIA 405M								.*NVIDIA .* 40*M.*						2	1	0	4.2
 NVIDIA 410M								.*NVIDIA .* 41*M.*						3	1	0	0
 NVIDIA GT 415M							.*NVIDIA .*GT *41*M.*					3	1	1	4.2
 NVIDIA GT 420M							.*NVIDIA .*GT *42*M.*					3	1	1	4.2
@@ -369,46 +381,51 @@ NVIDIA GTX 670M							.*NVIDIA .*GTX *67*M.*					5	1	1	4.2
 NVIDIA GTX 680M							.*NVIDIA .*GTX *68*M.*					5	1	0	0
 NVIDIA GTX 690M							.*NVIDIA .*GTX *69*M.*					5	1	0	0
 NVIDIA G100								.*NVIDIA .*G10.*						3	1	1	4.2
-NVIDIA GT 120							.*NVIDIA .*GT *12.*						2	1	0	0
-NVIDIA GT 130							.*NVIDIA .*GT *13.*						2	1	0	0
+NVIDIA GT 120							.*NVIDIA .*GT *12.*						2	1	0	3
+NVIDIA GT 130							.*NVIDIA .*GT *13.*						2	1	0	3.3
 NVIDIA GTS 150							.*NVIDIA .*GTS *15.*					2	1	0	0
-NVIDIA 205								.*NVIDIA .*GeForce 205.*				2	1	1	3.3
+NVIDIA 200								.*NVIDIA .*GeForce 20.*					2	1	1	3.3
+NVIDIA G200								.*NVIDIA .*GeForce G20.*				2	1	1	3.3
+NVIDIA G210								.*NVIDIA .*GeForce G210.*				3	1	1	3.3
 NVIDIA 210								.*NVIDIA .*GeForce 210.*				3	1	1	3.3
 NVIDIA GT 220							.*NVIDIA .*GT *22.*						2	1	1	3.3
+NVIDIA GT 230							.*NVIDIA .*GT *23.*						2	1	1	3.3
+NVIDIA GT 240							.*NVIDIA .*GT *24.*						4	1	1	3.3
 NVIDIA GTS 240							.*NVIDIA .*GTS *24.*					4	1	1	3.3
 NVIDIA GTS 250							.*NVIDIA .*GTS *25.*					4	1	1	3.3
 NVIDIA GTX 260							.*NVIDIA .*GTX *26.*					4	1	1	3.3
-NVIDIA GTX 270							.*NVIDIA .*GTX *27.*					4	1	0	0
+NVIDIA GTX 270							.*NVIDIA .*GTX *27.*					4	1	0	3.3
 NVIDIA GTX 280							.*NVIDIA .*GTX *28.*					4	1	1	3.3
-NVIDIA GTX 290							.*NVIDIA .*GTX *29.*					5	1	0	0
+NVIDIA GTX 290							.*NVIDIA .*GTX *29.*					5	1	0	3.3
 NVIDIA 310								.*NVIDIA .*GeForce 310.*				3	1	1	3.3
 NVIDIA 315								.*NVIDIA .*GeForce 315.*				3	1	1	3.3
-NVIDIA GT 320							.*NVIDIA .*GT *32.*						3	1	0	0
-NVIDIA GT 330							.*NVIDIA .*GT *33.*						3	1	0	0
+NVIDIA GT 320							.*NVIDIA .*GT *32.*						3	1	0	3.3
+NVIDIA GT 330							.*NVIDIA .*GT *33.*						3	1	0	3.3
 NVIDIA GT 340							.*NVIDIA .*GT *34.*						3	1	0	0
-NVIDIA 405								.*NVIDIA .* 405.*						3	1	0	0
+NVIDIA 405								.*NVIDIA .* 405.*						3	1	0	3.3
 NVIDIA GT 420							.*NVIDIA .*GT *42.*						3	1	1	4.2
-NVIDIA GT 430							.*NVIDIA .*GT *43.*						3	1	1	4.1
-NVIDIA GT 440							.*NVIDIA .*GT *44.*						4	1	0	0
+NVIDIA GT 430							.*NVIDIA .*GT *43.*						3	1	1	4.2
+NVIDIA GT 440							.*NVIDIA .*GT *44.*						4	1	0	4.2
 NVIDIA GTS 450							.*NVIDIA .*GTS *45.*					4	1	1	4.2
-NVIDIA GTX 460							.*NVIDIA .*GTX *46.*					5	1	1	4.2
+NVIDIA GTX 460							.*NVIDIA .*GTX *46.*					5	1	1	4.3
 NVIDIA GTX 470							.*NVIDIA .*GTX *47.*					5	1	1	4.2
 NVIDIA GTX 480							.*NVIDIA .*GTX *48.*					5	1	1	4.2
 NVIDIA 510								.*NVIDIA .* 510.*						3	1	0	0
 NVIDIA GT 520							.*NVIDIA .*GT *52.*						3	1	1	4.2
 NVIDIA GT 530							.*NVIDIA .*GT *53.*						3	1	1	4.2
 NVIDIA GT 540							.*NVIDIA .*GT *54.*						3	1	1	4.2
-NVIDIA GTX 550							.*NVIDIA .*GTX *55.*					5	1	1	4.2
+NVIDIA GTX 550							.*NVIDIA .*GTX *55.*					5	1	1	4.3
 NVIDIA GTX 560							.*NVIDIA .*GTX *56.*					5	1	1	4.2
 NVIDIA GTX 570							.*NVIDIA .*GTX *57.*					5	1	1	4.2
-NVIDIA GTX 580							.*NVIDIA .*GTX *58.*					5	1	1	4.2
+NVIDIA GTX 580							.*NVIDIA .*GTX *58.*					5	1	1	4.3
 NVIDIA GTX 590							.*NVIDIA .*GTX *59.*					5	1	1	4.2
 NVIDIA GT 610							.*NVIDIA .*GT *61.*						3	1	1	4.2
-NVIDIA GT 620							.*NVIDIA .*GT *62.*						3	1	0	0
-NVIDIA GT 630							.*NVIDIA .*GT *63.*						3	1	0	0
-NVIDIA GT 640							.*NVIDIA .*GT *64.*						3	1	0	0
+NVIDIA GT 620							.*NVIDIA .*GT *62.*						3	1	0	4.2
+NVIDIA GT 630							.*NVIDIA .*GT *63.*						3	1	0	4.2
+NVIDIA GT 640							.*NVIDIA .*GT *64.*						3	1	0	4.3
 NVIDIA GT 650							.*NVIDIA .*GT *65.*						3	1	1	4.2
-NVIDIA GTX 660							.*NVIDIA .*GTX *66.*					5	1	0	0
+NVIDIA GTX 650							.*NVIDIA .*GTX *65.*					3	1	1	4.2
+NVIDIA GTX 660							.*NVIDIA .*GTX *66.*					5	1	0	4.3
 NVIDIA GTX 670							.*NVIDIA .*GTX *67.*					5	1	1	4.2
 NVIDIA GTX 680							.*NVIDIA .*GTX *68.*					5	1	1	4.2
 NVIDIA GTX 690							.*NVIDIA .*GTX *69.*					5	1	1	4.2
@@ -442,8 +459,8 @@ NVIDIA GeForce 7600						.*NVIDIA .*GeForce 76.*					2	1	1	2.1
 NVIDIA GeForce 7800						.*NVIDIA .*GeForce 78.*					2	1	1	2.1
 NVIDIA GeForce 7900						.*NVIDIA .*GeForce 79.*					3	1	1	2.1
 NVIDIA GeForce 8100						.*NVIDIA .*GeForce 81.*					1	1	0	0
-NVIDIA GeForce 8200M					.*NVIDIA .*GeForce 8200M.*				1	1	0	0
-NVIDIA GeForce 8200						.*NVIDIA .*GeForce 82.*					1	1	0	0
+NVIDIA GeForce 8200M					.*NVIDIA .*GeForce 8200M.*				1	1	0	3.3
+NVIDIA GeForce 8200						.*NVIDIA .*GeForce 82.*					1	1	0	2.1
 NVIDIA GeForce 8300						.*NVIDIA .*GeForce 83.*					3	1	1	3.3
 NVIDIA GeForce 8400M					.*NVIDIA .*GeForce 8400M.*				1	1	1	3.3
 NVIDIA GeForce 8400						.*NVIDIA .*GeForce 84.*					2	1	1	3.3
@@ -455,9 +472,9 @@ NVIDIA GeForce 8700						.*NVIDIA .*GeForce 87.*					3	1	0	0
 NVIDIA GeForce 8800M					.*NVIDIA .*GeForce 8800M.*				2	1	1	3.3
 NVIDIA GeForce 8800						.*NVIDIA .*GeForce 88.*					3	1	1	3.3
 NVIDIA GeForce 9100M					.*NVIDIA .*GeForce 9100M.*				0	1	0	0
-NVIDIA GeForce 9100						.*NVIDIA .*GeForce 91.*					0	1	0	0
-NVIDIA GeForce 9200M					.*NVIDIA .*GeForce 9200M.*				1	1	0	0
-NVIDIA GeForce 9200						.*NVIDIA .*GeForce 92.*					1	1	0	0
+NVIDIA GeForce 9100						.*NVIDIA .*GeForce 91.*					0	1	0	3.3
+NVIDIA GeForce 9200M					.*NVIDIA .*GeForce 9200M.*				1	1	0	3.1
+NVIDIA GeForce 9200						.*NVIDIA .*GeForce 92.*					1	1	0	3.3
 NVIDIA GeForce 9300M					.*NVIDIA .*GeForce 9300M.*				1	1	1	3.3
 NVIDIA GeForce 9300						.*NVIDIA .*GeForce 93.*					1	1	1	3.3
 NVIDIA GeForce 9400M					.*NVIDIA .*GeForce 9400M.*				2	1	1	3.3
@@ -470,7 +487,7 @@ NVIDIA GeForce 9700M					.*NVIDIA .*GeForce 9700M.*				0	1	1	3.3
 NVIDIA GeForce 9800M					.*NVIDIA .*GeForce 9800M.*				2	1	1	3.3
 NVIDIA GeForce 9800						.*NVIDIA .*GeForce 98.*					3	1	1	3.3
 NVIDIA GeForce FX 5100					.*NVIDIA .*GeForce FX 51.*				0	1	0	0
-NVIDIA GeForce FX 5200					.*NVIDIA .*GeForce FX 52.*				0	1	0	0
+NVIDIA GeForce FX 5200					.*NVIDIA .*GeForce FX 52.*				0	1	0	2.1
 NVIDIA GeForce FX 5300					.*NVIDIA .*GeForce FX 53.*				0	1	0	0
 NVIDIA GeForce FX 5500					.*NVIDIA .*GeForce FX 55.*				0	1	1	2.1
 NVIDIA GeForce FX 5600					.*NVIDIA .*GeForce FX 56.*				1	1	1	2.1
@@ -505,7 +522,7 @@ NVIDIA D9M								.*NVIDIA .*D9M.*						1	1	0	0
 NVIDIA G94								.*NVIDIA .*G94.*						3	1	0	0
 NVIDIA GeForce Go 6						.*GeForce Go 6.*						1	1	0	0
 NVIDIA ION 2							.*NVIDIA .*ION 2.*						2	1	0	0
-NVIDIA ION 								.*NVIDIA Corporation.*ION.*				2	1	1	0
+NVIDIA ION 								.*NVIDIA Corporation.*ION.*				2	1	1	3.3
 NVIDIA NB8M								.*NVIDIA .*NB8M.*						1	1	0	0
 NVIDIA NB8P								.*NVIDIA .*NB8P.*						2	1	0	0
 NVIDIA NB9E								.*NVIDIA .*NB9E.*						3	1	0	0
@@ -513,7 +530,7 @@ NVIDIA NB9M								.*NVIDIA .*NB9M.*						1	1	0	0
 NVIDIA NB9P								.*NVIDIA .*NB9P.*						2	1	0	0
 NVIDIA N10								.*NVIDIA .*N10.*						1	1	0	0
 NVIDIA GeForce PCX						.*GeForce PCX.*							0	1	0	0
-NVIDIA Generic							.*NVIDIA .*Unknown.*					0	0	0	0
+NVIDIA Generic							.*NVIDIA .*Unknown.*					0	0	0	3
 NVIDIA NV17								.*NVIDIA .*NV17.*						0	1	0	0
 NVIDIA NV34								.*NVIDIA .*NV34.*						0	1	0	0
 NVIDIA NV35								.*NVIDIA .*NV35.*						0	1	0	0
@@ -521,7 +538,7 @@ NVIDIA NV36								.*NVIDIA .*NV36.*						1	1	0	0
 NVIDIA NV41								.*NVIDIA .*NV41.*						1	1	0	0
 NVIDIA NV43								.*NVIDIA .*NV43.*						1	1	0	0
 NVIDIA NV44								.*NVIDIA .*NV44.*						1	1	0	0
-NVIDIA nForce							.*NVIDIA .*nForce.*						0	0	0	0
+NVIDIA nForce							.*NVIDIA .*nForce.*						0	0	0	3.3
 NVIDIA MCP51							.*NVIDIA .*MCP51.*						1	1	0	0
 NVIDIA MCP61							.*NVIDIA .*MCP61.*						1	1	0	0
 NVIDIA MCP67							.*NVIDIA .*MCP67.*						1	1	0	0
@@ -532,40 +549,40 @@ NVIDIA MCP78							.*NVIDIA .*MCP78.*						1	1	0	0
 NVIDIA MCP79							.*NVIDIA .*MCP79.*						1	1	0	0
 NVIDIA MCP7A							.*NVIDIA .*MCP7A.*						1	1	0	0
 NVIDIA Quadro2							.*Quadro2.*								0	1	0	0
-NVIDIA Quadro 1000M						.*Quadro.*1000M.*						2	1	0	0
-NVIDIA Quadro 2000 M/D					.*Quadro.*2000.*						3	1	0	0
+NVIDIA Quadro 1000M						.*Quadro.*1000M.*						2	1	0	4.2
+NVIDIA Quadro 2000 M/D					.*Quadro.*2000.*						3	1	0	4.2
 NVIDIA Quadro 3000M						.*Quadro.*3000M.*						3	1	0	0
 NVIDIA Quadro 4000M						.*Quadro.*4000M.*						3	1	0	0
-NVIDIA Quadro 4000						.*Quadro *4000.*						3	1	0	0
+NVIDIA Quadro 4000						.*Quadro *4000.*						3	1	0	4.2
 NVIDIA Quadro 50x0 M					.*Quadro.*50.0.*						3	1	0	0
 NVIDIA Quadro 6000						.*Quadro.*6000.*						3	1	0	0
-NVIDIA Quadro 400						.*Quadro.*400.*							2	1	0	0
-NVIDIA Quadro 600						.*Quadro.*600.*							2	1	0	0
+NVIDIA Quadro 400						.*Quadro.*400.*							2	1	0	3.3
+NVIDIA Quadro 600						.*Quadro.*600.*							2	1	0	3.3
 NVIDIA Quadro4							.*Quadro4.*								0	1	0	0
 NVIDIA Quadro DCC						.*Quadro DCC.*							0	1	0	0
 NVIDIA Quadro CX						.*Quadro.*CX.*							3	1	0	0
 NVIDIA Quadro FX 770M					.*Quadro.*FX *770M.*					2	1	0	0
-NVIDIA Quadro FX 1500M					.*Quadro.*FX *1500M.*					1	1	0	0
+NVIDIA Quadro FX 1500M					.*Quadro.*FX *1500M.*					1	1	0	2.1
 NVIDIA Quadro FX 1600M					.*Quadro.*FX *1600M.*					2	1	0	0
 NVIDIA Quadro FX 2500M					.*Quadro.*FX *2500M.*					2	1	0	0
 NVIDIA Quadro FX 2700M					.*Quadro.*FX *2700M.*					3	1	0	0
-NVIDIA Quadro FX 2800M					.*Quadro.*FX *2800M.*					3	1	0	0
-NVIDIA Quadro FX 3500					.*Quadro.*FX *3500.*					2	1	0	0
+NVIDIA Quadro FX 2800M					.*Quadro.*FX *2800M.*					3	1	0	3.3
+NVIDIA Quadro FX 3500					.*Quadro.*FX *3500.*					2	1	0	2.1
 NVIDIA Quadro FX 3600					.*Quadro.*FX *3600.*					3	1	0	0
-NVIDIA Quadro FX 3700					.*Quadro.*FX *3700.*					3	1	0	0
-NVIDIA Quadro FX 3800					.*Quadro.*FX *3800.*					3	1	0	0
+NVIDIA Quadro FX 3700					.*Quadro.*FX *3700.*					3	1	0	3.3
+NVIDIA Quadro FX 3800					.*Quadro.*FX *3800.*					3	1	0	3.2
 NVIDIA Quadro FX 4500					.*Quadro.*FX *45.*						3	1	0	0
-NVIDIA Quadro FX 880M					.*Quadro.*FX *880M.*					3	1	0	0
+NVIDIA Quadro FX 880M					.*Quadro.*FX *880M.*					3	1	0	3.3
 NVIDIA Quadro FX 4800					.*NVIDIA .*Quadro *FX *4800.*			3	1	0	0
-NVIDIA Quadro FX						.*Quadro FX.*							1	1	0	0
-NVIDIA Quadro NVS 1xxM					.*Quadro NVS *1.[05]M.*					0	1	1	2.1
+NVIDIA Quadro FX						.*Quadro FX.*							1	1	0	3.3
+NVIDIA Quadro NVS 1xxM					.*Quadro NVS *1.[05]M.*					0	1	1	3.3
 NVIDIA Quadro NVS 300M					.*NVIDIA .*NVS *300M.*					2	1	0	0
 NVIDIA Quadro NVS 320M					.*NVIDIA .*NVS *320M.*					2	1	0	0
 NVIDIA Quadro NVS 2100M					.*NVIDIA .*NVS *2100M.*					2	1	0	0
 NVIDIA Quadro NVS 3100M					.*NVIDIA .*NVS *3100M.*					2	1	0	0
-NVIDIA Quadro NVS 4200M					.*NVIDIA .*NVS *4200M.*					2	1	0	0
+NVIDIA Quadro NVS 4200M					.*NVIDIA .*NVS *4200M.*					2	1	0	4.1
 NVIDIA Quadro NVS 5100M					.*NVIDIA .*NVS *5100M.*					2	1	0	0
-NVIDIA Quadro NVS						.*NVIDIA .*NVS							0	1	0	0
+NVIDIA Quadro NVS						.*NVIDIA .*NVS							0	1	0	3.2
 NVIDIA Corporation N12P					.*NVIDIA .*N12P.*						1	1	1	4.1
 NVIDIA Corporation N11M					.*NVIDIA .*N11M.*						2	1	0	0
 NVIDIA RIVA TNT							.*RIVA TNT.*							0	0	0	0
@@ -579,5 +596,3 @@ Apple Generic							Apple.*Generic.*						0	0	0	0
 Apple Software Renderer					Apple.*Software Renderer.*				0	0	0	0
 Humper									Humper.*								0	1	1	2.1
 PowerVR SGX545							.*PowerVR SGX.*							1	1	1	3
-
-
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index 6f11d4d4cae0d15f4e0bf2425ceee5d5589ce684..24a27c51464270da62852bf428148bb2b872710d 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -419,7 +419,7 @@ void LLFeatureManager::parseGPUTable(std::string filename)
 
 		// setup the tokenizer
 		std::string buf(buffer);
-		std::string cls, label, expr, supported;
+		std::string cls, label, expr, supported, stats_based, expected_gl_version;
 		boost_tokenizer tokens(buf, boost::char_separator<char>("\t\n"));
 		boost_tokenizer::iterator token_iter = tokens.begin();
 
@@ -440,6 +440,14 @@ void LLFeatureManager::parseGPUTable(std::string filename)
 		{
 			supported = *token_iter++;
 		}
+		if (token_iter != tokens.end())
+		{
+			stats_based = *token_iter++;
+		}
+		if (token_iter != tokens.end())
+		{
+			expected_gl_version = *token_iter++;
+		}
 
 		if (label.empty() || expr.empty() || cls.empty() || supported.empty())
 		{
@@ -450,7 +458,9 @@ void LLFeatureManager::parseGPUTable(std::string filename)
 		json << "{'label' : '" << label << "',\n" << 
 			"'regexp' : '" << expr << "',\n" <<
 			"'class' : '" << cls << "',\n" <<
-			"'supported' : '" << supported << "'\n},\n";
+			"'supported' : '" << supported << "',\n" <<
+			"'stats_based' : " << stats_based <<  ",\n" <<
+			"'gl_version' : " << expected_gl_version << "\n},\n";
 #endif
 
 		for (U32 i = 0; i < expr.length(); i++)	 /*Flawfinder: ignore*/
@@ -720,7 +730,9 @@ void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures)
 			maskFeatures("High");
 			maskFeatures("Class5");
 			break;
-		
+		case 6:
+			maskFeatures("Ultra");
+			break;
 		default:
 			maskFeatures("Low");
 			maskFeatures("Class0");
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 2c3f460701bdfb8adabdcdb178f03fb96ede8357..13d8a79f8d14df4926e108fbceab6d7528cb3eba 100755
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -749,7 +749,10 @@ void LLFloaterPreference::onClose(bool app_quitting)
 {
 	gSavedSettings.setS32("LastPrefTab", getChild<LLTabContainer>("pref core")->getCurrentPanelIndex());
 	LLPanelLogin::setAlwaysRefresh(false);
-	cancel();
+	if (!app_quitting)
+	{
+		cancel();
+	}
 }
 
 void LLFloaterPreference::onOpenHardwareSettings()
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 6916cf813a5754ce8fabb6dbab16ba48148507a6..81eb1d397e822a00bd3c7502120bd133c4d4990a 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -238,6 +238,7 @@ LLGroupMgrGroupData::LLGroupMgrGroupData(const LLUUID& id) :
 	mPendingRoleMemberRequest(FALSE),
 	mAccessTime(0.0f)
 {
+	mMemberVersion.generate();
 }
 
 void LLGroupMgrGroupData::setAccessed()
@@ -318,14 +319,14 @@ void LLGroupMgrGroupData::setRoleData(const LLUUID& role_id, LLRoleData role_dat
 			role_data.mChangeType = RC_UPDATE_DATA;
 		}
 		else
-	{
+		{
 			role_data.mChangeType = RC_UPDATE_POWERS;
 		}
 
 		mRoleChanges[role_id] = role_data;
 	}
 	else
-		{
+	{
 		llwarns << "Change being made to non-existant role " << role_id << llendl;
 	}
 }
@@ -424,6 +425,7 @@ void LLGroupMgrGroupData::removeMemberData()
 	}
 	mMembers.clear();
 	mMemberDataComplete = FALSE;
+	mMemberVersion.generate();
 }
 
 void LLGroupMgrGroupData::removeRoleData()
@@ -945,6 +947,8 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
 		}
 	}
 
+	group_datap->mMemberVersion.generate();
+
 	if (group_datap->mMembers.size() ==  (U32)group_datap->mMemberCount)
 	{
 		group_datap->mMemberDataComplete = TRUE;
@@ -1771,8 +1775,6 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
 	bool start_message = true;
 	LLMessageSystem* msg = gMessageSystem;
 
-	
-
 	LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id);
 	if (!group_datap) return;
 
@@ -1833,6 +1835,8 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
 	{
 		gAgent.sendReliableMessage();
 	}
+
+	group_datap->mMemberVersion.generate();
 }
 
 
@@ -1990,6 +1994,8 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
 		group_datap->mMembers[member_id] = data;
 	}
 
+	group_datap->mMemberVersion.generate();
+
 	// Technically, we have this data, but to prevent completely overhauling
 	// this entire system (it would be nice, but I don't have the time), 
 	// I'm going to be dumb and just call services I most likely don't need 
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index 62b2978f2188627e4086d3f9204503552ce6bba5..d8c1ab7ef5f92d2ea65b6b0cea1e11e7e5e6ddb7 100644
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -236,6 +236,8 @@ friend class LLGroupMgr;
 	F32 getAccessTime() const { return mAccessTime; }
 	void setAccessed();
 
+	const LLUUID& getMemberVersion() const { return mMemberVersion; }
+
 public:
 	typedef	std::map<LLUUID,LLGroupMemberData*> member_list_t;
 	typedef	std::map<LLUUID,LLGroupRoleData*> role_list_t;
@@ -284,6 +286,9 @@ friend class LLGroupMgr;
 
 	BOOL				mPendingRoleMemberRequest;
 	F32					mAccessTime;
+
+	// Generate a new ID every time mMembers
+	LLUUID				mMemberVersion;
 };
 
 struct LLRoleAction
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index 51b4d2ea65f51a96221a8574ad08fc739935a70e..993ffb7825dc530358f4ac7665d17a571330b926 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -670,7 +670,6 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
 		{
 			mMemberProgress = gdatap->mMembers.begin();
 			mPendingMemberUpdate = TRUE;
-			mUdpateSessionID.generate();
 
 			sSDTime = 0.0f;
 			sElementTime = 0.0f;
@@ -730,7 +729,7 @@ void LLPanelGroupGeneral::updateMembers()
 			// If name is not cached, onNameCache() should be called when it is cached and add this member to list.
 			LLAvatarNameCache::get(mMemberProgress->first, 
 									boost::bind(&LLPanelGroupGeneral::onNameCache,
-												this, mUdpateSessionID, member, _1, _2));
+												this, gdatap->getMemberVersion(), member, _2));
 		}
 	}
 
@@ -768,11 +767,15 @@ void LLPanelGroupGeneral::addMember(LLGroupMemberData* member)
 	}
 }
 
-void LLPanelGroupGeneral::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name)
+void LLPanelGroupGeneral::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name)
 {
-	if (!member 
-		|| update_id != mUdpateSessionID)
+	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
+
+	if (!gdatap
+		|| !gdatap->isMemberDataComplete()
+		|| gdatap->getMemberVersion() != update_id)
 	{
+		// Stale data
 		return;
 	}
 
diff --git a/indra/newview/llpanelgroupgeneral.h b/indra/newview/llpanelgroupgeneral.h
index b179f78c56781336107387a3416404507e1a8579..1b4e8e2645225c769b6f109ddc995f9b8995fa8b 100644
--- a/indra/newview/llpanelgroupgeneral.h
+++ b/indra/newview/llpanelgroupgeneral.h
@@ -63,7 +63,7 @@ class LLPanelGroupGeneral : public LLPanelGroupTab
 
 	virtual void setupCtrls	(LLPanel* parent);
 
-	void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name);
+	void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name);
 private:
 	void	reset();
 
@@ -90,7 +90,6 @@ class LLPanelGroupGeneral : public LLPanelGroupTab
 	BOOL			mChanged;
 	BOOL			mFirstUse;
 	std::string		mIncompleteMemberDataStr;
-	LLUUID			mUdpateSessionID;
 
 	// Group information (include any updates in updateChanged)
 	LLLineEditor		*mGroupNameEditor;
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index 7ad7e7149b7892cd18c2fd198db9de649bd0b805..73684779054fdac72d606996f20d88a819225ffd 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -745,7 +745,6 @@ LLPanelGroupMembersSubTab::LLPanelGroupMembersSubTab()
 	mHasMatch(FALSE),
 	mNumOwnerAdditions(0)
 {
-	mUdpateSessionID = LLUUID::null;
 }
 
 LLPanelGroupMembersSubTab::~LLPanelGroupMembersSubTab()
@@ -1427,13 +1426,20 @@ U64 LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges(const LLUUID& ag
 		return GP_NO_POWERS;
 	}
 
-	LLGroupMemberData* member_data = gdatap->mMembers[agent_id];
-	if ( !member_data )
+	LLGroupMgrGroupData::member_list_t::iterator iter = gdatap->mMembers.find(agent_id);
+	if ( iter == gdatap->mMembers.end() )
 	{
 		llwarns << "LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges() -- No member data for member with UUID " << agent_id << llendl;
 		return GP_NO_POWERS;
 	}
 
+	LLGroupMemberData* member_data = (*iter).second;
+	if (!member_data)
+	{
+		llwarns << "LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges() -- Null member data for member with UUID " << agent_id << llendl;
+		return GP_NO_POWERS;
+	}
+
 	//see if there are unsaved role changes for this agent
 	role_change_data_map_t* role_change_datap = NULL;
 	member_role_changes_map_t::iterator member = mMemberRoleChangeData.find(agent_id);
@@ -1548,10 +1554,6 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc)
 		mMemberProgress = gdatap->mMembers.begin();
 		mPendingMemberUpdate = TRUE;
 		mHasMatch = FALSE;
-		// Generate unique ID for current updateMembers()- see onNameCache for details.
-		// Using unique UUID is perhaps an overkill but this way we are perfectly safe
-		// from coincidences.
-		mUdpateSessionID.generate();
 	}
 	else
 	{
@@ -1579,14 +1581,14 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc)
 	}
 }
 
-void LLPanelGroupMembersSubTab::addMemberToList(LLUUID id, LLGroupMemberData* data)
+void LLPanelGroupMembersSubTab::addMemberToList(LLGroupMemberData* data)
 {
 	if (!data) return;
 	LLUIString donated = getString("donation_area");
 	donated.setArg("[AREA]", llformat("%d", data->getContribution()));
 
 	LLNameListCtrl::NameItem item_params;
-	item_params.value = id;
+	item_params.value = data->getID();
 
 	item_params.columns.add().column("name").font.name("SANSSERIF_SMALL").style("NORMAL");
 
@@ -1600,17 +1602,12 @@ void LLPanelGroupMembersSubTab::addMemberToList(LLUUID id, LLGroupMemberData* da
 	mHasMatch = TRUE;
 }
 
-void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name)
+void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name)
 {
-	// Update ID is used to determine whether member whose id is passed
-	// into onNameCache() was passed after current or previous user-initiated update.
-	// This is needed to avoid probable duplication of members in list after changing filter
-	// or adding of members of another group if gets for their names were called on
-	// previous update. If this id is from get() called from older update,
-	// we do nothing.
-	if (mUdpateSessionID != update_id) return;
-	
-	if (!member)
+	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
+	if (!gdatap
+		|| gdatap->getMemberVersion() != update_id
+		|| !member)
 	{
 		return;
 	}
@@ -1618,7 +1615,7 @@ void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, LLGroupMemb
 	// trying to avoid unnecessary hash lookups
 	if (matchesSearchFilter(av_name.getUserName()))
 	{
-		addMemberToList(id, member);
+		addMemberToList(member);
 		if(!mMembersList->getEnabled())
 		{
 			mMembersList->setEnabled(TRUE);
@@ -1672,14 +1669,14 @@ void LLPanelGroupMembersSubTab::updateMembers()
 		{
 			if (matchesSearchFilter(av_name.getUserName()))
 			{
-				addMemberToList(mMemberProgress->first, mMemberProgress->second);
+				addMemberToList(mMemberProgress->second);
 			}
 		}
 		else
 		{
 			// If name is not cached, onNameCache() should be called when it is cached and add this member to list.
 			LLAvatarNameCache::get(mMemberProgress->first, boost::bind(&LLPanelGroupMembersSubTab::onNameCache,
-																	   this, mUdpateSessionID, mMemberProgress->second, _1, _2));
+									this, gdatap->getMemberVersion(), mMemberProgress->second, _2));
 		}
 	}
 
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index 8b454e020aec016f89b15521cfb2389ecda1d47d..bead8bd85b4dd9d7b87c4f9545c8f349e0765db4 100644
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -187,8 +187,8 @@ class LLPanelGroupMembersSubTab : public LLPanelGroupSubTab
 
 	virtual void setGroupID(const LLUUID& id);
 
-	void addMemberToList(LLUUID id, LLGroupMemberData* data);
-	void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name);
+	void addMemberToList(LLGroupMemberData* data);
+	void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name);
 
 protected:
 	typedef std::map<LLUUID, LLRoleMemberChangeType> role_change_data_map_t;
@@ -210,9 +210,6 @@ class LLPanelGroupMembersSubTab : public LLPanelGroupSubTab
 	BOOL mPendingMemberUpdate;
 	BOOL mHasMatch;
 
-	// This id is generated after each user initiated member list update(opening Roles or changing filter)
-	LLUUID mUdpateSessionID;
-
 	member_role_changes_map_t mMemberRoleChangeData;
 	U32 mNumOwnerAdditions;
 
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index a61e2d5c869fa067ee78d1589fc187c4c0e61c3d..305f6fca0f71a49487c9bc10a4a9c29a44d2887f 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -1861,7 +1861,12 @@ LLPointer<LLImageRaw> LLTextureCache::readFromFastCache(const LLUUID& id, S32& d
 
 		mFastCachep->seek(APR_SET, offset);		
 	
-		llassert_always(mFastCachep->read(head, TEXTURE_FAST_CACHE_ENTRY_OVERHEAD) == TEXTURE_FAST_CACHE_ENTRY_OVERHEAD);
+		if(mFastCachep->read(head, TEXTURE_FAST_CACHE_ENTRY_OVERHEAD) != TEXTURE_FAST_CACHE_ENTRY_OVERHEAD)
+		{
+			//cache corrupted or under thread race condition
+			closeFastCache(); 
+			return NULL;
+		}
 		
 		S32 image_size = head[0] * head[1] * head[2];
 		if(!image_size) //invalid
@@ -1872,7 +1877,13 @@ LLPointer<LLImageRaw> LLTextureCache::readFromFastCache(const LLUUID& id, S32& d
 		discardlevel = head[3];
 		
 		data =  (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), image_size);
-		llassert_always(mFastCachep->read(data, image_size) == image_size);
+		if(mFastCachep->read(data, image_size) != image_size)
+		{
+			FREE_MEM(LLImageBase::getPrivatePool(), data);
+			closeFastCache();
+			return NULL;
+		}
+
 		closeFastCache();
 	}
 	LLPointer<LLImageRaw> raw = new LLImageRaw(data, head[0], head[1], head[2], true);
@@ -1926,7 +1937,11 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis
 		openFastCache();
 
 		mFastCachep->seek(APR_SET, offset);	
-		llassert_always(mFastCachep->write(mFastCachePadBuffer, TEXTURE_FAST_CACHE_ENTRY_SIZE) == TEXTURE_FAST_CACHE_ENTRY_SIZE);
+		
+		//no need to do this assertion check. When it fails, let it fail quietly.
+		//this failure could happen because other viewer removes the fast cache file when clearing cache.
+		//--> llassert_always(mFastCachep->write(mFastCachePadBuffer, TEXTURE_FAST_CACHE_ENTRY_SIZE) == TEXTURE_FAST_CACHE_ENTRY_SIZE);
+		mFastCachep->write(mFastCachePadBuffer, TEXTURE_FAST_CACHE_ENTRY_SIZE);
 
 		closeFastCache(true);
 	}
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 1b45e6f85da343fd5f7fc3365d472c4e39124405..1d7abb7c1cdaea04a31a85dc5a69b80c764939b2 100755
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -4245,14 +4245,48 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 		image_height = llmin(image_height, window_height);
 	}
 
+	S32 original_width = 0;
+	S32 original_height = 0;
+	bool reset_deferred = false;
+
+	LLRenderTarget scratch_space;
+
 	F32 scale_factor = 1.0f ;
 	if (!keep_window_aspect || (image_width > window_width) || (image_height > window_height))
 	{	
-		// if image cropping or need to enlarge the scene, compute a scale_factor
-		F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ;
-		snapshot_width  = (S32)(ratio * image_width) ;
-		snapshot_height = (S32)(ratio * image_height) ;
-		scale_factor = llmax(1.0f, 1.0f / ratio) ;
+		if ((image_width > window_width || image_height > window_height) && LLPipeline::sRenderDeferred && !show_ui)
+		{
+			if (scratch_space.allocate(image_width, image_height, GL_RGBA, true, true))
+			{
+				original_width = gPipeline.mDeferredScreen.getWidth();
+				original_height = gPipeline.mDeferredScreen.getHeight();
+
+				if (gPipeline.allocateScreenBuffer(image_width, image_height))
+				{
+					window_width = image_width;
+					window_height = image_height;
+					snapshot_width = image_width;
+					snapshot_height = image_height;
+					reset_deferred = true;
+					mWorldViewRectRaw.set(0, image_height, image_width, 0);
+					scratch_space.bindTarget();
+				}
+				else
+				{
+					scratch_space.release();
+					gPipeline.allocateScreenBuffer(original_width, original_height);
+				}
+			}
+		}
+
+		if (!reset_deferred)
+		{
+			// if image cropping or need to enlarge the scene, compute a scale_factor
+			F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ;
+			snapshot_width  = (S32)(ratio * image_width) ;
+			snapshot_height = (S32)(ratio * image_height) ;
+			scale_factor = llmax(1.0f, 1.0f / ratio) ;
+		}
 	}
 	
 	if (show_ui && scale_factor > 1.f)
@@ -4441,11 +4475,20 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 		gPipeline.resetDrawOrders();
 	}
 
+	if (reset_deferred)
+	{
+		mWorldViewRectRaw = window_rect;
+		scratch_space.flush();
+		scratch_space.release();
+		gPipeline.allocateScreenBuffer(original_width, original_height);
+		
+	}
+
 	if (high_res)
 	{
 		send_agent_resume();
 	}
-
+	
 	return ret;
 }
 
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index e1a9ad71f1690f4f28d458a7e84b84e27c82900e..deaf9a425c0777720ea94e426c3343242a2da6a9 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -779,18 +779,57 @@ void LLPipeline::allocatePhysicsBuffer()
 	}
 }
 
-void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
+bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
 {
 	refreshCachedSettings();
-	U32 samples = RenderFSAASamples;
+	
+	bool save_settings = sRenderDeferred;
+	if (save_settings)
+	{
+		// Set this flag in case we crash while resizing window or allocating space for deferred rendering targets
+		gSavedSettings.setBOOL("RenderInitError", TRUE);
+		gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
+	}
+
+	eFBOStatus ret = doAllocateScreenBuffer(resX, resY);
+
+	if (save_settings)
+	{
+		// don't disable shaders on next session
+		gSavedSettings.setBOOL("RenderInitError", FALSE);
+		gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
+	}
+	
+	if (ret == FBO_FAILURE)
+	{ //FAILSAFE: screen buffer allocation failed, disable deferred rendering if it's enabled
+		//NOTE: if the session closes successfully after this call, deferred rendering will be 
+		// disabled on future sessions
+		if (LLPipeline::sRenderDeferred)
+		{
+			gSavedSettings.setBOOL("RenderDeferred", FALSE);
+			LLPipeline::refreshCachedSettings();
+		}
+	}
+
+	return ret == FBO_SUCCESS_FULLRES;
+}
 
-	//try to allocate screen buffers at requested resolution and samples
+
+LLPipeline::eFBOStatus LLPipeline::doAllocateScreenBuffer(U32 resX, U32 resY)
+{
+	// try to allocate screen buffers at requested resolution and samples
 	// - on failure, shrink number of samples and try again
 	// - if not multisampled, shrink resolution and try again (favor X resolution over Y)
 	// Make sure to call "releaseScreenBuffers" after each failure to cleanup the partially loaded state
 
+	U32 samples = RenderFSAASamples;
+
+	eFBOStatus ret = FBO_SUCCESS_FULLRES;
 	if (!allocateScreenBuffer(resX, resY, samples))
 	{
+		//failed to allocate at requested specification, return false
+		ret = FBO_FAILURE;
+
 		releaseScreenBuffers();
 		//reduce number of samples 
 		while (samples > 0)
@@ -798,7 +837,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
 			samples /= 2;
 			if (allocateScreenBuffer(resX, resY, samples))
 			{ //success
-				return;
+				return FBO_SUCCESS_LOWRES;
 			}
 			releaseScreenBuffers();
 		}
@@ -811,22 +850,23 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
 			resY /= 2;
 			if (allocateScreenBuffer(resX, resY, samples))
 			{
-				return;
+				return FBO_SUCCESS_LOWRES;
 			}
 			releaseScreenBuffers();
 
 			resX /= 2;
 			if (allocateScreenBuffer(resX, resY, samples))
 			{
-				return;
+				return FBO_SUCCESS_LOWRES;
 			}
 			releaseScreenBuffers();
 		}
 
 		llwarns << "Unable to allocate screen buffer at any resolution!" << llendl;
 	}
-}
 
+	return ret;
+}
 
 bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 {
@@ -854,10 +894,6 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 
 	if (LLPipeline::sRenderDeferred)
 	{
-		// Set this flag in case we crash while resizing window or allocating space for deferred rendering targets
-		gSavedSettings.setBOOL("RenderInitError", TRUE);
-		gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
-
 		S32 shadow_detail = RenderShadowDetail;
 		BOOL ssao = RenderDeferredSSAO;
 		
@@ -869,7 +905,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 		if (!mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
 		if (samples > 0)
 		{
-			if (!mFXAABuffer.allocate(nhpo2(resX), nhpo2(resY), GL_RGBA, FALSE, FALSE, LLTexUnit::TT_TEXTURE, FALSE, samples)) return false;
+			if (!mFXAABuffer.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_TEXTURE, FALSE, samples)) return false;
 		}
 		else
 		{
@@ -903,7 +939,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 			}
 		}
 
-		U32 width = nhpo2(U32(resX*scale))/2;
+		U32 width = (U32) (resX*scale);
 		U32 height = width;
 
 		if (shadow_detail > 1)
@@ -922,9 +958,11 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 			}
 		}
 
-		// don't disable shaders on next session
-		gSavedSettings.setBOOL("RenderInitError", FALSE);
-		gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
+		//HACK make screenbuffer allocations start failing after 30 seconds
+		if (gSavedSettings.getBOOL("SimulateFBOFailure"))
+		{
+			return false;
+		}
 	}
 	else
 	{
@@ -7112,11 +7150,11 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
 
 	gGlowProgram.unbind();
 
-	if (LLRenderTarget::sUseFBO)
+	/*if (LLRenderTarget::sUseFBO)
 	{
 		LLFastTimer ftm(FTM_RENDER_BLOOM_FBO);
 		glBindFramebuffer(GL_FRAMEBUFFER, 0);
-	}
+	}*/
 
 	gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
 	gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
@@ -7992,10 +8030,6 @@ void LLPipeline::renderDeferredLighting()
 		gGL.popMatrix();
 		stop_glerror();
 
-		//copy depth and stencil from deferred screen
-		//mScreen.copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(),
-		//					0, 0, mScreen.getWidth(), mScreen.getHeight(), GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
-
 		mScreen.bindTarget();
 		// clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky
 		glClearColor(0,0,0,0);
@@ -8767,8 +8801,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 		}
 		last_update = LLDrawPoolWater::sNeedsReflectionUpdate && LLDrawPoolWater::sNeedsDistortionUpdate;
 
-		LLRenderTarget::unbindTarget();
-
 		LLPipeline::sReflectionRender = FALSE;
 
 		if (!LLRenderTarget::sUseFBO)
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 7a0ca86231f12ff6fe0528bc4f03036681b07d5f..36abeca295a25a22ec773a07bebf02f3bfd50e24 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -119,8 +119,25 @@ class LLPipeline
 	void createGLBuffers();
 	void createLUTBuffers();
 
-	void allocateScreenBuffer(U32 resX, U32 resY);
+	//allocate the largest screen buffer possible up to resX, resY
+	//returns true if full size buffer allocated, false if some other size is allocated
+	bool allocateScreenBuffer(U32 resX, U32 resY);
+
+	typedef enum {
+		FBO_SUCCESS_FULLRES = 0,
+		FBO_SUCCESS_LOWRES,
+		FBO_FAILURE
+	} eFBOStatus;
+
+private:
+	//implementation of above, wrapped for easy error handling
+	eFBOStatus doAllocateScreenBuffer(U32 resX, U32 resY);
+public:
+
+	//attempt to allocate screen buffers at resX, resY
+	//returns true if allocation successful, false otherwise
 	bool allocateScreenBuffer(U32 resX, U32 resY, U32 samples);
+
 	void allocatePhysicsBuffer();
 	
 	void resetVertexBuffers(LLDrawable* drawable);
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index f7666bdc4ca9bd18191c1b6ce52c81808f06f9e5..849f3ef73d6a714c1f3e84a3998b103d337ca80b 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -55,30 +55,57 @@
      name="LowGraphicsDivet"
      top_delta="-2"
      width="2" />
+  <icon
+     color="0.12 0.12 0.12 1"
+     height="14"
+     image_name="Rounded_Square"
+     layout="topleft"
+     left_pad="41"
+     name="LowMidraphicsDivet"
+     top_delta="-2"
+     width="2" />
     <icon
      color="0.12 0.12 0.12 1"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
-     left_pad="83"
+     left_pad="41"
      name="MidGraphicsDivet"
      top_delta="0"
      width="2" />
+  <icon
+     color="0.12 0.12 0.12 1"
+     height="14"
+     image_name="Rounded_Square"
+     layout="topleft"
+     left_pad="41"
+     name="MidHighGraphicsDivet"
+     top_delta="0"
+     width="2" />
     <icon
      color="0.12 0.12 0.12 1"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
-     left_pad="85"
+     left_pad="41"
      name="HighGraphicsDivet"
      top_delta="0"
      width="2" />
+  <icon
+     color="0.12 0.12 0.12 1"
+     height="14"
+     image_name="Rounded_Square"
+     layout="topleft"
+     left_pad="41"
+     name="HighUltraGraphicsDivet"
+     top_delta="0"
+     width="2" />
     <icon
      color="0.12 0.12 0.12 1"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
-     left_pad="83"
+     left_pad="41"
      name="UltraGraphicsDivet"
      top_delta="0"
      width="2" />
@@ -91,7 +118,7 @@
      initial_value="0"
      layout="topleft"
      left="120"
-     max_val="3"
+     max_val="6"
      name="QualityPerformanceSelection"
      show_text="false"
      top_delta="-2"
@@ -120,12 +147,12 @@
      height="12"
      layout="topleft"
      left_delta="87"
-     name="ShadersPrefText2"
+     name="ShadersPrefText3"
      top_delta="0"
      width="80">
         Mid
     </text>
-    <text
+  <text
      type="string"
      length="1"
      follows="left|top"
@@ -136,8 +163,8 @@
      name="ShadersPrefText3"
      top_delta="0"
      width="80">
-        High
-    </text>
+      High
+  </text>
     <text
      type="string"
      length="1"