[SCM] A client for connecting to 3D metaverses such as Linden Labs Secondlife(tm) and OpenSim grids branch, upstream, updated. upstream/1.21.6-13-g1836a2b

Robin Cornelius robin.cornelius at gmail.com
Tue Apr 14 11:12:09 UTC 2009


The following commit has been merged in the upstream branch:
commit 2fac2229e7dc9a08a31083ad3007f0ea67ba847d
Author: Robin Cornelius <robin.cornelius at gmail.com>
Date:   Sun Nov 23 16:43:50 2008 +0000

    Imported Upstream version 1.22.0

diff --git a/doc/contributions.txt b/doc/contributions.txt
index ea5ba5d..54aad6e 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -1,3 +1,4 @@
+
 Linden Lab would like to acknowledge source code contributions from the
 following residents.   The Second Life resident name is given below,
 along with the issue identifier corresponding to the patches we've
@@ -10,10 +11,12 @@ Able Whitman
 	VWR-1691
 	VWR-1735
 Adam Marker
-    VWR-2755
+	VWR-2755
 Aimee Trescothick
+  VWR-3336
 	VWR-3903
 	VWR-4083
+	VWR-9255
 Alejandro Rosenthal
 	VWR-1184
 Alissa Sabre
@@ -58,6 +61,8 @@ Angus Boyd
 	VWR-592
 Argent Stonecutter
 	VWR-68
+Asuka Neely
+  VWR-3434
 Balp Allen
     VWR-4157
 Benja Kepler
@@ -79,6 +84,7 @@ bushing Spatula
 	VWR-424
 Carjay McGinnis
 	VWR-3737
+	VWR-4070
 	VWR-6154
 Catherine Pfeffer
 	VWR-1282
@@ -184,10 +190,12 @@ Jacek Antonelli
 	VWR-188
 	VWR-427
 	VWR-597
+	VWR-2054
 	VWR-2448
 	VWR-3605
 JB Kraft
   VWR-5283
+  VWR-7802
 Joghert LeSabre
 	VWR-64
 Kage Pixel
@@ -205,13 +213,18 @@ Matthew Dowd
 	VWR-1761
 McCabe Maxsted
 	VWR-1318
-        VWR-7893
+	VWR-7893
+	VWR-8689
 Michelle2 Zenovka
 	VWR-2652
 	VWR-2834
 	VWR-3749
+	VWR-4022
 	VWR-4506
+	VWR-4981
 	VWR-7831
+	VWR-8889
+	VWR-8310
 	VWR-4022
 Mm Alder
 	VWR-3777
diff --git a/etc/message.xml b/etc/message.xml
index 80dc560..d833074 100644
--- a/etc/message.xml
+++ b/etc/message.xml
@@ -441,6 +441,30 @@
 					<boolean>true</boolean>
 				</map>
 				
+				<key>EnableSimulator</key>
+				<map>
+					<key>flavor</key>
+					<string>llsd</string>
+					<key>trusted-sender</key>
+					<boolean>true</boolean>
+				</map>
+				
+				<key>TeleportFinish</key>
+				<map>
+					<key>flavor</key>
+					<string>llsd</string>
+					<key>trusted-sender</key>
+					<boolean>true</boolean>
+				</map>
+				
+				<key>CrossedRegion</key>
+				<map>
+					<key>flavor</key>
+					<string>llsd</string>
+					<key>trusted-sender</key>
+					<boolean>true</boolean>
+				</map>
+				
 				<!-- UDPDeprecated Messages -->
 				<key>ScriptRunningReply</key>
 				<map>
@@ -564,6 +588,18 @@
 			<boolean>true</boolean>
 		
 			<key>FetchInventoryDescendents</key>
+			<boolean>false</boolean>
+		
+			<key>WebFetchInventoryDescendents</key>
+			<boolean>true</boolean>
+		
+			<key>FetchInventory</key>
+			<boolean>true</boolean>
+		
+			<key>FetchLibDescendents</key>
+			<boolean>true</boolean>
+		
+			<key>FetchLib</key>
 			<boolean>true</boolean>
 		</map>
 
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt
index fac2afa..c473b94 100644
--- a/indra/CMakeLists.txt
+++ b/indra/CMakeLists.txt
@@ -19,6 +19,10 @@ set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
 
 include(Variables)
 
+if (DARWIN)
+  cmake_minimum_required(VERSION 2.6.2 FATAL_ERROR)
+endif (DARWIN)
+
 if (NOT CMAKE_BUILD_TYPE)
   set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
       "Build type.  One of: Debug Release RelWithDebInfo" FORCE)
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 240853a..bf2d2c3 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -49,6 +49,10 @@ if (WINDOWS)
       )
      
   if(MSVC80 OR MSVC90)
+    set(CMAKE_CXX_FLAGS_RELEASE
+      "${CMAKE_CXX_FLAGS_RELEASE} -D_SECURE_STL=0 -D_HAS_ITERATOR_DEBUGGING=0"
+      CACHE STRING "C++ compiler release options" FORCE)
+   
     add_definitions(
       /Zc:wchar_t-
       )
@@ -165,6 +169,10 @@ if (DARWIN)
   set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mlong-branch")
   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mlong-branch")
+  # NOTE: it's critical that the optimization flag is put in front.
+  # NOTE: it's critical to have both CXX_FLAGS and C_FLAGS covered.
+  set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O0 ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
+  set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O0 ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
 endif (DARWIN)
 
 
diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake
index 2a96d70..523d8ee 100644
--- a/indra/cmake/APR.cmake
+++ b/indra/cmake/APR.cmake
@@ -15,23 +15,17 @@ if (STANDALONE)
 else (STANDALONE)
   use_prebuilt_binary(apr_suite)
   if (WINDOWS)
-    set(WINLIBS_PREBUILT_DEBUG_DIR 
-      ${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug
-      )
-    set(WINLIBS_PREBUILT_RELEASE_DIR 
-      ${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release
-      )
     set(APR_LIBRARIES 
-      debug ${WINLIBS_PREBUILT_DEBUG_DIR}/apr-1.lib
-      optimized ${WINLIBS_PREBUILT_RELEASE_DIR}/apr-1.lib
+      debug ${ARCH_PREBUILT_DIRS_DEBUG}/apr-1.lib
+      optimized ${ARCH_PREBUILT_DIRS_RELEASE}/apr-1.lib
       )
     set(APRUTIL_LIBRARIES 
-      debug ${WINLIBS_PREBUILT_DEBUG_DIR}/aprutil-1.lib
-      optimized ${WINLIBS_PREBUILT_RELEASE_DIR}/aprutil-1.lib
+      debug ${ARCH_PREBUILT_DIRS_DEBUG}/aprutil-1.lib
+      optimized ${ARCH_PREBUILT_DIRS_RELEASE}/aprutil-1.lib
       )
     set(APRICONV_LIBRARIES 
-      debug ${WINLIBS_PREBUILT_DEBUG_DIR}/apriconv-1.lib
-      optimized ${WINLIBS_PREBUILT_RELEASE_DIR}/apriconv-1.lib
+      debug ${ARCH_PREBUILT_DIRS_DEBUG}/apriconv-1.lib
+      optimized ${ARCH_PREBUILT_DIRS_RELEASE}/apriconv-1.lib
       )
   elseif (DARWIN)
     set(APR_LIBRARIES 
@@ -42,10 +36,11 @@ else (STANDALONE)
       debug ${ARCH_PREBUILT_DIRS_DEBUG}/libaprutil-1.a
       optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.a
       )
-    set(APRICONV_LIBRARIES apriconv-1)
+    set(APRICONV_LIBRARIES iconv)
   else (WINDOWS)
     set(APR_LIBRARIES apr-1)
     set(APRUTIL_LIBRARIES aprutil-1)
+    set(APRICONV_LIBRARIES iconv)
   endif (WINDOWS)
   set(APR_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/apr-1)
 
diff --git a/indra/cmake/CopyWinLibs.cmake b/indra/cmake/CopyWinLibs.cmake
index 345761a..b74ce4f 100644
--- a/indra/cmake/CopyWinLibs.cmake
+++ b/indra/cmake/CopyWinLibs.cmake
@@ -148,6 +148,61 @@ else(EXISTS ${internal_llkdu_path})
    
 endif (EXISTS ${internal_llkdu_path})
 
+# Copy MS C runtime dlls, required for packaging.
+# *TODO - Adapt this to support VC9
+if (MSVC80)
+    FIND_PATH(debug_msvc8_redist_path msvcr80d.dll
+        PATHS
+        [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/Debug_NonRedist/x86/Microsoft.VC80.DebugCRT
+        )
+
+    if(EXISTS ${debug_msvc8_redist_path})
+        set(debug_msvc8_files
+            msvcr80d.dll
+            msvcp80d.dll
+            Microsoft.VC80.DebugCRT.manifest
+            )
+
+        copy_if_different(
+            ${debug_msvc8_redist_path} 
+            "${CMAKE_CURRENT_BINARY_DIR}/Debug"
+            out_targets 
+            ${debug_msvc8_files}
+            )
+        set(all_targets ${all_targets} ${out_targets})
+    endif (EXISTS ${debug_msvc8_redist_path})
+
+    FIND_PATH(release_msvc8_redist_path msvcr80.dll
+        PATHS
+        [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/x86/Microsoft.VC80.CRT
+        )
+
+    if(EXISTS ${release_msvc8_redist_path})
+        set(release_msvc8_files
+            msvcr80.dll
+            msvcp80.dll
+            Microsoft.VC80.CRT.manifest
+            )
+
+        copy_if_different(
+            ${release_msvc8_redist_path} 
+            "${CMAKE_CURRENT_BINARY_DIR}/Release"
+            out_targets 
+            ${release_msvc8_files}
+            )
+        set(all_targets ${all_targets} ${out_targets})
+
+        copy_if_different(
+            ${release_msvc8_redist_path} 
+            "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo"
+            out_targets 
+            ${release_msvc8_files}
+            )
+        set(all_targets ${all_targets} ${out_targets})
+
+    endif (EXISTS ${release_msvc8_redist_path})
+endif (MSVC80)
+
 add_custom_target(copy_win_libs ALL DEPENDS ${all_targets})
 
 if(EXISTS ${internal_llkdu_path})
diff --git a/indra/cmake/DBusGlib.cmake b/indra/cmake/DBusGlib.cmake
new file mode 100644
index 0000000..cfc4ccd
--- /dev/null
+++ b/indra/cmake/DBusGlib.cmake
@@ -0,0 +1,29 @@
+# -*- cmake -*-
+include(Prebuilt)
+
+if (STANDALONE)
+  include(FindPkgConfig)
+
+  pkg_check_modules(DBUSGLIB REQUIRED dbus-glib-1)
+
+elseif (LINUX)
+  use_prebuilt_binary(dbusglib)
+  set(DBUSGLIB_FOUND ON FORCE BOOL)
+  set(DBUSGLIB_INCLUDE_DIRS
+      ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/glib-2.0
+      )
+  # We don't need to explicitly link against dbus-glib itself, because
+  # the viewer probes for the system's copy at runtime.
+  set(DBUSGLIB_LIBRARIES
+      gobject-2.0
+      glib-2.0
+      )
+endif (STANDALONE)
+
+if (DBUSGLIB_FOUND)
+  set(DBUSGLIB ON CACHE BOOL "Build with dbus-glib message bus support.")
+endif (DBUSGLIB_FOUND)
+
+if (DBUSGLIB)
+  add_definitions(-DLL_DBUS_ENABLED=1)
+endif (DBUSGLIB)
diff --git a/indra/cmake/DirectX.cmake b/indra/cmake/DirectX.cmake
index 4d2d5e0..d406f37 100644
--- a/indra/cmake/DirectX.cmake
+++ b/indra/cmake/DirectX.cmake
@@ -3,12 +3,13 @@
 if (VIEWER AND WINDOWS)
   find_path(DIRECTX_INCLUDE_DIR dxdiag.h
             "$ENV{DXSDK_DIR}/Include"
-            "C:/Program Files/Microsoft DirectX SDK (June 2008)/Include"
-            "C:/Program Files/Microsoft DirectX SDK (March 2008)/Include"
-            "C:/Program Files/Microsoft DirectX SDK (November 2007)/Include"
-            "C:/Program Files/Microsoft DirectX SDK (August 2007)/Include"
+            "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (August 2008)/Include"
+            "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (June 2008)/Include"
+            "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (March 2008)/Include"
+            "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (November 2007)/Include"
+            "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (August 2007)/Include"
             "C:/DX90SDK/Include"
-            "C:/Program Files/DX90SDK/Include"
+            "$ENV{PROGRAMFILES}/DX90SDK/Include"
             )
   if (DIRECTX_INCLUDE_DIR)
     include_directories(${DIRECTX_INCLUDE_DIR})
@@ -22,12 +23,13 @@ if (VIEWER AND WINDOWS)
 
   find_path(DIRECTX_LIBRARY_DIR dxguid.lib
             "$ENV{DXSDK_DIR}/Lib/x86"
-            "C:/Program Files/Microsoft DirectX SDK (June 2008)/Lib/x86"
-            "C:/Program Files/Microsoft DirectX SDK (March 2008)/Lib/x86"
-            "C:/Program Files/Microsoft DirectX SDK (November 2007)/Lib/x86"
-            "C:/Program Files/Microsoft DirectX SDK (August 2007)/Lib/x86"
+            "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (August 2008)/Lib/x86"
+            "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (June 2008)/Lib/x86"
+            "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (March 2008)/Lib/x86"
+            "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (November 2007)/Lib/x86"
+            "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (August 2007)/Lib/x86"
             "C:/DX90SDK/Lib"
-            "C:/Program Files/DX90SDK/Lib"
+            "$ENV{PROGRAMFILES}/DX90SDK/Lib"
             )
   if (DIRECTX_LIBRARY_DIR)
     if (DIRECTX_FIND_QUIETLY)
diff --git a/indra/cmake/FindMono.cmake b/indra/cmake/FindMono.cmake
index f0a0705..c36d725 100644
--- a/indra/cmake/FindMono.cmake
+++ b/indra/cmake/FindMono.cmake
@@ -14,29 +14,29 @@
 # Removed the check for gmcs
 
 FIND_PROGRAM (MONO_EXECUTABLE mono
-             "C:/Program Files/Mono-1.9.1/bin"
-             "C:/Program Files/Mono-1.2.6/bin"
+             "$ENV{PROGRAMFILES}/Mono-1.9.1/bin"
+             "$ENV{PROGRAMFILES}/Mono-1.2.6/bin"
              /bin
              /usr/bin
              /usr/local/bin
 )
 FIND_PROGRAM (MCS_EXECUTABLE mcs
-             "C:/Program Files/Mono-1.9.1/bin"
-             "C:/Program Files/Mono-1.2.6/bin"
+             "$ENV{PROGRAMFILES}/Mono-1.9.1/bin"
+             "$ENV{PROGRAMFILES}/Mono-1.2.6/bin"
              /bin
              /usr/bin
              /usr/local/bin
 )
 FIND_PROGRAM (GMCS_EXECUTABLE gmcs
-             "C:/Program Files/Mono-1.9.1/bin"
-             "C:/Program Files/Mono-1.2.6/bin"
+             "$ENV{PROGRAMFILES}/Mono-1.9.1/bin"
+             "$ENV{PROGRAMFILES}/Mono-1.2.6/bin"
              /bin
              /usr/bin
              /usr/local/bin
 )
 FIND_PROGRAM (GACUTIL_EXECUTABLE gacutil
-             "C:/Program Files/Mono-1.9.1/bin"
-             "C:/Program Files/Mono-1.2.6/bin"
+             "$ENV{PROGRAMFILES}/Mono-1.9.1/bin"
+             "$ENV{PROGRAMFILES}/Mono-1.2.6/bin"
              /bin
              /usr/bin
              /usr/local/bin
@@ -44,7 +44,7 @@ FIND_PROGRAM (GACUTIL_EXECUTABLE gacutil
 FIND_PROGRAM (ILASM_EXECUTABLE
              ilasm
              NO_DEFAULT_PATH
-             PATHS "C:/Program Files/Mono-1.9.1/bin" "C:/Apps/Mono-1.2.6/bin" "C:/Program Files/Mono-1.2.6/bin" /bin /usr/bin /usr/local/bin
+             PATHS "$ENV{PROGRAMFILES}/Mono-1.9.1/bin" "$ENV{PROGRAMFILES}/Mono-1.2.6/bin" /bin /usr/bin /usr/local/bin
 )
 
 SET (MONO_FOUND FALSE)
diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake
index 9b3eca0..25e9f6d 100644
--- a/indra/cmake/GooglePerfTools.cmake
+++ b/indra/cmake/GooglePerfTools.cmake
@@ -19,10 +19,14 @@ if (GOOGLE_PERFTOOLS_FOUND)
   set(USE_GOOGLE_PERFTOOLS ON CACHE BOOL "Build with Google PerfTools support.")
 endif (GOOGLE_PERFTOOLS_FOUND)
 
+# XXX Disable temporarily, until we have compilation issues on 64-bit
+# Etch sorted.
+set(USE_GOOGLE_PERFTOOLS OFF)
+
 if (USE_GOOGLE_PERFTOOLS)
   set(TCMALLOC_FLAG -DLL_USE_TCMALLOC=1)
   include_directories(${GOOGLE_PERFTOOLS_INCLUDE_DIR})
-  set(GOOGLE_PERFTOOLS_LIBRARIES ${TCMALLOC_LIBRARIES} ${STACKTRACE_LIBRARIES})
+  set(GOOGLE_PERFTOOLS_LIBRARIES ${TCMALLOC_LIBRARIES} ${STACKTRACE_LIBRARIES} ${PROFILER_LIBRARIES})
 else (USE_GOOGLE_PERFTOOLS)
   set(TCMALLOC_FLAG -ULL_USE_TCMALLOC)
 endif (USE_GOOGLE_PERFTOOLS)
diff --git a/indra/cmake/LLAudio.cmake b/indra/cmake/LLAudio.cmake
index 7b9f254..eff643d 100644
--- a/indra/cmake/LLAudio.cmake
+++ b/indra/cmake/LLAudio.cmake
@@ -6,10 +6,4 @@ set(LLAUDIO_INCLUDE_DIRS
     ${LIBS_OPEN_DIR}/llaudio
     )
 
-set(LLAUDIO_LIBRARIES
-    llaudio
-    ${VORBISENC_LIBRARIES}
-    ${VORBISFILE_LIBRARIES}
-    ${VORBIS_LIBRARIES}
-    ${OGG_LIBRARIES}
-    )
+set(LLAUDIO_LIBRARIES llaudio)
diff --git a/indra/cmake/LLCharacter.cmake b/indra/cmake/LLCharacter.cmake
index c74092c..9b2f5c4 100644
--- a/indra/cmake/LLCharacter.cmake
+++ b/indra/cmake/LLCharacter.cmake
@@ -4,6 +4,4 @@ set(LLCHARACTER_INCLUDE_DIRS
     ${LIBS_OPEN_DIR}/llcharacter
     )
 
-set(LLCHARACTER_LIBRARIES
-    llcharacter
-    )
+set(LLCHARACTER_LIBRARIES llcharacter)
diff --git a/indra/cmake/LLCommon.cmake b/indra/cmake/LLCommon.cmake
index f4b251e..410766e 100644
--- a/indra/cmake/LLCommon.cmake
+++ b/indra/cmake/LLCommon.cmake
@@ -12,10 +12,4 @@ set(LLCOMMON_INCLUDE_DIRS
     ${Boost_INCLUDE_DIRS}
     )
 
-set(LLCOMMON_LIBRARIES
-    llcommon
-    ${APRUTIL_LIBRARIES}
-    ${APR_LIBRARIES}
-    ${EXPAT_LIBRARIES}
-    ${ZLIB_LIBRARIES}
-    )
+set(LLCOMMON_LIBRARIES llcommon)
diff --git a/indra/cmake/LLCrashLogger.cmake b/indra/cmake/LLCrashLogger.cmake
index 7b362d0..f2cb83e 100644
--- a/indra/cmake/LLCrashLogger.cmake
+++ b/indra/cmake/LLCrashLogger.cmake
@@ -4,6 +4,4 @@ set(LLCRASHLOGGER_INCLUDE_DIRS
     ${LIBS_OPEN_DIR}/llcrashlogger
     )
 
-set(LLCRASHLOGGER_LIBRARIES
-    llcrashlogger
-    )
+set(LLCRASHLOGGER_LIBRARIES llcrashlogger)
diff --git a/indra/cmake/LLDatabase.cmake b/indra/cmake/LLDatabase.cmake
index c3cf622..6526101 100644
--- a/indra/cmake/LLDatabase.cmake
+++ b/indra/cmake/LLDatabase.cmake
@@ -7,7 +7,4 @@ set(LLDATABASE_INCLUDE_DIRS
     ${MYSQL_INCLUDE_DIR}
     )
 
-set(LLDATABASE_LIBRARIES
-    lldatabase
-    ${MYSQL_LIBRARIES}
-    )
+set(LLDATABASE_LIBRARIES lldatabase)
diff --git a/indra/cmake/LLImage.cmake b/indra/cmake/LLImage.cmake
index 8874fa5..ec3da89 100644
--- a/indra/cmake/LLImage.cmake
+++ b/indra/cmake/LLImage.cmake
@@ -8,8 +8,4 @@ set(LLIMAGE_INCLUDE_DIRS
     ${JPEG_INCLUDE_DIRS}
     )
 
-set(LLIMAGE_LIBRARIES
-    llimage
-    ${JPEG_LIBRARIES}
-    ${PNG_LIBRARIES}
-    )
+set(LLIMAGE_LIBRARIES llimage)
diff --git a/indra/cmake/LLImageJ2COJ.cmake b/indra/cmake/LLImageJ2COJ.cmake
index 91973e0..1bcf205 100644
--- a/indra/cmake/LLImageJ2COJ.cmake
+++ b/indra/cmake/LLImageJ2COJ.cmake
@@ -2,7 +2,4 @@
 
 include(OpenJPEG)
 
-set(LLIMAGEJ2COJ_LIBRARIES
-    llimagej2coj
-    ${OPENJPEG_LIBRARIES}
-    )
+set(LLIMAGEJ2COJ_LIBRARIES llimagej2coj)
diff --git a/indra/cmake/LLInventory.cmake b/indra/cmake/LLInventory.cmake
index 7d5f492..c3dc077 100644
--- a/indra/cmake/LLInventory.cmake
+++ b/indra/cmake/LLInventory.cmake
@@ -4,6 +4,4 @@ set(LLINVENTORY_INCLUDE_DIRS
     ${LIBS_OPEN_DIR}/llinventory
     )
 
-set(LLINVENTORY_LIBRARIES
-    llinventory
-    )
+set(LLINVENTORY_LIBRARIES llinventory)
diff --git a/indra/cmake/LLKDU.cmake b/indra/cmake/LLKDU.cmake
index a02b5d9..f103dcf 100644
--- a/indra/cmake/LLKDU.cmake
+++ b/indra/cmake/LLKDU.cmake
@@ -5,8 +5,6 @@ if (NOT STANDALONE AND EXISTS ${LIBS_CLOSED_DIR}/llkdu)
   use_prebuilt_binary(kdu)
   if (WINDOWS)
     set(KDU_LIBRARY debug kdu_cored optimized kdu_core)
-  elseif (LINUX)
-    set(KDU_LIBRARY kdu_v42R)
   else (WINDOWS)
     set(KDU_LIBRARY kdu)
   endif (WINDOWS)
diff --git a/indra/cmake/LLMath.cmake b/indra/cmake/LLMath.cmake
index 8afd45e..893920a 100644
--- a/indra/cmake/LLMath.cmake
+++ b/indra/cmake/LLMath.cmake
@@ -4,6 +4,4 @@ set(LLMATH_INCLUDE_DIRS
     ${LIBS_OPEN_DIR}/llmath
     )
 
-set(LLMATH_LIBRARIES
-    llmath
-    )
+set(LLMATH_LIBRARIES llmath)
diff --git a/indra/cmake/LLMedia.cmake b/indra/cmake/LLMedia.cmake
index b7bf11c..91c7818 100644
--- a/indra/cmake/LLMedia.cmake
+++ b/indra/cmake/LLMedia.cmake
@@ -7,9 +7,4 @@ set(LLMEDIA_INCLUDE_DIRS
     ${LIBS_OPEN_DIR}/llmedia
     )
 
-set(LLMEDIA_LIBRARIES
-    llmedia
-    ${GSTREAMER_LIBRARIES}
-    ${GSTREAMER_PLUGINS_BASE_LIBRARIES}
-    ${QUICKTIME_LIBRARY}
-    )
+set(LLMEDIA_LIBRARIES llmedia)
diff --git a/indra/cmake/LLMessage.cmake b/indra/cmake/LLMessage.cmake
index 1cea03a..0143d04 100644
--- a/indra/cmake/LLMessage.cmake
+++ b/indra/cmake/LLMessage.cmake
@@ -12,11 +12,4 @@ set(LLMESSAGE_INCLUDE_DIRS
     ${OPENSSL_INCLUDE_DIRS}
     )
 
-set(LLMESSAGE_LIBRARIES
-    llmessage
-    ${CURL_LIBRARIES}
-    ${CARES_LIBRARIES}
-    ${OPENSSL_LIBRARIES}
-    ${CRYPTO_LIBRARIES}
-    ${XMLRPCEPI_LIBRARIES}
-    )
+set(LLMESSAGE_LIBRARIES llmessage)
diff --git a/indra/cmake/LLPhysics.cmake b/indra/cmake/LLPhysics.cmake
deleted file mode 100644
index 3ae390e..0000000
--- a/indra/cmake/LLPhysics.cmake
+++ /dev/null
@@ -1,76 +0,0 @@
-# -*- cmake -*-
-include(Prebuilt)
-
-use_prebuilt_binary(havok)
-
-set(HAVOK_VERSION 460)
-
-set(LLPHYSICS_INCLUDE_DIRS
-    ${LIBS_SERVER_DIR}/llphysics
-    ${LIBS_PREBUILT_DIR}/include/havok/hk${HAVOK_VERSION}/common
-    ${LIBS_PREBUILT_DIR}/include/havok/hk${HAVOK_VERSION}/physics
-    )
-
-add_definitions(-DLL_CURRENT_HAVOK_VERSION=${HAVOK_VERSION})
-
-if (LINUX OR DARWIN)
-  if (DARWIN)
-    link_directories(
-        ${LIBS_PREBUILT_DIR}/universal-darwin/lib_release/havok/hk460
-        )
-  else (DARWIN)
-    link_directories(
-        ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release/havok/hk460
-        )
-  endif (DARWIN)
-
-  set(LLPHYSICS_LIBRARIES 
-      llphysics
-      hkcompat 
-      hkutilities 
-      hkvisualize 
-      hkdynamics 
-      hkvehicle 
-      hkcollide 
-      hkinternal 
-      hkconstraintsolver 
-      hkmath 
-      hkscenedata 
-      hkserialize 
-      hkgraphicsogl 
-      hkgraphicsbridge 
-      hkgraphics 
-      hkdemoframework 
-      hkbase
-      )
-elseif (WINDOWS)
-  if (MSVC71)
-    set(HK_DEBUG ${WINLIBS_PREBUILT_DEBUG_DIR}/havok/hk460)
-    set(HK_RELEASE ${WINLIBS_PREBUILT_RELEASE_DIR}/havok/hk460)
-  else (MSVC71)
-    set(HK_DEBUG ${WINLIBS_PREBUILT_DEBUG_DIR}/havok/hk460_net_8-0)
-    set(HK_RELEASE ${WINLIBS_PREBUILT_RELEASE_DIR}/havok/hk460_net_8-0)
-  endif (MSVC71)
-
-  set(HAVOK_LIBS
-      hkbase
-      hkdynamics
-      hkmath
-      hkcollide
-      hkutilities
-      hkvisualize
-      hkinternal
-      hkconstraintsolver
-      hkcompat
-      hkserialize
-      hkvehicle
-      hkscenedata
-      )
-
-  set(LLPHYSICS_LIBRARIES llphysics)
-
-  foreach(lib ${HAVOK_LIBS})
-    list(APPEND LLPHYSICS_LIBRARIES 
-         debug ${HK_DEBUG}/${lib} optimized ${HK_RELEASE}/${lib})
-  endforeach(lib)
-endif (LINUX OR DARWIN)
diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake
index 0426ae5..d397b78 100644
--- a/indra/cmake/LLPrimitive.cmake
+++ b/indra/cmake/LLPrimitive.cmake
@@ -4,6 +4,4 @@ set(LLPRIMITIVE_INCLUDE_DIRS
     ${LIBS_OPEN_DIR}/llprimitive
     )
 
-set(LLPRIMITIVE_LIBRARIES
-    llprimitive
-    )
+set(LLPRIMITIVE_LIBRARIES llprimitive)
diff --git a/indra/cmake/LLScene.cmake b/indra/cmake/LLScene.cmake
index d1c32b3..96ad508 100644
--- a/indra/cmake/LLScene.cmake
+++ b/indra/cmake/LLScene.cmake
@@ -4,6 +4,4 @@ set(LLSCENE_INCLUDE_DIRS
     ${LIBS_SERVER_DIR}/llscene
     )
 
-set(LLSCENE_LIBRARIES
-    llscene
-    )
+set(LLSCENE_LIBRARIES llscene)
diff --git a/indra/cmake/LLUI.cmake b/indra/cmake/LLUI.cmake
index d1287de..34de571 100644
--- a/indra/cmake/LLUI.cmake
+++ b/indra/cmake/LLUI.cmake
@@ -4,6 +4,4 @@ set(LLUI_INCLUDE_DIRS
     ${LIBS_OPEN_DIR}/llui
     )
 
-set(LLUI_LIBRARIES
-    llui
-    )
+set(LLUI_LIBRARIES llui)
diff --git a/indra/cmake/LLVFS.cmake b/indra/cmake/LLVFS.cmake
index 5ce3d25..0fe87cd 100644
--- a/indra/cmake/LLVFS.cmake
+++ b/indra/cmake/LLVFS.cmake
@@ -5,9 +5,3 @@ set(LLVFS_INCLUDE_DIRS
     )
 
 set(LLVFS_LIBRARIES llvfs)
-
-if (DARWIN)
-  include(CMakeFindFrameworks)
-  find_library(CARBON_LIBRARY Carbon)
-  list(APPEND LLVFS_LIBRARIES ${CARBON_LIBRARY})
-endif (DARWIN)
diff --git a/indra/cmake/LLXML.cmake b/indra/cmake/LLXML.cmake
index 1ce93c0..64dfdb6 100644
--- a/indra/cmake/LLXML.cmake
+++ b/indra/cmake/LLXML.cmake
@@ -1,13 +1,12 @@
 # -*- cmake -*-
 
+include(Boost)
 include(EXPAT)
 
 set(LLXML_INCLUDE_DIRS
     ${LIBS_OPEN_DIR}/llxml
+    ${Boost_INCLUDE_DIRS}
     ${EXPAT_INCLUDE_DIRS}
     )
 
-set(LLXML_LIBRARIES
-    llxml
-    ${EXPAT_LIBRARIES}
-    )
+set(LLXML_LIBRARIES llxml)
diff --git a/indra/cmake/Linking.cmake b/indra/cmake/Linking.cmake
index c9748e3..167c5dd 100644
--- a/indra/cmake/Linking.cmake
+++ b/indra/cmake/Linking.cmake
@@ -7,15 +7,15 @@ if (NOT STANDALONE)
     set(ARCH_PREBUILT_DIRS_DEBUG ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib/debug)
   elseif (LINUX)
     if (VIEWER)
-      set(ARCH_PREBUILT_DIRS 
-          ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release_client)
-      set(ARCH_PREBUILT_DIRS_RELEASE ${ARCH_PREBUILT_DIRS})
-      set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS})
+      set(ARCH_PREBUILT_DIRS ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release_client)
     else (VIEWER)
       set(ARCH_PREBUILT_DIRS ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release)
     endif (VIEWER)
+    set(ARCH_PREBUILT_DIRS_RELEASE ${ARCH_PREBUILT_DIRS})
+    set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS})
   elseif (DARWIN)
     set(ARCH_PREBUILT_DIRS_RELEASE ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release)
+    set(ARCH_PREBUILT_DIRS ${ARCH_PREBUILT_DIRS_RELEASE})
     set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS_RELEASE})
   endif (WINDOWS)
 endif (NOT STANDALONE)
diff --git a/indra/cmake/Python.cmake b/indra/cmake/Python.cmake
index e9505fb..4f86d32 100644
--- a/indra/cmake/Python.cmake
+++ b/indra/cmake/Python.cmake
@@ -9,6 +9,7 @@ if (WINDOWS)
     NAMES python25.exe python23.exe python.exe
     NO_DEFAULT_PATH # added so that cmake does not find cygwin python
     PATHS
+    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath]
     [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath]
     [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath]
     [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath]
diff --git a/indra/cmake/QuickTime.cmake b/indra/cmake/QuickTime.cmake
index b79ac11..4352709 100644
--- a/indra/cmake/QuickTime.cmake
+++ b/indra/cmake/QuickTime.cmake
@@ -9,13 +9,29 @@ if (DARWIN)
   include(CMakeFindFrameworks)
   find_library(QUICKTIME_LIBRARY QuickTime)
 elseif (WINDOWS)
-  set(QUICKTIME_SDK_DIR "C:\\Program Files\\QuickTime SDK"
+  set(QUICKTIME_SDK_DIR "$ENV{PROGRAMFILES}/QuickTime SDK"
       CACHE PATH "Location of the QuickTime SDK.")
-  find_library(QUICKTIME_LIBRARY qtmlclient
+
+  find_library(DEBUG_QUICKTIME_LIBRARY qtmlclient
+               PATHS
+               ${ARCH_PREBUILT_DIRS_DEBUG}
+               "${QUICKTIME_SDK_DIR}\\libraries"
+               )
+
+  find_library(RELEASE_QUICKTIME_LIBRARY qtmlclient
                PATHS
-               ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib/release
+               ${ARCH_PREBUILT_DIRS_RELEASE}
                "${QUICKTIME_SDK_DIR}\\libraries"
                )
+
+  if (DEBUG_QUICKTIME_LIBRARY AND RELEASE_QUICKTIME_LIBRARY)
+    set(QUICKTIME_LIBRARY 
+        optimized ${RELEASE_QUICKTIME_LIBRARY}
+        debug ${DEBUG_QUICKTIME_LIBRARY}
+        )
+        
+  endif (DEBUG_QUICKTIME_LIBRARY AND RELEASE_QUICKTIME_LIBRARY)
+  
   include_directories(
     ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/quicktime
     "${QUICKTIME_SDK_DIR}\\CIncludes"
diff --git a/indra/develop.py b/indra/develop.py
index 8edfccc..c4a9d0d 100755
--- a/indra/develop.py
+++ b/indra/develop.py
@@ -53,6 +53,16 @@ def mkdir(path):
         if err.errno != errno.EEXIST or not os.path.isdir(path):
             raise
 
+def getcwd():
+    cwd = os.getcwd()
+    if 'a' <= cwd[0] <= 'z' and cwd[1] == ':':
+        # CMake wants DOS drive letters to be in uppercase.  The above
+        # condition never asserts on platforms whose full path names
+        # always begin with a slash, so we don't need to test whether
+        # we are running on Windows.
+        cwd = cwd[0].upper() + cwd[1:]
+    return cwd
+
 def quote(opts):
     return '"' + '" "'.join([ opt.replace('"', '') for opt in opts ]) + '"'
 
@@ -63,8 +73,8 @@ class PlatformSetup(object):
         build_types[t.lower()] = t
 
     build_type = build_types['relwithdebinfo']
-    standalone = 'FALSE'
-    unattended = 'FALSE'
+    standalone = 'OFF'
+    unattended = 'OFF'
     distcc = True
     cmake_opts = []
 
@@ -141,7 +151,7 @@ class PlatformSetup(object):
         # do a sanity check to make sure we have a generator
         if not hasattr(self, 'generator'):
             raise "No generator available for '%s'" % (self.__name__,)
-        cwd = os.getcwd()
+        cwd = getcwd()
         created = []
         try:
             for d in self.build_dirs():
@@ -218,11 +228,15 @@ class UnixSetup(PlatformSetup):
         elif cpu == 'Power Macintosh':
             cpu = 'ppc'
         return cpu
-        
+
 
 class LinuxSetup(UnixSetup):
     def __init__(self):
         super(LinuxSetup, self).__init__()
+        try:
+            self.debian_sarge = open('/etc/debian_version').read().strip() == '3.1'
+        except:
+            self.debian_sarge = False
 
     def os(self):
         return 'linux'
@@ -230,10 +244,17 @@ class LinuxSetup(UnixSetup):
     def build_dirs(self):
         # Only build the server code if (a) we have it and (b) we're
         # on 32-bit x86.
+        platform_build = '%s-%s' % (self.platform(), self.build_type.lower())
+
         if self.arch() == 'i686' and self.is_internal_tree():
-            return ['viewer-' + self.platform(), 'server-' + self.platform()]
+            return ['viewer-' + platform_build, 'server-' + platform_build]
+        elif self.arch() == 'x86_64' and self.is_internal_tree():
+            # the viewer does not build in 64bit -- kdu5 issues
+            # we can either use openjpeg, or overhaul our viewer to handle kdu5 or higher
+            # doug knows about kdu issues
+            return ['server-' + platform_build]
         else:
-            return ['viewer-' + self.platform()]
+            return ['viewer-' + platform_build]
 
     def find_in_path(self, name, defval=None, basename=False):
         for p in os.getenv('PATH', '/usr/bin').split(':'):
@@ -254,7 +275,7 @@ class LinuxSetup(UnixSetup):
             type=self.build_type.upper()
             )
         if not self.is_internal_tree():
-            args.update({'cxx':'g++', 'server':'FALSE', 'viewer':'TRUE'})
+            args.update({'cxx':'g++', 'server':'OFF', 'viewer':'ON'})
         else:
             if self.distcc:
                 distcc = self.find_in_path('distcc')
@@ -263,18 +284,16 @@ class LinuxSetup(UnixSetup):
                 distcc = []
                 baseonly = False
             if 'server' in build_dir:
-                gcc33 = distcc + self.find_in_path('g++-3.3', 'g++', baseonly)
-                args.update({'cxx':' '.join(gcc33), 'server':'TRUE',
-                             'viewer':'FALSE'})
+                gcc = distcc + self.find_in_path(
+                    self.debian_sarge and 'g++-3.3' or 'g++-4.1',
+                    'g++', baseonly)
+                args.update({'cxx': ' '.join(gcc), 'server': 'ON',
+                             'viewer': 'OFF'})
             else:
                 gcc41 = distcc + self.find_in_path('g++-4.1', 'g++', baseonly)
-                args.update({'cxx': ' '.join(gcc41), 'server':'FALSE',
-                             'viewer':'TRUE'})
-        #if simple:
-        #    return (('cmake %(opts)s '
-        #             '-DSERVER:BOOL=%(server)s ' 
-        #             '-DVIEWER:BOOL=%(viewer)s '
-        #             '%(dir)r') % args)
+                args.update({'cxx': ' '.join(gcc41),
+                             'server': 'OFF',
+                             'viewer': 'ON'})
         cmd = (('cmake -DCMAKE_BUILD_TYPE:STRING=%(type)s '
                 '-G %(generator)r -DSERVER:BOOL=%(server)s '
                 '-DVIEWER:BOOL=%(viewer)s -DSTANDALONE:BOOL=%(standalone)s '
@@ -369,7 +388,7 @@ class DarwinSetup(UnixSetup):
         return 'darwin'
 
     def arch(self):
-        if self.unattended == 'TRUE':
+        if self.unattended == 'ON':
             return 'universal'
         else:
             return UnixSetup.arch(self)
@@ -384,7 +403,7 @@ class DarwinSetup(UnixSetup):
             universal='',
             type=self.build_type.upper()
             )
-        if self.unattended == 'TRUE':
+        if self.unattended == 'ON':
             args['universal'] = '-DCMAKE_OSX_ARCHITECTURES:STRING=\'i386;ppc\''
         #if simple:
         #    return 'cmake %(opts)s %(dir)r' % args
@@ -396,7 +415,7 @@ class DarwinSetup(UnixSetup):
                 '%(opts)s %(dir)r' % args)
 
     def run_build(self, opts, targets):
-        cwd = os.getcwd()
+        cwd = getcwd()
         if targets:
             targets = ' '.join(['-target ' + repr(t) for t in targets])
         else:
@@ -439,7 +458,7 @@ class WindowsSetup(PlatformSetup):
 
     def _get_generator(self):
         if self._generator is None:
-            for version in 'vc71 vc80 vc90'.split():
+            for version in 'vc80 vc90 vc71'.split():
                 if self.find_visual_studio(version):
                     self._generator = version
                     print 'Building with ', self.gens[version]['gen']
@@ -523,18 +542,30 @@ class WindowsSetup(PlatformSetup):
     def run_cmake(self, args=[]):
         '''Override to add the vstool.exe call after running cmake.'''
         PlatformSetup.run_cmake(self, args)
-        if self.unattended == 'FALSE':
-            for build_dir in self.build_dirs():
-                vstool_cmd = os.path.join('tools','vstool','VSTool.exe') \
-                             + ' --solution ' \
-                             + os.path.join(build_dir,'SecondLife.sln') \
-                             + ' --config RelWithDebInfo' \
-                             + ' --startup secondlife-bin'
-                print 'Running %r in %r' % (vstool_cmd, os.getcwd())
-                self.run(vstool_cmd)        
+        if self.unattended == 'OFF':
+            self.run_vstool()
+
+    def run_vstool(self):
+        for build_dir in self.build_dirs():
+            stamp = os.path.join(build_dir, 'vstool.txt')
+            try:
+                prev_build = open(stamp).read().strip()
+            except IOError:
+                prev_build = ''
+            if prev_build == self.build_type:
+                # Only run vstool if the build type has changed.
+                continue
+            vstool_cmd = (os.path.join('tools','vstool','VSTool.exe') +
+                          ' --solution ' +
+                          os.path.join(build_dir,'SecondLife.sln') +
+                          ' --config ' + self.build_type +
+                          ' --startup secondlife-bin')
+            print 'Running %r in %r' % (vstool_cmd, getcwd())
+            self.run(vstool_cmd)        
+            print >> open(stamp, 'w'), self.build_type
         
     def run_build(self, opts, targets):
-        cwd = os.getcwd()
+        cwd = getcwd()
         build_cmd = self.get_build_cmd()
 
         for d in self.build_dirs():
@@ -555,7 +586,7 @@ class WindowsSetup(PlatformSetup):
 class CygwinSetup(WindowsSetup):
     def __init__(self):
         super(CygwinSetup, self).__init__()
-        self.generator = 'vc71'
+        self.generator = 'vc80'
 
     def cmake_commandline(self, src_dir, build_dir, opts, simple):
         dos_dir = commands.getoutput("cygpath -w %s" % src_dir)
@@ -601,6 +632,13 @@ Commands:
   configure   configure project by running cmake
 
 If you do not specify a command, the default is "configure".
+
+Examples:
+  Set up a viewer-only project for your system:
+    develop.py configure -DSERVER:BOOL=OFF
+  
+  Set up a Visual Studio 2005 project with package target (to build installer):
+    develop.py -G vc80 configure -DPACKAGE:BOOL=ON
 '''
 
 def main(arguments):
@@ -612,6 +650,9 @@ def main(arguments):
             ['help', 'standalone', 'no-distcc', 'unattended', 'type=', 'incredibuild', 'generator='])
     except getopt.GetoptError, err:
         print >> sys.stderr, 'Error:', err
+        print >> sys.stderr, """
+Note: You must pass -D options to cmake after the "configure" command
+For example: develop.py configure -DSERVER:BOOL=OFF"""
         sys.exit(1)
 
     for o, a in opts:
@@ -619,9 +660,9 @@ def main(arguments):
             print usage_msg.strip()
             sys.exit(0)
         elif o in ('--standalone',):
-            setup.standalone = 'TRUE'
+            setup.standalone = 'ON'
         elif o in ('--unattended',):
-            setup.unattended = 'TRUE'
+            setup.unattended = 'ON'
         elif o in ('-t', '--type'):
             try:
                 setup.build_type = setup.build_types[a.lower()]
@@ -664,13 +705,14 @@ def main(arguments):
             print >> sys.stderr, 'Error: unknown subcommand', repr(cmd)
             print >> sys.stderr, "(run 'develop.py --help' for help)"
             sys.exit(1)
-    except CommandError, err:
-        print >> sys.stderr, 'Error:', err
-        sys.exit(1)
     except getopt.GetoptError, err:
         print >> sys.stderr, 'Error with %r subcommand: %s' % (cmd, err)
         sys.exit(1)
 
 
 if __name__ == '__main__':
-    main(sys.argv[1:])
+    try:
+        main(sys.argv[1:])
+    except CommandError, err:
+        print >> sys.stderr, 'Error:', err
+        sys.exit(1)
diff --git a/indra/lib/python/indra/base/lllog.py b/indra/lib/python/indra/base/lllog.py
index 99c50ef..1301894 100644
--- a/indra/lib/python/indra/base/lllog.py
+++ b/indra/lib/python/indra/base/lllog.py
@@ -59,7 +59,7 @@ class Logger(object):
         return self._sequence
 
     def log(self, msg, llsd):
-        payload = 'LLLOGMESSAGE (%d) %s %s' % (self.next(), msg,
+        payload = 'INFO: log: LLLOGMESSAGE (%d) %s %s' % (self.next(), msg,
                                                format_notation(llsd))
         syslog.syslog(payload)
 
diff --git a/indra/lib/python/indra/base/llsd.py b/indra/lib/python/indra/base/llsd.py
index 995ace7..5b8f5d7 100644
--- a/indra/lib/python/indra/base/llsd.py
+++ b/indra/lib/python/indra/base/llsd.py
@@ -33,19 +33,26 @@ import time
 import types
 import re
 
-from indra.util.fastest_elementtree import fromstring
+from indra.util.fastest_elementtree import ElementTreeError, fromstring
 from indra.base import lluuid
 
-int_regex = re.compile("[-+]?\d+")
-real_regex = re.compile("[-+]?(\d+(\.\d*)?|\d*\.\d+)([eE][-+]?\d+)?")
-alpha_regex = re.compile("[a-zA-Z]+")
-date_regex = re.compile("(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})T(?P<hour>\d{2}):(?P<minute>\d{2}):(?P<second>\d{2})(?P<second_float>\.\d{2})?Z")
-#date: d"YYYY-MM-DDTHH:MM:SS.FFZ"
+try:
+    import cllsd
+except ImportError:
+    cllsd = None
+
+int_regex = re.compile(r"[-+]?\d+")
+real_regex = re.compile(r"[-+]?(\d+(\.\d*)?|\d*\.\d+)([eE][-+]?\d+)?")
+alpha_regex = re.compile(r"[a-zA-Z]+")
+date_regex = re.compile(r"(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})T"
+                        r"(?P<hour>\d{2}):(?P<minute>\d{2}):(?P<second>\d{2})"
+                        r"(?P<second_float>(\.\d+)?)Z")
+#date: d"YYYY-MM-DDTHH:MM:SS.FFFFFFZ"
 
 class LLSDParseError(Exception):
     pass
 
-class LLSDSerializationError(Exception):
+class LLSDSerializationError(TypeError):
     pass
 
 
@@ -62,14 +69,7 @@ BOOL_FALSE = ('0', '0.0', 'false', '')
 
 def format_datestr(v):
     """ Formats a datetime object into the string format shared by xml and notation serializations."""
-    second_str = ""
-    if v.microsecond > 0:
-        seconds = v.second + float(v.microsecond) / 1000000
-        second_str = "%05.2f" % seconds
-    else:
-        second_str = "%d" % v.second
-    return '%s%sZ' % (v.strftime('%Y-%m-%dT%H:%M:'), second_str)
-
+    return v.isoformat() + 'Z'
 
 def parse_datestr(datestr):
     """Parses a datetime object from the string format shared by xml and notation serializations."""
@@ -89,7 +89,7 @@ def parse_datestr(datestr):
     seconds_float = match.group('second_float')
     microsecond = 0
     if seconds_float:
-        microsecond = int(seconds_float[1:]) * 10000
+        microsecond = int(float('0' + seconds_float) * 1e6)
     return datetime.datetime(year, month, day, hour, minute, second, microsecond)
 
 
@@ -116,7 +116,7 @@ def uuid_to_python(node):
     return lluuid.UUID(node.text)
 
 def str_to_python(node):
-    return unicode(node.text or '').encode('utf8', 'replace')
+    return node.text or ''
 
 def bin_to_python(node):
     return binary(base64.decodestring(node.text or ''))
@@ -189,9 +189,13 @@ class LLSDXMLFormatter(object):
         if(contents is None or contents is ''):
             return "<%s />" % (name,)
         else:
+            if type(contents) is unicode:
+                contents = contents.encode('utf-8')
             return "<%s>%s</%s>" % (name, contents, name)
 
     def xml_esc(self, v):
+        if type(v) is unicode:
+            v = v.encode('utf-8')
         return v.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;')
 
     def LLSD(self, v):
@@ -237,9 +241,14 @@ class LLSDXMLFormatter(object):
             raise LLSDSerializationError("Cannot serialize unknown type: %s (%s)" % (
                 t, something))
 
-    def format(self, something):
+    def _format(self, something):
         return '<?xml version="1.0" ?>' + self.elt("llsd", self.generate(something))
 
+    def format(self, something):
+        if cllsd:
+            return cllsd.llsd_to_xml(something)
+        return self._format(something)
+
 _g_xml_formatter = None
 def format_xml(something):
     global _g_xml_formatter
@@ -356,8 +365,10 @@ class LLSDNotationFormatter(object):
     def UUID(self, v):
         return "u%s" % v
     def BINARY(self, v):
-        raise LLSDSerializationError("binary notation not yet supported")
+        return 'b64"' + base64.encodestring(v) + '"'
     def STRING(self, v):
+        if isinstance(v, unicode):
+            v = v.encode('utf-8')
         return "'%s'" % v.replace("\\", "\\\\").replace("'", "\\'")
     def URI(self, v):
         return 'l"%s"' % str(v).replace("\\", "\\\\").replace('"', '\\"')
@@ -366,16 +377,24 @@ class LLSDNotationFormatter(object):
     def ARRAY(self, v):
         return "[%s]" % ','.join([self.generate(item) for item in v])
     def MAP(self, v):
-        return "{%s}" % ','.join(["'%s':%s" % (key.replace("\\", "\\\\").replace("'", "\\'"), self.generate(value))
+        def fix(key):
+            if isinstance(key, unicode):
+                return key.encode('utf-8')
+            return key
+        return "{%s}" % ','.join(["'%s':%s" % (fix(key).replace("\\", "\\\\").replace("'", "\\'"), self.generate(value))
              for key, value in v.items()])
 
     def generate(self, something):
         t = type(something)
-        if self.type_map.has_key(t):
-            return self.type_map[t](something)
+        handler = self.type_map.get(t)
+        if handler:
+            return handler(something)
         else:
-            raise LLSDSerializationError("Cannot serialize unknown type: %s (%s)" % (
-                t, something))
+            try:
+                return self.ARRAY(iter(something))
+            except TypeError:
+                raise LLSDSerializationError(
+                    "Cannot serialize unknown type: %s (%s)" % (t, something))
 
     def format(self, something):
         return self.generate(something)
@@ -479,7 +498,6 @@ class LLSDBinaryParser(object):
                 raise LLSDParseError("invalid map key at byte %d." % (
                     self._index - 1,))
             value = self._parse()
-            #print "kv:",key,value
             rv[key] = value
             count += 1
             cc = self._buffer[self._index]
@@ -636,11 +654,23 @@ class LLSDNotationParser(object):
             # 'd' = date in seconds since epoch
             return self._parse_date()
         elif cc == 'b':
-            raise LLSDParseError("binary notation not yet supported")
+            return self._parse_binary()
         else:
             raise LLSDParseError("invalid token at index %d: %d" % (
                 self._index - 1, ord(cc)))
 
+    def _parse_binary(self):
+        i = self._index
+        if self._buffer[i:i+2] == '64':
+            q = self._buffer[i+2]
+            e = self._buffer.find(q, i+3)
+            try:
+                return base64.decodestring(self._buffer[i+3:e])
+            finally:
+                self._index = e + 1
+        else:
+            raise LLSDParseError('random horrible binary format not supported')
+
     def _parse_map(self):
         """ map: { string:object, string:object } """
         rv = {}
@@ -653,30 +683,23 @@ class LLSDNotationParser(object):
                 if cc in ("'", '"', 's'):
                     key = self._parse_string(cc)
                     found_key = True
-                    #print "key:",key
                 elif cc.isspace() or cc == ',':
                     cc = self._buffer[self._index]
                     self._index += 1
                 else:
                     raise LLSDParseError("invalid map key at byte %d." % (
                                         self._index - 1,))
+            elif cc.isspace() or cc == ':':
+                cc = self._buffer[self._index]
+                self._index += 1
+                continue
             else:
-                if cc.isspace() or cc == ':':
-                    #print "skipping whitespace '%s'" % cc
-                    cc = self._buffer[self._index]
-                    self._index += 1
-                    continue
                 self._index += 1
                 value = self._parse()
-                #print "kv:",key,value
                 rv[key] = value
                 found_key = False
                 cc = self._buffer[self._index]
                 self._index += 1
-                #if cc == '}':
-                #    break
-                #cc = self._buffer[self._index]
-                #self._index += 1
 
         return rv
 
@@ -840,6 +863,14 @@ def format_binary(something):
     return '<?llsd/binary?>\n' + _format_binary_recurse(something)
 
 def _format_binary_recurse(something):
+    def _format_list(something):
+        array_builder = []
+        array_builder.append('[' + struct.pack('!i', len(something)))
+        for item in something:
+            array_builder.append(_format_binary_recurse(item))
+        array_builder.append(']')
+        return ''.join(array_builder)
+
     if something is None:
         return '!'
     elif isinstance(something, LLSD):
@@ -857,7 +888,10 @@ def _format_binary_recurse(something):
         return 'u' + something._bits
     elif isinstance(something, binary):
         return 'b' + struct.pack('!i', len(something)) + something
-    elif isinstance(something, (str, unicode)):
+    elif isinstance(something, str):
+        return 's' + struct.pack('!i', len(something)) + something
+    elif isinstance(something, unicode):
+        something = something.encode('utf-8')
         return 's' + struct.pack('!i', len(something)) + something
     elif isinstance(something, uri):
         return 'l' + struct.pack('!i', len(something)) + something
@@ -865,35 +899,50 @@ def _format_binary_recurse(something):
         seconds_since_epoch = time.mktime(something.timetuple())
         return 'd' + struct.pack('!d', seconds_since_epoch)
     elif isinstance(something, (list, tuple)):
-        array_builder = []
-        array_builder.append('[' + struct.pack('!i', len(something)))
-        for item in something:
-            array_builder.append(_format_binary_recurse(item))
-        array_builder.append(']')
-        return ''.join(array_builder)
+        return _format_list(something)
     elif isinstance(something, dict):
         map_builder = []
         map_builder.append('{' + struct.pack('!i', len(something)))
         for key, value in something.items():
+            if isinstance(key, unicode):
+                key = key.encode('utf-8')
             map_builder.append('k' + struct.pack('!i', len(key)) + key)
             map_builder.append(_format_binary_recurse(value))
         map_builder.append('}')
         return ''.join(map_builder)
     else:
-        raise LLSDSerializationError("Cannot serialize unknown type: %s (%s)" % (
-            type(something), something))
+        try:
+            return _format_list(list(something))
+        except TypeError:
+            raise LLSDSerializationError(
+                "Cannot serialize unknown type: %s (%s)" %
+                (type(something), something))
+
+
+def parse_binary(something):
+    header = '<?llsd/binary?>\n'
+    if not something.startswith(header):
+        raise LLSDParseError('LLSD binary encoding header not found')
+    return LLSDBinaryParser().parse(something[len(header):])
+    
+def parse_xml(something):
+    try:
+        return to_python(fromstring(something)[0])
+    except ElementTreeError, err:
+        raise LLSDParseError(*err.args)
 
+def parse_notation(something):
+    return LLSDNotationParser().parse(something)
 
 def parse(something):
     try:
         if something.startswith('<?llsd/binary?>'):
-            just_binary = something.split('\n', 1)[1]
-            return LLSDBinaryParser().parse(just_binary)
+            return parse_binary(something)
         # This should be better.
         elif something.startswith('<'):
-            return to_python(fromstring(something)[0])
+            return parse_xml(something)
         else:
-            return LLSDNotationParser().parse(something)
+            return parse_notation(something)
     except KeyError, e:
         raise Exception('LLSD could not be parsed: %s' % (e,))
 
@@ -913,6 +962,9 @@ class LLSD(object):
 
 undef = LLSD(None)
 
+XML_MIME_TYPE = 'application/llsd+xml'
+BINARY_MIME_TYPE = 'application/llsd+binary'
+
 # register converters for llsd in mulib, if it is available
 try:
     from mulib import stacked, mu
@@ -922,7 +974,7 @@ except:
     # mulib not available, don't print an error message since this is normal
     pass
 else:
-    mu.add_parser(parse, 'application/llsd+xml')
+    mu.add_parser(parse, XML_MIME_TYPE)
     mu.add_parser(parse, 'application/llsd+binary')
 
     def llsd_convert_xml(llsd_stuff, request):
@@ -931,11 +983,58 @@ else:
     def llsd_convert_binary(llsd_stuff, request):
         request.write(format_binary(llsd_stuff))
 
-    for typ in [LLSD, dict, list, tuple, str, int, float, bool, unicode, type(None)]:
-        stacked.add_producer(typ, llsd_convert_xml, 'application/llsd+xml')
+    for typ in [LLSD, dict, list, tuple, str, int, long, float, bool, unicode, type(None)]:
+        stacked.add_producer(typ, llsd_convert_xml, XML_MIME_TYPE)
         stacked.add_producer(typ, llsd_convert_xml, 'application/xml')
         stacked.add_producer(typ, llsd_convert_xml, 'text/xml')
 
         stacked.add_producer(typ, llsd_convert_binary, 'application/llsd+binary')
 
     stacked.add_producer(LLSD, llsd_convert_xml, '*/*')
+
+    # in case someone is using the legacy mu.xml wrapper, we need to
+    # tell mu to produce application/xml or application/llsd+xml
+    # (based on the accept header) from raw xml. Phoenix 2008-07-21
+    stacked.add_producer(mu.xml, mu.produce_raw, XML_MIME_TYPE)
+    stacked.add_producer(mu.xml, mu.produce_raw, 'application/xml')
+
+
+
+# mulib wsgi stuff
+# try:
+#     from mulib import mu, adapters
+#
+#     # try some known attributes from mulib to be ultra-sure we've imported it
+#     mu.get_current
+#     adapters.handlers
+# except:
+#     # mulib not available, don't print an error message since this is normal
+#     pass
+# else:
+#     def llsd_xml_handler(content_type):
+#         def handle_llsd_xml(env, start_response):
+#             llsd_stuff, _ = mu.get_current(env)
+#             result = format_xml(llsd_stuff)
+#             start_response("200 OK", [('Content-Type', content_type)])
+#             env['mu.negotiated_type'] = content_type
+#             yield result
+#         return handle_llsd_xml
+#    
+#     def llsd_binary_handler(content_type):
+#         def handle_llsd_binary(env, start_response):
+#             llsd_stuff, _ = mu.get_current(env)
+#             result = format_binary(llsd_stuff)
+#             start_response("200 OK", [('Content-Type', content_type)])
+#             env['mu.negotiated_type'] = content_type
+#             yield result
+#         return handle_llsd_binary
+#
+#     adapters.DEFAULT_PARSERS[XML_MIME_TYPE] = parse
+    
+#     for typ in [LLSD, dict, list, tuple, str, int, float, bool, unicode, type(None)]:
+#         for content_type in (XML_MIME_TYPE, 'application/xml'):
+#             adapters.handlers.set_handler(typ, llsd_xml_handler(content_type), content_type)
+#
+#         adapters.handlers.set_handler(typ, llsd_binary_handler(BINARY_MIME_TYPE), BINARY_MIME_TYPE)
+#
+#     adapters.handlers.set_handler(LLSD, llsd_xml_handler(XML_MIME_TYPE), '*/*')
diff --git a/indra/lib/python/indra/ipc/llmessage.py b/indra/lib/python/indra/ipc/llmessage.py
index 446679d..c2f3fd4 100644
--- a/indra/lib/python/indra/ipc/llmessage.py
+++ b/indra/lib/python/indra/ipc/llmessage.py
@@ -88,7 +88,7 @@ class Message:
     UDPDEPRECATED = "UDPDeprecated"
     UDPBLACKLISTED = "UDPBlackListed"
     deprecations = [ NOTDEPRECATED, UDPDEPRECATED, UDPBLACKLISTED, DEPRECATED ]
-        # in order of increasing deprecation
+    # in order of increasing deprecation
     
     def __init__(self, name, number, priority, trust, coding):
         self.name = name
diff --git a/indra/lib/python/indra/ipc/llsdhttp.py b/indra/lib/python/indra/ipc/llsdhttp.py
index 1cf1146..ed64899 100644
--- a/indra/lib/python/indra/ipc/llsdhttp.py
+++ b/indra/lib/python/indra/ipc/llsdhttp.py
@@ -51,6 +51,8 @@ request_ = suite.request_
 # import every httpc error exception into our namespace for convenience
 for x in httpc.status_to_error_map.itervalues():
     globals()[x.__name__] = x
+ConnectionError = httpc.ConnectionError
+Retriable = httpc.Retriable
 
 for x in (httpc.ConnectionError,):
     globals()[x.__name__] = x
diff --git a/indra/lib/python/indra/ipc/mysql_pool.py b/indra/lib/python/indra/ipc/mysql_pool.py
index 507b185..25a66cf 100644
--- a/indra/lib/python/indra/ipc/mysql_pool.py
+++ b/indra/lib/python/indra/ipc/mysql_pool.py
@@ -30,8 +30,10 @@ import MySQLdb
 from eventlet import db_pool
 
 class DatabaseConnector(db_pool.DatabaseConnector):
-    def __init__(self, credentials, min_size = 0, max_size = 4, *args, **kwargs):
-        super(DatabaseConnector, self).__init__(MySQLdb, credentials, min_size, max_size, conn_pool=db_pool.ConnectionPool, *args, **kwargs)
+    def __init__(self, credentials, *args, **kwargs):
+        super(DatabaseConnector, self).__init__(MySQLdb, credentials,
+                                                conn_pool=db_pool.ConnectionPool,
+                                                *args, **kwargs)
 
     # get is extended relative to eventlet.db_pool to accept a port argument
     def get(self, host, dbname, port=3306):
@@ -42,7 +44,7 @@ class DatabaseConnector(db_pool.DatabaseConnector):
             new_kwargs['host'] = host
             new_kwargs['port'] = port
             new_kwargs.update(self.credentials_for(host))
-            dbpool = ConnectionPool(self._min_size, self._max_size, *self._args, **new_kwargs)
+            dbpool = ConnectionPool(*self._args, **new_kwargs)
             self._databases[key] = dbpool
 
         return self._databases[key]
@@ -51,8 +53,8 @@ class ConnectionPool(db_pool.TpooledConnectionPool):
     """A pool which gives out saranwrapped MySQLdb connections from a pool
     """
 
-    def __init__(self, min_size = 0, max_size = 4, *args, **kwargs):
-        super(ConnectionPool, self).__init__(MySQLdb, min_size, max_size, *args, **kwargs)
+    def __init__(self, *args, **kwargs):
+        super(ConnectionPool, self).__init__(MySQLdb, *args, **kwargs)
 
     def get(self):
         conn = super(ConnectionPool, self).get()
@@ -77,14 +79,3 @@ class ConnectionPool(db_pool.TpooledConnectionPool):
         conn.connection_parameters = converted_kwargs
         return conn
 
-    def clear(self):
-        """ Close all connections that this pool still holds a reference to, leaving it empty."""
-        for conn in self.free_items:
-            try:
-                conn.close()
-            except:
-                pass   # even if stuff happens here, we still want to at least try to close all the other connections
-        self.free_items.clear()
-            
-    def __del__(self):
-        self.clear()
diff --git a/indra/lib/python/indra/ipc/saranwrap.py b/indra/lib/python/indra/ipc/saranwrap.py
deleted file mode 100644
index e0205bf..0000000
--- a/indra/lib/python/indra/ipc/saranwrap.py
+++ /dev/null
@@ -1,651 +0,0 @@
-"""\
- at file saranwrap.py
- at author Phoenix
- at date 2007-07-13
- at brief A simple, pickle based rpc mechanism which reflects python
-objects and callables.
-
-$LicenseInfo:firstyear=2007&license=mit$
-
-Copyright (c) 2007-2008, Linden Research, Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-$/LicenseInfo$
-
-This file provides classes and exceptions used for simple python level
-remote procedure calls. This is achieved by intercepting the basic
-getattr and setattr calls in a client proxy, which commnicates those
-down to the server which will dispatch them to objects in it's process
-space.
-
-The basic protocol to get and set attributes is for the client proxy
-to issue the command:
-
-getattr $id $name
-setattr $id $name $value
-
-getitem $id $item
-setitem $id $item $value
-eq $id $rhs
-del $id
-
-When the get returns a callable, the client proxy will provide a
-callable proxy which will invoke a remote procedure call. The command
-issued from the callable proxy to server is:
-
-call $id $name $args $kwargs
-
-If the client supplies an id of None, then the get/set/call is applied
-to the object(s) exported from the server.
-
-The server will parse the get/set/call, take the action indicated, and
-return back to the caller one of:
-
-value $val
-callable
-object $id
-exception $excp
-
-To handle object expiration, the proxy will instruct the rpc server to
-discard objects which are no longer in use. This is handled by
-catching proxy deletion and sending the command:
-
-del $id
-
-The server will handle this by removing clearing it's own internal
-references. This does not mean that the object will necessarily be
-cleaned from the server, but no artificial references will remain
-after successfully completing. On completion, the server will return
-one of:
-
-value None
-exception $excp
-
-The server also accepts a special command for debugging purposes:
-
-status
-
-Which will be intercepted by the server to write back:
-
-status {...}
-
-The wire protocol is to pickle the Request class in this file. The
-request class is basically an action and a map of parameters'
-"""
-
-import os
-import cPickle
-import struct
-import sys
-
-try:
-    set = set
-    frozenset = frozenset
-except NameError:
-    from sets import Set as set, ImmutableSet as frozenset
-
-from eventlet.processes import Process
-from eventlet import api
-
-#
-# debugging hooks
-#
-_g_debug_mode = False
-if _g_debug_mode:
-    import traceback
-
-def pythonpath_sync():
-    """
- at brief apply the current sys.path to the environment variable PYTHONPATH, so that child processes have the same paths as the caller does.
-"""
-    pypath = os.pathsep.join(sys.path)
-    os.environ['PYTHONPATH'] = pypath
-
-def wrap(obj, dead_callback = None):
-    """
- at brief wrap in object in another process through a saranwrap proxy
- at param object The object to wrap.
- at param dead_callback A callable to invoke if the process exits."""
-
-    if type(obj).__name__ == 'module':
-        return wrap_module(obj.__name__, dead_callback)
-    pythonpath_sync()
-    p = Process('python', [__file__, '--child'], dead_callback)
-    prox = Proxy(p, p)
-    prox.obj = obj
-    return prox.obj
-
-def wrap_module(fqname, dead_callback = None):
-    """
- at brief wrap a module in another process through a saranwrap proxy
- at param fqname The fully qualified name of the module.
- at param dead_callback A callable to invoke if the process exits."""
-    pythonpath_sync()
-    global _g_debug_mode
-    if _g_debug_mode:
-        p = Process('python', [__file__, '--module', fqname, '--logfile', '/tmp/saranwrap.log'], dead_callback)
-    else:
-        p = Process('python', [__file__, '--module', fqname,], dead_callback)
-    prox = Proxy(p, p)
-    return prox
-
-def status(proxy):
-    """
- at brief get the status from the server through a proxy
- at param proxy a saranwrap.Proxy object connected to a server."""
-    _write_request(Request('status', {}), proxy.__local_dict['_out'])
-    return _read_response(None, None, proxy.__local_dict['_in'], proxy.__local_dict['_out'], None)
-
-class BadResponse(Exception):
-    """"This exception is raised by an saranwrap client when it could
-    parse but cannot understand the response from the server."""
-    pass
-
-class BadRequest(Exception):
-    """"This exception is raised by a saranwrap server when it could parse
-    but cannot understand the response from the server."""
-    pass
-
-class UnrecoverableError(Exception):
-    pass
-
-class Request(object):
-    "@brief A wrapper class for proxy requests to the server."
-    def __init__(self, action, param):
-        self._action = action
-        self._param = param
-    def __str__(self):
-        return "Request `"+self._action+"` "+str(self._param)
-    def __getitem__(self, name):
-        return self._param[name]
-    def action(self):
-        return self._action
-
-def _read_lp_hunk(stream):
-    len_bytes = stream.read(4)
-    length = struct.unpack('I', len_bytes)[0]
-    body = stream.read(length)
-    return body
-
-def _read_response(id, attribute, input, output, dead_list):
-    """@brief local helper method to read respones from the rpc server."""
-    try:
-        str = _read_lp_hunk(input)
-        _prnt(`str`)
-        response = cPickle.loads(str)
-    except AttributeError, e:
-        raise UnrecoverableError(e)
-    _prnt("response: %s" % response)
-    if response[0] == 'value':
-        return response[1]
-    elif response[0] == 'callable':
-        return CallableProxy(id, attribute, input, output, dead_list)
-    elif response[0] == 'object':
-        return ObjectProxy(input, output, response[1], dead_list)
-    elif response[0] == 'exception':
-        exp = response[1]
-        raise exp
-    else:
-        raise BadResponse(response[0])
-
-def _write_lp_hunk(stream, hunk):
-    write_length = struct.pack('I', len(hunk))
-    stream.write(write_length + hunk)
-    if hasattr(stream, 'flush'):
-        stream.flush()
-
-def _write_request(param, output):
-    _prnt("request: %s" % param)
-    str = cPickle.dumps(param)
-    _write_lp_hunk(output, str)
-
-def _is_local(attribute):
-    "Return true if the attribute should be handled locally"
-#    return attribute in ('_in', '_out', '_id', '__getattribute__', '__setattr__', '__dict__')
-    # good enough for now. :)
-    if '__local_dict' in attribute:
-        return True
-    return False
-
-def _prnt(message):
-    global _g_debug_mode
-    if _g_debug_mode:
-        print message
-
-_g_logfile = None
-def _log(message):
-    global _g_logfile
-    if _g_logfile:
-        _g_logfile.write(str(os.getpid()) + ' ' + message)
-        _g_logfile.write('\n')
-        _g_logfile.flush()
-
-def _unmunge_attr_name(name):
-    """ Sometimes attribute names come in with classname prepended, not sure why.
-    This function removes said classname, because we're huge hackers and we didn't
-    find out what the true right thing to do is.  *FIX: find out. """
-    if(name.startswith('_Proxy')):
-        name = name[len('_Proxy'):]
-    if(name.startswith('_ObjectProxy')):
-        name = name[len('_ObjectProxy'):]
-    return name
-
-
-class Proxy(object):
-    """\
- at class Proxy
- at brief This class wraps a remote python process, presumably available
-in an instance of an Server.
-
-This is the class you will typically use as a client to a child
-process. Simply instantiate one around a file-like interface and start
-calling methods on the thing that is exported. The dir() builtin is
-not supported, so you have to know what has been exported.
-"""
-    def __init__(self, input, output, dead_list = None):
-        """\
- at param input a file-like object which supports read().
- at param output a file-like object which supports write() and flush().
- at param id an identifier for the remote object. humans do not provide this.
-"""
-        # default dead_list inside the function because all objects in method
-        # argument lists are init-ed only once globally
-        if dead_list is None:
-            dead_list = set()
-        #_prnt("Proxy::__init__")
-        self.__local_dict = dict(
-            _in = input,
-            _out = output,
-            _dead_list = dead_list,
-            _id = None)
-
-    def __getattribute__(self, attribute):
-        #_prnt("Proxy::__getattr__: %s" % attribute)
-        if _is_local(attribute):
-            # call base class getattribute so we actually get the local variable
-            attribute = _unmunge_attr_name(attribute)
-            return super(Proxy, self).__getattribute__(attribute)
-        else:
-            my_in = self.__local_dict['_in']
-            my_out = self.__local_dict['_out']
-            my_id = self.__local_dict['_id']
-
-            _dead_list = self.__local_dict['_dead_list']
-            for dead_object in _dead_list.copy():
-                    request = Request('del', {'id':dead_object})
-                    _write_request(request, my_out)
-                    response = _read_response(my_id, attribute, my_in, my_out, _dead_list)
-                    _dead_list.remove(dead_object)
-                
-            # Pass all public attributes across to find out if it is
-            # callable or a simple attribute.
-            request = Request('getattr', {'id':my_id, 'attribute':attribute})
-            _write_request(request, my_out)
-            return _read_response(my_id, attribute, my_in, my_out, _dead_list)
-
-    def __setattr__(self, attribute, value):
-        #_prnt("Proxy::__setattr__: %s" % attribute)
-        if _is_local(attribute):
-            # It must be local to this actual object, so we have to apply 
-            # it to the dict in a roundabout way
-            attribute = _unmunge_attr_name(attribute)
-            super(Proxy, self).__getattribute__('__dict__')[attribute]=value
-        else:
-            my_in = self.__local_dict['_in']
-            my_out = self.__local_dict['_out']
-            my_id = self.__local_dict['_id']
-            _dead_list = self.__local_dict['_dead_list']
-            # Pass the set attribute across
-            request = Request('setattr', {'id':my_id, 'attribute':attribute, 'value':value})
-            _write_request(request, my_out)
-            return _read_response(my_id, attribute, my_in, my_out, _dead_list)
-
-class ObjectProxy(Proxy):
-    """\
- at class ObjectProxy
- at brief This class wraps a remote object in the Server
-
-This class will be created during normal operation, and users should
-not need to deal with this class directly."""
-
-    def __init__(self, input, output, id, dead_list):
-        """\
- at param input a file-like object which supports read().
- at param output a file-like object which supports write() and flush().
- at param id an identifier for the remote object. humans do not provide this.
-"""
-        Proxy.__init__(self, input, output, dead_list)
-        self.__local_dict['_id'] = id
-        #_prnt("ObjectProxy::__init__ %s" % self._id)
-
-    def __del__(self):
-        my_id = self.__local_dict['_id']
-        _prnt("ObjectProxy::__del__ %s" % my_id)
-        self.__local_dict['_dead_list'].add(my_id)
-
-    def __getitem__(self, key):
-        my_in = self.__local_dict['_in']
-        my_out = self.__local_dict['_out']
-        my_id = self.__local_dict['_id']
-        _dead_list = self.__local_dict['_dead_list']
-        request = Request('getitem', {'id':my_id, 'key':key})
-        _write_request(request, my_out)
-        return _read_response(my_id, key, my_in, my_out, _dead_list)
-        
-    def __setitem__(self, key, value):
-        my_in = self.__local_dict['_in']
-        my_out = self.__local_dict['_out']
-        my_id = self.__local_dict['_id']
-        _dead_list = self.__local_dict['_dead_list']
-        request = Request('setitem', {'id':my_id, 'key':key, 'value':value})
-        _write_request(request, my_out)
-        return _read_response(my_id, key, my_in, my_out, _dead_list)
-
-    def __eq__(self, rhs):
-        my_in = self.__local_dict['_in']
-        my_out = self.__local_dict['_out']
-        my_id = self.__local_dict['_id']
-        _dead_list = self.__local_dict['_dead_list']
-        request = Request('eq', {'id':my_id, 'rhs':rhs.__local_dict['_id']})
-        _write_request(request, my_out)
-        return _read_response(my_id, None, my_in, my_out, _dead_list)
-
-    def __repr__(self):
-        # apparently repr(obj) skips the whole getattribute thing and just calls __repr__
-        # directly.  Therefore we just pass it through the normal call pipeline, and
-        # tack on a little header so that you can tell it's an object proxy.
-        val =  self.__repr__()
-        return "saran:%s" % val
-
-    def __str__(self):
-        # see description for __repr__, because str(obj) works the same.  We don't
-        # tack anything on to the return value here because str values are used as data.
-        return self.__str__()
-
-    def __len__(self):
-        # see description for __repr__, len(obj) is the same.  Unfortunately, __len__ is also
-        # used when determining whether an object is boolean or not, e.g. if proxied_object:
-        return self.__len__()
-
-def proxied_type(self):
-    if type(self) is not ObjectProxy:
-        return type(self)
-
-    my_in = self.__local_dict['_in']
-    my_out = self.__local_dict['_out']
-    my_id = self.__local_dict['_id']
-    request = Request('type', {'id':my_id})
-    _write_request(request, my_out)
-    # dead list can be none because we know the result will always be
-    # a value and not an ObjectProxy itself
-    return _read_response(my_id, None, my_in, my_out, None)
-
-class CallableProxy(object):
-    """\
- at class CallableProxy
- at brief This class wraps a remote function in the Server
-
-This class will be created by an Proxy during normal operation,
-and users should not need to deal with this class directly."""
-
-    def __init__(self, object_id, name, input, output, dead_list):
-        #_prnt("CallableProxy::__init__: %s, %s" % (object_id, name))
-        self._object_id = object_id
-        self._name = name
-        self._in = input
-        self._out = output
-        self._dead_list = dead_list
-
-    def __call__(self, *args, **kwargs):
-        #_prnt("CallableProxy::__call__: %s, %s" % (args, kwargs))
-
-        # Pass the call across. We never build a callable without
-        # having already checked if the method starts with '_' so we
-        # can safely pass this one to the remote object.
-        #_prnt("calling %s %s" % (self._object_id, self._name)
-        request = Request('call', {'id':self._object_id, 'name':self._name, 'args':args, 'kwargs':kwargs})
-        _write_request(request, self._out)
-        return _read_response(self._object_id, self._name, self._in, self._out, self._dead_list)
-
-class Server(object):
-    def __init__(self, input, output, export):
-        """\
- at param input a file-like object which supports read().
- at param output a file-like object which supports write() and flush().
- at param export an object, function, or map which is exported to clients
-when the id is None."""
-        #_log("Server::__init__")
-        self._in = input
-        self._out = output
-        self._export = export
-        self._next_id = 1
-        self._objects = {}
-
-    def handle_status(self, object, req):
-        return {
-            'object_count':len(self._objects),
-            'next_id':self._next_id,
-            'pid':os.getpid()}
-
-    def handle_getattr(self, object, req):
-        try:
-            return getattr(object, req['attribute'])
-        except AttributeError, e:
-            if hasattr(object, "__getitem__"):
-                return object[req['attribute']]
-            else:
-                raise e
-        #_log('getattr: %s' % str(response))
-        
-    def handle_setattr(self, object, req):
-        try:
-            return setattr(object, req['attribute'], req['value'])
-        except AttributeError, e:
-            if hasattr(object, "__setitem__"):
-                return object.__setitem__(req['attribute'], req['value'])
-            else:
-                raise e
-
-    def handle_getitem(self, object, req):
-        return object[req['key']]
-
-    def handle_setitem(self, object, req):
-        object[req['key']] = req['value']
-        return None  # *TODO figure out what the actual return value of __setitem__ should be
-
-    def handle_eq(self, object, req):
-        #_log("__eq__ %s %s" % (object, req))
-        rhs = None
-        try:
-            rhs = self._objects[req['rhs']]
-        except KeyError, e:
-            return False
-        return (object == rhs)
-
-    def handle_call(self, object, req):
-        #_log("calling %s " % (req['name']))
-        try:
-            fn = getattr(object, req['name'])
-        except AttributeError, e:
-            if hasattr(object, "__setitem__"):
-                fn = object[req['name']]
-            else:
-                raise e
-            
-        return fn(*req['args'],**req['kwargs'])
-
-    def handle_del(self, object, req):
-        id = req['id']
-        _log("del %s from %s" % (id, self._objects))
-
-        # *TODO what does __del__ actually return?
-        del self._objects[id]
-        return None
-
-    def handle_type(self, object, req):
-        return type(object)
-
-    def loop(self):
-        """@brief Loop forever and respond to all requests."""
-        _log("Server::loop")
-        while True:
-            try:
-                try:
-                    str = _read_lp_hunk(self._in)
-                except EOFError:
-                    sys.exit(0)  # normal exit
-                request = cPickle.loads(str)
-                _log("request: %s (%s)" % (request, self._objects))
-                req = request
-                id = None
-                object = None
-                try:
-                    id = req['id']
-                    if id:
-                        id = int(id)
-                        object = self._objects[id]
-                    #_log("id, object: %d %s" % (id, object))
-                except Exception, e:
-                    #_log("Exception %s" % str(e))
-                    pass
-                if object is None or id is None:
-                    id = None
-                    object = self._export
-                    #_log("found object %s" % str(object))
-
-                # Handle the request via a method with a special name on the server
-                handler_name = 'handle_%s' % request.action()
-
-                try:
-                    handler = getattr(self, handler_name)
-                except AttributeError:
-                    raise BadRequest, request.action()
-
-                response = handler(object, request)
-
-                # figure out what to do with the response, and respond
-                # apprpriately.
-                if request.action() in ['status', 'type']:
-                    # have to handle these specially since we want to
-                    # pickle up the actual value and not return a proxy
-                    self.respond(['value', response])
-                elif callable(response):
-                    #_log("callable %s" % response)
-                    self.respond(['callable'])
-                elif self.is_value(response):
-                    self.respond(['value', response])
-                else:
-                    self._objects[self._next_id] = response
-                    #_log("objects: %s" % str(self._objects))
-                    self.respond(['object', self._next_id])
-                    self._next_id += 1
-            except SystemExit, e:
-                raise e
-            except Exception, e:
-                self.write_exception(e)
-            except:
-                self.write_exception(sys.exc_info()[0])
-
-    def is_value(self, value):
-        """\
- at brief Test if value should be serialized as a simple dataset.
- at param value The value to test.
- at return Returns true if value is a simple serializeable set of data.
-"""
-        return type(value) in (str,unicode,int,float,long,bool,type(None))
-
-    def respond(self, body):
-        _log("responding with: %s" % body)
-        #_log("objects: %s" % self._objects)
-        s = cPickle.dumps(body)
-        _log(`s`)
-        str = _write_lp_hunk(self._out, s)
-
-    def write_exception(self, e):
-        """@brief Helper method to respond with an exception."""
-        #_log("exception: %s" % sys.exc_info()[0])
-        # TODO: serialize traceback using generalization of code from mulib.htmlexception
-        self.respond(['exception', e])
-        global _g_debug_mode
-        if _g_debug_mode:
-            _log("traceback: %s" % traceback.format_tb(sys.exc_info()[2]))
-
-
-# test function used for testing that final except clause
-def raise_a_weird_error():
-    raise "oh noes you can raise a string"
-
-# test function used for testing return of unpicklable exceptions
-def raise_an_unpicklable_error():
-    class Unpicklable(Exception):
-        pass
-    raise Unpicklable()
-
-# test function used for testing return of picklable exceptions
-def raise_standard_error():
-    raise FloatingPointError()
-
-# test function to make sure print doesn't break the wrapper
-def print_string(str):
-    print str
-
-# test function to make sure printing on stdout doesn't break the
-# wrapper
-def err_string(str):
-    print >>sys.stderr, str
-
-def main():
-    import optparse
-    parser = optparse.OptionParser(
-        usage="usage: %prog [options]",
-        description="Simple saranwrap.Server wrapper")
-    parser.add_option(
-        '-c', '--child', default=False, action='store_true',
-        help='Wrap an object serialed via setattr.')
-    parser.add_option(
-        '-m', '--module', type='string', dest='module', default=None,
-        help='a module to load and export.')
-    parser.add_option(
-        '-l', '--logfile', type='string', dest='logfile', default=None,
-        help='file to log to.')
-    options, args = parser.parse_args()
-    global _g_logfile
-    if options.logfile:
-        _g_logfile = open(options.logfile, 'a')
-    if options.module:
-        export = api.named(options.module)
-        server = Server(sys.stdin, sys.stdout, export)
-    elif options.child:
-        server = Server(sys.stdin, sys.stdout, {})
-
-    # *HACK: some modules may emit on stderr, which breaks everything.
-    class NullSTDOut(object):
-        def write(a, b):
-            pass
-    sys.stderr = NullSTDOut()
-    sys.stdout = NullSTDOut()
-
-    # Loop until EOF
-    server.loop()
-    if _g_logfile:
-        _g_logfile.close()
-
-
-if __name__ == "__main__":
-    main()
diff --git a/indra/lib/python/indra/ipc/siesta.py b/indra/lib/python/indra/ipc/siesta.py
index 5fbea29..b206f18 100644
--- a/indra/lib/python/indra/ipc/siesta.py
+++ b/indra/lib/python/indra/ipc/siesta.py
@@ -24,9 +24,9 @@ except ImportError:
 
 llsd_parsers = {
     'application/json': json_decode,
-    'application/llsd+binary': llsd.parse_binary,
+    llsd.BINARY_MIME_TYPE: llsd.parse_binary,
     'application/llsd+notation': llsd.parse_notation,
-    'application/llsd+xml': llsd.parse_xml,
+    llsd.XML_MIME_TYPE: llsd.parse_xml,
     'application/xml': llsd.parse_xml,
     }
 
diff --git a/indra/lib/python/indra/util/fastest_elementtree.py b/indra/lib/python/indra/util/fastest_elementtree.py
index 64aed09..2470143 100644
--- a/indra/lib/python/indra/util/fastest_elementtree.py
+++ b/indra/lib/python/indra/util/fastest_elementtree.py
@@ -2,9 +2,9 @@
 @file fastest_elementtree.py
 @brief Concealing some gnarly import logic in here.  This should export the interface of elementtree.
 
-$LicenseInfo:firstyear=2006&license=mit$
+$LicenseInfo:firstyear=2008&license=mit$
 
-Copyright (c) 2006-2008, Linden Research, Inc.
+Copyright (c) 2008, Linden Research, Inc.
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
@@ -26,27 +26,40 @@ THE SOFTWARE.
 $/LicenseInfo$
 """
 
-# Using celementree might cause some unforeseen problems so here's a
+# The parsing exception raised by the underlying library depends
+# on the ElementTree implementation we're using, so we provide an
+# alias here.
+#
+# Use ElementTreeError as the exception type for catching parsing
+# errors.
+
+
+# Using cElementTree might cause some unforeseen problems, so here's a
 # convenient off switch.
 
-# *NOTE: turned off cause of problems.  :-(  *TODO: debug
-use_celementree = False
+use_celementree = True
 
 try:
     if not use_celementree:
         raise ImportError()
-    from cElementTree import * ## This does not work under Windows
+    # Python 2.3 and 2.4.
+    from cElementTree import *
+    ElementTreeError = SyntaxError
 except ImportError:
     try:
         if not use_celementree:
             raise ImportError()
-        ## This is the name of cElementTree under python 2.5
+        # Python 2.5 and above.
         from xml.etree.cElementTree import *
+        ElementTreeError = SyntaxError
     except ImportError:
+        # Pure Python code.
         try:
-            ## This is the old name of elementtree, for use with 2.3
+            # Python 2.3 and 2.4.
             from elementtree.ElementTree import *
         except ImportError:
-            ## This is the name of elementtree under python 2.5
+            # Python 2.5 and above.
             from xml.etree.ElementTree import *
 
+        # The pure Python ElementTree module uses Expat for parsing.
+        from xml.parsers.expat import ExpatError as ElementTreeError
diff --git a/indra/lib/python/indra/util/iterators.py b/indra/lib/python/indra/util/iterators.py
new file mode 100644
index 0000000..6a98c97
--- /dev/null
+++ b/indra/lib/python/indra/util/iterators.py
@@ -0,0 +1,63 @@
+"""\
+ at file iterators.py
+ at brief Useful general-purpose iterators.
+
+$LicenseInfo:firstyear=2008&license=mit$
+
+Copyright (c) 2008, Linden Research, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+$/LicenseInfo$
+"""
+
+from __future__ import nested_scopes
+
+def iter_chunks(rows, aggregate_size=100):
+    """
+    Given an iterable set of items (@p rows), produces lists of up to @p
+    aggregate_size items at a time, for example:
+    
+    iter_chunks([1,2,3,4,5,6,7,8,9,10], 3)
+
+    Values for @p aggregate_size < 1 will raise ValueError.
+
+    Will return a generator that produces, in the following order:
+    - [1, 2, 3]
+    - [4, 5, 6]
+    - [7, 8, 9]
+    - [10]
+    """
+    if aggregate_size < 1:
+        raise ValueError()
+
+    def iter_chunks_inner():
+        row_iter = iter(rows)
+        done = False
+        agg = []
+        while not done:
+            try:
+                row = row_iter.next()
+                agg.append(row)
+            except StopIteration:
+                done = True
+            if agg and (len(agg) >= aggregate_size or done):
+                yield agg
+                agg = []
+    
+    return iter_chunks_inner()
diff --git a/indra/lib/python/indra/util/iterators_test.py b/indra/lib/python/indra/util/iterators_test.py
new file mode 100755
index 0000000..7fd9e73
--- /dev/null
+++ b/indra/lib/python/indra/util/iterators_test.py
@@ -0,0 +1,72 @@
+"""\
+ at file iterators_test.py
+ at brief Test cases for iterators module.
+
+$LicenseInfo:firstyear=2008&license=mit$
+
+Copyright (c) 2008, Linden Research, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+$/LicenseInfo$
+"""
+
+import unittest
+
+from indra.util.iterators import iter_chunks
+
+class TestIterChunks(unittest.TestCase):
+    """Unittests for iter_chunks"""
+    def test_bad_agg_size(self):
+        rows = [1,2,3,4]
+        self.assertRaises(ValueError, iter_chunks, rows, 0)
+        self.assertRaises(ValueError, iter_chunks, rows, -1)
+
+        try:
+            for i in iter_chunks(rows, 0):
+                pass
+        except ValueError:
+            pass
+        else:
+            self.fail()
+        
+        try:
+            result = list(iter_chunks(rows, 0))
+        except ValueError:
+            pass
+        else:
+            self.fail()
+    def test_empty(self):
+        rows = []
+        result = list(iter_chunks(rows))
+        self.assertEqual(result, [])
+    def test_small(self):
+        rows = [[1]]
+        result = list(iter_chunks(rows, 2))
+        self.assertEqual(result, [[[1]]])
+    def test_size(self):
+        rows = [[1],[2]]
+        result = list(iter_chunks(rows, 2))
+        self.assertEqual(result, [[[1],[2]]])
+    def test_multi_agg(self):
+        rows = [[1],[2],[3],[4],[5]]
+        result = list(iter_chunks(rows, 2))
+        self.assertEqual(result, [[[1],[2]],[[3],[4]],[[5]]])
+
+if __name__ == "__main__":
+    unittest.main()
diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py
index 4675177..a00d242 100644
--- a/indra/lib/python/indra/util/llmanifest.py
+++ b/indra/lib/python/indra/util/llmanifest.py
@@ -584,7 +584,7 @@ class LLManifest(object):
 
     def wildcard_regex(self, src_glob, dst_glob):
         src_re = re.escape(src_glob)
-        src_re = src_re.replace('\*', '([-a-zA-Z0-9._ ]+)')
+        src_re = src_re.replace('\*', '([-a-zA-Z0-9._ ]*)')
         dst_temp = dst_glob
         i = 1
         while dst_temp.count("*") > 0:
@@ -621,6 +621,7 @@ class LLManifest(object):
             count = 0
             if self.wildcard_pattern.search(src):
                 for s,d in self.expand_globs(src, dst):
+                    assert(s != d)
                     count += self.process_file(s, d)
             else:
                 # if we're specifying a single path (not a glob),
diff --git a/indra/lib/python/indra/util/llperformance.py b/indra/lib/python/indra/util/llperformance.py
new file mode 100755
index 0000000..7c52730
--- /dev/null
+++ b/indra/lib/python/indra/util/llperformance.py
@@ -0,0 +1,158 @@
+#!/usr/bin/python
+
+# ------------------------------------------------
+# Sim metrics utility functions.
+
+import glob, os, time, sys, stat, exceptions
+
+from indra.base import llsd
+
+gBlockMap = {}              #Map of performance metric data with function hierarchy information.
+gCurrentStatPath = ""
+
+gIsLoggingEnabled=False
+
+class LLPerfStat:
+    def __init__(self,key):
+        self.mTotalTime = 0
+        self.mNumRuns = 0
+        self.mName=key
+        self.mTimeStamp = int(time.time()*1000)
+        self.mUTCTime = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
+
+    def __str__(self):
+        return "%f" %  self.mTotalTime
+
+    def start(self):
+        self.mStartTime = int(time.time() * 1000000)
+        self.mNumRuns += 1
+
+    def stop(self):
+        execution_time = int(time.time() * 1000000) - self.mStartTime
+        self.mTotalTime += execution_time
+
+    def get_map(self):
+        results={}
+        results['name']=self.mName
+        results['utc_time']=self.mUTCTime
+        results['timestamp']=self.mTimeStamp
+        results['us']=self.mTotalTime
+        results['count']=self.mNumRuns
+        return results
+
+class PerfError(exceptions.Exception):
+    def __init__(self):
+        return
+
+    def __Str__(self):
+        print "","Unfinished LLPerfBlock"
+
+class LLPerfBlock:
+    def __init__( self, key ):
+        global gBlockMap
+        global gCurrentStatPath
+        global gIsLoggingEnabled
+
+        #Check to see if we're running metrics right now.
+        if gIsLoggingEnabled:
+            self.mRunning = True        #Mark myself as running.
+    
+            self.mPreviousStatPath = gCurrentStatPath
+            gCurrentStatPath += "/" + key
+            if gCurrentStatPath not in gBlockMap:
+                gBlockMap[gCurrentStatPath] = LLPerfStat(key)
+
+            self.mStat = gBlockMap[gCurrentStatPath]
+            self.mStat.start()
+    
+    def finish( self ):
+        global gBlockMap
+        global gIsLoggingEnabled
+
+        if gIsLoggingEnabled:
+            self.mStat.stop()
+            self.mRunning = False
+            gCurrentStatPath = self.mPreviousStatPath
+
+#    def __del__( self ):
+#        if self.mRunning:
+#            #SPATTERS FIXME
+#            raise PerfError
+
+class LLPerformance:
+    #--------------------------------------------------
+    # Determine whether or not we want to log statistics
+
+    def __init__( self, process_name = "python" ):
+        self.process_name = process_name
+        self.init_testing()
+        self.mTimeStamp = int(time.time()*1000)
+        self.mUTCTime = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
+
+    def init_testing( self ):
+        global gIsLoggingEnabled
+
+        host_performance_file = "/dev/shm/simperf/simperf_proc_config.llsd"
+    
+        #If file exists, open
+        if os.path.exists(host_performance_file):
+            file = open (host_performance_file,'r')
+    
+            #Read serialized LLSD from file.
+            body = llsd.parse(file.read())
+    
+            #Calculate time since file last modified.
+            stats = os.stat(host_performance_file)
+            now = time.time()
+            mod = stats[stat.ST_MTIME]
+            age = now - mod
+    
+            if age < ( body['duration'] ):
+                gIsLoggingEnabled = True
+    
+
+    def get ( self ):
+        global gIsLoggingEnabled
+        return gIsLoggingEnabled
+
+    #def output(self,ptr,path):
+    #    if 'stats' in ptr:
+    #        stats = ptr['stats']
+    #        self.mOutputPtr[path] = stats.get_map()
+
+    #    if 'children' in ptr:
+    #        children=ptr['children']
+
+    #        curptr = self.mOutputPtr
+    #        curchildren={}
+    #        curptr['children'] = curchildren
+
+    #        for key in children:
+    #            curchildren[key]={}
+    #            self.mOutputPtr = curchildren[key]
+    #            self.output(children[key],path + '/' + key)
+    
+    def done(self):
+        global gBlockMap
+
+        if not self.get():
+            return
+
+        output_name = "/dev/shm/simperf/%s_proc.%d.llsd" % (self.process_name, os.getpid())
+        output_file = open(output_name, 'w')
+        process_info = {
+            "name"  :   self.process_name,
+            "pid"   :   os.getpid(),
+            "ppid"  :   os.getppid(),
+            "timestamp" :   self.mTimeStamp,
+            "utc_time"  :   self.mUTCTime,
+            }
+        output_file.write(llsd.format_notation(process_info))
+        output_file.write('\n')
+
+        for key in gBlockMap.keys():
+            gBlockMap[key] = gBlockMap[key].get_map()
+        output_file.write(llsd.format_notation(gBlockMap))
+        output_file.write('\n')
+        output_file.close()
+
diff --git a/indra/lib/python/indra/util/named_query.py b/indra/lib/python/indra/util/named_query.py
index 20f2ec7..c5fb498 100644
--- a/indra/lib/python/indra/util/named_query.py
+++ b/indra/lib/python/indra/util/named_query.py
@@ -63,7 +63,7 @@ def _init_g_named_manager(sql_dir = None):
 
     # extra fallback directory in case config doesn't return what we want
     if sql_dir is None:
-        sql_dir = os.path.dirname(__file__) + "../../../../web/dataservice/sql"
+        sql_dir = os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "web", "dataservice", "sql")
 
     global _g_named_manager
     _g_named_manager = NamedQueryManager(
@@ -103,11 +103,12 @@ class NamedQuery(object):
     def __init__(self, name, filename):
         """ Construct a NamedQuery object.  The name argument is an
         arbitrary name as a handle for the query, and the filename is
-        a path to a file containing an llsd named query document."""
+        a path to a file or a file-like object containing an llsd named
+        query document."""
         self._stat_interval_seconds = 5  # 5 seconds
         self._name = name
-        if (filename is not None) \
-                and (NQ_FILE_SUFFIX != filename[-NQ_FILE_SUFFIX_LEN:]):
+        if (filename is not None and isinstance(filename, (str, unicode))
+            and NQ_FILE_SUFFIX != filename[-NQ_FILE_SUFFIX_LEN:]):
             filename = filename + NQ_FILE_SUFFIX
         self._location = filename
         self._alternative = dict()
@@ -122,8 +123,8 @@ class NamedQuery(object):
 
     def get_modtime(self):
         """ Returns the mtime (last modified time) of the named query
-        file, if such exists."""
-        if self._location:
+        filename. For file-like objects, expect a modtime of 0"""
+        if self._location and isinstance(self._location, (str, unicode)):
             return os.path.getmtime(self._location)
         return 0
 
@@ -131,7 +132,12 @@ class NamedQuery(object):
         """ Loads and parses the named query file into self.  Does
         nothing if self.location is nonexistant."""
         if self._location:
-            self._reference_contents(llsd.parse(open(self._location).read()))
+            if isinstance(self._location, (str, unicode)):
+                contents = llsd.parse(open(self._location).read())
+            else:
+                # we probably have a file-like object. Godspeed!
+                contents = llsd.parse(self._location.read())
+            self._reference_contents(contents)
             # Check for alternative implementations
             try:
                 for name, alt in self._contents['alternative'].items():
diff --git a/indra/lib/python/indra/util/simperf_host_xml_parser.py b/indra/lib/python/indra/util/simperf_host_xml_parser.py
new file mode 100755
index 0000000..b608415
--- /dev/null
+++ b/indra/lib/python/indra/util/simperf_host_xml_parser.py
@@ -0,0 +1,338 @@
+#!/usr/bin/env python
+"""\
+ at file simperf_host_xml_parser.py
+ at brief Digest collector's XML dump and convert to simple dict/list structure
+
+$LicenseInfo:firstyear=2008&license=mit$
+
+Copyright (c) 2008, Linden Research, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+$/LicenseInfo$
+"""
+
+import sys, os, getopt, time
+import simplejson
+from xml import sax
+
+
+def usage():
+    print "Usage:"
+    print sys.argv[0] + " [options]"
+    print "  Convert RRD's XML dump to JSON.  Script to convert the simperf_host_collector-"
+    print "  generated RRD dump into JSON.  Steps include converting selected named"
+    print "  fields from GAUGE type to COUNTER type by computing delta with preceding"
+    print "  values.  Top-level named fields are:"
+    print 
+    print "     lastupdate      Time (javascript timestamp) of last data sample"
+    print "     step            Time in seconds between samples"
+    print "     ds              Data specification (name/type) for each column"
+    print "     database        Table of data samples, one time step per row"
+    print 
+    print "Options:"
+    print "  -i, --in      Input settings filename.  (Default:  stdin)"
+    print "  -o, --out     Output settings filename.  (Default:  stdout)"
+    print "  -h, --help    Print this message and exit."
+    print
+    print "Example: %s -i rrddump.xml -o rrddump.json" % sys.argv[0]
+    print
+    print "Interfaces:"
+    print "   class SimPerfHostXMLParser()         # SAX content handler"
+    print "   def simperf_host_xml_fixup(parser)   # post-parse value fixup"
+
+class SimPerfHostXMLParser(sax.handler.ContentHandler):
+
+    def __init__(self):
+        pass
+        
+    def startDocument(self):
+        self.rrd_last_update = 0         # public
+        self.rrd_step = 0                # public
+        self.rrd_ds = []                 # public
+        self.rrd_records = []            # public
+        self._rrd_level = 0
+        self._rrd_parse_state = 0
+        self._rrd_chars = ""
+        self._rrd_capture = False
+        self._rrd_ds_val = {}
+        self._rrd_data_row = []
+        self._rrd_data_row_has_nan = False
+        
+    def endDocument(self):
+        pass
+
+    # Nasty little ad-hoc state machine to extract the elements that are
+    # necessary from the 'rrdtool dump' XML output.  The same element
+    # name '<ds>' is used for two different data sets so we need to pay
+    # some attention to the actual structure to get the ones we want
+    # and ignore the ones we don't.
+    
+    def startElement(self, name, attrs):
+        self._rrd_level = self._rrd_level + 1
+        self._rrd_capture = False
+        if self._rrd_level == 1:
+            if name == "rrd" and self._rrd_parse_state == 0:
+                self._rrd_parse_state = 1     # In <rrd>
+                self._rrd_capture = True
+                self._rrd_chars = ""
+        elif self._rrd_level == 2:
+            if self._rrd_parse_state == 1:
+                if name == "lastupdate":
+                    self._rrd_parse_state = 2         # In <rrd><lastupdate>
+                    self._rrd_capture = True
+                    self._rrd_chars = ""
+                elif name == "step":
+                    self._rrd_parse_state = 3         # In <rrd><step>
+                    self._rrd_capture = True
+                    self._rrd_chars = ""
+                elif name == "ds":
+                    self._rrd_parse_state = 4         # In <rrd><ds>
+                    self._rrd_ds_val = {}
+                    self._rrd_chars = ""
+                elif name == "rra":
+                    self._rrd_parse_state = 5         # In <rrd><rra>
+        elif self._rrd_level == 3:
+            if self._rrd_parse_state == 4:
+                if name == "name":
+                    self._rrd_parse_state = 6         # In <rrd><ds><name>
+                    self._rrd_capture = True
+                    self._rrd_chars = ""
+                elif name == "type":
+                    self._rrd_parse_state = 7         # In <rrd><ds><type>
+                    self._rrd_capture = True
+                    self._rrd_chars = ""
+            elif self._rrd_parse_state == 5:
+                if name == "database":
+                    self._rrd_parse_state = 8         # In <rrd><rra><database>
+        elif self._rrd_level == 4:
+            if self._rrd_parse_state == 8:
+                if name == "row":
+                    self._rrd_parse_state = 9         # In <rrd><rra><database><row>
+                    self._rrd_data_row = []
+                    self._rrd_data_row_has_nan = False
+        elif self._rrd_level == 5:
+            if self._rrd_parse_state == 9:
+                if name == "v":
+                    self._rrd_parse_state = 10        # In <rrd><rra><database><row><v>
+                    self._rrd_capture = True
+                    self._rrd_chars = ""
+
+    def endElement(self, name):
+        self._rrd_capture = False
+        if self._rrd_parse_state == 10:
+            self._rrd_capture = self._rrd_level == 6
+            if self._rrd_level == 5:
+                if self._rrd_chars == "NaN":
+                    self._rrd_data_row_has_nan = True
+                else:
+                    self._rrd_data_row.append(self._rrd_chars)
+                self._rrd_parse_state = 9              # In <rrd><rra><database><row>
+        elif self._rrd_parse_state == 9:
+            if self._rrd_level == 4:
+                if not self._rrd_data_row_has_nan:
+                    self.rrd_records.append(self._rrd_data_row)
+                self._rrd_parse_state = 8              # In <rrd><rra><database>
+        elif self._rrd_parse_state == 8:
+            if self._rrd_level == 3:
+                self._rrd_parse_state = 5              # In <rrd><rra>
+        elif self._rrd_parse_state == 7:
+            if self._rrd_level == 3:
+                self._rrd_ds_val["type"] = self._rrd_chars
+                self._rrd_parse_state = 4              # In <rrd><ds>
+        elif self._rrd_parse_state == 6:
+            if self._rrd_level == 3:
+                self._rrd_ds_val["name"] = self._rrd_chars
+                self._rrd_parse_state = 4              # In <rrd><ds>
+        elif self._rrd_parse_state == 5:
+            if self._rrd_level == 2:
+                self._rrd_parse_state = 1              # In <rrd>
+        elif self._rrd_parse_state == 4:
+            if self._rrd_level == 2:
+                self.rrd_ds.append(self._rrd_ds_val)
+                self._rrd_parse_state = 1              # In <rrd>
+        elif self._rrd_parse_state == 3:
+            if self._rrd_level == 2:
+                self.rrd_step = long(self._rrd_chars)
+                self._rrd_parse_state = 1              # In <rrd>
+        elif self._rrd_parse_state == 2:
+            if self._rrd_level == 2:
+                self.rrd_last_update = long(self._rrd_chars)
+                self._rrd_parse_state = 1              # In <rrd>
+        elif self._rrd_parse_state == 1:
+            if self._rrd_level == 1:
+                self._rrd_parse_state = 0              # At top
+                
+        if self._rrd_level:
+            self._rrd_level = self._rrd_level - 1
+
+    def characters(self, content):
+        if self._rrd_capture:
+            self._rrd_chars = self._rrd_chars + content.strip()
+
+def _make_numeric(value):
+    try:
+        value = float(value)
+    except:
+        value = ""
+    return value
+
+def simperf_host_xml_fixup(parser, filter_start_time = None, filter_end_time = None):
+    # Fixup for GAUGE fields that are really COUNTS.  They
+    # were forced to GAUGE to try to disable rrdtool's
+    # data interpolation/extrapolation for non-uniform time
+    # samples.
+    fixup_tags = [ "cpu_user",
+                   "cpu_nice",
+                   "cpu_sys",
+                   "cpu_idle",
+                   "cpu_waitio",
+                   "cpu_intr",
+                   # "file_active",
+                   # "file_free",
+                   # "inode_active",
+                   # "inode_free",
+                   "netif_in_kb",
+                   "netif_in_pkts",
+                   "netif_in_errs",
+                   "netif_in_drop",
+                   "netif_out_kb",
+                   "netif_out_pkts",
+                   "netif_out_errs",
+                   "netif_out_drop",
+                   "vm_page_in",
+                   "vm_page_out",
+                   "vm_swap_in",
+                   "vm_swap_out",
+                   #"vm_mem_total",
+                   #"vm_mem_used",
+                   #"vm_mem_active",
+                   #"vm_mem_inactive",
+                   #"vm_mem_free",
+                   #"vm_mem_buffer",
+                   #"vm_swap_cache",
+                   #"vm_swap_total",
+                   #"vm_swap_used",
+                   #"vm_swap_free",
+                   "cpu_interrupts",
+                   "cpu_switches",
+                   "cpu_forks" ]
+
+    col_count = len(parser.rrd_ds)
+    row_count = len(parser.rrd_records)
+
+    # Process the last row separately, just to make all values numeric.
+    for j in range(col_count):
+        parser.rrd_records[row_count - 1][j] = _make_numeric(parser.rrd_records[row_count - 1][j])
+
+    # Process all other row/columns.
+    last_different_row = row_count - 1
+    current_row = row_count - 2
+    while current_row >= 0:
+        # Check for a different value than the previous row.  If everything is the same
+        # then this is probably just a filler/bogus entry.
+        is_different = False
+        for j in range(col_count):
+            parser.rrd_records[current_row][j] = _make_numeric(parser.rrd_records[current_row][j])
+            if parser.rrd_records[current_row][j] != parser.rrd_records[last_different_row][j]:
+                # We're good.  This is a different row.
+                is_different = True
+
+        if not is_different:
+            # This is a filler/bogus entry.  Just ignore it.
+            for j in range(col_count):
+                parser.rrd_records[current_row][j] = float('nan')
+        else:
+            # Some tags need to be converted into deltas.
+            for j in range(col_count):
+                if parser.rrd_ds[j]["name"] in fixup_tags:
+                    parser.rrd_records[last_different_row][j] = \
+                        parser.rrd_records[last_different_row][j] - parser.rrd_records[current_row][j]
+            last_different_row = current_row
+
+        current_row -= 1
+
+    # Set fixup_tags in the first row to 'nan' since they aren't useful anymore.
+    for j in range(col_count):
+        if parser.rrd_ds[j]["name"] in fixup_tags:
+            parser.rrd_records[0][j] = float('nan')
+
+    # Add a timestamp to each row and to the catalog.  Format and name
+    # chosen to match other simulator logging (hopefully).
+    start_time = parser.rrd_last_update - (parser.rrd_step * (row_count - 1))
+    # Build a filtered list of rrd_records if we are limited to a time range.
+    filter_records = False
+    if filter_start_time is not None or filter_end_time is not None:
+        filter_records = True
+        filtered_rrd_records = []
+        if filter_start_time is None:
+            filter_start_time = start_time * 1000
+        if filter_end_time is None:
+            filter_end_time = parser.rrd_last_update * 1000
+        
+    for i in range(row_count):
+        record_timestamp = (start_time + (i * parser.rrd_step)) * 1000
+        parser.rrd_records[i].insert(0, record_timestamp)
+        if filter_records:
+            if filter_start_time <= record_timestamp and record_timestamp <= filter_end_time:
+                filtered_rrd_records.append(parser.rrd_records[i])
+
+    if filter_records:
+        parser.rrd_records = filtered_rrd_records
+
+    parser.rrd_ds.insert(0, {"type": "GAUGE", "name": "javascript_timestamp"})
+
+
+def main(argv=None):
+    opts, args = getopt.getopt(sys.argv[1:], "i:o:h", ["in=", "out=", "help"])
+    input_file = sys.stdin
+    output_file = sys.stdout
+    for o, a in opts:
+        if o in ("-i", "--in"):
+            input_file = open(a, 'r')
+        if o in ("-o", "--out"):
+            output_file = open(a, 'w')
+        if o in ("-h", "--help"):
+            usage()
+            sys.exit(0)
+
+    # Using the SAX parser as it is at least 4X faster and far, far
+    # smaller on this dataset than the DOM-based interface in xml.dom.minidom.
+    # With SAX and a 5.4MB xml file, this requires about seven seconds of
+    # wall-clock time and 32MB VSZ.  With the DOM interface, about 22 seconds
+    # and over 270MB VSZ.
+
+    handler = SimPerfHostXMLParser()
+    sax.parse(input_file, handler)
+    if input_file != sys.stdin:
+        input_file.close()
+
+    # Various format fixups:  string-to-num, gauge-to-counts, add
+    # a time stamp, etc.
+    simperf_host_xml_fixup(handler)
+    
+    # Create JSONable dict with interesting data and format/print it
+    print >>output_file, simplejson.dumps({ "step" : handler.rrd_step,
+                                            "lastupdate": handler.rrd_last_update * 1000,
+                                            "ds" : handler.rrd_ds,
+                                            "database" : handler.rrd_records })
+
+    return 0
+
+if __name__ == "__main__":
+    sys.exit(main())
diff --git a/indra/lib/python/indra/util/simperf_oprof_interface.py b/indra/lib/python/indra/util/simperf_oprof_interface.py
new file mode 100755
index 0000000..a7e9a4c
--- /dev/null
+++ b/indra/lib/python/indra/util/simperf_oprof_interface.py
@@ -0,0 +1,160 @@
+#!/usr/bin/env python
+"""\
+ at file simperf_oprof_interface.py
+ at brief Manage OProfile data collection on a host
+
+$LicenseInfo:firstyear=2008&license=internal$
+
+Copyright (c) 2008, Linden Research, Inc.
+
+The following source code is PROPRIETARY AND CONFIDENTIAL. Use of
+this source code is governed by the Linden Lab Source Code Disclosure
+Agreement ("Agreement") previously entered between you and Linden
+Lab. By accessing, using, copying, modifying or distributing this
+software, you acknowledge that you have been informed of your
+obligations under the Agreement and agree to abide by those obligations.
+
+ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+COMPLETENESS OR PERFORMANCE.
+$/LicenseInfo$
+"""
+
+import sys, os, getopt
+import simplejson
+
+
+def usage():
+    print "Usage:"
+    print sys.argv[0] + " [options]"
+    print "  Digest the OProfile report forms that come out of the"
+    print "  simperf_oprof_ctl program's -r/--report command.  The result"
+    print "  is an array of dictionaires with the following keys:"
+    print 
+    print "     symbol        Name of sampled, calling, or called procedure"
+    print "     file          Executable or library where symbol resides"
+    print "     percentage    Percentage contribution to profile, calls or called"
+    print "     samples       Sample count"
+    print "     calls         Methods called by the method in question (full only)"
+    print "     called_by     Methods calling the method (full only)"
+    print 
+    print "  For 'full' reports the two keys 'calls' and 'called_by' are"
+    print "  themselves arrays of dictionaries based on the first four keys."
+    print
+    print "Return Codes:"
+    print "  None.  Aggressively digests everything.  Will likely mung results"
+    print "  if a program or library has whitespace in its name."
+    print
+    print "Options:"
+    print "  -i, --in      Input settings filename.  (Default:  stdin)"
+    print "  -o, --out     Output settings filename.  (Default:  stdout)"
+    print "  -h, --help    Print this message and exit."
+    print
+    print "Interfaces:"
+    print "   class SimPerfOProfileInterface()"
+    
+class SimPerfOProfileInterface:
+    def __init__(self):
+        self.isBrief = True             # public
+        self.isValid = False            # public
+        self.result = []                # public
+
+    def parse(self, input):
+        in_samples = False
+        for line in input:
+            if in_samples:
+                if line[0:6] == "------":
+                    self.isBrief = False
+                    self._parseFull(input)
+                else:
+                    self._parseBrief(input, line)
+                self.isValid = True
+                return
+            try:
+                hd1, remain = line.split(None, 1)
+                if hd1 == "samples":
+                    in_samples = True
+            except ValueError:
+                pass
+
+    def _parseBrief(self, input, line1):
+        try:
+            fld1, fld2, fld3, fld4 = line1.split(None, 3)
+            self.result.append({"samples" : fld1,
+                                "percentage" : fld2,
+                                "file" : fld3,
+                                "symbol" : fld4.strip("\n")})
+        except ValueError:
+            pass
+        for line in input:
+            try:
+                fld1, fld2, fld3, fld4 = line.split(None, 3)
+                self.result.append({"samples" : fld1,
+                                    "percentage" : fld2,
+                                    "file" : fld3,
+                                    "symbol" : fld4.strip("\n")})
+            except ValueError:
+                pass
+
+    def _parseFull(self, input):
+        state = 0       # In 'called_by' section
+        calls = []
+        called_by = []
+        current = {}
+        for line in input:
+            if line[0:6] == "------":
+                if len(current):
+                    current["calls"] = calls
+                    current["called_by"] = called_by
+                    self.result.append(current)
+                state = 0
+                calls = []
+                called_by = []
+                current = {}
+            else:
+                try:
+                    fld1, fld2, fld3, fld4 = line.split(None, 3)
+                    tmp = {"samples" : fld1,
+                           "percentage" : fld2,
+                           "file" : fld3,
+                           "symbol" : fld4.strip("\n")}
+                except ValueError:
+                    continue
+                if line[0] != " ":
+                    current = tmp
+                    state = 1       # In 'calls' section
+                elif state == 0:
+                    called_by.append(tmp)
+                else:
+                    calls.append(tmp)
+        if len(current):
+            current["calls"] = calls
+            current["called_by"] = called_by
+            self.result.append(current)
+
+
+def main(argv=None):
+    opts, args = getopt.getopt(sys.argv[1:], "i:o:h", ["in=", "out=", "help"])
+    input_file = sys.stdin
+    output_file = sys.stdout
+    for o, a in opts:
+        if o in ("-i", "--in"):
+            input_file = open(a, 'r')
+        if o in ("-o", "--out"):
+            output_file = open(a, 'w')
+        if o in ("-h", "--help"):
+            usage()
+            sys.exit(0)
+
+    oprof = SimPerfOProfileInterface()
+    oprof.parse(input_file)
+    if input_file != sys.stdin:
+        input_file.close()
+
+    # Create JSONable dict with interesting data and format/print it
+    print >>output_file, simplejson.dumps(oprof.result)
+
+    return 0
+
+if __name__ == "__main__":
+    sys.exit(main())
diff --git a/indra/lib/python/indra/util/simperf_proc_interface.py b/indra/lib/python/indra/util/simperf_proc_interface.py
new file mode 100755
index 0000000..62a63fa
--- /dev/null
+++ b/indra/lib/python/indra/util/simperf_proc_interface.py
@@ -0,0 +1,164 @@
+#!/usr/bin/python
+
+# ----------------------------------------------------
+# Utility to extract log messages from *.<pid>.llsd
+# files that contain performance statistics.
+
+# ----------------------------------------------------
+import sys, os
+
+if os.path.exists("setup-path.py"):
+    execfile("setup-path.py")
+
+from indra.base import llsd
+
+DEFAULT_PATH="/dev/shm/simperf/"
+
+
+# ----------------------------------------------------
+# Pull out the stats and return a single document
+def parse_logfile(filename, target_column=None, verbose=False):
+    full_doc = []
+    # Open source temp log file.  Let exceptions percolate up.
+    sourcefile = open( filename,'r')
+        
+    if verbose:
+        print "Reading " + filename  
+    
+    # Parse and output all lines from the temp file
+    for line in sourcefile.xreadlines():
+        partial_doc = llsd.parse(line)
+        if partial_doc is not None:
+            if target_column is None:
+                full_doc.append(partial_doc)
+            else:
+                trim_doc = { target_column: partial_doc[target_column] }
+                if target_column != "fps":
+                    trim_doc[ 'fps' ] = partial_doc[ 'fps' ]
+                trim_doc[ '/total_time' ] = partial_doc[ '/total_time' ]
+                trim_doc[ 'utc_time' ] = partial_doc[ 'utc_time' ]
+                full_doc.append(trim_doc)
+
+    sourcefile.close()
+    return full_doc
+
+# Extract just the meta info line, and the timestamp of the first/last frame entry.
+def parse_logfile_info(filename, verbose=False):
+    # Open source temp log file.  Let exceptions percolate up.
+    sourcefile = open(filename, 'rU') # U is to open with Universal newline support
+        
+    if verbose:
+        print "Reading " + filename  
+
+    # The first line is the meta info line.
+    info_line = sourcefile.readline()
+    if not info_line:
+        sourcefile.close()
+        return None
+
+    # The rest of the lines are frames.  Read the first and last to get the time range.
+    info = llsd.parse( info_line )
+    info['start_time'] = None
+    info['end_time'] = None
+    first_frame = sourcefile.readline()
+    if first_frame:
+        try:
+            info['start_time'] = int(llsd.parse(first_frame)['timestamp'])
+        except:
+            pass
+
+    # Read the file backwards to find the last two lines.
+    sourcefile.seek(0, 2)
+    file_size = sourcefile.tell()
+    offset = 1024
+    num_attempts = 0
+    end_time = None
+    if file_size < offset:
+        offset = file_size
+    while 1:
+        sourcefile.seek(-1*offset, 2)
+        read_str = sourcefile.read(offset)
+        # Remove newline at the end
+        if read_str[offset - 1] == '\n':
+            read_str = read_str[0:-1]
+        lines = read_str.split('\n')
+        full_line = None
+        if len(lines) > 2:  # Got two line
+            try:
+                end_time = llsd.parse(lines[-1])['timestamp']
+            except:
+                # We couldn't parse this line.  Try once more.
+                try:
+                    end_time = llsd.parse(lines[-2])['timestamp']
+                except:
+                    # Nope.  Just move on.
+                    pass
+            break
+        if len(read_str) == file_size:   # Reached the beginning
+            break
+        offset += 1024
+
+    info['end_time'] = int(end_time)
+
+    sourcefile.close()
+    return info
+    
+
+def parse_proc_filename(filename):
+    try:
+        name_as_list = filename.split(".")
+        cur_stat_type = name_as_list[0].split("_")[0]
+        cur_pid = name_as_list[1]
+    except IndexError, ValueError:
+        return (None, None)
+    return (cur_pid, cur_stat_type)
+
+# ----------------------------------------------------
+def get_simstats_list(path=None):
+    """ Return stats (pid, type) listed in <type>_proc.<pid>.llsd """
+    if path is None:
+        path = DEFAULT_PATH
+    simstats_list = []
+    for file_name in os.listdir(path):
+        if file_name.endswith(".llsd") and file_name != "simperf_proc_config.llsd":
+            simstats_info = parse_logfile_info(path + file_name)
+            if simstats_info is not None:
+                simstats_list.append(simstats_info)
+    return simstats_list
+
+def get_log_info_list(pid=None, stat_type=None, path=None, target_column=None, verbose=False):
+    """ Return data from all llsd files matching the pid and stat type """
+    if path is None:
+        path = DEFAULT_PATH
+    log_info_list = {}
+    for file_name in os.listdir ( path ):
+        if file_name.endswith(".llsd") and file_name != "simperf_proc_config.llsd":
+            (cur_pid, cur_stat_type) = parse_proc_filename(file_name)
+            if cur_pid is None:
+                continue
+            if pid is not None and pid != cur_pid:
+                continue
+            if stat_type is not None and stat_type != cur_stat_type:
+                continue
+            log_info_list[cur_pid] = parse_logfile(path + file_name, target_column, verbose)
+    return log_info_list
+
+def delete_simstats_files(pid=None, stat_type=None, path=None):
+    """ Delete *.<pid>.llsd files """
+    if path is None:
+        path = DEFAULT_PATH
+    del_list = []
+    for file_name in os.listdir(path):
+        if file_name.endswith(".llsd") and file_name != "simperf_proc_config.llsd":
+            (cur_pid, cur_stat_type) = parse_proc_filename(file_name)
+            if cur_pid is None:
+                continue
+            if pid is not None and pid != cur_pid:
+                continue
+            if stat_type is not None and stat_type != cur_stat_type:
+                continue
+            del_list.append(cur_pid)
+            # Allow delete related exceptions to percolate up if this fails.
+            os.unlink(os.path.join(DEFAULT_PATH, file_name))
+    return del_list
+
diff --git a/indra/linux_crash_logger/CMakeLists.txt b/indra/linux_crash_logger/CMakeLists.txt
index 628d4ac..6f6754e 100644
--- a/indra/linux_crash_logger/CMakeLists.txt
+++ b/indra/linux_crash_logger/CMakeLists.txt
@@ -3,7 +3,6 @@
 project(linux_crash_logger)
 
 include(00-Common)
-include(Boost)
 include(LLCommon)
 include(LLCrashLogger)
 include(LLMath)
@@ -52,17 +51,15 @@ target_link_libraries(linux-crash-logger
     ${LLMATH_LIBRARIES}
     ${LLCOMMON_LIBRARIES}
     ${UI_LIBRARIES}
-    ${BOOST_SIGNALS_LIBRARY}
     ${DB_LIBRARIES}
     )
 
 add_custom_command(
     OUTPUT linux-crash-logger-stripped
     COMMAND strip
-    ARGS --strip-debug -o linux-crash-logger-stripped
-         linux-crash-logger
+    ARGS --strip-debug -o linux-crash-logger-stripped linux-crash-logger
     DEPENDS linux-crash-logger
     )
 
-add_custom_target(linux-crash-logger-stripped ALL
+add_custom_target(linux-crash-logger-strip-target ALL
                   DEPENDS linux-crash-logger-stripped)
diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt
index b662023..ebedcab 100644
--- a/indra/llaudio/CMakeLists.txt
+++ b/indra/llaudio/CMakeLists.txt
@@ -65,3 +65,10 @@ set_source_files_properties(${llaudio_HEADER_FILES}
 list(APPEND llaudio_SOURCE_FILES ${llaudio_HEADER_FILES})
 
 add_library (llaudio ${llaudio_SOURCE_FILES})
+target_link_libraries(
+    llaudio
+    ${VORBISENC_LIBRARIES}
+    ${VORBISFILE_LIBRARIES}
+    ${VORBIS_LIBRARIES}
+    ${OGG_LIBRARIES}
+    )
diff --git a/indra/llaudio/audioengine.cpp b/indra/llaudio/audioengine.cpp
index 5dd5b28..298ab1d 100644
--- a/indra/llaudio/audioengine.cpp
+++ b/indra/llaudio/audioengine.cpp
@@ -96,6 +96,9 @@ void LLAudioEngine::setDefaults()
 	mMasterGain = 1.f;
 	mInternetStreamGain = 0.125f;
 	mNextWindUpdate = 0.f;
+
+	for (U32 i = 0; i < LLAudioEngine::AUDIO_TYPE_COUNT; i++)
+		mSecondaryGain[i] = 1.0f;
 }
 
 
@@ -167,6 +170,13 @@ void LLAudioEngine::updateChannels()
 	{
 		if (mChannels[i])
 		{
+			// set secondary gain if type is available
+			LLAudioSource* source = mChannels[i]->getSource();
+			if (source)
+			{
+				mChannels[i]->setSecondaryGain(mSecondaryGain[source->getType()]);
+			}
+			
 			mChannels[i]->updateBuffer();
 			mChannels[i]->update3DPosition();
 			mChannels[i]->updateLoop();
@@ -643,6 +653,18 @@ F32 LLAudioEngine::getMasterGain()
 	return mMasterGain;
 }
 
+void LLAudioEngine::setSecondaryGain(S32 type, F32 gain)
+{
+	llassert(type < LLAudioEngine::AUDIO_TYPE_COUNT);
+	
+	mSecondaryGain[type] = gain;
+}
+
+F32 LLAudioEngine::getSecondaryGain(S32 type)
+{
+	return mSecondaryGain[type];
+}
+
 F32 LLAudioEngine::getInternetStreamGain()
 {
 	return mInternetStreamGain;
@@ -718,7 +740,8 @@ F64 LLAudioEngine::mapWindVecToPan(LLVector3 wind_vec)
 }
 
 
-void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain, const LLVector3d &pos_global)
+void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain,
+								 const S32 type, const LLVector3d &pos_global)
 {
 	// Create a new source (since this can't be associated with an existing source.
 	//llinfos << "Localized: " << audio_uuid << llendl;
@@ -731,7 +754,7 @@ void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_i
 	LLUUID source_id;
 	source_id.generate();
 
-	LLAudioSource *asp = new LLAudioSource(source_id, owner_id, gain);
+	LLAudioSource *asp = new LLAudioSource(source_id, owner_id, gain, type);
 	gAudiop->addAudioSource(asp);
 	if (pos_global.isExactlyZero())
 	{
@@ -1180,11 +1203,12 @@ void LLAudioEngine::assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::E
 //
 
 
-LLAudioSource::LLAudioSource(const LLUUID& id, const LLUUID& owner_id, const F32 gain)
+LLAudioSource::LLAudioSource(const LLUUID& id, const LLUUID& owner_id, const F32 gain, const S32 type)
 :	mID(id),
 	mOwnerID(owner_id),
 	mPriority(0.f),
 	mGain(gain),
+	mType(type),
 	mAmbient(FALSE),
 	mLoop(FALSE),
 	mSyncMaster(FALSE),
@@ -1515,7 +1539,8 @@ LLAudioChannel::LLAudioChannel() :
 	mCurrentSourcep(NULL),
 	mCurrentBufferp(NULL),
 	mLoopedThisFrame(FALSE),
-	mWaiting(FALSE)
+	mWaiting(FALSE),
+	mSecondaryGain(1.0f)
 {
 }
 
diff --git a/indra/llaudio/audioengine.h b/indra/llaudio/audioengine.h
index e38413f..b8153a3 100644
--- a/indra/llaudio/audioengine.h
+++ b/indra/llaudio/audioengine.h
@@ -78,6 +78,15 @@ class LLAudioBuffer;
 class LLAudioEngine 
 {
 public:
+	enum LLAudioType
+	{
+		AUDIO_TYPE_NONE    = 0,
+		AUDIO_TYPE_SFX     = 1,
+		AUDIO_TYPE_UI      = 2,
+		AUDIO_TYPE_AMBIENT = 3,
+		AUDIO_TYPE_COUNT   = 4 // last
+	};
+	
 	LLAudioEngine();
 	virtual ~LLAudioEngine();
 
@@ -109,6 +118,9 @@ public:
 	F32 getMasterGain();
 	void setMasterGain(F32 gain);
 
+	F32 getSecondaryGain(S32 type);
+	void setSecondaryGain(S32 type, F32 gain);
+
 	F32 getInternetStreamGain();
 
 	virtual void setDopplerFactor(F32 factor);
@@ -122,7 +134,9 @@ public:
 
 	// Methods actually related to setting up and removing sounds
 	// Owner ID is the owner of the object making the request
-	void triggerSound(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, const LLVector3d &pos_global = LLVector3d::zero);
+	void triggerSound(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain,
+					  const S32 type = LLAudioEngine::AUDIO_TYPE_NONE,
+					  const LLVector3d &pos_global = LLVector3d::zero);
 	BOOL preloadSound(const LLUUID &id);
 
 	void addAudioSource(LLAudioSource *asp);
@@ -222,6 +236,7 @@ protected:
 	LLAudioBuffer *mBuffers[MAX_BUFFERS];
 	
 	F32 mMasterGain;
+	F32 mSecondaryGain[AUDIO_TYPE_COUNT];
 
 	// Hack!  Internet streams are treated differently from other sources!
 	F32 mInternetStreamGain;
@@ -247,7 +262,7 @@ class LLAudioSource
 public:
 	// owner_id is the id of the agent responsible for making this sound
 	// play, for example, the owner of the object currently playing it
-	LLAudioSource(const LLUUID &id, const LLUUID& owner_id, const F32 gain);
+	LLAudioSource(const LLUUID &id, const LLUUID& owner_id, const F32 gain, const S32 type = LLAudioEngine::AUDIO_TYPE_NONE);
 	virtual ~LLAudioSource();
 
 	virtual void update();						// Update this audio source
@@ -274,6 +289,9 @@ public:
 
 	void setPlayedOnce(const BOOL played_once)				{ mPlayedOnce = played_once; }
 
+	void setType(S32 type)                                  { mType = type; }
+	S32 getType()                                           { return mType; }
+
 	void setPositionGlobal(const LLVector3d &position_global)		{ mPositionGlobal = position_global; }
 	LLVector3d getPositionGlobal() const							{ return mPositionGlobal; }
 	LLVector3 getVelocity()	const									{ return mVelocity; }				
@@ -312,6 +330,7 @@ protected:
 	BOOL			mSyncSlave;
 	BOOL			mQueueSounds;
 	BOOL			mPlayedOnce;
+	S32             mType;
 	LLVector3d		mPositionGlobal;
 	LLVector3		mVelocity;
 
@@ -380,6 +399,9 @@ public:
 	virtual void setSource(LLAudioSource *sourcep);
 	LLAudioSource *getSource() const			{ return mCurrentSourcep; }
 
+	void setSecondaryGain(F32 gain)             { mSecondaryGain = gain; }
+	F32 getSecondaryGain()                      { return mSecondaryGain; }
+
 	friend class LLAudioEngine;
 	friend class LLAudioSource;
 protected:
@@ -398,6 +420,7 @@ protected:
 	LLAudioBuffer	*mCurrentBufferp;
 	BOOL			mLoopedThisFrame;
 	BOOL			mWaiting;	// Waiting for sync.
+	F32             mSecondaryGain;
 };
 
 
diff --git a/indra/llaudio/audioengine_fmod.cpp b/indra/llaudio/audioengine_fmod.cpp
index 16d820c..4bf0c95 100644
--- a/indra/llaudio/audioengine_fmod.cpp
+++ b/indra/llaudio/audioengine_fmod.cpp
@@ -488,7 +488,7 @@ BOOL LLAudioChannelFMOD::updateBuffer()
 	if (mCurrentSourcep)
 	{
 		// SJB: warnings can spam and hurt framerate, disabling
-		if (!FSOUND_SetVolume(mChannelID, llround(mCurrentSourcep->getGain() * 255.0f)))
+		if (!FSOUND_SetVolume(mChannelID, llround(getSecondaryGain() * mCurrentSourcep->getGain() * 255.0f)))
 		{
 // 			llwarns << "LLAudioChannelFMOD::updateBuffer error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
 		}
diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp
index cd1f492..938f47d 100644
--- a/indra/llcharacter/llbvhloader.cpp
+++ b/indra/llcharacter/llbvhloader.cpp
@@ -1133,6 +1133,8 @@ void LLBVHLoader::optimize()
 
 			F32 rot_threshold = ROTATION_KEYFRAME_THRESHOLD / llmax((F32)joint->mChildTreeMaxDepth * 0.33f, 1.f);
 
+			double diff_max = 0;
+			KeyVector::iterator ki_max = ki;
 			for (; ki != joint->mKeys.end(); ++ki)
 			{
 				if (ki_prev == ki_last_good_pos)
@@ -1193,30 +1195,55 @@ void LLBVHLoader::optimize()
 					F32 x_delta;
 					F32 y_delta;
 					F32 rot_test;
-
+					
+					// Test if the rotation has changed significantly since the very first frame.  If false
+					// for all frames, then we'll just throw out this joint's rotation entirely.
 					x_delta = dist_vec(LLVector3::x_axis * first_frame_rot, LLVector3::x_axis * test_rot);
 					y_delta = dist_vec(LLVector3::y_axis * first_frame_rot, LLVector3::y_axis * test_rot);
 					rot_test = x_delta + y_delta;
-
 					if (rot_test > ROTATION_MOTION_THRESHOLD)
 					{
 						rot_changed = TRUE;
 					}
-
 					x_delta = dist_vec(LLVector3::x_axis * interp_rot, LLVector3::x_axis * test_rot);
 					y_delta = dist_vec(LLVector3::y_axis * interp_rot, LLVector3::y_axis * test_rot);
 					rot_test = x_delta + y_delta;
 
-					if (rot_test < rot_threshold)
-					{
-						ki_prev->mIgnoreRot = TRUE;
-						numRotFramesConsidered++;
-					}
-					else
+					// Draw a line between the last good keyframe and current.  Test the distance between the last frame (current-1, i.e. ki_prev)
+					// and the line.  If it's greater than some threshold, then it represents a significant frame and we want to include it.
+					if (rot_test >= rot_threshold ||
+						(ki+1 == joint->mKeys.end() && numRotFramesConsidered > 2))
 					{
+						// Add the current test keyframe (which is technically the previous key, i.e. ki_prev).
 						numRotFramesConsidered = 2;
 						ki_last_good_rot = ki_prev;
 						joint->mNumRotKeys++;
+
+						// Add another keyframe between the last good keyframe and current, at whatever point was the most "significant" (i.e.
+						// had the largest deviation from the earlier tests).  Note that a more robust approach would be test all intermediate
+						// keyframes against the line between the last good keyframe and current, but we're settling for this other method
+						// because it's significantly faster.
+						if (diff_max > 0)
+						{
+							if (ki_max->mIgnoreRot == TRUE)
+							{
+								ki_max->mIgnoreRot = FALSE;
+								joint->mNumRotKeys++;
+							}
+							diff_max = 0;
+						}
+					}
+					else
+					{
+						// This keyframe isn't significant enough, throw it away.
+						ki_prev->mIgnoreRot = TRUE;
+						numRotFramesConsidered++;
+						// Store away the keyframe that has the largest deviation from the interpolated line, for insertion later.
+						if (rot_test > diff_max)
+						{
+							diff_max = rot_test;
+							ki_max = ki;
+						}
 					}
 				}
 
diff --git a/indra/llcharacter/lleditingmotion.cpp b/indra/llcharacter/lleditingmotion.cpp
index b7539ee..3590097 100644
--- a/indra/llcharacter/lleditingmotion.cpp
+++ b/indra/llcharacter/lleditingmotion.cpp
@@ -190,7 +190,7 @@ BOOL LLEditingMotion::onUpdate(F32 time, U8* joint_mask)
 	{
 		LLVector3 tmp = mCharacter->getCharacterPosition() ;
 		llerrs << "Non finite focus point in editing motion. focus point: " << focus_pt << " and character position: " <<
-			tmp << " and pointAtPt: " << pointAtPt << llendl;
+			tmp << " and pointAtPt: " << *pointAtPt << llendl;
 	}
 
 	// propagate joint positions to kinematic chain
@@ -226,7 +226,7 @@ BOOL LLEditingMotion::onUpdate(F32 time, U8* joint_mask)
 	if (!target.isFinite())
 	{
 		llerrs << "Non finite target in editing motion with target distance of " << target_dist << 
-			" and focus point " << focus_pt << " and pointAtPt: " << pointAtPt << llendl;
+			" and focus point " << focus_pt << " and pointAtPt: " << *pointAtPt << llendl;
 	}
 	
 	mTarget.setPosition( target + mParentJoint.getPosition());
diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp
index 90a3d74..fadf1a5 100644
--- a/indra/llcharacter/llmotioncontroller.cpp
+++ b/indra/llcharacter/llmotioncontroller.cpp
@@ -783,6 +783,11 @@ void LLMotionController::updateLoadingMotions()
 			llinfos << "Motion " << motionp->getID() << " init failed." << llendl;
 			sRegistry.markBad(motionp->getID());
 			mLoadingMotions.erase(curiter);
+			motion_set_t::iterator found_it = mDeprecatedMotions.find(motionp);
+			if (found_it != mDeprecatedMotions.end())
+			{
+				mDeprecatedMotions.erase(found_it);
+			}
 			mAllMotions.erase(motionp->getID());
 			delete motionp;
 		}
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 8810549..4001e1f 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -187,3 +187,10 @@ set_source_files_properties(${llcommon_HEADER_FILES}
 list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES})
 
 add_library (llcommon ${llcommon_SOURCE_FILES})
+target_link_libraries(
+    llcommon
+    ${APRUTIL_LIBRARIES}
+    ${APR_LIBRARIES}
+    ${EXPAT_LIBRARIES}
+    ${ZLIB_LIBRARIES}
+    )
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index 1c48a5c..fcb2aaf 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -251,6 +251,7 @@ const U8 GOD_NOT = 0;
 const LLUUID LL_UUID_ALL_AGENTS("44e87126-e794-4ded-05b3-7c42da3d5cdb");
 
 // Governor Linden's agent id.
+const LLUUID ALEXANDRIA_LINDEN_ID("ba2a564a-f0f1-4b82-9c61-b7520bfcd09f");
 const LLUUID GOVERNOR_LINDEN_ID("3d6181b0-6a4b-97ef-18d8-722652995cf1");
 const LLUUID REALESTATE_LINDEN_ID("3d6181b0-6a4b-97ef-18d8-722652995cf1");
 // Maintenance's group id.
diff --git a/indra/llcommon/llcommon.cpp b/indra/llcommon/llcommon.cpp
index b21b687..cdaa7f9 100644
--- a/indra/llcommon/llcommon.cpp
+++ b/indra/llcommon/llcommon.cpp
@@ -46,7 +46,7 @@ void LLCommon::initClass()
 		sAprInitialized = TRUE;
 	}
 	LLTimer::initClass();
-	LLThreadSafeRefCount::initClass();
+	LLThreadSafeRefCount::initThreadSafeRefCount();
 // 	LLWorkerThread::initClass();
 // 	LLFrameCallbackManager::initClass();
 }
@@ -56,7 +56,7 @@ void LLCommon::cleanupClass()
 {
 // 	LLFrameCallbackManager::cleanupClass();
 // 	LLWorkerThread::cleanupClass();
-	LLThreadSafeRefCount::cleanupClass();
+	LLThreadSafeRefCount::cleanupThreadSafeRefCount();
 	LLTimer::cleanupClass();
 	if (sAprInitialized)
 	{
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index 8ad2667..80ed26b 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -165,6 +165,7 @@ public:
 		FTM_FILTER,
 		FTM_REFRESH,
 		FTM_SORT,
+		FTM_PICK,
 		
 		// Temp
 		FTM_TEMP1,
diff --git a/indra/llcommon/llfindlocale.cpp b/indra/llcommon/llfindlocale.cpp
index 47da974..344041c 100644
--- a/indra/llcommon/llfindlocale.cpp
+++ b/indra/llcommon/llfindlocale.cpp
@@ -180,10 +180,10 @@ canonise_fl(FL_Locale *l) {
 #define ML(pn,sn) MAKELANGID(LANG_##pn, SUBLANG_##pn##_##sn)
 #define MLN(pn) MAKELANGID(LANG_##pn, SUBLANG_DEFAULT)
 #define RML(pn,sn) MAKELANGID(LANG_##pn, SUBLANG_##sn)
-typedef struct {
+struct IDToCode {
   LANGID id;
   char*  code;
-} IDToCode;
+};
 static const IDToCode both_to_code[] = {
   {ML(ENGLISH,US),           "en_US.ISO_8859-1"},
   {ML(ENGLISH,CAN),          "en_CA"}, /* english / canadian */
diff --git a/indra/llcommon/llfindlocale.h b/indra/llcommon/llfindlocale.h
index 6cc2dbb..bc253c3 100644
--- a/indra/llcommon/llfindlocale.h
+++ b/indra/llcommon/llfindlocale.h
@@ -36,11 +36,11 @@ typedef const char* FL_Lang;
 typedef const char* FL_Country;
 typedef const char* FL_Variant;
 
-typedef struct {
+struct FL_Locale {
   FL_Lang    lang;
   FL_Country country;
   FL_Variant variant;
-} FL_Locale;
+};
 
 typedef enum {
   /* for some reason we failed to even guess: this should never happen */
diff --git a/indra/llcommon/llkeythrottle.h b/indra/llcommon/llkeythrottle.h
index eb1519a..25d0fe0 100644
--- a/indra/llcommon/llkeythrottle.h
+++ b/indra/llcommon/llkeythrottle.h
@@ -243,7 +243,7 @@ public:
 	}
 
 	// Set the throttling behavior
-	void setParameters( U32 limit, F32 interval, BOOL realtime )
+	void setParameters( U32 limit, F32 interval, BOOL realtime = TRUE )
 	{
 		// limit is the maximum number of keys
 		// allowed per interval (in seconds or frames)
diff --git a/indra/llcommon/llprocessor.h b/indra/llcommon/llprocessor.h
index 6abbd96..06dc72a 100644
--- a/indra/llcommon/llprocessor.h
+++ b/indra/llcommon/llprocessor.h
@@ -58,7 +58,7 @@
 #endif
 
 
-typedef struct ProcessorExtensions
+struct ProcessorExtensions
 {
 	bool FPU_FloatingPointUnit;
 	bool VME_Virtual8086ModeEnhancements;
@@ -97,9 +97,9 @@ typedef struct ProcessorExtensions
 	bool _3DNOW_InstructionExtensions;
 	bool _E3DNOW_InstructionExtensions;
 	bool AA64_AMD64BitArchitecture;
-} ProcessorExtensions;
+};
 
-typedef struct ProcessorCache
+struct ProcessorCache
 {
 	bool bPresent;
 	char strSize[32];	/* Flawfinder: ignore */	
@@ -107,24 +107,24 @@ typedef struct ProcessorCache
 	unsigned int uiLineSize;
 	bool bSectored;
 	char strCache[128];	/* Flawfinder: ignore */	
-} ProcessorCache;
+};
 
-typedef struct ProcessorL1Cache
+struct ProcessorL1Cache
 {
     ProcessorCache Instruction;
 	ProcessorCache Data;
-} ProcessorL1Cache;
+};
 
-typedef struct ProcessorTLB
+struct ProcessorTLB
 {
 	bool bPresent;
 	char strPageSize[32];	/* Flawfinder: ignore */	
 	unsigned int uiAssociativeWays;
 	unsigned int uiEntries;
 	char strTLB[128];	/* Flawfinder: ignore */	
-} ProcessorTLB;
+};
 
-typedef struct ProcessorInfo
+struct ProcessorInfo
 {
 	char strVendor[16];	/* Flawfinder: ignore */	
 	unsigned int uiFamily;
@@ -148,7 +148,7 @@ typedef struct ProcessorInfo
 	ProcessorCache _Trace;
 	ProcessorTLB _Instruction;
 	ProcessorTLB _Data;
-} ProcessorInfo;
+};
 
 
 // CProcessor
diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp
index d42842d..f21ff68 100644
--- a/indra/llcommon/llsdserialize.cpp
+++ b/indra/llcommon/llsdserialize.cpp
@@ -324,7 +324,7 @@ S32 LLSDParser::parse(std::istream& istr, LLSD& data, S32 max_bytes)
 S32 LLSDParser::parseLines(std::istream& istr, LLSD& data)
 {
 	mCheckLimits = false;
-	mParseLines = false;		// was true, Emergency fix DEV-17785 parsing newline failure
+	mParseLines = true;
 	return doParse(istr, data);
 }
 
diff --git a/indra/llcommon/llsdserialize_xml.cpp b/indra/llcommon/llsdserialize_xml.cpp
index 690ab67..9c3f85e 100644
--- a/indra/llcommon/llsdserialize_xml.cpp
+++ b/indra/llcommon/llsdserialize_xml.cpp
@@ -461,11 +461,11 @@ S32 LLSDXMLParser::Impl::parseLines(std::istream& input, LLSD& data)
 				input.clear();
 			}
 		
-			// Don't parse the NULL at the end which might be added if \n was absorbed by getline()
+			// Re-insert with the \n that was absorbed by getline()
 			char * text = (char *) buffer;
 			if ( text[num_read - 1] == 0)
 			{
-				num_read--;
+				text[num_read - 1] = '\n';
 			}
 		}
 
@@ -808,12 +808,11 @@ void LLSDXMLParser::parsePart(const char *buf, int len)
 // virtual
 S32 LLSDXMLParser::doParse(std::istream& input, LLSD& data) const
 {
-// Remove code - emergency fix DEV-17785 parsing newline failure
-//	if (mParseLines)
-//	{
+	if (mParseLines)
+	{
 		// Use line-based reading (faster code)
-//		return impl.parseLines(input, data);
-//	}
+		return impl.parseLines(input, data);
+	}
 
 	return impl.parse(input, data);
 }
diff --git a/indra/llcommon/llstat.cpp b/indra/llcommon/llstat.cpp
index 4b79fcb..706acdb 100644
--- a/indra/llcommon/llstat.cpp
+++ b/indra/llcommon/llstat.cpp
@@ -31,55 +31,288 @@
 #include "linden_common.h"
 
 #include "llstat.h"
+#include "lllivefile.h"
+#include "llerrorcontrol.h"
 #include "llframetimer.h"
 #include "timing.h"
+#include "llsd.h"
+#include "llsdserialize.h"
+#include "llstl.h"
+#include "u64.h"
 
-class LLStatAccum::impl
+
+// statics
+BOOL            LLPerfBlock::sStatsEnabled = FALSE;    // Flag for detailed information
+LLPerfBlock::stat_map_t    LLPerfBlock::sStatMap;    // Map full path string to LLStatTime objects, tracks all active objects
+std::string        LLPerfBlock::sCurrentStatPath = "";    // Something like "/total_time/physics/physics step"
+
+//------------------------------------------------------------------------
+// Live config file to trigger stats logging
+static const char    STATS_CONFIG_FILE_NAME[]            = "/dev/shm/simperf/simperf_proc_config.llsd";
+static const F32    STATS_CONFIG_REFRESH_RATE            = 5.0;        // seconds
+
+class LLStatsConfigFile : public LLLiveFile
 {
 public:
-	static const TimeScale IMPL_NUM_SCALES = (TimeScale)(SCALE_TWO_MINUTE + 1);
-	static U64 sScaleTimes[IMPL_NUM_SCALES];
+    LLStatsConfigFile()
+        : LLLiveFile(filename(), STATS_CONFIG_REFRESH_RATE),
+        mChanged(false), mStatsp(NULL) { }
 
-	BOOL	mUseFrameTimer;
+    static std::string filename();
+    
+protected:
+    /* virtual */ void loadFile();
 
-	BOOL	mRunning;
-	U64		mLastTime;
-	
-	struct Bucket
-	{
-		F64		accum;
-		U64		endTime;
+public:
+    void init(LLPerfStats* statsp);
+    static LLStatsConfigFile& instance();
+        // return the singleton stats config file
 
-		BOOL	lastValid;
-		F64		lastAccum;
-	};
+    bool mChanged;
 
-	Bucket	mBuckets[IMPL_NUM_SCALES];
+protected:
+    LLPerfStats*    mStatsp;
+};
 
-	BOOL 	mLastSampleValid;
-	F64 	mLastSampleValue;
+std::string LLStatsConfigFile::filename()
+{
+    return STATS_CONFIG_FILE_NAME;
+}
 
+void LLStatsConfigFile::init(LLPerfStats* statsp)
+{
+    mStatsp = statsp;
+}
 
-	impl(bool useFrameTimer);
+LLStatsConfigFile& LLStatsConfigFile::instance()
+{
+    static LLStatsConfigFile the_file;
+    return the_file;
+}
 
-	void reset(U64 when);
 
-	void sum(F64 value);
-	void sum(F64 value, U64 when);
+/* virtual */
+// Load and parse the stats configuration file
+void LLStatsConfigFile::loadFile()
+{
+    if (!mStatsp)
+    {
+        llwarns << "Tries to load performance configure file without initializing LPerfStats" << llendl;
+        return;
+    }
+    mChanged = true;
+    
+    LLSD stats_config;
+    {
+        llifstream file(filename().c_str());
+        if (file.is_open())
+        {
+            LLSDSerialize::fromXML(stats_config, file);
+            if (stats_config.isUndefined())
+            {
+                llinfos << "Performance statistics configuration file ill-formed, not recording statistics" << llendl;
+                mStatsp->setReportPerformanceDuration( 0.f );
+                return;
+            }
+        }
+        else 
+        {    // File went away, turn off stats if it was on
+            if ( mStatsp->frameStatsIsRunning() )
+            {
+                llinfos << "Performance statistics configuration file deleted, not recording statistics" << llendl;
+                mStatsp->setReportPerformanceDuration( 0.f );
+            }
+            return;
+        }
+    }
+
+    F32 duration = 0.f;
+    F32 interval = 0.f;
+
+    const char * w = "duration";
+    if (stats_config.has(w))
+    {
+        duration = (F32)stats_config[w].asReal();
+    } 
+    w = "interval";
+    if (stats_config.has(w))
+    {
+        interval = (F32)stats_config[w].asReal();
+    } 
+
+    mStatsp->setReportPerformanceDuration( duration );
+    mStatsp->setReportPerformanceInterval( interval );
+
+    if ( duration > 0 )
+    {
+        if ( interval == 0.f )
+        {
+            llinfos << "Recording performance stats every frame for " << duration << " sec" << llendl;
+        }
+        else
+        {
+            llinfos << "Recording performance stats every " << interval << " seconds for " << duration << " seconds" << llendl;
+        }
+    }
+    else
+    {
+        llinfos << "Performance stats recording turned off" << llendl;
+    }
+}
 
-	F32 meanValue(TimeScale scale) const;
 
-	U64 getCurrentUsecs() const;
-		// Get current microseconds based on timer type
-};
+//------------------------------------------------------------------------
 
+LLPerfStats::LLPerfStats(const std::string& process_name, S32 process_pid) : 
+    mFrameStatsFileFailure(FALSE),
+    mSkipFirstFrameStats(FALSE),
+    mProcessName(process_name),
+    mProcessPID(process_pid),
+    mReportPerformanceStatInterval(1.f),
+    mReportPerformanceStatEnd(0.0) 
+{ }
 
-U64 LLStatAccum::impl::sScaleTimes[IMPL_NUM_SCALES] =
+LLPerfStats::~LLPerfStats()
+{
+    LLPerfBlock::clearDynamicStats();
+    mFrameStatsFile.close();
+}
+
+void LLPerfStats::init()
+{
+    // Initialize the stats config file instance.
+    (void) LLStatsConfigFile::instance().init(this);
+    (void) LLStatsConfigFile::instance().checkAndReload();
+}
+
+// Open file for statistics
+void    LLPerfStats::openPerfStatsFile()
+{
+    if ( !mFrameStatsFile
+        && !mFrameStatsFileFailure )
+    {
+        std::string stats_file = llformat("/dev/shm/simperf/%s_proc.%d.llsd", mProcessName.c_str(), mProcessPID);
+        mFrameStatsFile.close();
+        mFrameStatsFile.clear();
+        mFrameStatsFile.open(stats_file, llofstream::out);
+        if ( mFrameStatsFile.fail() )
+        {
+            llinfos << "Error opening statistics log file " << stats_file << llendl;
+            mFrameStatsFileFailure = TRUE;
+        }
+        else
+        {
+            LLSD process_info = LLSD::emptyMap();
+            process_info["name"] = mProcessName;
+            process_info["pid"] = (LLSD::Integer) mProcessPID;
+            process_info["stat_rate"] = (LLSD::Integer) mReportPerformanceStatInterval;
+            // Add process-specific info.
+            addProcessHeaderInfo(process_info);
+
+            mFrameStatsFile << LLSDNotationStreamer(process_info) << std::endl; 
+        }
+    }
+}
+
+// Dump out performance metrics over some time interval
+void LLPerfStats::dumpIntervalPerformanceStats()
+{
+    // Ensure output file is OK
+    openPerfStatsFile();
+
+    if ( mFrameStatsFile )
+    {
+        LLSD stats = LLSD::emptyMap();
+
+        LLStatAccum::TimeScale scale;
+        if ( getReportPerformanceInterval() == 0.f )
+        {
+            scale = LLStatAccum::SCALE_PER_FRAME;
+        }
+        else if ( getReportPerformanceInterval() < 0.5f )
+        {
+            scale = LLStatAccum::SCALE_100MS;
+        }
+        else
+        {
+            scale = LLStatAccum::SCALE_SECOND;
+        }
+
+        // Write LLSD into log
+        stats["utc_time"] = (LLSD::String) LLError::utcTime();
+        stats["timestamp"] = U64_to_str((totalTime() / 1000) + (gUTCOffset * 1000));    // milliseconds since epoch
+        stats["frame_number"] = (LLSD::Integer) LLFrameTimer::getFrameCount();
+
+        // Add process-specific frame info.
+        addProcessFrameInfo(stats, scale);
+        LLPerfBlock::addStatsToLLSDandReset( stats, scale );
+
+        mFrameStatsFile << LLSDNotationStreamer(stats) << std::endl; 
+    }
+}
+
+// Set length of performance stat recording
+void    LLPerfStats::setReportPerformanceDuration( F32 seconds )
+{ 
+	if ( seconds <= 0.f )
+	{
+		mReportPerformanceStatEnd = 0.0;
+		LLPerfBlock::setStatsEnabled( FALSE );
+		mFrameStatsFile.close();
+		LLPerfBlock::clearDynamicStats();
+	}
+	else
+	{
+		mReportPerformanceStatEnd = LLFrameTimer::getElapsedSeconds() + ((F64) seconds);
+		// Clear failure flag to try and create the log file once
+		mFrameStatsFileFailure = FALSE;
+		LLPerfBlock::setStatsEnabled( TRUE );
+		mSkipFirstFrameStats = TRUE;		// Skip the first report (at the end of this frame)
+	}
+}
+
+void LLPerfStats::updatePerFrameStats()
+{
+    (void) LLStatsConfigFile::instance().checkAndReload();
+	static LLFrameTimer performance_stats_timer;
+	if ( frameStatsIsRunning() )
+	{
+		if ( mReportPerformanceStatInterval == 0 )
+		{	// Record info every frame
+			if ( mSkipFirstFrameStats )
+			{	// Skip the first time - was started this frame
+				mSkipFirstFrameStats = FALSE;
+			}
+			else
+			{
+				dumpIntervalPerformanceStats();
+			}
+		}
+		else
+		{
+			performance_stats_timer.setTimerExpirySec( getReportPerformanceInterval() );
+			if (performance_stats_timer.checkExpirationAndReset( mReportPerformanceStatInterval ))
+			{
+				dumpIntervalPerformanceStats();
+			}
+		}
+		
+		if ( LLFrameTimer::getElapsedSeconds() > mReportPerformanceStatEnd )
+		{	// Reached end of time, clear it to stop reporting
+			setReportPerformanceDuration(0.f);			// Don't set mReportPerformanceStatEnd directly	
+            llinfos << "Recording performance stats completed" << llendl;
+		}
+	}
+}
+
+
+//------------------------------------------------------------------------
+
+U64 LLStatAccum::sScaleTimes[NUM_SCALES] =
 {
 	USEC_PER_SEC / 10,				// 100 millisec
 	USEC_PER_SEC * 1,				// seconds
 	USEC_PER_SEC * 60,				// minutes
-	USEC_PER_SEC * 60 * 2			// two minutes
 #if ENABLE_LONG_TIME_STATS
 	// enable these when more time scales are desired
 	USEC_PER_SEC * 60*60,			// hours
@@ -89,19 +322,27 @@ U64 LLStatAccum::impl::sScaleTimes[IMPL_NUM_SCALES] =
 };
 
 
-LLStatAccum::impl::impl(bool useFrameTimer)
+
+LLStatAccum::LLStatAccum(bool useFrameTimer)
+	: mUseFrameTimer(useFrameTimer),
+	  mRunning(FALSE),
+	  mLastSampleValue(0.0),
+	  mLastSampleValid(FALSE)
+{
+}
+
+LLStatAccum::~LLStatAccum()
 {
-	mUseFrameTimer = useFrameTimer;
-	mRunning = FALSE;
-	mLastSampleValid = FALSE;
 }
 
-void LLStatAccum::impl::reset(U64 when)
+
+
+void LLStatAccum::reset(U64 when)
 {
 	mRunning = TRUE;
 	mLastTime = when;
 
-	for (int i = 0; i < IMPL_NUM_SCALES; ++i)
+	for (int i = 0; i < NUM_SCALES; ++i)
 	{
 		mBuckets[i].accum = 0.0;
 		mBuckets[i].endTime = when + sScaleTimes[i];
@@ -109,12 +350,12 @@ void LLStatAccum::impl::reset(U64 when)
 	}
 }
 
-void LLStatAccum::impl::sum(F64 value)
+void LLStatAccum::sum(F64 value)
 {
 	sum(value, getCurrentUsecs());
 }
 
-void LLStatAccum::impl::sum(F64 value, U64 when)
+void LLStatAccum::sum(F64 value, U64 when)
 {
 	if (!mRunning)
 	{
@@ -131,7 +372,10 @@ void LLStatAccum::impl::sum(F64 value, U64 when)
 		return;
 	}
 
-	for (int i = 0; i < IMPL_NUM_SCALES; ++i)
+	// how long is this value for
+	U64 timeSpan = when - mLastTime;
+
+	for (int i = 0; i < NUM_SCALES; ++i)
 	{
 		Bucket& bucket = mBuckets[i];
 
@@ -143,8 +387,6 @@ void LLStatAccum::impl::sum(F64 value, U64 when)
 		{
 			U64 timeScale = sScaleTimes[i];
 
-			U64 timeSpan = when - mLastTime;
-				// how long is this value for
 			U64 timeLeft = when - bucket.endTime;
 				// how much time is left after filling this bucket
 			
@@ -173,13 +415,18 @@ void LLStatAccum::impl::sum(F64 value, U64 when)
 }
 
 
-F32 LLStatAccum::impl::meanValue(TimeScale scale) const
+F32 LLStatAccum::meanValue(TimeScale scale) const
 {
 	if (!mRunning)
 	{
 		return 0.0;
 	}
-	if (scale < 0 || scale >= IMPL_NUM_SCALES)
+	if ( scale == SCALE_PER_FRAME )
+	{	// Per-frame not supported here
+		scale = SCALE_100MS;
+	}
+
+	if (scale < 0 || scale >= NUM_SCALES)
 	{
 		llwarns << "llStatAccum::meanValue called for unsupported scale: "
 			<< scale << llendl;
@@ -209,7 +456,7 @@ F32 LLStatAccum::impl::meanValue(TimeScale scale) const
 }
 
 
-U64 LLStatAccum::impl::getCurrentUsecs() const
+U64 LLStatAccum::getCurrentUsecs() const
 {
 	if (mUseFrameTimer)
 	{
@@ -222,25 +469,44 @@ U64 LLStatAccum::impl::getCurrentUsecs() const
 }
 
 
+// ------------------------------------------------------------------------
 
-
-
-LLStatAccum::LLStatAccum(bool useFrameTimer)
-	: m(* new impl(useFrameTimer))
+LLStatRate::LLStatRate(bool use_frame_timer)
+	: LLStatAccum(use_frame_timer)
 {
 }
 
-LLStatAccum::~LLStatAccum()
+void LLStatRate::count(U32 value)
 {
-	delete &m;
+	sum((F64)value * sScaleTimes[SCALE_SECOND]);
 }
 
-F32 LLStatAccum::meanValue(TimeScale scale) const
-{
-	return m.meanValue(scale);
-}
+
+void LLStatRate::mark()
+ { 
+	// Effectively the same as count(1), but sets mLastSampleValue
+	U64 when = getCurrentUsecs();
+
+	if ( mRunning 
+		 && (when > mLastTime) )
+	{	// Set mLastSampleValue to the time from the last mark()
+		F64 duration = ((F64)(when - mLastTime)) / sScaleTimes[SCALE_SECOND];
+		if ( duration > 0.0 )
+		{
+			mLastSampleValue = 1.0 / duration;
+		}
+		else
+		{
+			mLastSampleValue = 0.0;
+		}
+	}
+
+	sum( (F64) sScaleTimes[SCALE_SECOND], when);
+ }
 
 
+// ------------------------------------------------------------------------
+
 
 LLStatMeasure::LLStatMeasure(bool use_frame_timer)
 	: LLStatAccum(use_frame_timer)
@@ -249,53 +515,209 @@ LLStatMeasure::LLStatMeasure(bool use_frame_timer)
 
 void LLStatMeasure::sample(F64 value)
 {
-	U64 when = m.getCurrentUsecs();
+	U64 when = getCurrentUsecs();
 
-	if (m.mLastSampleValid)
+	if (mLastSampleValid)
 	{
-		F64 avgValue = (value + m.mLastSampleValue) / 2.0;
-		F64 interval = (F64)(when - m.mLastTime);
+		F64 avgValue = (value + mLastSampleValue) / 2.0;
+		F64 interval = (F64)(when - mLastTime);
 
-		m.sum(avgValue * interval, when);
+		sum(avgValue * interval, when);
 	}
 	else
 	{
-		m.reset(when);
+		reset(when);
 	}
 
-	m.mLastSampleValid = TRUE;
-	m.mLastSampleValue = value;
+	mLastSampleValid = TRUE;
+	mLastSampleValue = value;
 }
 
 
-LLStatRate::LLStatRate(bool use_frame_timer)
-	: LLStatAccum(use_frame_timer)
+// ------------------------------------------------------------------------
+
+LLStatTime::LLStatTime(const std::string & key)
+	: LLStatAccum(false),
+	  mFrameNumber(LLFrameTimer::getFrameCount()),
+	  mTotalTimeInFrame(0),
+	  mKey(key)
+#if LL_DEBUG
+	  , mRunning(FALSE)
+#endif
 {
 }
 
-void LLStatRate::count(U32 value)
+void LLStatTime::start()
+{
+	// Reset frame accumluation if the frame number has changed
+	U32 frame_number = LLFrameTimer::getFrameCount();
+	if ( frame_number != mFrameNumber )
+	{
+		mFrameNumber = frame_number;
+		mTotalTimeInFrame = 0;
+	}
+
+	sum(0.0);
+
+#if LL_DEBUG
+	// Shouldn't be running already
+	llassert( !mRunning );
+	mRunning = TRUE;
+#endif
+}
+
+void LLStatTime::stop()
+{
+	U64 end_time = getCurrentUsecs();
+	U64 duration = end_time - mLastTime;
+	sum(F64(duration), end_time);
+	//llinfos << "mTotalTimeInFrame incremented from  " << mTotalTimeInFrame << " to " << (mTotalTimeInFrame + duration) << llendl; 
+	mTotalTimeInFrame += duration;
+
+#if LL_DEBUG
+	mRunning = FALSE;
+#endif
+}
+
+/* virtual */ F32 LLStatTime::meanValue(TimeScale scale) const
 {
-	m.sum((F64)value * impl::sScaleTimes[SCALE_SECOND]);
+    if ( LLStatAccum::SCALE_PER_FRAME == scale )
+    {
+        return mTotalTimeInFrame;
+    }
+    else
+    {
+        return LLStatAccum::meanValue(scale);
+    }
 }
 
 
-LLStatTime::LLStatTime(bool use_frame_timer)
-	: LLStatAccum(use_frame_timer)
+// ------------------------------------------------------------------------
+
+
+// Use this constructor for pre-defined LLStatTime objects
+LLPerfBlock::LLPerfBlock(LLStatTime* stat ) : mPredefinedStat(stat), mDynamicStat(NULL)
 {
+    if (mPredefinedStat)
+    {
+        // If dynamic stats are turned on, this will create a separate entry in the stat map.
+        initDynamicStat(mPredefinedStat->mKey);
+
+        // Start predefined stats.  These stats are not part of the stat map.
+        mPredefinedStat->start();
+    }
 }
 
-void LLStatTime::start()
+// Use this constructor for dynamically created LLStatTime objects (not pre-defined) with a multi-part key.
+// These are also turned on or off via the switch passed in
+LLPerfBlock::LLPerfBlock( const char* key1, const char* key2 ) : mPredefinedStat(NULL), mDynamicStat(NULL)
 {
-	m.sum(0.0);
+    if (!sStatsEnabled) return;
+
+    if (NULL == key2 || strlen(key2) == 0)
+    {
+        initDynamicStat(key1);
+    }
+    else
+    {
+        std::ostringstream key;
+        key << key1 << "_" << key2;
+        initDynamicStat(key.str());
+    }
 }
 
-void LLStatTime::stop()
+void LLPerfBlock::initDynamicStat(const std::string& key)
+{
+    // Early exit if dynamic stats aren't enabled.
+    if (!sStatsEnabled) return;
+
+    mLastPath = sCurrentStatPath;		// Save and restore current path
+    sCurrentStatPath += "/" + key;		// Add key to current path
+
+    // See if the LLStatTime object already exists
+    stat_map_t::iterator iter = sStatMap.find(sCurrentStatPath);
+    if ( iter == sStatMap.end() )
+    {
+        // StatEntry object doesn't exist, so create it
+        mDynamicStat = new StatEntry( key );
+        sStatMap[ sCurrentStatPath ] = mDynamicStat;	// Set the entry for this path
+    }
+    else
+    {
+        // Found this path in the map, use the object there
+        mDynamicStat = (*iter).second;		// Get StatEntry for the current path
+    }
+
+    if (mDynamicStat)
+    {
+        mDynamicStat->mStat.start();
+        mDynamicStat->mCount++;
+    }
+    else
+    {
+        llwarns << "Initialized NULL dynamic stat at '" << sCurrentStatPath << "'" << llendl;
+       sCurrentStatPath = mLastPath;
+    }
+}
+
+
+// Destructor does the time accounting
+LLPerfBlock::~LLPerfBlock()
+{
+    if (mPredefinedStat) mPredefinedStat->stop();
+    if (mDynamicStat)
+    {
+        mDynamicStat->mStat.stop();
+        sCurrentStatPath = mLastPath;	// Restore the path in case sStatsEnabled changed during this block
+    }
+}
+
+
+// Clear the map of any dynamic stats.  Static routine
+void LLPerfBlock::clearDynamicStats()
+{
+    std::for_each(sStatMap.begin(), sStatMap.end(), DeletePairedPointer());
+    sStatMap.clear();
+}
+
+// static - Extract the stat info into LLSD
+void LLPerfBlock::addStatsToLLSDandReset( LLSD & stats,
+										  LLStatAccum::TimeScale scale )
 {
-	U64 endTime = m.getCurrentUsecs();
-	m.sum((F64)(endTime - m.mLastTime), endTime);
+    // If we aren't in per-frame scale, we need to go from second to microsecond.
+    U32 scale_adjustment = 1;
+    if (LLStatAccum::SCALE_PER_FRAME != scale)
+    {
+        scale_adjustment = USEC_PER_SEC;
+    }
+	stat_map_t::iterator iter = sStatMap.begin();
+	for ( ; iter != sStatMap.end(); ++iter )
+	{	// Put the entry into LLSD "/full/path/to/stat/" = microsecond total time
+		const std::string & stats_full_path = (*iter).first;
+
+		StatEntry * stat = (*iter).second;
+		if (stat)
+		{
+            if (stat->mCount > 0)
+            {
+                stats[stats_full_path] = LLSD::emptyMap();
+                stats[stats_full_path]["us"] = (LLSD::Integer) (scale_adjustment * stat->mStat.meanValue(scale));
+                if (stat->mCount > 1)
+                {
+                    stats[stats_full_path]["count"] = (LLSD::Integer) stat->mCount;
+                }
+                stat->mCount = 0;
+            }
+		}
+		else
+		{	// WTF?  Shouldn't have a NULL pointer in the map.
+            llwarns << "Unexpected NULL dynamic stat at '" << stats_full_path << "'" << llendl;
+		}
+	}	
 }
 
 
+// ------------------------------------------------------------------------
 
 LLTimer LLStat::sTimer;
 LLFrameTimer LLStat::sFrameTimer;
diff --git a/indra/llcommon/llstat.h b/indra/llcommon/llstat.h
index 0a7e014..63813e2 100644
--- a/indra/llcommon/llstat.h
+++ b/indra/llcommon/llstat.h
@@ -33,9 +33,13 @@
 #define LL_LLSTAT_H
 
 #include <deque>
+#include <map>
 
 #include "lltimer.h"
 #include "llframetimer.h"
+#include "llfile.h"
+
+class	LLSD;
 
 // Set this if longer stats are needed
 #define ENABLE_LONG_TIME_STATS	0
@@ -58,25 +62,50 @@ public:
 		SCALE_100MS,
 		SCALE_SECOND,
 		SCALE_MINUTE,
-		SCALE_TWO_MINUTE,
 #if ENABLE_LONG_TIME_STATS
 		SCALE_HOUR,
 		SCALE_DAY,
 		SCALE_WEEK,
 #endif
-		NUM_SCALES
+		NUM_SCALES,			// Use to size storage arrays
+		SCALE_PER_FRAME		// For latest frame information - should be after NUM_SCALES since this doesn't go into the time buckets
 	};
 
-	F32 meanValue(TimeScale scale) const;
+	static U64 sScaleTimes[NUM_SCALES];
+
+	virtual F32 meanValue(TimeScale scale) const;
 		// see the subclasses for the specific meaning of value
 
 	F32 meanValueOverLast100ms()  const { return meanValue(SCALE_100MS);  }
 	F32 meanValueOverLastSecond() const	{ return meanValue(SCALE_SECOND); }
 	F32 meanValueOverLastMinute() const	{ return meanValue(SCALE_MINUTE); }
 
-protected:
-	class impl;
-	impl& m;
+	void reset(U64 when);
+
+	void sum(F64 value);
+	void sum(F64 value, U64 when);
+
+	U64 getCurrentUsecs() const;
+		// Get current microseconds based on timer type
+
+	BOOL	mUseFrameTimer;
+	BOOL	mRunning;
+
+	U64		mLastTime;
+	
+	struct Bucket
+	{
+		F64		accum;
+		U64		endTime;
+
+		BOOL	lastValid;
+		F64		lastAccum;
+	};
+
+	Bucket	mBuckets[NUM_SCALES];
+
+	BOOL 	mLastSampleValid;
+	F64 	mLastSampleValue;
 };
 
 class LLStatMeasure : public LLStatAccum
@@ -105,39 +134,120 @@ public:
 	void count(U32);
 		// used to note that n items have occured
 	
-	void mark() { count(1); }
+	void mark();
 		// used for counting the rate thorugh a point in the code
 };
 
 
-class LLTimeBlock;
-
 class LLStatTime : public LLStatAccum
 	// gathers statistics about time spent in a block of code
 	// measure average duration per second in the block
 {
 public:
-	LLStatTime(bool use_frame_timer = false);
+	LLStatTime( const std::string & key = "undefined" );
+
+	U32		mFrameNumber;		// Current frame number
+	U64		mTotalTimeInFrame;	// Total time (microseconds) accumulated during the last frame
+
+	void	setKey( const std::string & key )		{ mKey = key;	};
+
+	virtual F32 meanValue(TimeScale scale) const;
 
 private:
-	void start();
+	void start();				// Start and stop measuring time block
 	void stop();
-	friend class LLTimeBlock;
+
+	std::string		mKey;		// Tag representing this time block
+
+#if LL_DEBUG
+	BOOL			mRunning;	// TRUE if start() has been called
+#endif
+
+	friend class LLPerfBlock;
 };
 
-class LLTimeBlock
+// ----------------------------------------------------------------------------
+
+
+// Use this class on the stack to record statistics about an area of code
+class LLPerfBlock
 {
 public:
-	LLTimeBlock(LLStatTime& stat) : mStat(stat) { mStat.start(); }
-	~LLTimeBlock()								{ mStat.stop(); }
+    struct StatEntry
+    {
+            StatEntry(const std::string& key) : mStat(LLStatTime(key)), mCount(0) {}
+            LLStatTime  mStat;
+            U32         mCount;
+    };
+    typedef std::map<std::string, StatEntry*>		stat_map_t;
+
+	// Use this constructor for pre-defined LLStatTime objects
+	LLPerfBlock(LLStatTime* stat);
+
+	// Use this constructor for dynamically created LLStatTime objects (not pre-defined) with a multi-part key
+	LLPerfBlock( const char* key1, const char* key2 = NULL);
+
+
+	~LLPerfBlock();
+
+	static void setStatsEnabled( BOOL enable )		{ sStatsEnabled = enable;	};
+	static S32  getStatsEnabled()					{ return sStatsEnabled;		};
+
+	static void clearDynamicStats();		// Reset maps to clear out dynamic objects
+	static void addStatsToLLSDandReset( LLSD & stats,		// Get current information and clear time bin
+										LLStatAccum::TimeScale scale );
+
 private:
-	LLStatTime& mStat;
+	// Initialize dynamically created LLStatTime objects
+    void initDynamicStat(const std::string& key);
+
+	std::string				mLastPath;				// Save sCurrentStatPath when this is called
+	LLStatTime * 			mPredefinedStat;		// LLStatTime object to get data
+	StatEntry *				mDynamicStat;   		// StatEntryobject to get data
+
+	static BOOL				sStatsEnabled;			// Normally FALSE
+    static stat_map_t		sStatMap;				// Map full path string to LLStatTime objects
+	static std::string		sCurrentStatPath;		// Something like "frame/physics/physics step"
 };
 
+// ----------------------------------------------------------------------------
 
+class LLPerfStats
+{
+public:
+    LLPerfStats(const std::string& process_name = "unknown", S32 process_pid = 0);
+    virtual ~LLPerfStats();
+
+    virtual void init();    // Reset and start all stat timers
+    virtual void updatePerFrameStats();
+    // Override these function to add process-specific information to the performance log header and per-frame logging.
+    virtual void addProcessHeaderInfo(LLSD& info) { /* not implemented */ }
+    virtual void addProcessFrameInfo(LLSD& info, LLStatAccum::TimeScale scale) { /* not implemented */ }
+
+    // High-resolution frame stats
+    BOOL    frameStatsIsRunning()                                { return (mReportPerformanceStatEnd > 0.);        };
+    F32     getReportPerformanceInterval() const                { return mReportPerformanceStatInterval;        };
+    void    setReportPerformanceInterval( F32 interval )        { mReportPerformanceStatInterval = interval;    };
+    void    setReportPerformanceDuration( F32 seconds );
+    void    setProcessName(const std::string& process_name) { mProcessName = process_name; }
+    void    setProcessPID(S32 process_pid) { mProcessPID = process_pid; }
 
+protected:
+    void    openPerfStatsFile();                    // Open file for high resolution metrics logging
+    void    dumpIntervalPerformanceStats();
+
+    llofstream      mFrameStatsFile;            // File for per-frame stats
+    BOOL            mFrameStatsFileFailure;        // Flag to prevent repeat opening attempts
+    BOOL            mSkipFirstFrameStats;        // Flag to skip one (partial) frame report
+    std::string     mProcessName;
+    S32             mProcessPID;
 
+private:
+    F32 mReportPerformanceStatInterval;    // Seconds between performance stats
+    F64 mReportPerformanceStatEnd;        // End time (seconds) for performance stats
+};
 
+// ----------------------------------------------------------------------------
 class LLStat
 {
 public:
diff --git a/indra/llcommon/llstatenums.h b/indra/llcommon/llstatenums.h
index 6866586..1d9b863 100644
--- a/indra/llcommon/llstatenums.h
+++ b/indra/llcommon/llstatenums.h
@@ -33,38 +33,41 @@
 
 enum
 {
-	LL_SIM_STAT_TIME_DILATION,
+	LL_SIM_STAT_TIME_DILATION,				// 0
 	LL_SIM_STAT_FPS,
 	LL_SIM_STAT_PHYSFPS,
 	LL_SIM_STAT_AGENTUPS,
 	LL_SIM_STAT_FRAMEMS,
-	LL_SIM_STAT_NETMS,
+	LL_SIM_STAT_NETMS,						// 5
 	LL_SIM_STAT_SIMOTHERMS,
 	LL_SIM_STAT_SIMPHYSICSMS,
 	LL_SIM_STAT_AGENTMS,
 	LL_SIM_STAT_IMAGESMS,
-	LL_SIM_STAT_SCRIPTMS,
+	LL_SIM_STAT_SCRIPTMS,					// 10
 	LL_SIM_STAT_NUMTASKS,
 	LL_SIM_STAT_NUMTASKSACTIVE,
 	LL_SIM_STAT_NUMAGENTMAIN,
 	LL_SIM_STAT_NUMAGENTCHILD,
-	LL_SIM_STAT_NUMSCRIPTSACTIVE,
+	LL_SIM_STAT_NUMSCRIPTSACTIVE,			// 15
 	LL_SIM_STAT_LSLIPS,
 	LL_SIM_STAT_INPPS,
 	LL_SIM_STAT_OUTPPS,
 	LL_SIM_STAT_PENDING_DOWNLOADS,
-	LL_SIM_STAT_PENDING_UPLOADS,
+	LL_SIM_STAT_PENDING_UPLOADS,			// 20
 	LL_SIM_STAT_VIRTUAL_SIZE_KB,
 	LL_SIM_STAT_RESIDENT_SIZE_KB,
 	LL_SIM_STAT_PENDING_LOCAL_UPLOADS,
 	LL_SIM_STAT_TOTAL_UNACKED_BYTES,
-	LL_SIM_STAT_PHYSICS_PINNED_TASKS,
+	LL_SIM_STAT_PHYSICS_PINNED_TASKS,		// 25
 	LL_SIM_STAT_PHYSICS_LOD_TASKS,
 	LL_SIM_STAT_SIMPHYSICSSTEPMS,
 	LL_SIM_STAT_SIMPHYSICSSHAPEMS,
 	LL_SIM_STAT_SIMPHYSICSOTHERMS,
-	LL_SIM_STAT_SIMPHYSICSMEMORY,
+	LL_SIM_STAT_SIMPHYSICSMEMORY,			// 30
 	LL_SIM_STAT_SCRIPT_EPS,
+	LL_SIM_STAT_SIMSPARETIME,
+	LL_SIM_STAT_SIMSLEEPTIME,
+	LL_SIM_STAT_IOPUMPTIME,
 };
 
 #endif
diff --git a/indra/llcommon/llstl.h b/indra/llcommon/llstl.h
index 4486727..70a2cc0 100644
--- a/indra/llcommon/llstl.h
+++ b/indra/llcommon/llstl.h
@@ -79,6 +79,9 @@ struct compare_pointer_contents
 // The general form is:
 //
 //  std::for_each(cont.begin(), cont.end(), DeletePointer());
+//  somemap.clear();
+//
+// Don't forget to clear()!
 
 struct DeletePointer
 {
@@ -95,7 +98,7 @@ struct DeletePointerArray
 	}
 };
 
-// DeletePointer is a simple helper for deleting all pointers in a map.
+// DeletePairedPointer is a simple helper for deleting all pointers in a map.
 // The general form is:
 //
 //  std::for_each(somemap.begin(), somemap.end(), DeletePairedPointer());
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 7b08fd3..5e75188 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -133,26 +133,32 @@ struct char_traits<U16>
 class LLStringOps
 {
 public:
-	static char toUpper(char elem) { return toupper(elem); }
+	static char toUpper(char elem) { return toupper((unsigned char)elem); }
 	static llwchar toUpper(llwchar elem) { return towupper(elem); }
 	
-	static char toLower(char elem) { return tolower(elem); }
+	static char toLower(char elem) { return tolower((unsigned char)elem); }
 	static llwchar toLower(llwchar elem) { return towlower(elem); }
 
-	static BOOL isSpace(char elem) { return isspace(elem) != 0; }
-	static BOOL isSpace(llwchar elem) { return iswspace(elem) != 0; }
+	static bool isSpace(char elem) { return isspace((unsigned char)elem) != 0; }
+	static bool isSpace(llwchar elem) { return iswspace(elem) != 0; }
 
-	static BOOL isUpper(char elem) { return isupper(elem) != 0; }
-	static BOOL isUpper(llwchar elem) { return iswupper(elem) != 0; }
+	static bool isUpper(char elem) { return isupper((unsigned char)elem) != 0; }
+	static bool isUpper(llwchar elem) { return iswupper(elem) != 0; }
 
-	static BOOL isLower(char elem) { return islower(elem) != 0; }
-	static BOOL isLower(llwchar elem) { return iswlower(elem) != 0; }
+	static bool isLower(char elem) { return islower((unsigned char)elem) != 0; }
+	static bool isLower(llwchar elem) { return iswlower(elem) != 0; }
+
+	static bool isDigit(char a) { return isdigit((unsigned char)a) != 0; }
+	static bool isDigit(llwchar a) { return iswdigit(a) != 0; }
+
+	static bool isPunct(char a) { return ispunct((unsigned char)a) != 0; }
+	static bool isPunct(llwchar a) { return iswpunct(a) != 0; }
+
+	static bool isAlnum(char a) { return isalnum((unsigned char)a) != 0; }
+	static bool isAlnum(llwchar a) { return iswalnum(a) != 0; }
 
 	static S32	collate(const char* a, const char* b) { return strcoll(a, b); }
 	static S32	collate(const llwchar* a, const llwchar* b);
-
-	static BOOL isDigit(char a) { return isdigit(a) != 0; }
-	static BOOL isDigit(llwchar a) { return iswdigit(a) != 0; }
 };
 
 /**
@@ -194,7 +200,7 @@ public:
 	typedef std::map<LLFormatMapString, LLFormatMapString> format_map_t;
 	static S32 format(std::basic_string<T>& s, const format_map_t& fmt_map);
 	
-	static BOOL	isValidIndex(const std::basic_string<T>& string, size_type i)
+	static bool isValidIndex(const std::basic_string<T>& string, size_type i)
 	{
 		return !string.empty() && (0 <= i) && (i <= string.size());
 	}
@@ -1155,13 +1161,6 @@ BOOL LLStringUtilBase<T>::convertToU32(const std::basic_string<T>& string, U32&
 	std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
 	if(i_stream >> v)
 	{
-		//TODO: figure out overflow reporting here
-		//if( ULONG_MAX == v )
-		//{
-		//	// Underflow or overflow
-		//	return FALSE;
-		//}
-
 		value = v;
 		return TRUE;
 	}
diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index 822adc2..8bc9aac 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -359,7 +359,7 @@ void LLCondition::broadcast()
 LLMutex* LLThreadSafeRefCount::sMutex = 0;
 
 //static
-void LLThreadSafeRefCount::initClass()
+void LLThreadSafeRefCount::initThreadSafeRefCount()
 {
 	if (!sMutex)
 	{
@@ -368,7 +368,7 @@ void LLThreadSafeRefCount::initClass()
 }
 
 //static
-void LLThreadSafeRefCount::cleanupClass()
+void LLThreadSafeRefCount::cleanupThreadSafeRefCount()
 {
 	delete sMutex;
 	sMutex = NULL;
diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h
index 9da3134..923de56 100644
--- a/indra/llcommon/llthread.h
+++ b/indra/llcommon/llthread.h
@@ -191,8 +191,8 @@ void LLThread::unlockData()
 class LLThreadSafeRefCount
 {
 public:
-	static void initClass(); // creates sMutex
-	static void cleanupClass(); // destroys sMutex
+	static void initThreadSafeRefCount(); // creates sMutex
+	static void cleanupThreadSafeRefCount(); // destroys sMutex
 	
 private:
 	static LLMutex* sMutex;
diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp
index 967570d..47edfd0 100644
--- a/indra/llcommon/lltimer.cpp
+++ b/indra/llcommon/lltimer.cpp
@@ -83,15 +83,20 @@ void ms_sleep(U32 ms)
 {
 	Sleep(ms);
 }
+
+U32 micro_sleep(U64 us, U32 max_yields)
+{
+    // max_yields is unused; just fiddle with it to avoid warnings.
+    max_yields = 0;
+    ms_sleep(us / 1000);
+    return 0;
+}
 #elif LL_LINUX || LL_SOLARIS || LL_DARWIN
-void ms_sleep(U32 ms)
+static void _sleep_loop(struct timespec& thiswait)
 {
-	long mslong = ms; // tv_nsec is a long
-	struct timespec thiswait, nextwait;
+	struct timespec nextwait;
 	bool sleep_more = false;
 
-	thiswait.tv_sec = ms / 1000;
-	thiswait.tv_nsec = (mslong % 1000) * 1000000l;
 	do {
 		int result = nanosleep(&thiswait, &nextwait);
 
@@ -127,6 +132,44 @@ void ms_sleep(U32 ms)
 		}
 	} while (sleep_more);
 }
+
+U32 micro_sleep(U64 us, U32 max_yields)
+{
+    U64 start = get_clock_count();
+    // This is kernel dependent.  Currently, our kernel generates software clock
+    // interrupts at 250 Hz (every 4,000 microseconds).
+    const U64 KERNEL_SLEEP_INTERVAL_US = 4000;
+
+    S32 num_sleep_intervals = (us - (KERNEL_SLEEP_INTERVAL_US >> 1)) / KERNEL_SLEEP_INTERVAL_US;
+    if (num_sleep_intervals > 0)
+    {
+        U64 sleep_time = (num_sleep_intervals * KERNEL_SLEEP_INTERVAL_US) - (KERNEL_SLEEP_INTERVAL_US >> 1);
+        struct timespec thiswait;
+        thiswait.tv_sec = sleep_time / 1000000;
+        thiswait.tv_nsec = (sleep_time % 1000000) * 1000l;
+        _sleep_loop(thiswait);
+    }
+
+    U64 current_clock = get_clock_count();
+    U32 yields = 0;
+    while (    (yields < max_yields)
+            && (current_clock - start < us) )
+    {
+        sched_yield();
+        ++yields;
+        current_clock = get_clock_count();
+    }
+    return yields;
+}
+
+void ms_sleep(U32 ms)
+{
+	long mslong = ms; // tv_nsec is a long
+	struct timespec thiswait;
+	thiswait.tv_sec = ms / 1000;
+	thiswait.tv_nsec = (mslong % 1000) * 1000000l;
+    _sleep_loop(thiswait);
+}
 #else
 # error "architecture not supported"
 #endif
diff --git a/indra/llcommon/lltimer.h b/indra/llcommon/lltimer.h
index 8d94276..766645b 100644
--- a/indra/llcommon/lltimer.h
+++ b/indra/llcommon/lltimer.h
@@ -39,6 +39,8 @@
 
 #include "stdtypes.h"
 
+#include <string>
+#include <list>
 // units conversions
 #ifndef USEC_PER_SEC
     const U32	USEC_PER_SEC	= 1000000;
@@ -115,6 +117,7 @@ void update_clock_frequencies();
 
 // Sleep for milliseconds
 void ms_sleep(U32 ms);
+U32 micro_sleep(U64 us, U32 max_yields = 0xFFFFFFFF);
 
 // Returns the correct UTC time in seconds, like time(NULL).
 // Useful on the viewer, which may have its local clock set wrong.
@@ -184,7 +187,7 @@ protected:
 
 private:
 	//list of active timers
-	static std::list<LLEventTimer*> sActiveList;
+	static std::list<LLEventTimer*> sActiveList; // TODO should this be a vector
 };
 
 #endif
diff --git a/indra/llcommon/llversionserver.h b/indra/llcommon/llversionserver.h
index 0b88ce8..2861428 100644
--- a/indra/llcommon/llversionserver.h
+++ b/indra/llcommon/llversionserver.h
@@ -34,8 +34,8 @@
 
 const S32 LL_VERSION_MAJOR = 1;
 const S32 LL_VERSION_MINOR = 24;
-const S32 LL_VERSION_PATCH = 0;
-const S32 LL_VERSION_BUILD = 93453;
+const S32 LL_VERSION_PATCH = 9;
+const S32 LL_VERSION_BUILD = 98650;
 
 const char * const LL_CHANNEL = "Second Life Server";
 
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index 66462b3..6e7d6ce 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -33,8 +33,8 @@
 #define LL_LLVERSIONVIEWER_H
 
 const S32 LL_VERSION_MAJOR = 1;
-const S32 LL_VERSION_MINOR = 21;
-const S32 LL_VERSION_PATCH = 6;
+const S32 LL_VERSION_MINOR = 22;
+const S32 LL_VERSION_PATCH = 0;
 const S32 LL_VERSION_BUILD = 0;
 
 const char * const LL_CHANNEL = "Second Life Release";
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index 77274b0..3abbb2d 100755
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -154,6 +154,9 @@ void LLCrashLogger::gatherFiles()
 	if (debug_log_file.is_open())
 	{		
 		LLSDSerialize::fromXML(mDebugLog, debug_log_file);
+
+		mCrashInPreviousExec = mDebugLog["CrashNotHandled"].asBoolean();
+
 		mFileMap["SecondLifeLog"] = mDebugLog["SLLog"].asString();
 		mFileMap["SettingsXml"] = mDebugLog["SettingsFilename"].asString();
 		if(mDebugLog.has("CAFilename"))
@@ -176,6 +179,16 @@ void LLCrashLogger::gatherFiles()
 		mFileMap["SettingsXml"] = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings.xml");
 	}
 
+	if(mCrashInPreviousExec)
+	{
+		// Replace the log file ext with .old, since the 
+		// instance that launched this process has overwritten
+		// SecondLife.log
+		std::string log_filename = mFileMap["SecondLifeLog"];
+		log_filename.replace(log_filename.size() - 4, 4, ".old");
+		mFileMap["SecondLifeLog"] = log_filename;
+	}
+
 	gatherPlatformSpecificFiles();
 
 	//Use the debug log to reconstruct the URL to send the crash report to
@@ -229,12 +242,6 @@ void LLCrashLogger::gatherFiles()
 LLSD LLCrashLogger::constructPostData()
 {
 	LLSD ret;
-
-	if(mCrashInPreviousExec)
-	{
-		mCrashInfo["CrashInPreviousExecution"] = "Y";
-	}
-
 	return mCrashInfo;
 }
 
@@ -338,25 +345,6 @@ bool LLCrashLogger::init()
 	llinfos << "Loading crash behavior setting" << llendl;
 	mCrashBehavior = loadCrashBehaviorSetting();
 
-	//Run through command line options
-	if(getOption("previous").isDefined())
-	{
-		llinfos << "Previous execution did not remove SecondLife.exec_marker" << llendl;
-		mCrashInPreviousExec = TRUE;
-	}
-
-	if(getOption("dialog").isDefined())
-	{
-		llinfos << "Show the user dialog" << llendl;
-		mCrashBehavior = CRASH_BEHAVIOR_ASK;
-	}
-	
-	LLSD name = getOption("name");
-	if(name.isDefined())
-	{	
-		mProductName = name.asString();
-	}
-
 	// If user doesn't want to send, bail out
 	if (mCrashBehavior == CRASH_BEHAVIOR_NEVER_SEND)
 	{
diff --git a/indra/llimage/CMakeLists.txt b/indra/llimage/CMakeLists.txt
index 5593b4a..1a4d92b 100644
--- a/indra/llimage/CMakeLists.txt
+++ b/indra/llimage/CMakeLists.txt
@@ -7,6 +7,7 @@ include(LLCommon)
 include(LLImage)
 include(LLMath)
 include(LLVFS)
+include(ZLIB)
 
 include_directories(
     ${LLCOMMON_INCLUDE_DIRS}
@@ -48,3 +49,9 @@ set_source_files_properties(${llimage_HEADER_FILES}
 list(APPEND llimage_SOURCE_FILES ${llimage_HEADER_FILES})
 
 add_library (llimage ${llimage_SOURCE_FILES})
+target_link_libraries(
+    llimage
+    ${JPEG_LIBRARIES}
+    ${PNG_LIBRARIES}
+    ${ZLIB_LIBRARIES}
+    )
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index 814e82f..71e7b41 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -43,6 +43,49 @@
 #include "llimagejpeg.h"
 #include "llimagepng.h"
 #include "llimagedxt.h"
+#include "llimageworker.h"
+
+//---------------------------------------------------------------------------
+// LLImage
+//---------------------------------------------------------------------------
+
+//static
+std::string LLImage::sLastErrorMessage;
+LLMutex* LLImage::sMutex = NULL;
+
+//static
+void LLImage::initClass(LLWorkerThread* workerthread)
+{
+	sMutex = new LLMutex(NULL);
+	if (workerthread)
+	{
+		LLImageWorker::initImageWorker(workerthread);
+	}
+	LLImageJ2C::openDSO();
+}
+
+//static
+void LLImage::cleanupClass()
+{
+	LLImageJ2C::closeDSO();
+	LLImageWorker::cleanupImageWorker();
+	delete sMutex;
+	sMutex = NULL;
+}
+
+//static
+const std::string& LLImage::getLastError()
+{
+	static const std::string noerr("No Error");
+	return sLastErrorMessage.empty() ? noerr : sLastErrorMessage;
+}
+
+//static
+void LLImage::setLastError(const std::string& message)
+{
+	LLMutexLock m(sMutex);
+	sLastErrorMessage = message;
+}
 
 //---------------------------------------------------------------------------
 // LLImageBase
@@ -95,21 +138,8 @@ void LLImageBase::sanityCheck()
 	}
 }
 
-std::string LLImageBase::sLastErrorMessage;
 BOOL LLImageBase::sSizeOverride = FALSE;
 
-BOOL LLImageBase::setLastError(const std::string& message, const std::string& filename) 
-{
-	sLastErrorMessage = message;
-	if (!filename.empty())
-	{
-		sLastErrorMessage += " FILE:";
-		sLastErrorMessage += filename;
-	}
-	llwarns << sLastErrorMessage << llendl;
-	return FALSE;
-}
-
 // virtual
 void LLImageBase::deleteData()
 {
@@ -136,8 +166,6 @@ U8* LLImageBase::allocateData(S32 size)
 		llerrs << "LLImageBase::allocateData: bad size: " << size << llendl;
 	}
 	
-	resetLastError();
-
 	if (!mData || size != mDataSize)
 	{
 		deleteData(); // virtual
@@ -1269,6 +1297,23 @@ LLImageFormatted::~LLImageFormatted()
 
 //----------------------------------------------------------------------------
 
+//virtual
+void LLImageFormatted::resetLastError()
+{
+	LLImage::setLastError("");
+}
+
+//virtual
+void LLImageFormatted::setLastError(const std::string& message, const std::string& filename)
+{
+	std::string error = message;
+	if (!filename.empty())
+		error += std::string(" FILE: ") + filename;
+	LLImage::setLastError(error);
+}
+
+//----------------------------------------------------------------------------
+
 // static
 LLImageFormatted* LLImageFormatted::createFromType(S8 codec)
 {
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index 98a98c2..8a08c89 100644
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -59,6 +59,7 @@ const S32 MAX_IMG_PACKET_SIZE = 1000;
 class LLImageFormatted;
 class LLImageRaw;
 class LLColor4U;
+class LLWorkerThread;
 
 typedef enum e_image_codec
 {
@@ -74,6 +75,24 @@ typedef enum e_image_codec
 } EImageCodec;
 
 //============================================================================
+// library initialization class
+
+class LLImage
+{
+public:
+	static void initClass(LLWorkerThread* workerthread);
+	static void cleanupClass();
+
+	static const std::string& getLastError();
+	static void setLastError(const std::string& message);
+	
+protected:
+	static LLMutex* sMutex;
+	static std::string sLastErrorMessage;
+};
+
+//============================================================================
+// Image base class
 
 class LLImageBase : public LLThreadSafeRefCount
 {
@@ -113,10 +132,6 @@ protected:
 	void setDataAndSize(U8 *data, S32 size) { mData = data; mDataSize = size; };
 	
 public:
-	static const std::string& getLastError() {return sLastErrorMessage;};
-	static void resetLastError() {sLastErrorMessage = "No Error"; };
-	static BOOL setLastError(const std::string& message, const std::string& filename = std::string()); // returns FALSE
-
 	static void generateMip(const U8 *indata, U8* mipdata, int width, int height, S32 nchannels);
 	
 	// Function for calculating the download priority for textures
@@ -141,8 +156,6 @@ private:
 public:
 	S16 mMemType; // debug
 	
-	static std::string sLastErrorMessage;
-
 	static BOOL sSizeOverride;
 };
 
@@ -245,7 +258,6 @@ public:
 	LLImageFormatted(S8 codec);
 
 	// LLImageBase
-public:
 	/*virtual*/ void deleteData();
 	/*virtual*/ U8* allocateData(S32 size = -1);
 	/*virtual*/ U8* reallocateData(S32 size);
@@ -254,7 +266,6 @@ public:
 	/*virtual*/ void sanityCheck();
 
 	// New methods
-public:
 	// subclasses must return a prefered file extension (lowercase without a leading dot)
 	virtual std::string getExtension() = 0;
 	// calcHeaderSize() returns the maximum size of header;
@@ -287,6 +298,10 @@ public:
 	void setDiscardLevel(S8 discard_level) { mDiscardLevel = discard_level; }
 	S8 getDiscardLevel() const { return mDiscardLevel; }
 
+	// setLastError needs to be deferred for J2C images since it may be called from a DLL
+	virtual void resetLastError();
+	virtual void setLastError(const std::string& message, const std::string& filename = std::string());
+	
 protected:
 	BOOL copyData(U8 *data, S32 size); // calls updateData()
 	
@@ -295,7 +310,7 @@ protected:
 	S8 mDecoding;
 	S8 mDecoded;
 	S8 mDiscardLevel;
-
+	
 public:
 	static S32 sGlobalFormattedMemory;
 };
diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp
index 510b303..95abbae 100644
--- a/indra/llimage/llimagej2c.cpp
+++ b/indra/llimage/llimagej2c.cpp
@@ -219,32 +219,54 @@ LLImageJ2C::~LLImageJ2C()
 }
 
 // virtual
+void LLImageJ2C::resetLastError()
+{
+	mLastError.clear();
+}
+
+//virtual
+void LLImageJ2C::setLastError(const std::string& message, const std::string& filename)
+{
+	mLastError = message;
+	if (!filename.empty())
+		mLastError += std::string(" FILE: ") + filename;
+}
+
+// virtual
 S8  LLImageJ2C::getRawDiscardLevel()
 {
 	return mRawDiscardLevel;
 }
 
 BOOL LLImageJ2C::updateData()
-{	
+{
+	BOOL res = TRUE;
 	resetLastError();
 
 	// Check to make sure that this instance has been initialized with data
 	if (!getData() || (getDataSize() < 16))
 	{
 		setLastError("LLImageJ2C uninitialized");
-		return FALSE;
+		res = FALSE;
+	}
+	else 
+	{
+		res = mImpl->getMetadata(*this);
 	}
 
-	if (!mImpl->getMetadata(*this))
+	if (res)
 	{
-		return FALSE;
+		// SJB: override discard based on mMaxBytes elsewhere
+		S32 max_bytes = getDataSize(); // mMaxBytes ? mMaxBytes : getDataSize();
+		S32 discard = calcDiscardLevelBytes(max_bytes);
+		setDiscardLevel(discard);
 	}
-	// SJB: override discard based on mMaxBytes elsewhere
-	S32 max_bytes = getDataSize(); // mMaxBytes ? mMaxBytes : getDataSize();
-	S32 discard = calcDiscardLevelBytes(max_bytes);
-	setDiscardLevel(discard);
 
-	return TRUE;
+	if (!mLastError.empty())
+	{
+		LLImage::setLastError(mLastError);
+	}
+	return res;
 }
 
 
@@ -258,20 +280,24 @@ BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir
 {
 	LLMemType mt1((LLMemType::EMemType)mMemType);
 
+	BOOL res = TRUE;
+	
 	resetLastError();
 
 	// Check to make sure that this instance has been initialized with data
 	if (!getData() || (getDataSize() < 16))
 	{
 		setLastError("LLImageJ2C uninitialized");
-		return FALSE;
+		res = FALSE;
 	}
-
-	// Update the raw discard level
-	updateRawDiscardLevel();
-
-	mDecoding = TRUE;
-	BOOL res = mImpl->decodeImpl(*this, *raw_imagep, decode_time, first_channel, max_channel_count);
+	else
+	{
+		// Update the raw discard level
+		updateRawDiscardLevel();
+		mDecoding = TRUE;
+		res = mImpl->decodeImpl(*this, *raw_imagep, decode_time, first_channel, max_channel_count);
+	}
+	
 	if (res)
 	{
 		if (!mDecoding)
@@ -283,9 +309,14 @@ BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir
 		{
 			mDecoding = FALSE;
 		}
-		return TRUE; // done
 	}
-	return FALSE;
+
+	if (!mLastError.empty())
+	{
+		LLImage::setLastError(mLastError);
+	}
+	
+	return res;
 }
 
 
@@ -298,7 +329,13 @@ BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, F32 encode_time)
 BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time)
 {
 	LLMemType mt1((LLMemType::EMemType)mMemType);
-	return mImpl->encodeImpl(*this, *raw_imagep, comment_text, encode_time, mReversible);
+	resetLastError();
+	BOOL res = mImpl->encodeImpl(*this, *raw_imagep, comment_text, encode_time, mReversible);
+	if (!mLastError.empty())
+	{
+		LLImage::setLastError(mLastError);
+	}
+	return res;
 }
 
 //static
@@ -376,6 +413,8 @@ void LLImageJ2C::setReversible(const BOOL reversible)
 
 BOOL LLImageJ2C::loadAndValidate(const std::string &filename)
 {
+	BOOL res = TRUE;
+	
 	resetLastError();
 
 	S32 file_size = 0;
@@ -383,27 +422,38 @@ BOOL LLImageJ2C::loadAndValidate(const std::string &filename)
 	if (!apr_file)
 	{
 		setLastError("Unable to open file for reading", filename);
-		return FALSE;
+		res = FALSE;
 	}
-	if (file_size == 0)
+	else if (file_size == 0)
 	{
 		setLastError("File is empty",filename);
 		apr_file_close(apr_file);
-		return FALSE;
+		res = FALSE;
 	}
-	
-	U8 *data = new U8[file_size];
-	apr_size_t bytes_read = file_size;
-	apr_status_t s = apr_file_read(apr_file, data, &bytes_read); // modifies bytes_read	
-	if (s != APR_SUCCESS || (S32)bytes_read != file_size)
+	else
 	{
-		delete[] data;
-		setLastError("Unable to read entire file");
-		return FALSE;
+		U8 *data = new U8[file_size];
+		apr_size_t bytes_read = file_size;
+		apr_status_t s = apr_file_read(apr_file, data, &bytes_read); // modifies bytes_read	
+		apr_file_close(apr_file);
+		if (s != APR_SUCCESS || (S32)bytes_read != file_size)
+		{
+			delete[] data;
+			setLastError("Unable to read entire file");
+			res = FALSE;
+		}
+		else
+		{
+			res = validate(data, file_size);
+		}
 	}
-	apr_file_close(apr_file);
 
-	return validate(data, file_size);
+	if (!mLastError.empty())
+	{
+		LLImage::setLastError(mLastError);
+	}
+	
+	return res;
 }
 
 
@@ -411,21 +461,30 @@ BOOL LLImageJ2C::validate(U8 *data, U32 file_size)
 {
 	LLMemType mt1((LLMemType::EMemType)mMemType);
 
+	resetLastError();
+	
 	setData(data, file_size);
+
 	BOOL res = updateData();
-	if ( !res )
+	if ( res )
 	{
-		return FALSE;
+		// Check to make sure that this instance has been initialized with data
+		if (!getData() || (0 == getDataSize()))
+		{
+			setLastError("LLImageJ2C uninitialized");
+			res = FALSE;
+		}
+		else
+		{
+			res = mImpl->getMetadata(*this);
+		}
 	}
-
-	// Check to make sure that this instance has been initialized with data
-	if (!getData() || (0 == getDataSize()))
+	
+	if (!mLastError.empty())
 	{
-		setLastError("LLImageJ2C uninitialized");
-		return FALSE;
+		LLImage::setLastError(mLastError);
 	}
-
-	return mImpl->getMetadata(*this);
+	return res;
 }
 
 void LLImageJ2C::decodeFailed()
diff --git a/indra/llimage/llimagej2c.h b/indra/llimage/llimagej2c.h
index 2b4a3ec..f4d651f 100644
--- a/indra/llimage/llimagej2c.h
+++ b/indra/llimage/llimagej2c.h
@@ -54,6 +54,10 @@ public:
 	/*virtual*/ S32 calcDataSize(S32 discard_level = 0);
 	/*virtual*/ S32 calcDiscardLevelBytes(S32 bytes);
 	/*virtual*/ S8  getRawDiscardLevel();
+	// Override these so that we don't try to set a global variable from a DLL
+	/*virtual*/ void resetLastError();
+	/*virtual*/ void setLastError(const std::string& message, const std::string& filename = std::string());
+	
 	
 	// Encode with comment text 
 	BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0);
@@ -86,6 +90,7 @@ protected:
 	F32 mRate;
 	BOOL mReversible;
 	LLImageJ2CImpl *mImpl;
+	std::string mLastError;
 };
 
 // Derive from this class to implement JPEG2000 decoding
diff --git a/indra/llimage/llimageworker.cpp b/indra/llimage/llimageworker.cpp
index dc6f2e4..93ce19b 100644
--- a/indra/llimage/llimageworker.cpp
+++ b/indra/llimage/llimageworker.cpp
@@ -41,13 +41,13 @@ LLWorkerThread* LLImageWorker::sWorkerThread = NULL;
 S32 LLImageWorker::sCount = 0;
 
 //static
-void LLImageWorker::initClass(LLWorkerThread* workerthread)
+void LLImageWorker::initImageWorker(LLWorkerThread* workerthread)
 {
 	sWorkerThread = workerthread;
 }
 
 //static
-void LLImageWorker::cleanupClass()
+void LLImageWorker::cleanupImageWorker()
 {
 }
 
diff --git a/indra/llimage/llimageworker.h b/indra/llimage/llimageworker.h
index bf6c3f2..3ee6b8e 100644
--- a/indra/llimage/llimageworker.h
+++ b/indra/llimage/llimageworker.h
@@ -38,8 +38,10 @@
 class LLImageWorker : public LLWorkerClass
 {
 public:
-	static void initClass(LLWorkerThread* workerthread);
-	static void cleanupClass();
+	static void initImageWorker(LLWorkerThread* workerthread);
+	static void cleanupImageWorker();
+	
+public:
 	static LLWorkerThread* getWorkerThread() { return sWorkerThread; }
 
 	// LLWorkerThread
diff --git a/indra/llimagej2coj/CMakeLists.txt b/indra/llimagej2coj/CMakeLists.txt
index ed3ff3c..97d22cf 100644
--- a/indra/llimagej2coj/CMakeLists.txt
+++ b/indra/llimagej2coj/CMakeLists.txt
@@ -29,3 +29,7 @@ set_source_files_properties(${llimagej2coj_HEADER_FILES}
 list(APPEND llimagej2coj_SOURCE_FILES ${llimagej2coj_HEADER_FILES})
 
 add_library (llimagej2coj ${llimagej2coj_SOURCE_FILES})
+target_link_libraries(
+    llimagej2coj
+    ${OPENJPEG_LIBRARIES}
+    )
diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp
index 983241c..7a62cfd 100644
--- a/indra/llimagej2coj/llimagej2coj.cpp
+++ b/indra/llimagej2coj/llimagej2coj.cpp
@@ -151,9 +151,11 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
 	// dereference the array.
 	if(!image || !image->numcomps)
 	{
-		fprintf(stderr, "ERROR -> decodeImpl: failed to decode image!\n");
+		llwarns << "ERROR -> decodeImpl: failed to decode image!" << llendl;
 		if (image)
+		{
 			opj_image_destroy(image);
+		}
 
 		return TRUE; // done
 	}
@@ -170,6 +172,17 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
 		}
 	}
 	
+	if(image->numcomps <= first_channel)
+	{
+		llwarns << "trying to decode more channels than are present in image: numcomps: " << image->numcomps << " first_channel: " << first_channel << llendl;
+		if (image)
+		{
+			opj_image_destroy(image);
+		}
+			
+		return TRUE;
+	}
+
 	// Copy image data into our raw image format (instead of the separate channel format
 
 	S32 img_components = image->numcomps;
@@ -211,7 +224,7 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
 		}
 		else // Some rare OpenJPEG versions have this bug.
 		{
-			fprintf(stderr, "ERROR -> decodeImpl: failed to decode image! (NULL comp data - OpenJPEG bug)\n");
+			llwarns << "ERROR -> decodeImpl: failed to decode image! (NULL comp data - OpenJPEG bug)" << llendl;
 			opj_image_destroy(image);
 
 			return TRUE; // done
@@ -430,7 +443,7 @@ BOOL LLImageJ2COJ::getMetadata(LLImageJ2C &base)
 
 	if(!image)
 	{
-		fprintf(stderr, "ERROR -> getMetadata: failed to decode image!\n");
+		llwarns << "ERROR -> getMetadata: failed to decode image!" << llendl;
 		return FALSE;
 	}
 
diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp
index 457a0cb..0c7e0ed 100644
--- a/indra/llinventory/llinventory.cpp
+++ b/indra/llinventory/llinventory.cpp
@@ -60,6 +60,9 @@ static const std::string INV_SALE_INFO_LABEL("sale_info");
 static const std::string INV_FLAGS_LABEL("flags");
 static const std::string INV_CREATION_DATE_LABEL("created_at");
 
+// key used by agent-inventory-service
+static const std::string INV_ASSET_TYPE_LABEL_WS("type_default");
+static const std::string INV_FOLDER_ID_LABEL_WS("category_id");
 ///----------------------------------------------------------------------------
 /// Local function declarations, constants, enums, and typedefs
 ///----------------------------------------------------------------------------
@@ -949,11 +952,13 @@ LLSD LLInventoryItem::asLLSD() const
 		sd[INV_SHADOW_ID_LABEL] = shadow_id;
 	}
 	sd[INV_ASSET_TYPE_LABEL] = LLAssetType::lookup(mType);
+	sd[INV_INVENTORY_TYPE_LABEL] = mInventoryType;
 	const char* inv_type_str = LLInventoryType::lookup(mInventoryType);
 	if(inv_type_str)
 	{
 		sd[INV_INVENTORY_TYPE_LABEL] = inv_type_str;
 	}
+	//sd[INV_FLAGS_LABEL] = (S32)mFlags;
 	sd[INV_FLAGS_LABEL] = ll_sd_from_U32(mFlags);
 	sd[INV_SALE_INFO_LABEL] = mSaleInfo;
 	sd[INV_NAME_LABEL] = mName;
@@ -1026,17 +1031,40 @@ bool LLInventoryItem::fromLLSD(LLSD& sd)
 	w = INV_ASSET_TYPE_LABEL;
 	if (sd.has(w))
 	{
-		mType = LLAssetType::lookup(sd[w].asString());
+		if (sd[w].isString())
+		{
+			mType = LLAssetType::lookup(sd[w].asString().c_str());
+		}
+		else if (sd[w].isInteger())
+		{
+			S8 type = (U8)sd[w].asInteger();
+			mType = static_cast<LLAssetType::EType>(type);
+		}
 	}
 	w = INV_INVENTORY_TYPE_LABEL;
 	if (sd.has(w))
 	{
-		mInventoryType = LLInventoryType::lookup(sd[w].asString());
+		if (sd[w].isString())
+		{
+			mInventoryType = LLInventoryType::lookup(sd[w].asString().c_str());
+		}
+		else if (sd[w].isInteger())
+		{
+			S8 type = (U8)sd[w].asInteger();
+			mInventoryType = static_cast<LLInventoryType::EType>(type);
+		}
 	}
 	w = INV_FLAGS_LABEL;
 	if (sd.has(w))
 	{
-		mFlags = ll_U32_from_sd(sd[w]);
+		if (sd[w].isBinary())
+		{
+			mFlags = ll_U32_from_sd(sd[w]);
+		}
+		else if(sd[w].isInteger())
+		{
+			mFlags = sd[w].asInteger();
+		}
 	}
 	w = INV_NAME_LABEL;
 	if (sd.has(w))
@@ -1394,7 +1422,7 @@ bool LLInventoryCategory::fromLLSD(LLSD& sd)
 {
     std::string w;
 
-    w = INV_ITEM_ID_LABEL;
+    w = INV_FOLDER_ID_LABEL_WS;
     if (sd.has(w))
     {
         mUUID = sd[w];
@@ -1410,6 +1438,13 @@ bool LLInventoryCategory::fromLLSD(LLSD& sd)
         S8 type = (U8)sd[w].asInteger();
         mPreferredType = static_cast<LLAssetType::EType>(type);
     }
+	w = INV_ASSET_TYPE_LABEL_WS;
+	if (sd.has(w))
+	{
+		S8 type = (U8)sd[w].asInteger();
+        mPreferredType = static_cast<LLAssetType::EType>(type);
+	}
+
     w = INV_NAME_LABEL;
     if (sd.has(w))
     {
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index 2b9c201..911e257 100644
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -1398,7 +1398,7 @@ void LLParcel::unpackMessage(LLMessageSystem* msg)
 
 	// New Media Data
 	// Note: the message has been converted to TCP
-	if(msg->getNumberOfBlocks("MediaData") > 0)
+	if(msg->has("MediaData"))
 	{
 		msg->getString("MediaData", "MediaDesc", buffer);
 		setMediaDesc(buffer);
@@ -1761,7 +1761,11 @@ void LLParcel::startSale(const LLUUID& buyer_id, BOOL is_buyer_group)
 	setCleanOtherTime(0);
 }
 
-void LLParcel::expireSale(U32& type, U8& flags, LLUUID& from_id, LLUUID& to_id)
+void LLParcel::expireSale(
+	U32& type,
+	U8& flags,
+	LLUUID& from_id,
+	LLUUID& to_id)
 {
     mSaleTimerExpires.setTimerExpirySec(0.0);
     mSaleTimerExpires.stop();
@@ -1777,8 +1781,10 @@ void LLParcel::expireSale(U32& type, U8& flags, LLUUID& from_id, LLUUID& to_id)
     to_id.setNull();
 }
 
-void LLParcel::completeSale(U32& type, U8& flags,
-                            LLUUID& to_id)
+void LLParcel::completeSale(
+	U32& type,
+	U8& flags,
+	LLUUID& to_id)
 {
 	mSaleTimerExpires.setTimerExpirySec(0.0);
 	mSaleTimerExpires.stop();
diff --git a/indra/llinventory/llsaleinfo.cpp b/indra/llinventory/llsaleinfo.cpp
index 4895378..fef6b05 100644
--- a/indra/llinventory/llsaleinfo.cpp
+++ b/indra/llinventory/llsaleinfo.cpp
@@ -114,7 +114,16 @@ bool LLSaleInfo::fromLLSD(LLSD& sd, BOOL& has_perm_mask, U32& perm_mask)
 {
 	const char *w;
 
-	mSaleType = lookup(sd["sale_type"].asString().c_str());
+	if (sd["sale_type"].isString())
+	{
+		mSaleType = lookup(sd["sale_type"].asString().c_str());
+	}
+	else if(sd["sale_type"].isInteger())
+	{
+		S8 type = (U8)sd["sale_type"].asInteger();
+		mSaleType = static_cast<LLSaleInfo::EForSale>(type);
+	}
+
 	mSalePrice = llclamp(sd["sale_price"].asInteger(), 0, S32_MAX);
 	w = "perm_mask";
 	if (sd.has(w))
diff --git a/indra/llmath/llmodularmath.h b/indra/llmath/llmodularmath.h
new file mode 100644
index 0000000..076f5da
--- /dev/null
+++ b/indra/llmath/llmodularmath.h
@@ -0,0 +1,57 @@
+/** 
+ * @file llmodularmath.h
+ * @brief Useful modular math functions.
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ * 
+ * Copyright (c) 2008, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LLMODULARMATH_H
+#define LLMODULARMATH_H
+
+namespace LLModularMath
+{
+    // Return difference between lhs and rhs
+    // treating the U32 operands and result
+    // as unsigned values of given width.
+	template<int width>
+	inline U32 subtract(U32 lhs, U32 rhs)
+	{
+		// Generate a bit mask which will truncate
+		// unsigned values to given width at compile time.
+		const U32 mask = (1 << width) - 1;
+		
+		// Operands are unsigned, so modular
+		// arithmetic applies. If lhs < rhs,
+		// difference will wrap in to lower
+		// bits of result, which is then masked
+		// to give a value that can be represented
+		// by an unsigned value of width bits.
+		return mask & (lhs - rhs);
+	}	
+}
+
+#endif
diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h
index 57b359f..c37f887 100644
--- a/indra/llmath/lloctree.h
+++ b/indra/llmath/lloctree.h
@@ -38,9 +38,9 @@
 #include <set>
 
 #if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG
-#define OCT_ERRS LL_WARNS("OctreeErrors")
-#else
 #define OCT_ERRS LL_ERRS("OctreeErrors")
+#else
+#define OCT_ERRS LL_WARNS("OctreeErrors")
 #endif
 
 #define LL_OCTREE_PARANOIA_CHECK 0
diff --git a/indra/llmath/v3color.h b/indra/llmath/v3color.h
index b9bc641..111a871 100644
--- a/indra/llmath/v3color.h
+++ b/indra/llmath/v3color.h
@@ -82,13 +82,23 @@ public:
 	
 	const LLColor3&	setToBlack();					// Clears LLColor3 to (0, 0, 0)
 	const LLColor3&	setToWhite();					// Zero LLColor3 to (0, 0, 0)
-	const LLColor3&	setVec(F32 x, F32 y, F32 z);	// Sets LLColor3 to (x, y, z)
-	const LLColor3&	setVec(const LLColor3 &vec);	// Sets LLColor3 to vec
-	const LLColor3&	setVec(const F32 *vec);			// Sets LLColor3 to vec
+	
+	const LLColor3&	setVec(F32 x, F32 y, F32 z);	// deprecated
+	const LLColor3&	setVec(const LLColor3 &vec);	// deprecated
+	const LLColor3&	setVec(const F32 *vec);			// deprecated
+
+	const LLColor3&	set(F32 x, F32 y, F32 z);	// Sets LLColor3 to (x, y, z)
+	const LLColor3&	set(const LLColor3 &vec);	// Sets LLColor3 to vec
+	const LLColor3&	set(const F32 *vec);		// Sets LLColor3 to vec
+
+	F32		magVec() const;				// deprecated
+	F32		magVecSquared() const;		// deprecated
+	F32		normVec();					// deprecated
+
+	F32		length() const;				// Returns magnitude of LLColor3
+	F32		lengthSquared() const;		// Returns magnitude squared of LLColor3
+	F32		normalize();				// Normalizes and returns the magnitude of LLColor3
 
-	F32		magVec() const;				// Returns magnitude of LLColor3
-	F32		magVecSquared() const;		// Returns magnitude squared of LLColor3
-	F32		normVec();					// Normalizes and returns the magnitude of LLColor3
 	F32		brightness() const;			// Returns brightness of LLColor3
 
 	const LLColor3&	operator=(const LLColor4 &a);
@@ -214,6 +224,31 @@ inline const LLColor3&	LLColor3::setToWhite(void)
 	return (*this);
 }
 
+inline const LLColor3&	LLColor3::set(F32 r, F32 g, F32 b)
+{
+	mV[0] = r;
+	mV[1] = g;
+	mV[2] = b;
+	return (*this);
+}
+
+inline const LLColor3&	LLColor3::set(const LLColor3 &vec)
+{
+	mV[0] = vec.mV[0];
+	mV[1] = vec.mV[1];
+	mV[2] = vec.mV[2];
+	return (*this);
+}
+
+inline const LLColor3&	LLColor3::set(const F32 *vec)
+{
+	mV[0] = vec[0];
+	mV[1] = vec[1];
+	mV[2] = vec[2];
+	return (*this);
+}
+
+// deprecated
 inline const LLColor3&	LLColor3::setVec(F32 r, F32 g, F32 b)
 {
 	mV[0] = r;
@@ -222,6 +257,7 @@ inline const LLColor3&	LLColor3::setVec(F32 r, F32 g, F32 b)
 	return (*this);
 }
 
+// deprecated
 inline const LLColor3&	LLColor3::setVec(const LLColor3 &vec)
 {
 	mV[0] = vec.mV[0];
@@ -230,6 +266,7 @@ inline const LLColor3&	LLColor3::setVec(const LLColor3 &vec)
 	return (*this);
 }
 
+// deprecated
 inline const LLColor3&	LLColor3::setVec(const F32 *vec)
 {
 	mV[0] = vec[0];
@@ -243,16 +280,44 @@ inline F32		LLColor3::brightness(void) const
 	return (mV[0] + mV[1] + mV[2]) / 3.0f;
 }
 
+inline F32		LLColor3::length(void) const
+{
+	return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+}
+
+inline F32		LLColor3::lengthSquared(void) const
+{
+	return mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2];
+}
+
+inline F32		LLColor3::normalize(void)
+{
+	F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+	F32 oomag;
+
+	if (mag)
+	{
+		oomag = 1.f/mag;
+		mV[0] *= oomag;
+		mV[1] *= oomag;
+		mV[2] *= oomag;
+	}
+	return (mag);
+}
+
+// deprecated
 inline F32		LLColor3::magVec(void) const
 {
 	return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
 }
 
+// deprecated
 inline F32		LLColor3::magVecSquared(void) const
 {
 	return mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2];
 }
 
+// deprecated
 inline F32		LLColor3::normVec(void)
 {
 	F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
diff --git a/indra/llmath/v4color.cpp b/indra/llmath/v4color.cpp
index 88237a0..b105769 100644
--- a/indra/llmath/v4color.cpp
+++ b/indra/llmath/v4color.cpp
@@ -161,6 +161,38 @@ LLColor4::LLColor4(const LLVector4& vector4)
 	mV[VW] = vector4.mV[VW];
 }
 
+const LLColor4&	LLColor4::set(const LLColor4U& color4u)
+{
+	const F32 SCALE = 1.f/255.f;
+	mV[VX] = color4u.mV[VX] * SCALE;
+	mV[VY] = color4u.mV[VY] * SCALE;
+	mV[VZ] = color4u.mV[VZ] * SCALE;
+	mV[VW] = color4u.mV[VW] * SCALE;
+	return (*this);
+}
+
+const LLColor4&	LLColor4::set(const LLColor3 &vec)
+{
+	mV[VX] = vec.mV[VX];
+	mV[VY] = vec.mV[VY];
+	mV[VZ] = vec.mV[VZ];
+
+//  no change to alpha!
+//	mV[VW] = 1.f;  
+
+	return (*this);
+}
+
+const LLColor4&	LLColor4::set(const LLColor3 &vec, F32 a)
+{
+	mV[VX] = vec.mV[VX];
+	mV[VY] = vec.mV[VY];
+	mV[VZ] = vec.mV[VZ];
+	mV[VW] = a;
+	return (*this);
+}
+
+// deprecated -- use set()
 const LLColor4&	LLColor4::setVec(const LLColor4U& color4u)
 {
 	const F32 SCALE = 1.f/255.f;
@@ -171,6 +203,7 @@ const LLColor4&	LLColor4::setVec(const LLColor4U& color4u)
 	return (*this);
 }
 
+// deprecated -- use set()
 const LLColor4&	LLColor4::setVec(const LLColor3 &vec)
 {
 	mV[VX] = vec.mV[VX];
@@ -183,6 +216,7 @@ const LLColor4&	LLColor4::setVec(const LLColor3 &vec)
 	return (*this);
 }
 
+// deprecated -- use set()
 const LLColor4&	LLColor4::setVec(const LLColor3 &vec, F32 a)
 {
 	mV[VX] = vec.mV[VX];
@@ -338,270 +372,270 @@ BOOL LLColor4::parseColor(const std::string& buf, LLColor4* color)
 		{
 			v = v * (1.f / 255.f);
 		}
-		color->setVec( v );
+		color->set( v );
 	}
 	else // Single value.  Read as a named color.
 	{
 		// We have a color name
 		if ( "red" == color_name )
 		{
-			color->setVec(LLColor4::red);
+			color->set(LLColor4::red);
 		}
 		else if ( "red1" == color_name )
 		{
-			color->setVec(LLColor4::red1);
+			color->set(LLColor4::red1);
 		}
 		else if ( "red2" == color_name )
 		{
-			color->setVec(LLColor4::red2);
+			color->set(LLColor4::red2);
 		}
 		else if ( "red3" == color_name )
 		{
-			color->setVec(LLColor4::red3);
+			color->set(LLColor4::red3);
 		}
 		else if ( "red4" == color_name )
 		{
-			color->setVec(LLColor4::red4);
+			color->set(LLColor4::red4);
 		}
 		else if ( "red5" == color_name )
 		{
-			color->setVec(LLColor4::red5);
+			color->set(LLColor4::red5);
 		}
 		else if( "green" == color_name )
 		{
-			color->setVec(LLColor4::green);
+			color->set(LLColor4::green);
 		}
 		else if( "green1" == color_name )
 		{
-			color->setVec(LLColor4::green1);
+			color->set(LLColor4::green1);
 		}
 		else if( "green2" == color_name )
 		{
-			color->setVec(LLColor4::green2);
+			color->set(LLColor4::green2);
 		}
 		else if( "green3" == color_name )
 		{
-			color->setVec(LLColor4::green3);
+			color->set(LLColor4::green3);
 		}
 		else if( "green4" == color_name )
 		{
-			color->setVec(LLColor4::green4);
+			color->set(LLColor4::green4);
 		}
 		else if( "green5" == color_name )
 		{
-			color->setVec(LLColor4::green5);
+			color->set(LLColor4::green5);
 		}
 		else if( "green6" == color_name )
 		{
-			color->setVec(LLColor4::green6);
+			color->set(LLColor4::green6);
 		}
 		else if( "blue" == color_name )
 		{
-			color->setVec(LLColor4::blue);
+			color->set(LLColor4::blue);
 		}
 		else if( "blue1" == color_name )
 		{
-			color->setVec(LLColor4::blue1);
+			color->set(LLColor4::blue1);
 		}
 		else if( "blue2" == color_name )
 		{
-			color->setVec(LLColor4::blue2);
+			color->set(LLColor4::blue2);
 		}
 		else if( "blue3" == color_name )
 		{
-			color->setVec(LLColor4::blue3);
+			color->set(LLColor4::blue3);
 		}
 		else if( "blue4" == color_name )
 		{
-			color->setVec(LLColor4::blue4);
+			color->set(LLColor4::blue4);
 		}
 		else if( "blue5" == color_name )
 		{
-			color->setVec(LLColor4::blue5);
+			color->set(LLColor4::blue5);
 		}
 		else if( "blue6" == color_name )
 		{
-			color->setVec(LLColor4::blue6);
+			color->set(LLColor4::blue6);
 		}
 		else if( "black" == color_name )
 		{
-			color->setVec(LLColor4::black);
+			color->set(LLColor4::black);
 		}
 		else if( "white" == color_name )
 		{
-			color->setVec(LLColor4::white);
+			color->set(LLColor4::white);
 		}
 		else if( "yellow" == color_name )
 		{
-			color->setVec(LLColor4::yellow);
+			color->set(LLColor4::yellow);
 		}
 		else if( "yellow1" == color_name )
 		{
-			color->setVec(LLColor4::yellow1);
+			color->set(LLColor4::yellow1);
 		}
 		else if( "yellow2" == color_name )
 		{
-			color->setVec(LLColor4::yellow2);
+			color->set(LLColor4::yellow2);
 		}
 		else if( "yellow3" == color_name )
 		{
-			color->setVec(LLColor4::yellow3);
+			color->set(LLColor4::yellow3);
 		}
 		else if( "yellow4" == color_name )
 		{
-			color->setVec(LLColor4::yellow4);
+			color->set(LLColor4::yellow4);
 		}
 		else if( "yellow5" == color_name )
 		{
-			color->setVec(LLColor4::yellow5);
+			color->set(LLColor4::yellow5);
 		}
 		else if( "yellow6" == color_name )
 		{
-			color->setVec(LLColor4::yellow6);
+			color->set(LLColor4::yellow6);
 		}
 		else if( "magenta" == color_name )
 		{
-			color->setVec(LLColor4::magenta);
+			color->set(LLColor4::magenta);
 		}
 		else if( "magenta1" == color_name )
 		{
-			color->setVec(LLColor4::magenta1);
+			color->set(LLColor4::magenta1);
 		}
 		else if( "magenta2" == color_name )
 		{
-			color->setVec(LLColor4::magenta2);
+			color->set(LLColor4::magenta2);
 		}
 		else if( "magenta3" == color_name )
 		{
-			color->setVec(LLColor4::magenta3);
+			color->set(LLColor4::magenta3);
 		}
 		else if( "magenta4" == color_name )
 		{
-			color->setVec(LLColor4::magenta4);
+			color->set(LLColor4::magenta4);
 		}
 		else if( "purple" == color_name )
 		{
-			color->setVec(LLColor4::purple);
+			color->set(LLColor4::purple);
 		}
 		else if( "purple1" == color_name )
 		{
-			color->setVec(LLColor4::purple1);
+			color->set(LLColor4::purple1);
 		}
 		else if( "purple2" == color_name )
 		{
-			color->setVec(LLColor4::purple2);
+			color->set(LLColor4::purple2);
 		}
 		else if( "purple3" == color_name )
 		{
-			color->setVec(LLColor4::purple3);
+			color->set(LLColor4::purple3);
 		}
 		else if( "purple4" == color_name )
 		{
-			color->setVec(LLColor4::purple4);
+			color->set(LLColor4::purple4);
 		}
 		else if( "purple5" == color_name )
 		{
-			color->setVec(LLColor4::purple5);
+			color->set(LLColor4::purple5);
 		}
 		else if( "purple6" == color_name )
 		{
-			color->setVec(LLColor4::purple6);
+			color->set(LLColor4::purple6);
 		}
 		else if( "pink" == color_name )
 		{
-			color->setVec(LLColor4::pink);
+			color->set(LLColor4::pink);
 		}
 		else if( "pink1" == color_name )
 		{
-			color->setVec(LLColor4::pink1);
+			color->set(LLColor4::pink1);
 		}
 		else if( "pink2" == color_name )
 		{
-			color->setVec(LLColor4::pink2);
+			color->set(LLColor4::pink2);
 		}
 		else if( "cyan" == color_name )
 		{
-			color->setVec(LLColor4::cyan);
+			color->set(LLColor4::cyan);
 		}
 		else if( "cyan1" == color_name )
 		{
-			color->setVec(LLColor4::cyan1);
+			color->set(LLColor4::cyan1);
 		}
 		else if( "cyan2" == color_name )
 		{
-			color->setVec(LLColor4::cyan2);
+			color->set(LLColor4::cyan2);
 		}
 		else if( "cyan3" == color_name )
 		{
-			color->setVec(LLColor4::cyan3);
+			color->set(LLColor4::cyan3);
 		}
 		else if( "cyan4" == color_name )
 		{
-			color->setVec(LLColor4::cyan4);
+			color->set(LLColor4::cyan4);
 		}
 		else if( "cyan5" == color_name )
 		{
-			color->setVec(LLColor4::cyan5);
+			color->set(LLColor4::cyan5);
 		}
 		else if( "cyan6" == color_name )
 		{
-			color->setVec(LLColor4::cyan6);
+			color->set(LLColor4::cyan6);
 		}
 		else if( "smoke" == color_name )
 		{
-			color->setVec(LLColor4::smoke);
+			color->set(LLColor4::smoke);
 		}
 		else if( "grey" == color_name )
 		{
-			color->setVec(LLColor4::grey);
+			color->set(LLColor4::grey);
 		}
 		else if( "grey1" == color_name )
 		{
-			color->setVec(LLColor4::grey1);
+			color->set(LLColor4::grey1);
 		}
 		else if( "grey2" == color_name )
 		{
-			color->setVec(LLColor4::grey2);
+			color->set(LLColor4::grey2);
 		}
 		else if( "grey3" == color_name )
 		{
-			color->setVec(LLColor4::grey3);
+			color->set(LLColor4::grey3);
 		}
 		else if( "grey4" == color_name )
 		{
-			color->setVec(LLColor4::grey4);
+			color->set(LLColor4::grey4);
 		}
 		else if( "orange" == color_name )
 		{
-			color->setVec(LLColor4::orange);
+			color->set(LLColor4::orange);
 		}
 		else if( "orange1" == color_name )
 		{
-			color->setVec(LLColor4::orange1);
+			color->set(LLColor4::orange1);
 		}
 		else if( "orange2" == color_name )
 		{
-			color->setVec(LLColor4::orange2);
+			color->set(LLColor4::orange2);
 		}
 		else if( "orange3" == color_name )
 		{
-			color->setVec(LLColor4::orange3);
+			color->set(LLColor4::orange3);
 		}
 		else if( "orange4" == color_name )
 		{
-			color->setVec(LLColor4::orange4);
+			color->set(LLColor4::orange4);
 		}
 		else if( "orange5" == color_name )
 		{
-			color->setVec(LLColor4::orange5);
+			color->set(LLColor4::orange5);
 		}
 		else if( "orange6" == color_name )
 		{
-			color->setVec(LLColor4::orange6);
+			color->set(LLColor4::orange6);
 		}
 		else if ( "clear" == color_name )
 		{
-			color->setVec(0.f, 0.f, 0.f, 0.f);
+			color->set(0.f, 0.f, 0.f, 0.f);
 		}
 		else
 		{
diff --git a/indra/llmath/v4color.h b/indra/llmath/v4color.h
index 53e4407..b01e881 100644
--- a/indra/llmath/v4color.h
+++ b/indra/llmath/v4color.h
@@ -84,20 +84,33 @@ class LLColor4
 		const LLColor4&	setToBlack();						// zero LLColor4 to (0, 0, 0, 1)
 		const LLColor4&	setToWhite();						// zero LLColor4 to (0, 0, 0, 1)
 
-		const LLColor4&	setVec(F32 r, F32 g, F32 b, F32 a);	// Sets LLColor4 to (r, g, b, a)
-		const LLColor4&	setVec(F32 r, F32 g, F32 b);	// Sets LLColor4 to (r, g, b) (no change in a)
-		const LLColor4&	setVec(const LLColor4 &vec);	// Sets LLColor4 to vec
-		const LLColor4&	setVec(const LLColor3 &vec);	// Sets LLColor4 to LLColor3 vec (no change in alpha)
-		const LLColor4&	setVec(const LLColor3 &vec, F32 a);	// Sets LLColor4 to LLColor3 vec, with alpha specified
-		const LLColor4&	setVec(const F32 *vec);			// Sets LLColor4 to vec
-		const LLColor4&	setVec(const LLColor4U& color4u); // Sets LLColor4 to color4u, rescaled.
+		const LLColor4&	setVec(F32 r, F32 g, F32 b, F32 a);	// deprecated -- use set()
+		const LLColor4&	setVec(F32 r, F32 g, F32 b);		// deprecated -- use set()
+		const LLColor4&	setVec(const LLColor4 &vec);		// deprecated -- use set()
+		const LLColor4&	setVec(const LLColor3 &vec);		// deprecated -- use set()
+		const LLColor4&	setVec(const LLColor3 &vec, F32 a);	// deprecated -- use set()
+		const LLColor4&	setVec(const F32 *vec);				// deprecated -- use set()
+		const LLColor4&	setVec(const LLColor4U& color4u); 	// deprecated -- use set()
+
+		const LLColor4&	set(F32 r, F32 g, F32 b, F32 a);	// Sets LLColor4 to (r, g, b, a)
+		const LLColor4&	set(F32 r, F32 g, F32 b);	// Sets LLColor4 to (r, g, b) (no change in a)
+		const LLColor4&	set(const LLColor4 &vec);	// Sets LLColor4 to vec
+		const LLColor4&	set(const LLColor3 &vec);	// Sets LLColor4 to LLColor3 vec (no change in alpha)
+		const LLColor4&	set(const LLColor3 &vec, F32 a);	// Sets LLColor4 to LLColor3 vec, with alpha specified
+		const LLColor4&	set(const F32 *vec);			// Sets LLColor4 to vec
+		const LLColor4&	set(const LLColor4U& color4u); // Sets LLColor4 to color4u, rescaled.
 
 
 		const LLColor4&    setAlpha(F32 a);
 
-		F32			magVec() const;				// Returns magnitude of LLColor4
-		F32			magVecSquared() const;		// Returns magnitude squared of LLColor4
-		F32			normVec();					// Normalizes and returns the magnitude of LLColor4
+		F32			magVec() const;				// deprecated -- use length()
+		F32			magVecSquared() const;		// deprecated -- use lengthSquared()
+		F32			normVec();					// deprecated -- use normalize()
+
+		F32			length() const;				// Returns magnitude of LLColor4
+		F32			lengthSquared() const;		// Returns magnitude squared of LLColor4
+		F32			normalize();				// deprecated -- use normalize()
+
 		BOOL		isOpaque() { return mV[VALPHA] == 1.f; }
 
 		F32 operator[](int idx) const { return mV[idx]; }
@@ -289,6 +302,47 @@ inline const LLColor4&	LLColor4::setToWhite(void)
 	return (*this);
 }
 
+inline const LLColor4&	LLColor4::set(F32 x, F32 y, F32 z)
+{
+	mV[VX] = x;
+	mV[VY] = y;
+	mV[VZ] = z;
+
+//  no change to alpha!
+//	mV[VW] = 1.f;  
+
+	return (*this);
+}
+
+inline const LLColor4&	LLColor4::set(F32 x, F32 y, F32 z, F32 a)
+{
+	mV[VX] = x;
+	mV[VY] = y;
+	mV[VZ] = z;
+	mV[VW] = a;  
+	return (*this);
+}
+
+inline const LLColor4&	LLColor4::set(const LLColor4 &vec)
+{
+	mV[VX] = vec.mV[VX];
+	mV[VY] = vec.mV[VY];
+	mV[VZ] = vec.mV[VZ];
+	mV[VW] = vec.mV[VW];
+	return (*this);
+}
+
+
+inline const LLColor4&	LLColor4::set(const F32 *vec)
+{
+	mV[VX] = vec[VX];
+	mV[VY] = vec[VY];
+	mV[VZ] = vec[VZ];
+	mV[VW] = vec[VW];
+	return (*this);
+}
+
+// deprecated
 inline const LLColor4&	LLColor4::setVec(F32 x, F32 y, F32 z)
 {
 	mV[VX] = x;
@@ -301,6 +355,7 @@ inline const LLColor4&	LLColor4::setVec(F32 x, F32 y, F32 z)
 	return (*this);
 }
 
+// deprecated
 inline const LLColor4&	LLColor4::setVec(F32 x, F32 y, F32 z, F32 a)
 {
 	mV[VX] = x;
@@ -310,6 +365,7 @@ inline const LLColor4&	LLColor4::setVec(F32 x, F32 y, F32 z, F32 a)
 	return (*this);
 }
 
+// deprecated
 inline const LLColor4&	LLColor4::setVec(const LLColor4 &vec)
 {
 	mV[VX] = vec.mV[VX];
@@ -320,6 +376,7 @@ inline const LLColor4&	LLColor4::setVec(const LLColor4 &vec)
 }
 
 
+// deprecated
 inline const LLColor4&	LLColor4::setVec(const F32 *vec)
 {
 	mV[VX] = vec[VX];
@@ -337,16 +394,44 @@ inline const LLColor4&	LLColor4::setAlpha(F32 a)
 
 // LLColor4 Magnitude and Normalization Functions
 
+inline F32		LLColor4::length(void) const
+{
+	return fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+}
+
+inline F32		LLColor4::lengthSquared(void) const
+{
+	return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];
+}
+
+inline F32		LLColor4::normalize(void)
+{
+	F32 mag = fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+	F32 oomag;
+
+	if (mag)
+	{
+		oomag = 1.f/mag;
+		mV[VX] *= oomag;
+		mV[VY] *= oomag;
+		mV[VZ] *= oomag;
+	}
+	return (mag);
+}
+
+// deprecated
 inline F32		LLColor4::magVec(void) const
 {
 	return fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
 }
 
+// deprecated
 inline F32		LLColor4::magVecSquared(void) const
 {
 	return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];
 }
 
+// deprecated
 inline F32		LLColor4::normVec(void)
 {
 	F32 mag = fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
@@ -497,13 +582,13 @@ inline const LLColor4& operator%=(LLColor4 &a, F32 k)
 inline F32		distVec(const LLColor4 &a, const LLColor4 &b)
 {
 	LLColor4 vec = a - b;
-	return (vec.magVec());
+	return (vec.length());
 }
 
 inline F32		distVec_squared(const LLColor4 &a, const LLColor4 &b)
 {
 	LLColor4 vec = a - b;
-	return (vec.magVecSquared());
+	return (vec.lengthSquared());
 }
 
 inline LLColor4 lerp(const LLColor4 &a, const LLColor4 &b, F32 u)
diff --git a/indra/llmath/v4coloru.cpp b/indra/llmath/v4coloru.cpp
index 7ad7eb2..fdad596 100644
--- a/indra/llmath/v4coloru.cpp
+++ b/indra/llmath/v4coloru.cpp
@@ -120,6 +120,6 @@ BOOL LLColor4U::parseColor4U(const std::string& buf, LLColor4U* value)
 		}
 	}
 
-	value->setVec( U8(v[0]), U8(v[1]), U8(v[2]), U8(v[3]) );
+	value->set( U8(v[0]), U8(v[1]), U8(v[2]), U8(v[3]) );
 	return TRUE;
 }
diff --git a/indra/llmath/v4coloru.h b/indra/llmath/v4coloru.h
index 910a081..d46ca52 100644
--- a/indra/llmath/v4coloru.h
+++ b/indra/llmath/v4coloru.h
@@ -97,15 +97,23 @@ public:
 	const LLColor4U&	setToBlack();						// zero LLColor4U to (0, 0, 0, 1)
 	const LLColor4U&	setToWhite();						// zero LLColor4U to (0, 0, 0, 1)
 
-	const LLColor4U&	setVec(U8 r, U8 g, U8 b, U8 a);	// Sets LLColor4U to (r, g, b, a)
-	const LLColor4U&	setVec(U8 r, U8 g, U8 b);	// Sets LLColor4U to (r, g, b) (no change in a)
-	const LLColor4U&	setVec(const LLColor4U &vec);	// Sets LLColor4U to vec
-	const LLColor4U&	setVec(const U8 *vec);			// Sets LLColor4U to vec
+	const LLColor4U&	set(U8 r, U8 g, U8 b, U8 a);// Sets LLColor4U to (r, g, b, a)
+	const LLColor4U&	set(U8 r, U8 g, U8 b);		// Sets LLColor4U to (r, g, b) (no change in a)
+	const LLColor4U&	set(const LLColor4U &vec);	// Sets LLColor4U to vec
+	const LLColor4U&	set(const U8 *vec);			// Sets LLColor4U to vec
+
+	const LLColor4U&	setVec(U8 r, U8 g, U8 b, U8 a);	// deprecated -- use set()
+	const LLColor4U&	setVec(U8 r, U8 g, U8 b);		// deprecated -- use set()
+	const LLColor4U&	setVec(const LLColor4U &vec);	// deprecated -- use set()
+	const LLColor4U&	setVec(const U8 *vec);			// deprecated -- use set()
 
 	const LLColor4U&    setAlpha(U8 a);
 
-	F32			magVec() const;				// Returns magnitude of LLColor4U
-	F32			magVecSquared() const;		// Returns magnitude squared of LLColor4U
+	F32			magVec() const;				// deprecated -- use length()
+	F32			magVecSquared() const;		// deprecated -- use lengthSquared()
+
+	F32			length() const;				// Returns magnitude squared of LLColor4U
+	F32			lengthSquared() const;		// Returns magnitude squared of LLColor4U
 
 	friend std::ostream&	 operator<<(std::ostream& s, const LLColor4U &a);		// Print a
 	friend LLColor4U operator+(const LLColor4U &a, const LLColor4U &b);	// Return vector a + b
@@ -199,7 +207,7 @@ inline const LLColor4U&	LLColor4U::setToWhite(void)
 	return (*this);
 }
 
-inline const LLColor4U&	LLColor4U::setVec(const U8 x, const U8 y, const U8 z)
+inline const LLColor4U&	LLColor4U::set(const U8 x, const U8 y, const U8 z)
 {
 	mV[VX] = x;
 	mV[VY] = y;
@@ -211,7 +219,7 @@ inline const LLColor4U&	LLColor4U::setVec(const U8 x, const U8 y, const U8 z)
 	return (*this);
 }
 
-inline const LLColor4U&	LLColor4U::setVec(const U8 r, const U8 g, const U8 b, U8 a)
+inline const LLColor4U&	LLColor4U::set(const U8 r, const U8 g, const U8 b, U8 a)
 {
 	mV[0] = r;
 	mV[1] = g;
@@ -220,7 +228,7 @@ inline const LLColor4U&	LLColor4U::setVec(const U8 r, const U8 g, const U8 b, U8
 	return (*this);
 }
 
-inline const LLColor4U&	LLColor4U::setVec(const LLColor4U &vec)
+inline const LLColor4U&	LLColor4U::set(const LLColor4U &vec)
 {
 	mV[VX] = vec.mV[VX];
 	mV[VY] = vec.mV[VY];
@@ -229,17 +237,49 @@ inline const LLColor4U&	LLColor4U::setVec(const LLColor4U &vec)
 	return (*this);
 }
 
-/*
-inline const LLColor4U&	LLColor4U::setVec(const LLColor4 &vec)
+inline const LLColor4U&	LLColor4U::set(const U8 *vec)
 {
-	mV[VX] = (U8) (llmin(1.f, vec.mV[VX]) * 255.f);
-	mV[VY] = (U8) (llmin(1.f, vec.mV[VY]) * 255.f);
-	mV[VZ] = (U8) (llmin(1.f, vec.mV[VZ]) * 255.f);
-	mV[VW] = (U8) (llmin(1.f, vec.mV[VW]) * 255.f);
+	mV[VX] = vec[VX];
+	mV[VY] = vec[VY];
+	mV[VZ] = vec[VZ];
+	mV[VW] = vec[VW];
 	return (*this);
 }
-*/
 
+// deprecated
+inline const LLColor4U&	LLColor4U::setVec(const U8 x, const U8 y, const U8 z)
+{
+	mV[VX] = x;
+	mV[VY] = y;
+	mV[VZ] = z;
+
+//  no change to alpha!
+//	mV[VW] = 255;  
+
+	return (*this);
+}
+
+// deprecated
+inline const LLColor4U&	LLColor4U::setVec(const U8 r, const U8 g, const U8 b, U8 a)
+{
+	mV[0] = r;
+	mV[1] = g;
+	mV[2] = b;
+	mV[3] = a;  
+	return (*this);
+}
+
+// deprecated
+inline const LLColor4U&	LLColor4U::setVec(const LLColor4U &vec)
+{
+	mV[VX] = vec.mV[VX];
+	mV[VY] = vec.mV[VY];
+	mV[VZ] = vec.mV[VZ];
+	mV[VW] = vec.mV[VW];
+	return (*this);
+}
+
+// deprecated
 inline const LLColor4U&	LLColor4U::setVec(const U8 *vec)
 {
 	mV[VX] = vec[VX];
@@ -256,13 +296,24 @@ inline const LLColor4U&	LLColor4U::setAlpha(U8 a)
 }
 
 // LLColor4U Magnitude and Normalization Functions
-// bookmark
 
+inline F32		LLColor4U::length(void) const
+{
+	return fsqrtf( ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ] );
+}
+
+inline F32		LLColor4U::lengthSquared(void) const
+{
+	return ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ];
+}
+
+// deprecated
 inline F32		LLColor4U::magVec(void) const
 {
 	return fsqrtf( ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ] );
 }
 
+// deprecated
 inline F32		LLColor4U::magVecSquared(void) const
 {
 	return ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ];
@@ -407,13 +458,13 @@ inline const LLColor4U& operator%=(LLColor4U &a, U8 k)
 inline F32		distVec(const LLColor4U &a, const LLColor4U &b)
 {
 	LLColor4U vec = a - b;
-	return (vec.magVec());
+	return (vec.length());
 }
 
 inline F32		distVec_squared(const LLColor4U &a, const LLColor4U &b)
 {
 	LLColor4U vec = a - b;
-	return (vec.magVecSquared());
+	return (vec.lengthSquared());
 }
 
 void LLColor4U::setVecScaleClamp(const LLColor4& color)
diff --git a/indra/llmedia/CMakeLists.txt b/indra/llmedia/CMakeLists.txt
index 8ef8006..0c892f9 100644
--- a/indra/llmedia/CMakeLists.txt
+++ b/indra/llmedia/CMakeLists.txt
@@ -11,6 +11,7 @@ include(LLMedia)
 include(LLMessage)
 include(LLWindow)
 include(Mozlib)
+include(QuickTime)
 
 include_directories(
     ${GSTREAMER_INCLUDE_DIRS}
@@ -92,3 +93,9 @@ set_source_files_properties(${llmedia_HEADER_FILES}
 list(APPEND llmedia_SOURCE_FILES ${llmedia_HEADER_FILES})
 
 add_library (llmedia ${llmedia_SOURCE_FILES})
+target_link_libraries(
+    llmedia
+    ${GSTREAMER_LIBRARIES}
+    ${GSTREAMER_PLUGINS_BASE_LIBRARIES}
+    ${QUICKTIME_LIBRARY}
+    )
diff --git a/indra/llmedia/llmediaimplexample2.cpp b/indra/llmedia/llmediaimplexample2.cpp
index 13036f9..dc19f55 100644
--- a/indra/llmedia/llmediaimplexample2.cpp
+++ b/indra/llmedia/llmediaimplexample2.cpp
@@ -45,7 +45,7 @@ static LLMediaImplRegister sLLMediaImplExample2Reg( "LLMediaImplExample2", new L
 LLMediaImplExample2Maker::LLMediaImplExample2Maker()
 {
 	// Register to handle the scheme
-	mSchema.push_back( "example2" );
+	mSchema.push_back( "example2." );
 }
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/indra/llmedia/llmediaimplgstreamer.cpp b/indra/llmedia/llmediaimplgstreamer.cpp
index 51a5bca..b1d36f0 100644
--- a/indra/llmedia/llmediaimplgstreamer.cpp
+++ b/indra/llmedia/llmediaimplgstreamer.cpp
@@ -171,6 +171,9 @@ startup ( LLMediaManagerData* init_data )
 	static bool done_init = false;
 	if (!done_init)
 	{
+		// Init the glib type system - we need it.
+		g_type_init();
+
 		// Get symbols!
 		if (! grab_gst_syms("libgstreamer-0.10.so.0",
 				    "libgstvideo-0.10.so.0",
diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt
index ba17265..fd22de9 100644
--- a/indra/llmessage/CMakeLists.txt
+++ b/indra/llmessage/CMakeLists.txt
@@ -189,3 +189,11 @@ set_source_files_properties(${llmessage_HEADER_FILES}
 list(APPEND llmessage_SOURCE_FILES ${llmessage_HEADER_FILES})
 
 add_library (llmessage ${llmessage_SOURCE_FILES})
+target_link_libraries(
+    llmessage
+    ${CURL_LIBRARIES}
+    ${CARES_LIBRARIES}
+    ${OPENSSL_LIBRARIES}
+    ${CRYPTO_LIBRARIES}
+    ${XMLRPCEPI_LIBRARIES}
+    )
diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp
index 70e1ccf..8f02358 100644
--- a/indra/llmessage/llcachename.cpp
+++ b/indra/llmessage/llcachename.cpp
@@ -41,7 +41,8 @@
 #include "llsdserialize.h"
 #include "lluuid.h"
 #include "message.h"
-
+#include "llservicebuilder.h"
+#include "llframetimer.h"
 // Constants
 static const std::string CN_WAITING("(Loading...)"); // *TODO: translate
 static const std::string CN_NOBODY("(nobody)"); // *TODO: translate
@@ -196,6 +197,8 @@ class LLCacheName::Impl
 public:
 	LLMessageSystem*	mMsg;
 	LLHost				mUpstreamHost;
+	std::string mGroupNameURL;
+	std::string mAgentNameURL;
 
 	Cache				mCache;
 		// the map of UUIDs to names
@@ -221,6 +224,8 @@ public:
 	void processPendingReplies();
 	void sendRequest(const char* msg_name, const AskQueue& queue);
 	bool isRequestPending(const LLUUID& id);
+	void getAgentName(const AskQueue&);
+	void getGroupName(const AskQueue&);
 
 	// Message system callbacks.
 	void processUUIDRequest(LLMessageSystem* msg, bool isGroup);
@@ -234,6 +239,35 @@ public:
 	void notifyObservers(const LLUUID& id, const std::string& first, const std::string& last, BOOL group);
 };
 
+class LLHTTPAgentNamesResponse : public LLHTTPClient::Responder
+{
+public:
+	LLHTTPAgentNamesResponse(const LLSD& agent_ids)
+		: mAgentIDs(agent_ids)
+	{ }
+	void result(const LLSD& content);
+private:
+	LLHost mSender;
+	LLSD mAgentIDs;
+
+};
+
+class LLHTTPGroupNamesResponse : public LLHTTPClient::Responder
+{
+public:
+	LLHTTPGroupNamesResponse(const LLSD& group_ids)
+		: mGroupIDs(group_ids)
+	{ };
+					        
+	void result(const LLSD& content);
+private:
+	LLHost mSender;
+	LLSD mGroupIDs;
+
+};
+
+
+
 
 /// --------------------------------------------------------------------------
 /// class LLCacheName
@@ -319,6 +353,57 @@ void LLCacheName::cancelCallback(const LLUUID& id, LLCacheNameCallback callback,
 	}
 }
 
+void LLCacheName::sendAgentNames(const LLUUID& id, std::string& first, std::string& last)
+{
+
+	LLCacheNameEntry* entry = get_ptr_in_map(impl.mCache, id);
+	if (!entry)
+	{
+		entry = new LLCacheNameEntry;
+		impl.mCache[id] = entry;
+		
+	}
+	entry->mIsGroup = false;
+	entry->mCreateTime = (U32)LLFrameTimer::getTotalSeconds();
+    //entry->mFirstName = first;
+    //entry->mLastName = last;
+    //LLStringUtil::truncate(entry->mFirstName, DB_FIRST_NAME_BUF_SIZE);
+    //LLStringUtil::truncate(entry->mLastName, DB_LAST_NAME_BUF_SIZE);
+    entry->mFirstName = std::string(first, DB_FIRST_NAME_BUF_SIZE);
+    entry->mLastName = std::string(last, DB_LAST_NAME_BUF_SIZE);
+
+	impl.mPendingQueue.erase(id);
+	impl.notifyObservers(id,
+				entry->mFirstName, entry->mLastName,
+				FALSE);
+	 
+}
+
+void LLCacheName::sendGroupNames(const LLUUID& id, std::string& name)
+{
+	 
+	LLCacheNameEntry* entry = get_ptr_in_map(impl.mCache, id);
+    if (!entry)
+	{
+		entry = new LLCacheNameEntry;
+		impl.mCache[id] = entry;
+								     
+	}
+	     
+	entry->mIsGroup = true;
+	entry->mCreateTime = (U32)time(NULL);
+	
+    entry->mGroupName = std::string(name, DB_GROUP_NAME_BUF_SIZE);
+
+	impl.mPendingQueue.erase(id);
+		     
+	impl.notifyObservers(id,
+		entry->mFirstName, entry->mLastName,
+		FALSE);
+			 
+	
+}
+
 void LLCacheName::importFile(LLFILE* fp)
 {
 	S32 count = 0;
@@ -524,6 +609,16 @@ BOOL LLCacheName::getFullName(const LLUUID& id, std::string& fullname)
 	return res;
 }
 
+void LLCacheName::setGroupURL(const std::string& group_url)
+{
+	impl.mGroupNameURL = group_url; 
+}
+
+void LLCacheName::setAgentURL(const std::string& agent_url)
+{
+	impl.mAgentNameURL = agent_url;
+}
+
 BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group)
 {
 	if(id.isNull())
@@ -558,6 +653,111 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group)
 	}
 }
 
+void LLCacheName::Impl::getAgentName(const AskQueue &queue)
+{
+	 
+	// get the names from backbone module
+	if(queue.empty())
+	{
+		 return;
+	}
+		
+	LLSD request;
+	request["action"] = "GET";
+	LLSD id_block = LLSD::emptyArray();
+	AskQueue::const_iterator it = queue.begin();
+	AskQueue::const_iterator end = queue.end();
+	for(;it!=end;++it)
+	{
+		id_block.append(*it);
+	}
+	lldebugs<<LLSDOStreamer<LLSDNotationFormatter>(id_block) <<llendl;
+		 
+	request["agents"] = id_block;
+	
+	LLHTTPClient::post(
+		 	mAgentNameURL,
+			request, 
+			new LLHTTPAgentNamesResponse(id_block));
+		 
+		                                           
+	lldebugs<<"Service builder call to agent-name "<<mAgentNameURL<<llendl;
+		 
+}
+
+void LLHTTPAgentNamesResponse::result(const LLSD& content)
+{
+	LLUUID id;
+	lldebugs<<LLSDOStreamer<LLSDNotationFormatter>(content) <<llendl;
+
+	LLSD::map_const_iterator iter = content.beginMap();
+	for ( ; iter != content.endMap(); ++iter)
+	{
+		id.set((*iter).first);
+		LLSD name = (*iter).second;
+		LLCacheNameEntry* entry = new LLCacheNameEntry;
+		entry->mIsGroup = FALSE;
+		entry->mCreateTime = (U32)LLFrameTimer::getTotalSeconds();
+        std::string first = name["first"];
+        std::string last = name["last"];
+        entry->mFirstName = std::string(first, DB_FIRST_NAME_BUF_SIZE);
+        entry->mLastName = std::string(last, DB_LAST_NAME_BUF_SIZE);
+
+		gCacheName->sendAgentNames(id,first,last);
+	}	
+}
+
+
+void LLCacheName::Impl::getGroupName(const AskQueue &queue)
+{
+	// get the group names from backbone module
+	if(queue.empty())
+	{
+		return;
+	}
+		
+	LLSD request;
+	request["action"] = "GET";
+	LLSD id_block = LLSD::emptyArray();
+	AskQueue::const_iterator it = queue.begin();
+	AskQueue::const_iterator end = queue.end();
+	for(;it!=end;++it)
+	{
+		id_block.append(*it);
+	}
+		
+	request["groups"] = id_block;
+		                                                             
+	if(!mGroupNameURL.empty())
+	{	
+		LLHTTPClient::post(
+			mGroupNameURL,
+			request,
+			new LLHTTPGroupNamesResponse(id_block));
+	}
+	lldebugs<<"Service builder call to group-name "<< mGroupNameURL<<llendl;
+}
+
+void LLHTTPGroupNamesResponse::result(const LLSD& content)
+{
+	lldebugs<<"Result"<<LLSDOStreamer<LLSDNotationFormatter>(content) << llendl;
+	LLUUID id;
+
+	LLSD::map_const_iterator iter = content.beginMap();
+	for ( ; iter != content.endMap(); ++iter)
+	{
+					  
+		id.set((*iter).first);
+		std::string name = (*iter).second.asString();
+		LLCacheNameEntry* entry = new LLCacheNameEntry;
+		entry->mIsGroup = TRUE;						
+		entry->mCreateTime = (U32)time(NULL);
+        entry->mGroupName = std::string(name, DB_GROUP_NAME_BUF_SIZE);
+		lldebugs<<"Group Name"<<name<<llendl;
+		gCacheName->sendGroupNames(id,name);							
+	}
+}
+
 // TODO: Make the cache name callback take a SINGLE std::string,
 // not a separate first and last name.
 void LLCacheName::get(const LLUUID& id, BOOL is_group, LLCacheNameCallback callback, void* user_data)
@@ -606,12 +806,14 @@ void LLCacheName::processPending()
 		return;
 	}
 
+    /*
 	if(!impl.mUpstreamHost.isOk())
 	{
 		lldebugs << "LLCacheName::processPending() - bad upstream host."
 				 << llendl;
 		return;
 	}
+    */
 
 	impl.processPendingAsks();
 	impl.processPendingReplies();
@@ -693,8 +895,16 @@ std::string LLCacheName::getDefaultName()
 
 void LLCacheName::Impl::processPendingAsks()
 {
-	sendRequest(_PREHASH_UUIDNameRequest, mAskNameQueue);
-	sendRequest(_PREHASH_UUIDGroupNameRequest, mAskGroupQueue);
+	if (mUpstreamHost.isOk()) //its the vuewer asking for names send request to simulator
+	{
+		sendRequest(_PREHASH_UUIDNameRequest, mAskNameQueue);
+		sendRequest(_PREHASH_UUIDGroupNameRequest, mAskGroupQueue);
+	}
+	else //its simulator asking for names ask the backbone
+	{
+		getAgentName(mAskNameQueue);
+		getGroupName(mAskGroupQueue);
+	}
 	mAskNameQueue.clear();
 	mAskGroupQueue.clear();
 }
@@ -815,12 +1025,15 @@ void LLCacheName::Impl::processUUIDRequest(LLMessageSystem* msg, bool isGroup)
 {
 	// You should only get this message if the cache is at the simulator
 	// level, hence having an upstream provider.
+	// 03/31/2008 Simulator is talking to backbone and not dataserver
+	// This check was for dataserver
+	/*
 	if (!mUpstreamHost.isOk())
 	{
 		llwarns << "LLCacheName - got UUID name/group request, but no upstream provider!" << llendl;
 		return;
 	}
-
+	*/
 	LLHost fromHost = msg->getSender();
 	ReplySender sender(msg);
 
diff --git a/indra/llmessage/llcachename.h b/indra/llmessage/llcachename.h
index 965b4ba..af644d0 100644
--- a/indra/llmessage/llcachename.h
+++ b/indra/llmessage/llcachename.h
@@ -31,7 +31,9 @@
 
 #ifndef LL_LLCACHENAME_H
 #define LL_LLCACHENAME_H
-
+#include "llhttpclient.h"
+#include "llhost.h"
+#include "lluri.h"
 class LLMessageSystem;
 class LLHost;
 class LLUUID;
@@ -97,10 +99,15 @@ public:
 	// This method needs to be called from time to time to send out
 	// requests.
 	void processPending();
-
+	void setAgentURL(const std::string& url);
+	void setGroupURL(const std::string& url);
+	
 	// Expire entries created more than "secs" seconds ago.
 	void deleteEntriesOlderThan(S32 secs);
 
+	//send the information retrived from backbone
+	void sendAgentNames(const LLUUID& id, std::string& first, std::string& last);
+	void sendGroupNames(const LLUUID& id, std::string& name);
 	// Debugging
 	void dump();		// Dumps the contents of the cache
 	void dumpStats();	// Dumps the sizes of the cache and associated queues.
@@ -111,9 +118,8 @@ private:
 
 	class Impl;
 	Impl& impl;
-};
-
 
+};
 
 extern LLCacheName* gCacheName;
 
diff --git a/indra/llmessage/llcircuit.cpp b/indra/llmessage/llcircuit.cpp
index 12a1520..7b2f241 100644
--- a/indra/llmessage/llcircuit.cpp
+++ b/indra/llmessage/llcircuit.cpp
@@ -60,6 +60,7 @@
 #include "llrand.h"
 #include "llstl.h"
 #include "lltransfermanager.h"
+#include "llmodularmath.h"
 
 const F32 PING_INTERVAL = 5.f; // seconds
 const S32 PING_START_BLOCK = 3;		// How many pings behind we have to be to consider ourself blocked.
@@ -676,6 +677,8 @@ void LLCircuitData::checkPacketInID(TPACKETID id, BOOL receive_resent)
 		mPacketsIn++;
 		setPacketInID((id + 1) % LL_MAX_OUT_PACKET_ID);
 
+        mLastPacketGap = 0;
+        mOutOfOrderRate.count(0);
 		return;
 	}
 
@@ -683,6 +686,7 @@ void LLCircuitData::checkPacketInID(TPACKETID id, BOOL receive_resent)
 
 
 	// now, check to see if we've got a gap
+    U32 gap = 0;
 	if ((mPacketsInID == id))
 	{
 		// nope! bump and wrap the counter, then return
@@ -704,6 +708,11 @@ void LLCircuitData::checkPacketInID(TPACKETID id, BOOL receive_resent)
 		// otherwise, walk from mCurrentCircuit->mPacketsInID to id with wrapping, adding the values to the map
 		// and setting mPacketsInID to id + 1 % LL_MAX_OUT_PACKET_ID
 
+        // babbage: all operands in expression are unsigned, so modular 
+		// arithmetic will always find correct gap, regardless of wrap arounds.
+		const U8 width = 24;
+		gap = LLModularMath::subtract<width>(mPacketsInID, id);
+
 		if (mPotentialLostPackets.find(id) != mPotentialLostPackets.end())
 		{
 			if(gMessageSystem->mVerboseLog)
@@ -765,6 +774,8 @@ void LLCircuitData::checkPacketInID(TPACKETID id, BOOL receive_resent)
 
 		}
 	}
+    mOutOfOrderRate.count(gap);
+    mLastPacketGap = gap;
 }
 
 
diff --git a/indra/llmessage/llcircuit.h b/indra/llmessage/llcircuit.h
index 552b50f..3b9df02 100644
--- a/indra/llmessage/llcircuit.h
+++ b/indra/llmessage/llcircuit.h
@@ -45,6 +45,7 @@
 #include "llpacketack.h"
 #include "lluuid.h"
 #include "llthrottle.h"
+#include "llstat.h"
 
 //
 // Constants
@@ -133,6 +134,10 @@ public:
 	S32			getUnackedPacketCount() const	{ return mUnackedPacketCount; }
 	S32			getUnackedPacketBytes() const	{ return mUnackedPacketBytes; }
 	F64         getNextPingSendTime() const { return mNextPingSendTime; }
+    F32         getOutOfOrderRate(LLStatAccum::TimeScale scale = LLStatAccum::SCALE_MINUTE) 
+                    { return mOutOfOrderRate.meanValue(scale); }
+    U32         getLastPacketGap() const { return mLastPacketGap; }
+    LLHost      getHost() const { return mHost; }
 
 	LLThrottleGroup &getThrottleGroup()		{	return mThrottles; }
 
@@ -276,6 +281,8 @@ protected:
 	LLTimer	mExistenceTimer;	    // initialized when circuit created, used to track bandwidth numbers
 
 	S32		mCurrentResendCount;	// Number of resent packets since last spam
+    LLStatRate  mOutOfOrderRate;    // Rate of out of order packets coming in.
+    U32     mLastPacketGap;         // Gap in sequence number of last packet.
 };
 
 
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index 834ec4b..167e237 100644
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -265,6 +265,10 @@ LLCurl::Easy* LLCurl::Easy::getEasy()
 		delete easy;
 		return NULL;
 	}
+	
+	// set no DMS caching as default for all easy handles. This prevents them adopting a
+	// multi handles cache if they are added to one.
+	curl_easy_setopt(easy->mCurlEasyHandle, CURLOPT_DNS_CACHE_TIMEOUT, 0);
 	++gCurlEasyCount;
 	return easy;
 }
@@ -747,7 +751,7 @@ bool LLCurlRequest::post(const std::string& url, const LLSD& data, LLCurl::Respo
 	easy->setopt(CURLOPT_POSTFIELDS, (void*)NULL);
 	easy->setopt(CURLOPT_POSTFIELDSIZE, bytes);
 
-	easy->slist_append("Content-Type: application/xml");
+	easy->slist_append("Content-Type: application/llsd+xml");
 	easy->setHeaders();
 
 	lldebugs << "POSTING: " << bytes << " bytes." << llendl;
diff --git a/indra/llmessage/llhttpassetstorage.cpp b/indra/llmessage/llhttpassetstorage.cpp
index fdd521f..6d5a716 100644
--- a/indra/llmessage/llhttpassetstorage.cpp
+++ b/indra/llmessage/llhttpassetstorage.cpp
@@ -256,6 +256,10 @@ void LLHTTPAssetRequest::setupCurlHandle()
 			// disable use of proxy, which can't handle chunked transfers
 	}
 	mHTTPHeaders = curl_slist_append(mHTTPHeaders, "Pragma:");
+
+	// bug in curl causes DNS to be cached for too long a time, 0 sets it to never cache DNS results internally (to curl)
+	curl_easy_setopt(mCurlHandle, CURLOPT_DNS_CACHE_TIMEOUT, 0);
+	
 	// resist the temptation to explicitly add the Transfer-Encoding: chunked
 	// header here - invokes a libCURL bug
 	curl_easy_setopt(mCurlHandle, CURLOPT_HTTPHEADER, mHTTPHeaders);
diff --git a/indra/llmessage/llhttpclient.cpp b/indra/llmessage/llhttpclient.cpp
index fc2612f..fb43861 100644
--- a/indra/llmessage/llhttpclient.cpp
+++ b/indra/llmessage/llhttpclient.cpp
@@ -106,7 +106,7 @@ namespace
 		LLSDInjector(const LLSD& sd) : mSD(sd) {}
 		virtual ~LLSDInjector() {}
 
-		const char* contentType() { return "application/xml"; }
+		const char* contentType() { return "application/llsd+xml"; }
 
 		virtual EStatus process_impl(const LLChannelDescriptors& channels,
 			buffer_ptr_t& buffer, bool& eos, LLSD& context, LLPumpIO* pump)
@@ -238,7 +238,8 @@ static void request(
             //the Pragma header it so gratuitously inserts
             //Before inserting the header, force libcurl
             //to not use the proxy (read: llurlrequest.cpp)
-            if ((iter->first == "Pragma") && (iter->second.asString() == ""))
+			static const std::string PRAGMA("Pragma");
+			if ((iter->first == PRAGMA) && (iter->second.asString().empty()))
             {
                 req->useProxy(false);
             }
@@ -247,6 +248,19 @@ static void request(
             req->addHeader(header.str().c_str());
         }
     }
+
+	// Check to see if we have already set Accept or not. If no one
+	// set it, set it to application/llsd+xml since that's what we
+	// almost always want.
+	if( method != LLURLRequest::HTTP_PUT && method != LLURLRequest::HTTP_POST )
+	{
+		static const std::string ACCEPT("Accept");
+		if(!headers.has(ACCEPT))
+		{
+			req->addHeader("Accept: application/llsd+xml");
+		}
+	}
+
 	req->setCallback(new LLHTTPClientURLAdaptor(responder));
 
 	if (method == LLURLRequest::HTTP_POST  &&  gMessageSystem)
@@ -254,12 +268,22 @@ static void request(
 		req->addHeader(llformat("X-SecondLife-UDP-Listen-Port: %d",
 								gMessageSystem->mPort).c_str());
    	}
-	
+
 	if (method == LLURLRequest::HTTP_PUT || method == LLURLRequest::HTTP_POST)
 	{
-		req->addHeader(llformat("Content-Type: %s",
-								body_injector->contentType()).c_str());
-
+		static const std::string CONTENT_TYPE("Content-Type");
+		if(!headers.has(CONTENT_TYPE))
+		{
+			// If the Content-Type header was passed in, it has
+			// already been added as a header through req->addHeader
+			// in the loop above. We defer to the caller's wisdom, but
+			// if they did not specify a Content-Type, then ask the
+			// injector.
+			req->addHeader(
+				llformat(
+					"Content-Type: %s",
+					body_injector->contentType()).c_str());
+		}
    		chain.push_back(LLIOPipe::ptr_t(body_injector));
 	}
 
diff --git a/indra/llmessage/lliohttpserver.cpp b/indra/llmessage/lliohttpserver.cpp
index d4155f6..64222ff 100644
--- a/indra/llmessage/lliohttpserver.cpp
+++ b/indra/llmessage/lliohttpserver.cpp
@@ -47,6 +47,7 @@
 #include "llpumpio.h"
 #include "llsd.h"
 #include "llsdserialize_xml.h"
+#include "llstat.h"
 #include "llstl.h"
 #include "lltimer.h"
 
@@ -171,22 +172,26 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl(
 		std::string verb = context[CONTEXT_REQUEST][CONTEXT_VERB];
 		if(verb == HTTP_VERB_GET)
 		{
+            LLPerfBlock getblock("http_get");   
 			mNode.get(LLHTTPNode::ResponsePtr(mResponse), context);
 		}
 		else if(verb == HTTP_VERB_PUT)
 		{
+            LLPerfBlock putblock("http_put");
 			LLSD input;
 			LLSDSerialize::fromXML(input, istr);
 			mNode.put(LLHTTPNode::ResponsePtr(mResponse), context, input);
 		}
 		else if(verb == HTTP_VERB_POST)
 		{
+            LLPerfBlock postblock("http_post");
 			LLSD input;
 			LLSDSerialize::fromXML(input, istr);
 			mNode.post(LLHTTPNode::ResponsePtr(mResponse), context, input);
 		}
 		else if(verb == HTTP_VERB_DELETE)
 		{
+            LLPerfBlock delblock("http_delete");
 			mNode.del(LLHTTPNode::ResponsePtr(mResponse), context);
 		}		
 		else if(verb == HTTP_VERB_OPTIONS)
@@ -240,7 +245,7 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl(
 		case STATE_GOOD_RESULT:
 		{
 			LLSD headers = mHeaders;
-			headers["Content-Type"] = "application/xml";
+			headers["Content-Type"] = "application/llsd+xml";
 			context[CONTEXT_RESPONSE][CONTEXT_HEADERS] = headers;
 			LLBufferStream ostr(channels, buffer.get());
 			LLSDSerialize::toXML(mGoodResult, ostr);
diff --git a/indra/llmessage/lliosocket.cpp b/indra/llmessage/lliosocket.cpp
index dec83b0..28fee37 100644
--- a/indra/llmessage/lliosocket.cpp
+++ b/indra/llmessage/lliosocket.cpp
@@ -355,8 +355,11 @@ LLIOPipe::EStatus LLIOSocketReader::process_impl(
 	}
 	else if(APR_STATUS_IS_EAGAIN(status))
 	{
+/*Commented out by Aura 9-9-8 for DEV-19961.
 		// everything is fine, but we can terminate this process pump.
+	
 		rv = STATUS_BREAK;
+*/
 	}
 	else
 	{
diff --git a/indra/llmessage/llmail.cpp b/indra/llmessage/llmail.cpp
index 8ae7206..181f378 100644
--- a/indra/llmessage/llmail.cpp
+++ b/indra/llmessage/llmail.cpp
@@ -51,6 +51,7 @@
 #include "llblowfishcipher.h"
 #include "llerror.h"
 #include "llhost.h"
+#include "llsd.h"
 #include "llstring.h"
 #include "lluuid.h"
 #include "net.h"
@@ -111,16 +112,22 @@ void disconnect_smtp()
 // Returns TRUE on success.
 // message should NOT be SMTP escaped.
 // static
-BOOL LLMail::send(const char* from_name, const char* from_address,
-			   const char* to_name, const char* to_address,
-			   const char* subject, const char* message)
+BOOL LLMail::send(
+	const char* from_name,
+	const char* from_address,
+	const char* to_name,
+	const char* to_address,
+	const char* subject,
+	const char* message,
+	const LLSD& headers)
 {
 	std::string header = buildSMTPTransaction(
 		from_name,
 		from_address,
 		to_name,
 		to_address,
-		subject);
+		subject,
+		headers);
 	if(header.empty())
 	{
 		return FALSE;
@@ -192,7 +199,8 @@ std::string LLMail::buildSMTPTransaction(
 	const char* from_address,
 	const char* to_name,
 	const char* to_address,
-	const char* subject)
+	const char* subject,
+	const LLSD& headers)
 {
 	if(!from_address || !to_address)
 	{
@@ -236,8 +244,20 @@ std::string LLMail::buildSMTPTransaction(
 		<< "DATA\r\n"
 		<< "From: " << from_fmt.str() << "\r\n"
 		<< "To: " << to_fmt.str() << "\r\n"
-		<< "Subject: " << subject << "\r\n"
-		<< "\r\n";
+		<< "Subject: " << subject << "\r\n";
+	
+	if(headers.isMap())
+	{
+		LLSD::map_const_iterator iter = headers.beginMap();
+		LLSD::map_const_iterator end = headers.endMap();
+		for(; iter != end; ++iter)
+		{
+			header << (*iter).first << ": " << ((*iter).second).asString()
+				<< "\r\n";
+		}
+	}
+
+	header << "\r\n";
 	return header.str();
 }
 
@@ -324,7 +344,7 @@ bool LLMail::send(
 			<< "when sending messages larger than " << LL_MAX_KNOWN_GOOD_MAIL_SIZE
 			<< " bytes. The next log about success is potentially a lie." << llendl;
 	}
-	llinfos << "send_mail success: "
+	lldebugs << "send_mail success: "
 		<< "to=<" << to_address
 		<< ">, from=<" << from_address << ">"
 		<< ", bytes=" << original_size
diff --git a/indra/llmessage/llmail.h b/indra/llmessage/llmail.h
index 86b7793..018e180 100644
--- a/indra/llmessage/llmail.h
+++ b/indra/llmessage/llmail.h
@@ -34,7 +34,7 @@
 
 typedef struct apr_pool_t apr_pool_t;
 
-class LLUUID;
+#include "llsd.h"
 
 class LLMail
 {
@@ -45,34 +45,51 @@ public:
 	// Allow all email transmission to be disabled/enabled.
 	static void enable(bool mail_enabled);
 
-	// returns TRUE if the call succeeds, FALSE otherwise.
-	//
-	// Results in:
-	// From: "from_name" <from_address>
-	// To:   "to_name" <to_address>
-	// Subject: subject
-	// message
-	static BOOL send(const char* from_name, const char* from_address,
-				const char* to_name, const char* to_address,
-				const char* subject, const char* message);
+	/**
+	 * @brief send an email
+	 * @param from_name The name of the email sender
+	 * @param from_address The email address for the sender
+	 * @param to_name The name of the email recipient
+	 * @param to_address The email recipient address
+	 * @param subject The subject of the email
+	 * @param headers optional X-Foo headers in an llsd map. 
+	 * @return Returns TRUE if the call succeeds, FALSE otherwise.
+	 *
+	 * Results in:
+	 * From: "from_name" <from_address>
+	 * To:   "to_name" <to_address>
+	 * Subject: subject
+	 * 
+	 * message
+	 */
+	static BOOL send(
+		const char* from_name,
+		const char* from_address,
+		const char* to_name,
+		const char* to_address,
+		const char* subject,
+		const char* message,
+		const LLSD& headers = LLSD());
 
 	/**
-	* @brief build the complete smtp transaction & header for use in an
-	* mail.
-	*
-	* @param from_name The name of the email sender
-	* @param from_address The email address for the sender
-	* @param to_name The name of the email recipient
-	* @param to_name The email recipient address
-	* @param subject The subject of the email
-	* @return Returns the complete SMTP transaction mail header.
-	*/
+	 * @brief build the complete smtp transaction & header for use in an
+	 * mail.
+	 *
+	 * @param from_name The name of the email sender
+	 * @param from_address The email address for the sender
+	 * @param to_name The name of the email recipient
+	 * @param to_address The email recipient address
+	 * @param subject The subject of the email
+	 * @param headers optional X-Foo headers in an llsd map. 
+	 * @return Returns the complete SMTP transaction mail header.
+	 */
 	static std::string buildSMTPTransaction(
 		const char* from_name,
 		const char* from_address,
 		const char* to_name,
 		const char* to_address,
-		const char* subject);
+		const char* subject,
+		const LLSD& headers = LLSD());
 
 	/**
 	* @brief send an email with header and body.
diff --git a/indra/llmessage/llmessagetemplate.cpp b/indra/llmessage/llmessagetemplate.cpp
index 4a560ca..ff44d45 100644
--- a/indra/llmessage/llmessagetemplate.cpp
+++ b/indra/llmessage/llmessagetemplate.cpp
@@ -50,7 +50,7 @@ void LLMsgVarData::addData(const void *data, S32 size, EMsgVariableType type, S3
 	}
 	if(size)
 	{
-		delete mData; // Delete it if it already exists
+		delete[] mData; // Delete it if it already exists
 		mData = new U8[size];
 		htonmemcpy(mData, data, mType, size);
 	}
@@ -175,3 +175,23 @@ std::ostream& operator<<(std::ostream& s, LLMessageTemplate &msg)
 
 	return s;
 }
+
+void LLMessageTemplate::banUdp()
+{
+	static const char* deprecation[] = {
+		"NotDeprecated",
+		"Deprecated",
+		"UDPDeprecated",
+		"UDPBlackListed"
+	};
+	if (mDeprecation != MD_DEPRECATED)
+	{
+		llinfos << "Setting " << mName << " to UDPBlackListed was " << deprecation[mDeprecation] << llendl;
+		mDeprecation = MD_UDPBLACKLISTED;
+	}
+	else
+	{
+		llinfos << mName << " is already more deprecated than UDPBlackListed" << llendl;
+	}
+}
+
diff --git a/indra/llmessage/llmessagetemplate.h b/indra/llmessage/llmessagetemplate.h
index 716c618..445d1a8 100644
--- a/indra/llmessage/llmessagetemplate.h
+++ b/indra/llmessage/llmessagetemplate.h
@@ -34,6 +34,7 @@
 
 #include "lldarray.h"
 #include "message.h" // TODO: babbage: Remove...
+#include "llstat.h"
 #include "llstl.h"
 
 class LLMsgVarData
@@ -370,20 +371,23 @@ public:
 	{
 		if (mHandlerFunc)
 		{
+            LLPerfBlock msg_cb_time("msg_cb", mName);
 			mHandlerFunc(msgsystem, mUserData);
 			return TRUE;
 		}
 		return FALSE;
 	}
 
-	bool isBanned(bool trustedSource) const
+	bool isUdpBanned() const
 	{
-		return trustedSource ? mBanFromTrusted : mBanFromUntrusted;
+		return mDeprecation == MD_UDPBLACKLISTED;
 	}
 
-	bool isUdpBanned() const
+	void banUdp();
+
+	bool isBanned(bool trustedSource) const
 	{
-		return mDeprecation == MD_UDPBLACKLISTED;
+		return trustedSource ? mBanFromTrusted : mBanFromUntrusted;
 	}
 
 	friend std::ostream&	 operator<<(std::ostream& s, LLMessageTemplate &msg);
diff --git a/indra/llmessage/llnamevalue.cpp b/indra/llmessage/llnamevalue.cpp
index c44f6ce..f661261 100644
--- a/indra/llmessage/llnamevalue.cpp
+++ b/indra/llmessage/llnamevalue.cpp
@@ -896,7 +896,7 @@ void LLNameValue::setVec3(const LLVector3 &a)
 }
 
 
-std::string LLNameValue::printNameValue()
+std::string LLNameValue::printNameValue() const
 {
 	std::string buffer;
 	buffer = llformat("%s %s %s %s ", mName, mStringType, mStringClass, mStringSendto);
@@ -905,7 +905,7 @@ std::string LLNameValue::printNameValue()
 	return buffer;
 }
 
-std::string LLNameValue::printData()
+std::string LLNameValue::printData() const
 {
 	std::string buffer;
 	switch(mType)
diff --git a/indra/llmessage/llnamevalue.h b/indra/llmessage/llnamevalue.h
index 52beb07..f6c5040 100644
--- a/indra/llmessage/llnamevalue.h
+++ b/indra/llmessage/llnamevalue.h
@@ -148,8 +148,8 @@ public:
 	BOOL			sendToViewer() const;
 
 	void			callCallback();
-	std::string		printNameValue();
-	std::string		printData();
+	std::string		printNameValue() const;
+	std::string		printData() const;
 	
 	ENameValueType		getTypeEnum() const		{ return mType; }
 	ENameValueClass		getClassEnum() const	{ return mClass; }
diff --git a/indra/llmessage/llpartdata.h b/indra/llmessage/llpartdata.h
index 82757ec..58a1fae 100644
--- a/indra/llmessage/llpartdata.h
+++ b/indra/llmessage/llpartdata.h
@@ -114,6 +114,7 @@ public:
 		//LL_PART_TRAIL_MASK =			0x400,		// Particles have historical "trails"
 
 		// Viewer side use only!
+		LL_PART_HUD =					0x40000000,
 		LL_PART_DEAD_MASK =				0x80000000,
 	};
 
diff --git a/indra/llmessage/llpumpio.cpp b/indra/llmessage/llpumpio.cpp
index c92612f..467502b 100644
--- a/indra/llmessage/llpumpio.cpp
+++ b/indra/llmessage/llpumpio.cpp
@@ -41,6 +41,7 @@
 #include "llapr.h"
 #include "llmemtype.h"
 #include "llstl.h"
+#include "llstat.h"
 
 // These should not be enabled in production, but they can be
 // intensely useful during development for finding certain kinds of
@@ -176,7 +177,8 @@ LLPumpIO::LLPumpIO(apr_pool_t* pool) :
 	mCurrentPool(NULL),
 	mCurrentPoolReallocCount(0),
 	mChainsMutex(NULL),
-	mCallbackMutex(NULL)
+	mCallbackMutex(NULL),
+	mCurrentChain(mRunningChains.end())
 {
 	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	initialize(pool);
@@ -269,6 +271,16 @@ bool LLPumpIO::setTimeoutSeconds(F32 timeout)
 	return true;
 }
 
+void LLPumpIO::adjustTimeoutSeconds(F32 delta)
+{
+	// If no chain is running, bail
+	if(mRunningChains.end() == mCurrentChain) 
+	{
+		return;
+	}
+	(*mCurrentChain).adjustTimeoutSeconds(delta);
+}
+
 static std::string events_2_string(apr_int16_t events)
 {
 	std::ostringstream ostr;
@@ -514,7 +526,10 @@ void LLPumpIO::pump(const S32& poll_timeout)
 		//llinfos << "polling" << llendl;
 		S32 count = 0;
 		S32 client_id = 0;
-		apr_pollset_poll(mPollset, poll_timeout, &count, &poll_fd);
+        {
+            LLPerfBlock polltime("pump_poll");
+            apr_pollset_poll(mPollset, poll_timeout, &count, &poll_fd);
+        }
 		PUMP_DEBUG;
 		for(S32 ii = 0; ii < count; ++ii)
 		{
@@ -1161,3 +1176,14 @@ void LLPumpIO::LLChainInfo::setTimeoutSeconds(F32 timeout)
 		mTimer.stop();
 	}
 }
+
+void LLPumpIO::LLChainInfo::adjustTimeoutSeconds(F32 delta)
+{
+	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
+	if(mTimer.getStarted())
+	{
+		F64 expiry = mTimer.expiresAt();
+		expiry += delta;
+		mTimer.setExpiryAt(expiry);
+	}
+}
diff --git a/indra/llmessage/llpumpio.h b/indra/llmessage/llpumpio.h
index d2392a3..daff723 100644
--- a/indra/llmessage/llpumpio.h
+++ b/indra/llmessage/llpumpio.h
@@ -166,6 +166,14 @@ public:
 	bool setTimeoutSeconds(F32 timeout);
 
 	/** 
+	 * @brief Adjust the timeout of the running chain.
+	 *
+	 * This method has no effect if there is no timeout on the chain.
+	 * @param delta The number of seconds to add to/remove from the timeout.
+	 */
+	void adjustTimeoutSeconds(F32 delta);
+
+	/** 
 	 * @brief Set up file descriptors for for the running chain.
 	 * @see rebuildPollset()
 	 *
@@ -349,6 +357,7 @@ protected:
 		// methods
 		LLChainInfo();
 		void setTimeoutSeconds(F32 timeout);
+		void adjustTimeoutSeconds(F32 delta);
 
 		// basic member data
 		bool mInit;
diff --git a/indra/llmessage/llqueryflags.h b/indra/llmessage/llqueryflags.h
index 1d8d500..6740d46 100644
--- a/indra/llmessage/llqueryflags.h
+++ b/indra/llmessage/llqueryflags.h
@@ -38,7 +38,7 @@
 const U32 DFQ_PEOPLE			= 0x1 << 0;
 const U32 DFQ_ONLINE			= 0x1 << 1;
 //const U32 DFQ_PLACES			= 0x1 << 2;
-const U32 DFQ_EVENTS			= 0x1 << 3;
+const U32 DFQ_EVENTS			= 0x1 << 3; // This is not set by the 1.21 viewer, but I don't know about older versions. JC
 const U32 DFQ_GROUPS			= 0x1 << 4;
 const U32 DFQ_DATE_EVENTS		= 0x1 << 5;
 
diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp
index ee62798..e561597 100644
--- a/indra/llmessage/llurlrequest.cpp
+++ b/indra/llmessage/llurlrequest.cpp
@@ -68,6 +68,7 @@ public:
 	LLChannelDescriptors mChannels;
 	U8* mLastRead;
 	U32 mBodyLimit;
+	S32 mByteAccumulator;
 	bool mIsBodyLimitSet;
 };
 
@@ -76,8 +77,8 @@ LLURLRequestDetail::LLURLRequestDetail() :
 	mResponseBuffer(NULL),
 	mLastRead(NULL),
 	mBodyLimit(0),
+	mByteAccumulator(0),
 	mIsBodyLimitSet(false)
-	
 {
 	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	mCurlRequest = new LLCurlEasyRequest();
@@ -264,8 +265,25 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
 		{
 			CURLcode result;
 			bool newmsg = mDetail->mCurlRequest->getResult(&result);
-			if (!newmsg)
+			if(!newmsg)
 			{
+				// we're still waiting or prcessing, check how many
+				// bytes we have accumulated.
+				const S32 MIN_ACCUMULATION = 100000;
+				if(pump && (mDetail->mByteAccumulator > MIN_ACCUMULATION))
+				{
+					// This is a pretty sloppy calculation, but this
+					// tries to make the gross assumption that if data
+					// is coming in at 56kb/s, then this transfer will
+					// probably succeed. So, if we're accumlated
+					// 100,000 bytes (MIN_ACCUMULATION) then let's
+					// give this client another 2s to complete.
+					const F32 TIMEOUT_ADJUSTMENT = 2.0f;
+					mDetail->mByteAccumulator = 0;
+					pump->adjustTimeoutSeconds(TIMEOUT_ADJUSTMENT);
+				}
+
+				// keep processing
 				break;
 			}
 
@@ -434,6 +452,7 @@ size_t LLURLRequest::downCallback(
 		req->mDetail->mChannels.out(),
 		(U8*)data,
 		bytes);
+	req->mDetail->mByteAccumulator += bytes;
 	return bytes;
 }
 
diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp
index b20731a..9ca7211 100644
--- a/indra/llmessage/message.cpp
+++ b/indra/llmessage/message.cpp
@@ -763,7 +763,7 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count )
 				clearReceiveState();
 				valid_packet = FALSE;
 			}
-			
+
 			if( valid_packet )
 			{
 				logValidMsg(cdp, host, recv_reliable, recv_resent, (BOOL)(acks>0) );
@@ -3956,22 +3956,27 @@ void LLMessageSystem::getString(const char *block, const char *var,
 				  blocknum);
 }
 
-S32	LLMessageSystem::getNumberOfBlocksFast(const char *blockname)
+BOOL	LLMessageSystem::has(const char *blockname) const
+{
+	return getNumberOfBlocks(blockname) > 0;
+}
+
+S32	LLMessageSystem::getNumberOfBlocksFast(const char *blockname) const
 {
 	return mMessageReader->getNumberOfBlocks(blockname);
 }
 
-S32	LLMessageSystem::getNumberOfBlocks(const char *blockname)
+S32	LLMessageSystem::getNumberOfBlocks(const char *blockname) const
 {
 	return getNumberOfBlocksFast(LLMessageStringTable::getInstance()->getString(blockname));
 }
 	
-S32	LLMessageSystem::getSizeFast(const char *blockname, const char *varname)
+S32	LLMessageSystem::getSizeFast(const char *blockname, const char *varname) const
 {
 	return mMessageReader->getSize(blockname, varname);
 }
 
-S32	LLMessageSystem::getSize(const char *blockname, const char *varname)
+S32	LLMessageSystem::getSize(const char *blockname, const char *varname) const
 {
 	return getSizeFast(LLMessageStringTable::getInstance()->getString(blockname), 
 					   LLMessageStringTable::getInstance()->getString(varname));
@@ -3979,13 +3984,13 @@ S32	LLMessageSystem::getSize(const char *blockname, const char *varname)
 	
 // size in bytes of variable length data
 S32	LLMessageSystem::getSizeFast(const char *blockname, S32 blocknum, 
-								 const char *varname)
+								 const char *varname) const
 {
 	return mMessageReader->getSize(blockname, blocknum, varname);
 }
 		
 S32	LLMessageSystem::getSize(const char *blockname, S32 blocknum, 
-							 const char *varname)
+							 const char *varname) const
 {
 	return getSizeFast(LLMessageStringTable::getInstance()->getString(blockname), blocknum, 
 					   LLMessageStringTable::getInstance()->getString(varname));
@@ -4021,3 +4026,18 @@ bool LLMessageSystem::checkAllMessages(S64 frame_count, LLPumpIO* http_pump)
 	http_pump->callback();
 	return (mPacketsIn - packetsIn) > 0;
 }
+
+void LLMessageSystem::banUdpMessage(const std::string& name)
+{
+	message_template_name_map_t::iterator itt = mMessageTemplates.find(
+		LLMessageStringTable::getInstance()->getString(name.c_str())
+		);
+	if(itt != mMessageTemplates.end())
+	{
+		itt->second->banUdp();
+	}
+	else
+	{
+		llwarns << "Attempted to ban an unknown message: " << name << "." << llendl;
+	}
+}
diff --git a/indra/llmessage/message.h b/indra/llmessage/message.h
index 8807521..b72aa9a 100644
--- a/indra/llmessage/message.h
+++ b/indra/llmessage/message.h
@@ -562,6 +562,9 @@ public:
 	/** Return false true if name is unknown or trusted */
 	bool isUntrustedMessage(const std::string& name) const;
 
+	// Change this message to be UDP black listed.
+	void banUdpMessage(const std::string& name);
+
 private:
 	// A list of the circuits that need to be sent DenyTrustedCircuit messages.
 	typedef std::set<LLHost> host_set_t;
@@ -591,13 +594,14 @@ public:
 	LLHost	findHost(const U32 circuit_code);
 	void	sanityCheck();
 
-	S32		getNumberOfBlocksFast(const char *blockname);
-	S32		getNumberOfBlocks(const char *blockname);
-	S32		getSizeFast(const char *blockname, const char *varname);
-	S32		getSize(const char *blockname, const char *varname);
+	BOOL	has(const char *blockname) const;
+	S32		getNumberOfBlocksFast(const char *blockname) const;
+	S32		getNumberOfBlocks(const char *blockname) const;
+	S32		getSizeFast(const char *blockname, const char *varname) const;
+	S32		getSize(const char *blockname, const char *varname) const;
 	S32		getSizeFast(const char *blockname, S32 blocknum, 
-						const char *varname); // size in bytes of data
-	S32		getSize(const char *blockname, S32 blocknum, const char *varname);
+						const char *varname) const; // size in bytes of data
+	S32		getSize(const char *blockname, S32 blocknum, const char *varname) const;
 
 	void	resetReceiveCounts();				// resets receive counts for all message types to 0
 	void	dumpReceiveCounts();				// dumps receive count for each message type to llinfos
diff --git a/indra/llprimitive/lltree_common.h b/indra/llprimitive/lltree_common.h
index b63e00a..4708c5f 100644
--- a/indra/llprimitive/lltree_common.h
+++ b/indra/llprimitive/lltree_common.h
@@ -36,6 +36,19 @@
 
 struct LLTree_gene_0 
 {
+	LLTree_gene_0()
+	:	scale(0),
+		branches(0),
+		twist(0),
+		droop(0),
+		species(0),
+		trunk_depth(0),
+		branch_thickness(0),
+		max_depth(0),
+		scale_step(0)
+	{
+	}
+
 	// 
 	//  The genome for a tree, species 0
 	// 
diff --git a/indra/llrender/llcubemap.cpp b/indra/llrender/llcubemap.cpp
index 563d616..878ae17 100644
--- a/indra/llrender/llcubemap.cpp
+++ b/indra/llrender/llcubemap.cpp
@@ -92,11 +92,11 @@ void LLCubeMap::initGL()
 			for (int i = 0; i < 6; i++)
 			{
 				mImages[i] = new LLImageGL(64, 64, 4, (use_cube_mipmaps? TRUE : FALSE));
-				mImages[i]->setTarget(mTargets[i], GL_TEXTURE_CUBE_MAP_ARB);
+				mImages[i]->setTarget(mTargets[i], LLTexUnit::TT_CUBE_MAP);
 				mRawImages[i] = new LLImageRaw(64, 64, 4);
 				mImages[i]->createGLTexture(0, mRawImages[i], texname);
 				
-				glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, texname);
+				gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_CUBE_MAP, texname); 
 				mImages[i]->setClampCubemap (TRUE, TRUE, TRUE);
 				stop_glerror();
 			}
@@ -180,26 +180,7 @@ GLuint LLCubeMap::getGLName()
 
 void LLCubeMap::bind()
 {
-	if (gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps)
-	{
-		// We assume that if they have cube mapping, they have multitexturing.
-		if (mTextureStage > 0)
-		{
-			gGL.getTexUnit(mTextureStage)->activate();
-		}
-		glEnable(GL_TEXTURE_CUBE_MAP_ARB);
-		glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, mImages[0]->getTexName());
-
-		mImages[0]->setMipFilterNearest (FALSE, FALSE);
-		if (mTextureStage > 0)
-		{
-			gGL.getTexUnit(0)->activate();
-		}
-	}
-	else
-	{
-		llwarns << "Using cube map without extension!" << llendl
-	}
+	gGL.getTexUnit(mTextureStage)->bind(this);
 }
 
 void LLCubeMap::enable(S32 stage)
@@ -213,17 +194,7 @@ void LLCubeMap::enableTexture(S32 stage)
 	mTextureStage = stage;
 	if (gGLManager.mHasCubeMap && stage >= 0 && LLCubeMap::sUseCubeMaps)
 	{
-		if (stage > 0)
-		{
-			gGL.getTexUnit(stage)->activate();
-		}
-		
-		glEnable(GL_TEXTURE_CUBE_MAP_ARB);
-		
-		if (stage > 0)
-		{
-			gGL.getTexUnit(0)->activate();
-		}
+		gGL.getTexUnit(stage)->enable(LLTexUnit::TT_CUBE_MAP);
 	}
 }
 
@@ -262,15 +233,10 @@ void LLCubeMap::disableTexture(void)
 {
 	if (gGLManager.mHasCubeMap && mTextureStage >= 0 && LLCubeMap::sUseCubeMaps)
 	{
-		if (mTextureStage > 0)
+		gGL.getTexUnit(mTextureStage)->disable();
+		if (mTextureStage == 0)
 		{
-			gGL.getTexUnit(mTextureStage)->activate();
-		}
-		glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0);
-		glDisable(GL_TEXTURE_CUBE_MAP_ARB);
-		if (mTextureStage > 0)
-		{
-			gGL.getTexUnit(0)->activate();
+			gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
 		}
 	}
 }
@@ -297,6 +263,8 @@ void LLCubeMap::setMatrix(S32 stage)
 {
 	mMatrixStage = stage;
 	
+	if (mMatrixStage < 0) return;
+	
 	if (stage > 0)
 	{
 		gGL.getTexUnit(stage)->activate();
@@ -324,6 +292,8 @@ void LLCubeMap::setMatrix(S32 stage)
 
 void LLCubeMap::restoreMatrix()
 {
+	if (mMatrixStage < 0) return;
+
 	if (mMatrixStage > 0)
 	{
 		gGL.getTexUnit(mMatrixStage)->activate();
@@ -340,7 +310,7 @@ void LLCubeMap::restoreMatrix()
 
 void LLCubeMap::setReflection (void)
 {
-	glBindTexture (GL_TEXTURE_CUBE_MAP_ARB, getGLName());
+	gGL.getTexUnit(mTextureStage)->bindManual(LLTexUnit::TT_CUBE_MAP, getGLName());
 	mImages[0]->setMipFilterNearest (FALSE, FALSE);
 	mImages[0]->setClampCubemap (TRUE, TRUE);
 }
diff --git a/indra/llrender/llcubemap.h b/indra/llrender/llcubemap.h
index 45bfa16..15ca7db 100644
--- a/indra/llrender/llcubemap.h
+++ b/indra/llrender/llcubemap.h
@@ -53,6 +53,7 @@ public:
 	
 	void enableTexture(S32 stage);
 	void enableTextureCoords(S32 stage);
+	S32	 getStage(void) { return mTextureStage; }
 	
 	void disable(void);
 	void disableTexture(void);
@@ -77,6 +78,7 @@ public:
 	static bool sUseCubeMaps;
 
 protected:
+	friend class LLTexUnit;
 	~LLCubeMap();
 	LLGLenum mTargets[6];
 	LLPointer<LLImageGL> mImages[6];
diff --git a/indra/llrender/llfont.cpp b/indra/llrender/llfont.cpp
index 4b5ee64..bcd0aca 100644
--- a/indra/llrender/llfont.cpp
+++ b/indra/llrender/llfont.cpp
@@ -92,18 +92,18 @@ LLFontManager::~LLFontManager()
 
 
 LLFontGlyphInfo::LLFontGlyphInfo(U32 index)
-{
-	mGlyphIndex = index;
-	mXBitmapOffset = 0; // Offset to the origin in the bitmap
-	mYBitmapOffset = 0; // Offset to the origin in the bitmap
-	mXBearing = 0;		// Distance from baseline to left in pixels
-	mYBearing = 0;		// Distance from baseline to top in pixels
-	mWidth = 0;			// In pixels
-	mHeight = 0;		// In pixels
-	mXAdvance = 0.f;	// In pixels
-	mYAdvance = 0.f;	// In pixels
-	mIsRendered = FALSE;
-}
+:	mGlyphIndex(index),
+	mXBitmapOffset(0), 	// Offset to the origin in the bitmap
+	mYBitmapOffset(0), 	// Offset to the origin in the bitmap
+	mXBearing(0),		// Distance from baseline to left in pixels
+	mYBearing(0),		// Distance from baseline to top in pixels
+	mWidth(0),			// In pixels
+	mHeight(0),			// In pixels
+	mXAdvance(0.f),		// In pixels
+	mYAdvance(0.f),		// In pixels
+	mIsRendered(FALSE),
+	mMetricsValid(FALSE)
+{}
 
 LLFontList::LLFontList()
 {
@@ -303,6 +303,9 @@ void LLFont::resetBitmap()
 		 iter != mCharGlyphInfoMap.end(); ++iter)
 	{
 		iter->second->mIsRendered = FALSE;
+		//FIXME: this is only strictly necessary when resetting the entire font, 
+		//not just flushing the bitmap
+		iter->second->mMetricsValid = FALSE;
 	}
 	mRawImagep->clear(255, 0);
 	mCurrentOffsetX = 1;
@@ -439,6 +442,7 @@ BOOL LLFont::addGlyphFromFont(LLFont *fontp, const llwchar wch, const U32 glyph_
 	gi->mXAdvance = fontp->mFTFace->glyph->advance.x / 64.f;
 	gi->mYAdvance = fontp->mFTFace->glyph->advance.y / 64.f;
 	gi->mIsRendered = TRUE;
+	gi->mMetricsValid = TRUE;
 
 	insertGlyphInfo(wch, gi);
 
@@ -528,7 +532,7 @@ F32 LLFont::getXAdvance(const llwchar wch) const
 
 	// Return existing info only if it is current
 	LLFontGlyphInfo* gi = getGlyphInfo(wch);
-	if (gi && gi->mIsRendered)
+	if (gi && gi->mMetricsValid)
 	{
 		return gi->mXAdvance;
 	}
@@ -573,6 +577,7 @@ F32 LLFont::getXAdvance(const llwchar wch) const
 		// Convert these from 26.6 units to float pixels.
 		gi->mXAdvance = fontp->mFTFace->glyph->advance.x / 64.f;
 		gi->mYAdvance = fontp->mFTFace->glyph->advance.y / 64.f;
+		gi->mMetricsValid = TRUE;
 		return gi->mXAdvance;
 	}
 	else
diff --git a/indra/llrender/llfont.h b/indra/llrender/llfont.h
index d937dfd..2054832 100644
--- a/indra/llrender/llfont.h
+++ b/indra/llrender/llfont.h
@@ -72,6 +72,7 @@ public:
 	S32 mHeight;		// In pixels
 	F32 mXAdvance;		// In pixels
 	F32 mYAdvance;		// In pixels
+	BOOL mMetricsValid; // We have up-to-date metrics for this glyph
 
 	// Information for actually rendering
 	BOOL mIsRendered;	// We actually have rendered this glyph
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index a328196..2705516 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -148,7 +148,7 @@ void LLFontGL::init()
 	{
 		mImageGLp = new LLImageGL(FALSE);
 		//RN: use nearest mipmap filtering to obviate the need to do pixel-accurate positioning
-		mImageGLp->bind();
+		gGL.getTexUnit(0)->bind(mImageGLp);
 		// we allow bilinear filtering to get sub-pixel positioning for drop shadows
 		//mImageGLp->setMipFilterNearest(TRUE, TRUE);
 	}
@@ -533,7 +533,7 @@ BOOL LLFontGL::loadFace(const std::string& filename,
 		return FALSE;
 	}
 	mImageGLp->createGLTexture(0, mRawImageGLp);
-	mImageGLp->bind();
+	gGL.getTexUnit(0)->bind(mImageGLp);
 	mImageGLp->setMipFilterNearest(TRUE, TRUE);
 	return TRUE;
 }
@@ -547,7 +547,7 @@ BOOL LLFontGL::addChar(const llwchar wch)
 
 	stop_glerror();
 	mImageGLp->setSubImage(mRawImageGLp, 0, 0, mImageGLp->getWidth(), mImageGLp->getHeight());
-	mImageGLp->bind();
+	gGL.getTexUnit(0)->bind(mImageGLp);
 	mImageGLp->setMipFilterNearest(TRUE, TRUE);
 	stop_glerror();
 	return TRUE;
@@ -583,7 +583,7 @@ S32 LLFontGL::render(const LLWString &wstr,
 		return wstr.length() ;
 	}
 
-	LLGLEnable tex(GL_TEXTURE_2D);
+	gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
 
 	if (wstr.empty())
 	{
@@ -663,7 +663,7 @@ S32 LLFontGL::render(const LLWString &wstr,
 
 	// Bind the font texture
 	
-	mImageGLp->bind(0);
+	gGL.getTexUnit(0)->bind(mImageGLp);
 	
  	// Not guaranteed to be set correctly
 	gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -761,7 +761,7 @@ S32 LLFontGL::render(const LLWString &wstr,
 				break;
 			}
 
-			ext_image->bind();
+			gGL.getTexUnit(0)->bind(ext_image);
 			const F32 ext_x = cur_render_x + (EXT_X_BEARING * sScaleX);
 			const F32 ext_y = cur_render_y + (EXT_Y_BEARING * sScaleY + mAscender - mLineHeight);
 
@@ -795,7 +795,7 @@ S32 LLFontGL::render(const LLWString &wstr,
 			cur_render_x = cur_x;
 
 			// Bind the font texture
-			mImageGLp->bind();
+			gGL.getTexUnit(0)->bind(mImageGLp);
 		}
 		else
 		{
@@ -863,8 +863,8 @@ S32 LLFontGL::render(const LLWString &wstr,
 
 	if (style & UNDERLINE)
 	{
-		LLGLSNoTexture no_texture;
-		gGL.begin(LLVertexBuffer::LINES);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+		gGL.begin(LLRender::LINES);
 		gGL.vertex2f(start_x, cur_y - (mDescender));
 		gGL.vertex2f(cur_x, cur_y - (mDescender));
 		gGL.end();
@@ -1359,7 +1359,7 @@ void LLFontGL::drawGlyph(const LLRectf& screen_rect, const LLRectf& uv_rect, con
 	F32 slant_offset;
 	slant_offset = ((style & ITALIC) ? ( -mAscender * 0.2f) : 0.f);
 
-	gGL.begin(LLVertexBuffer::QUADS);
+	gGL.begin(LLRender::QUADS);
 	{
 		//FIXME: bold and drop shadow are mutually exclusive only for convenience
 		//Allow both when we need them.
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 843bc79..67d258e 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -263,7 +263,6 @@ LLGLManager::LLGLManager() :
 	mHasMultitexture(FALSE),
 	mNumTextureUnits(1),
 	mHasMipMapGeneration(FALSE),
-	mHasPalettedTextures(FALSE),
 	mHasCompressedTextures(FALSE),
 	mHasFramebufferObject(FALSE),
 
@@ -566,7 +565,6 @@ void LLGLManager::initExtensions()
 	mHasFramebufferObject = FALSE;
 # endif
 	mHasMipMapGeneration = FALSE;
-	mHasPalettedTextures = FALSE;
 	mHasSeparateSpecularColor = FALSE;
 	mHasAnisotropic = FALSE;
 	mHasCubeMap = FALSE;
@@ -578,7 +576,6 @@ void LLGLManager::initExtensions()
 #else // LL_MESA_HEADLESS
 	mHasMultitexture = glh_init_extensions("GL_ARB_multitexture");
 	mHasMipMapGeneration = glh_init_extensions("GL_SGIS_generate_mipmap");
-	mHasPalettedTextures = glh_init_extension("GL_EXT_paletted_texture");
 	mHasSeparateSpecularColor = glh_init_extensions("GL_EXT_separate_specular_color");
 	mHasAnisotropic = glh_init_extensions("GL_EXT_texture_filter_anisotropic");
 	glh_init_extensions("GL_ARB_texture_cube_map");
@@ -610,7 +607,6 @@ void LLGLManager::initExtensions()
 		mHasVertexBufferObject = FALSE;
 		mHasFramebufferObject = FALSE;
 		mHasMipMapGeneration = FALSE;
-		mHasPalettedTextures = FALSE;
 		mHasSeparateSpecularColor = FALSE;
 		mHasAnisotropic = FALSE;
 		mHasCubeMap = FALSE;
@@ -628,7 +624,6 @@ void LLGLManager::initExtensions()
 		// bug reports.  This should be the default until we get a
 		// proper blacklist/whitelist on Linux.
 		mHasMipMapGeneration = FALSE;
-		mHasPalettedTextures = FALSE;
 		mHasAnisotropic = FALSE;
 		//mHasCubeMap = FALSE; // apparently fatal on Intel 915 & similar
 		//mHasOcclusionQuery = FALSE; // source of many ATI system hangs
@@ -648,7 +643,6 @@ void LLGLManager::initExtensions()
 		if (strchr(blacklist,'b')) mHasCompressedTextures = FALSE;
 		if (strchr(blacklist,'c')) mHasVertexBufferObject = FALSE;
 		if (strchr(blacklist,'d')) mHasMipMapGeneration = FALSE;//S
-		if (strchr(blacklist,'e')) mHasPalettedTextures = FALSE;//S
 // 		if (strchr(blacklist,'f')) mHasNVVertexArrayRange = FALSE;//S
 // 		if (strchr(blacklist,'g')) mHasNVFence = FALSE;//S
 		if (strchr(blacklist,'h')) mHasSeparateSpecularColor = FALSE;
@@ -663,13 +657,6 @@ void LLGLManager::initExtensions()
 		if (strchr(blacklist,'q')) mHasFramebufferObject = FALSE;//S
 	}
 #endif // LL_LINUX
-
-#if LL_DARWIN || LL_LINUX
-	// MBW -- 12/4/2003 -- Using paletted textures causes a bunch of avatar rendering problems on the Mac.
-	// Not sure if this is due to driver problems or incorrect use of the extension, but I'm disabling it for now.
-	// Tofu - 2006-10-03 -- Same problem on Linux.
-	mHasPalettedTextures = false;
-#endif
 	
 	if (!mHasMultitexture)
 	{
@@ -683,10 +670,6 @@ void LLGLManager::initExtensions()
 	{
 		LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_texture_env_combine" << LL_ENDL;
 	}
-	if (!mHasPalettedTextures)
-	{
-		LL_INFOS("RenderInit") << "Couldn't initialize GL_EXT_paletted_texture" << LL_ENDL;
-	}
 	if (!mHasSeparateSpecularColor)
 	{
 		LL_INFOS("RenderInit") << "Couldn't initialize separate specular color" << LL_ENDL;
@@ -788,13 +771,7 @@ void LLGLManager::initExtensions()
 		mGLMaxIndexRange = 0;
 	}
 #endif // !LL_LINUX
-#if LL_LINUX
-	// On Linux we need to get glColorTableEXT dynamically.
-	if (mHasPalettedTextures)
-	{
-		glColorTableEXT = (PFNGLCOLORTABLEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glColorTableEXT");
-	}
-#endif // LL_LINUX
+
 	if (mHasOcclusionQuery)
 	{
 		glGenQueriesARB = (PFNGLGENQUERIESARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGenQueriesARB");
@@ -960,7 +937,8 @@ void assert_glerror()
 		GLubyte const * gl_error_msg = gluErrorString(error);
 		if (NULL != gl_error_msg)
 		{
-			LL_WARNS("RenderState") << "GL Error:" << gl_error_msg << LL_ENDL;
+			LL_WARNS("RenderState") << "GL Error:" << error<< LL_ENDL;
+			LL_WARNS("RenderState") << "GL Error String:" << gl_error_msg << LL_ENDL;
 		}
 		else
 		{
@@ -1001,7 +979,7 @@ GLboolean LLGLDepthTest::sWriteEnabled = GL_TRUE; // OpenGL default
 void LLGLState::initClass() 
 {
 	sStateMap[GL_DITHER] = GL_TRUE;
-	sStateMap[GL_TEXTURE_2D] = GL_TRUE;
+	// sStateMap[GL_TEXTURE_2D] = GL_TRUE;
 
 	//make sure multisample defaults to disabled
 	sStateMap[GL_MULTISAMPLE_ARB] = GL_FALSE;
@@ -1030,7 +1008,7 @@ void LLGLState::resetTextureStates()
 	{
 		gGL.getTexUnit(j)->activate();
 		glClientActiveTextureARB(GL_TEXTURE0_ARB+j);
-		j == 0 ? glEnable(GL_TEXTURE_2D) : glDisable(GL_TEXTURE_2D);
+		j == 0 ? gGL.getTexUnit(j)->enable(LLTexUnit::TT_TEXTURE) : gGL.getTexUnit(j)->disable();
 	}
 }
 
@@ -1053,14 +1031,6 @@ void LLGLState::checkStates(const std::string& msg)
 
 	stop_glerror();
 
-	GLint activeTexture;
-	glGetIntegerv(GL_ACTIVE_TEXTURE_ARB, &activeTexture);
-	
-	if (activeTexture != GL_TEXTURE0_ARB)
-	{
-		LL_GL_ERRS << "Texture channel corrupted. " << LL_ENDL;
-	}
-	
 	GLint src;
 	GLint dst;
 	glGetIntegerv(GL_BLEND_SRC, &src);
@@ -1099,17 +1069,7 @@ void LLGLState::checkTextureChannels(const std::string& msg)
 	
 	BOOL error = FALSE;
 
-	if (activeTexture != GL_TEXTURE0_ARB)
-	{
-		error = TRUE;
- 		LL_WARNS("RenderState") << "Active texture channel corrupted. " << LL_ENDL;
-	}
-	else if (!glIsEnabled(GL_TEXTURE_2D))
-	{
-		error = TRUE;
-		LL_WARNS("RenderState") << "GL_TEXTURE_2D not enabled on texture channel 0." << LL_ENDL;
-	}
-	else 
+	if (activeTexture == GL_TEXTURE0_ARB)
 	{
 		GLint tex_env_mode = 0;
 
@@ -1152,7 +1112,7 @@ void LLGLState::checkTextureChannels(const std::string& msg)
 	LLMatrix4 identity;
 	LLMatrix4 matrix;
 
-	for (GLint i = 0; i < maxTextureUnits; i++)
+	for (GLint i = 1; i < maxTextureUnits; i++)
 	{
 		gGL.getTexUnit(i)->activate();
 		glClientActiveTextureARB(GL_TEXTURE0_ARB+i);
@@ -1459,16 +1419,6 @@ void set_binormals(const S32 index, const U32 stride,const LLVector3 *binormals)
 #endif
 }
 
-
-void set_palette(U8 *palette_data)
-{
-	if (gGLManager.mHasPalettedTextures)
-	{
-		glColorTableEXT(GL_TEXTURE_2D, GL_RGBA8, 256, GL_RGBA, GL_UNSIGNED_BYTE, palette_data);
-	}
-}
-
-
 void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific )
 {
 	// GL_VERSION returns a null-terminated string with the format: 
diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h
index cb368d7..8433348 100644
--- a/indra/llrender/llgl.h
+++ b/indra/llrender/llgl.h
@@ -74,7 +74,6 @@ public:
 	BOOL mHasMultitexture;
 	S32	 mNumTextureUnits;
 	BOOL mHasMipMapGeneration;
-	BOOL mHasPalettedTextures;
 	BOOL mHasCompressedTextures;
 	BOOL mHasFramebufferObject;
 
@@ -318,11 +317,11 @@ public:
 class LLGLNamePool
 {
 public:
-	typedef struct
+	struct NameEntry
 	{
 		GLuint name;
 		BOOL used;
-	} NameEntry;
+	};
 
 	struct CompareUsed
 	{
@@ -370,7 +369,6 @@ void disable_cloth_weights(const S32 index);
 void set_vertex_weights(const S32 index, const U32 stride, const F32 *weights);
 void set_vertex_clothing_weights(const S32 index, const U32 stride, const LLVector4 *weights);
 void set_binormals(const S32 index, const U32 stride, const LLVector3 *binormals);
-void set_palette(U8* palette_data);
 void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific );
 
 extern BOOL gClothRipple;
diff --git a/indra/llrender/llglimmediate.h b/indra/llrender/llglimmediate.h
index 2d7d768..cd2af8b 100644
--- a/indra/llrender/llglimmediate.h
+++ b/indra/llrender/llglimmediate.h
@@ -76,12 +76,12 @@ public:
 	void color3fv(const GLfloat* c);
 	void color4ubv(const GLubyte* c);
 	
-	typedef struct Vertex
+	typedef struct
 	{
 		GLfloat v[3];
 		GLubyte c[4];
 		GLfloat uv[2];
-	};
+	} Vertex;
 
 private:
 	U32 mCount;
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 26984e1..5d7375c 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -365,7 +365,7 @@ void LLGLSLShader::bindNoShader(void)
 	glUseProgramObjectARB(0);
 }
 
-S32 LLGLSLShader::enableTexture(S32 uniform, S32 mode)
+S32 LLGLSLShader::enableTexture(S32 uniform, LLTexUnit::eTextureType mode)
 {
 	if (uniform < 0 || uniform >= (S32)mTexture.size())
 	{
@@ -376,12 +376,12 @@ S32 LLGLSLShader::enableTexture(S32 uniform, S32 mode)
 	if (index != -1)
 	{
 		gGL.getTexUnit(index)->activate();
-		glEnable(mode);
+		gGL.getTexUnit(index)->enable(mode);
 	}
 	return index;
 }
 
-S32 LLGLSLShader::disableTexture(S32 uniform, S32 mode)
+S32 LLGLSLShader::disableTexture(S32 uniform, LLTexUnit::eTextureType mode)
 {
 	if (uniform < 0 || uniform >= (S32)mTexture.size())
 	{
@@ -392,7 +392,7 @@ S32 LLGLSLShader::disableTexture(S32 uniform, S32 mode)
 	if (index != -1)
 	{
 		gGL.getTexUnit(index)->activate();
-		glDisable(mode);
+		gGL.getTexUnit(index)->disable();
 	}
 	return index;
 }
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index 0fa8e41..cd787cc 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -33,6 +33,7 @@
 #define LL_LLGLSLSHADER_H
 
 #include "llgl.h"
+#include "llrender.h"
 
 class LLShaderFeatures
 {
@@ -111,8 +112,8 @@ public:
 	//if given texture uniform is active in the shader, 
 	//the corresponding channel will be active upon return
 	//returns channel texture is enabled in from [0-MAX)
-	S32 enableTexture(S32 uniform, S32 mode = GL_TEXTURE_2D);
-	S32 disableTexture(S32 uniform, S32 mode = GL_TEXTURE_2D); 
+	S32 enableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
+	S32 disableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE); 
 	
     BOOL link(BOOL suppress_errors = FALSE);
 	void bind();
diff --git a/indra/llrender/llglstates.h b/indra/llrender/llglstates.h
index e53640c..bb8b8df 100644
--- a/indra/llrender/llglstates.h
+++ b/indra/llrender/llglstates.h
@@ -87,13 +87,6 @@ public:
 	{ }
 };
 
-class LLGLSNoTexture 
-{
-public:
-	LLGLSNoTexture()
-	{ LLImageGL::unbindTexture(0); }
-};
-
 class LLGLSObjectSelect
 { 
 protected:
@@ -104,7 +97,7 @@ public:
 		: mBlend(GL_BLEND), mFog(GL_FOG), 
 		  mAlphaTest(GL_ALPHA_TEST),
 		  mCullFace(GL_CULL_FACE)
-	{ LLImageGL::unbindTexture(0); }
+	{ }
 };
 
 class LLGLSObjectSelectAlpha
@@ -143,17 +136,6 @@ public:
 	{}
 };
 
-class LLGLSNoTextureNoAlphaTest // : public LLGLSUIDefault
-{
-protected:
-	LLGLDisable mAlphaTest;
-public:
-	LLGLSNoTextureNoAlphaTest()
-		: mAlphaTest(GL_ALPHA_TEST)
-		  
-	{ LLImageGL::unbindTexture(0); }
-};
-
 //----------------------------------------------------------------------------
 
 class LLGLSFog
@@ -251,7 +233,7 @@ public:
 		mBlend(GL_BLEND),
 		mAlphaTest(GL_ALPHA_TEST)
 		
-	{ LLImageGL::unbindTexture(0); }
+	{ }
 };
 
 //----------------------------------------------------------------------------
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index a871758..d9b22c5 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -125,49 +125,6 @@ S32 LLImageGL::dataFormatComponents(S32 dataformat)
 //----------------------------------------------------------------------------
 
 // static
-void LLImageGL::bindExternalTexture(LLGLuint gl_name, S32 stage, LLGLenum bind_target )
-{
-	gGL.flush();
-	if (stage > 0)
-	{
-		gGL.getTexUnit(stage)->activate();
-	}
-	glBindTexture(bind_target, gl_name);
-	sCurrentBoundTextures[stage] = gl_name;
-	if (stage > 0)
-	{
-		gGL.getTexUnit(0)->activate();
-	}
-}
-
-// static
-void LLImageGL::unbindTexture(S32 stage, LLGLenum bind_target)
-{
-	// LLGLSLShader can return -1
-	if (stage >= 0)
-	{
-		gGL.flush();
-		if (stage > 0)
-		{
-			gGL.getTexUnit(stage)->activate();
-			glBindTexture(GL_TEXTURE_2D, 0);
-			gGL.getTexUnit(0)->activate();
-		}
-		else
-		{
-			glBindTexture(GL_TEXTURE_2D, 0);
-		}
-		sCurrentBoundTextures[stage] = 0;
-	}
-}
-
-// static (duplicated for speed and to avoid GL_TEXTURE_2D default argument which requires GL header dependency)
-void LLImageGL::unbindTexture(S32 stage)
-{
-	unbindTexture(stage, GL_TEXTURE_2D);
-}
-
-// static
 void LLImageGL::updateStats(F32 current_time)
 {
 	sLastFrameTime = current_time;
@@ -189,7 +146,7 @@ void LLImageGL::destroyGL(BOOL save_state)
 {
 	for (S32 stage = 0; stage < gGLManager.mNumTextureUnits; stage++)
 	{
-		LLImageGL::unbindTexture(stage, GL_TEXTURE_2D);
+		gGL.getTexUnit(stage)->unbind(LLTexUnit::TT_TEXTURE);
 	}
 	for (std::set<LLImageGL*>::iterator iter = sImageList.begin();
 		 iter != sImageList.end(); iter++)
@@ -284,6 +241,8 @@ LLImageGL::~LLImageGL()
 {
 	LLImageGL::cleanup();
 	sImageList.erase(this);
+	delete [] mPickMask;
+	mPickMask = NULL;
 	sCount--;
 }
 
@@ -293,11 +252,12 @@ void LLImageGL::init(BOOL usemipmaps)
 	mMissed				= FALSE;
 #endif
 
+	mPickMask		  = NULL;
 	mTextureMemory    = 0;
 	mLastBindTime     = 0.f;
 
 	mTarget			  = GL_TEXTURE_2D;
-	mBindTarget		  = GL_TEXTURE_2D;
+	mBindTarget		  = LLTexUnit::TT_TEXTURE;
 	mUseMipMaps		  = usemipmaps;
 	mHasMipMaps		  = FALSE;
 	mAutoGenMips	  = FALSE;
@@ -321,6 +281,8 @@ void LLImageGL::init(BOOL usemipmaps)
 	mFormatType = GL_UNSIGNED_BYTE;
 	mFormatSwapBytes = FALSE;
 	mHasExplicitFormat = FALSE;
+
+	mInitialized = true;
 }
 
 void LLImageGL::cleanup()
@@ -421,41 +383,14 @@ void LLImageGL::dump()
 
 //----------------------------------------------------------------------------
 
-BOOL LLImageGL::bindTextureInternal(const S32 stage) const
+void LLImageGL::updateBindStats(void) const
 {	
-	if (gGLManager.mIsDisabled)
-	{
-		llwarns << "Trying to bind a texture while GL is disabled!" << llendl;
-	}
-
-
-	if (sCurrentBoundTextures[stage] && sCurrentBoundTextures[stage] == mTexName)
-	{
-		// already set!
-		return TRUE;
-	}
-
 	if (mTexName != 0)
 	{
 #ifdef DEBUG_MISS
 		mMissed = ! getIsResident(TRUE);
 #endif
-
-		gGL.flush();
-		if (stage > 0)
-		{
-			gGL.getTexUnit(stage)->activate();
-		}
-	
-		glBindTexture(mBindTarget, mTexName);
-		sCurrentBoundTextures[stage] = mTexName;
 		sBindCount++;
-
-		if (stage > 0)
-		{
-			gGL.getTexUnit(0)->activate();
-		}
-		
 		if (mLastBindTime != sLastFrameTime)
 		{
 			// we haven't accounted for this texture yet this frame
@@ -463,38 +398,22 @@ BOOL LLImageGL::bindTextureInternal(const S32 stage) const
 			updateBoundTexMem(mTextureMemory);
 			mLastBindTime = sLastFrameTime;
 		}
-		
-		return TRUE;
-	}
-	else
-	{
-		gGL.flush();
-		if (stage > 0)
-		{
-			gGL.getTexUnit(stage)->activate();
-		}
-		glBindTexture(mBindTarget, 0);
-		if (stage > 0)
-		{
-			gGL.getTexUnit(0)->activate();
-		}
-		sCurrentBoundTextures[stage] = 0;
-		return FALSE;
 	}
 }
 
 //virtual
-BOOL LLImageGL::bind(const S32 stage) const
+bool LLImageGL::bindError(const S32 stage) const
 {
-	if (stage == -1)
-	{
-		return FALSE;
-	}
-	BOOL res = bindTextureInternal(stage);
-	//llassert(res);
-	return res;
+	return false;
+}
+
+//virtual
+bool LLImageGL::bindDefaultImage(const S32 stage) const
+{
+	return false;
 }
 
+
 void LLImageGL::setExplicitFormat( LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes )
 {
 	// Note: must be called before createTexture()
@@ -532,7 +451,7 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
 
 	{
 // 		LLFastTimer t2(LLFastTimer::FTM_TEMP2);
-		llverify(bindTextureInternal(0));
+		llverify(gGL.getTexUnit(0)->bind(this));
 	}
 	
 	if (mUseMipMaps)
@@ -569,7 +488,8 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
 					}
 						
 					glTexImage2D(mTarget, gl_level, mFormatInternal, w, h, 0, mFormatPrimary, GL_UNSIGNED_BYTE, (GLvoid*)data_in);
-					
+					updatePickMask(w, h, data_in);
+
 					if(mFormatSwapBytes)
 					{
 						glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);
@@ -585,7 +505,7 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
 		{
 			if (mAutoGenMips)
 			{
-				glTexParameteri(mBindTarget, GL_GENERATE_MIPMAP_SGIS, TRUE);
+				glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_GENERATE_MIPMAP_SGIS, TRUE);
 				stop_glerror();
 				{
 // 					LLFastTimer t2(LLFastTimer::FTM_TEMP4);
@@ -596,12 +516,17 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
 						stop_glerror();
 					}
 
+					S32 w = getWidth(mCurrentDiscardLevel);
+					S32 h = getHeight(mCurrentDiscardLevel);
+
 					glTexImage2D(mTarget, 0, mFormatInternal,
-								 getWidth(mCurrentDiscardLevel), getHeight(mCurrentDiscardLevel), 0,
+								 w, h, 0,
 								 mFormatPrimary, mFormatType,
 								 data_in);
 					stop_glerror();
 
+					updatePickMask(w, h, data_in);
+
 					if(mFormatSwapBytes)
 					{
 						glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);
@@ -651,6 +576,10 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
 
 						glTexImage2D(mTarget, m, mFormatInternal, w, h, 0, mFormatPrimary, mFormatType, cur_mip_data);
 						stop_glerror();
+						if (m == 0)
+						{
+							updatePickMask(w, h, cur_mip_data);
+						}
 
 						if(mFormatSwapBytes)
 						{
@@ -701,6 +630,8 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
 
 			glTexImage2D(mTarget, 0, mFormatInternal, w, h, 0,
 						 mFormatPrimary, mFormatType, (GLvoid *)data_in);
+			updatePickMask(w, h, data_in);
+
 			stop_glerror();
 
 			if(mFormatSwapBytes)
@@ -713,6 +644,7 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
 		mHasMipMaps = FALSE;
 	}
 	stop_glerror();
+	mInitialized = true;
 }
 
 BOOL LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height)
@@ -786,12 +718,10 @@ BOOL LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S3
 
 		datap += (y_pos * data_width + x_pos) * getComponents();
 		// Update the GL texture
-		BOOL res = bindTextureInternal(0);
+		BOOL res = gGL.getTexUnit(0)->bindManual(mBindTarget, mTexName);
 		if (!res) llerrs << "LLImageGL::setSubImage(): bindTexture failed" << llendl;
 		stop_glerror();
 
-		LLGLEnable tex( GL_TEXTURE_2D ); 
-
 		glTexSubImage2D(mTarget, 0, x_pos, y_pos, 
 						width, height, mFormatPrimary, mFormatType, datap);
 		stop_glerror();
@@ -804,6 +734,7 @@ BOOL LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S3
 
 		glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
 		stop_glerror();
+		mInitialized = true;
 	}
 	
 	return TRUE;
@@ -817,9 +748,10 @@ BOOL LLImageGL::setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S3
 // Copy sub image from frame buffer
 BOOL LLImageGL::setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_pos, S32 width, S32 height)
 {
-	if (bindTextureInternal(0))
+	if (gGL.getTexUnit(0)->bind(this))
 	{
 		glCopyTexSubImage2D(GL_TEXTURE_2D, 0, fb_x, fb_y, x_pos, y_pos, width, height);
+		mInitialized = true;
 		stop_glerror();
 		return TRUE;
 	}
@@ -919,9 +851,9 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_
 		stop_glerror();
 		{
 // 			LLFastTimer t1(LLFastTimer::FTM_TEMP6);
-			llverify(bindTextureInternal(0));
-			glTexParameteri(mBindTarget, GL_TEXTURE_BASE_LEVEL, 0);
-			glTexParameteri(mBindTarget, GL_TEXTURE_MAX_LEVEL,  mMaxDiscardLevel-discard_level);
+			llverify(gGL.getTexUnit(0)->bind(this));
+			glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_BASE_LEVEL, 0);
+			glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MAX_LEVEL,  mMaxDiscardLevel-discard_level);
 		}
 	}
 	if (!mTexName)
@@ -949,7 +881,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_
 	setMipFilterNearest(mMagFilterNearest);
 	
 	// things will break if we don't unbind after creation
-	unbindTexture(0, mBindTarget);
+	gGL.getTexUnit(0)->unbind(mBindTarget);
 	stop_glerror();
 
 	if (old_name != 0)
@@ -1050,8 +982,8 @@ BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre
 	S32 gl_discard = discard_level - mCurrentDiscardLevel;
 
 	//explicitly unbind texture 
-	LLImageGL::unbindTexture(0, mTarget);
-	llverify(bindTextureInternal(0));	
+	gGL.getTexUnit(0)->unbind(mBindTarget);
+	llverify(gGL.getTexUnit(0)->bind(this));	
 
 	if (gDebugGL)
 	{
@@ -1148,15 +1080,15 @@ BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre
 
 void LLImageGL::destroyGLTexture()
 {
-	stop_glerror();
-
 	if (mTexName != 0)
 	{
+		stop_glerror();
+
 		for (int i = 0; i < gGLManager.mNumTextureUnits; i++)
 		{
 			if (sCurrentBoundTextures[i] == mTexName)
 			{
-				unbindTexture(i, GL_TEXTURE_2D);
+				gGL.getTexUnit(i)->unbind(LLTexUnit::TT_TEXTURE);
 				stop_glerror();
 			}
 		}
@@ -1184,8 +1116,8 @@ void LLImageGL::glClamp (BOOL clamps, BOOL clampt)
 {
 	if (mTexName != 0)
 	{
-		glTexParameteri (mBindTarget, GL_TEXTURE_WRAP_S, clamps ? GL_CLAMP_TO_EDGE : GL_REPEAT);
-		glTexParameteri (mBindTarget, GL_TEXTURE_WRAP_T, clampt ? GL_CLAMP_TO_EDGE : GL_REPEAT);
+		glTexParameteri (LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_WRAP_S, clamps ? GL_CLAMP_TO_EDGE : GL_REPEAT);
+		glTexParameteri (LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_WRAP_T, clampt ? GL_CLAMP_TO_EDGE : GL_REPEAT);
 	}
 }
 
@@ -1223,23 +1155,23 @@ void LLImageGL::setMipFilterNearest(BOOL mag_nearest, BOOL min_nearest)
 	{
 		if (mMinFilterNearest)
 		{
-			glTexParameteri(mBindTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+			glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 		}
 		else if (mHasMipMaps)
 		{
-			glTexParameteri(mBindTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+			glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
 		}
 		else
 		{
-			glTexParameteri(mBindTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+			glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 		}
 		if (mMagFilterNearest)
 		{
-			glTexParameteri(mBindTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+			glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 		}
 		else 
 		{
-			glTexParameteri(mBindTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+			glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 		}
 		if (gGLManager.mHasAnisotropic)
 		{
@@ -1247,16 +1179,15 @@ void LLImageGL::setMipFilterNearest(BOOL mag_nearest, BOOL min_nearest)
 			{
 				F32 largest_anisotropy;
 				glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest_anisotropy);
-				glTexParameterf(mBindTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest_anisotropy);
+				glTexParameterf(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MAX_ANISOTROPY_EXT, largest_anisotropy);
 			}
 			else
 			{
-				glTexParameterf(mBindTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.f);
+				glTexParameterf(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.f);
 			}
 		}
-	}
-	
-	stop_glerror();
+		stop_glerror();
+	}	
 }
 
 BOOL LLImageGL::getIsResident(BOOL test_now)
@@ -1337,14 +1268,93 @@ BOOL LLImageGL::getBoundRecently() const
 	return (BOOL)(sLastFrameTime - mLastBindTime < MIN_TEXTURE_LIFETIME);
 }
 
-void LLImageGL::setTarget(const LLGLenum target, const LLGLenum bind_target)
+void LLImageGL::setTarget(const LLGLenum target, const LLTexUnit::eTextureType bind_target)
 {
 	mTarget = target;
 	mBindTarget = bind_target;
 }
 
+void LLImageGL::updatePickMask(S32 width, S32 height, const U8* data_in)
+{
+	if (mFormatType != GL_UNSIGNED_BYTE ||
+		mFormatPrimary != GL_RGBA)
+	{
+		//cannot generate a pick mask for this texture
+		delete [] mPickMask;
+		mPickMask = NULL;
+		return;
+	}
+
+	U32 pick_width = width/2;
+	U32 pick_height = height/2;
+
+	U32 size = llmax(pick_width, (U32) 1) * llmax(pick_height, (U32) 1);
+
+	size = size/8 + 1;
+
+	delete[] mPickMask;
+	mPickMask = new U8[size];
+
+	memset(mPickMask, 0, sizeof(U8) * size);
+
+	U32 pick_bit = 0;
+	
+	for (S32 y = 0; y < height; y += 2)
+	{
+		for (S32 x = 0; x < width; x += 2)
+		{
+			U8 alpha = data_in[(y*width+x)*4+3];
+
+			if (alpha > 32)
+			{
+				U32 pick_idx = pick_bit/8;
+				U32 pick_offset = pick_bit%8;
+				if (pick_idx >= size)
+				{
+					llerrs << "WTF?" << llendl;
+				}
+
+				mPickMask[pick_idx] |= 1 << pick_offset;
+			}
+			
+			++pick_bit;
+		}
+	}
+}
+
+BOOL LLImageGL::getMask(const LLVector2 &tc)
+{
+	BOOL res = TRUE;
+
+	if (mPickMask)
+	{
+		S32 width = getWidth()/2;
+		S32 height = getHeight()/2;
+
+		F32 u = tc.mV[0] - floorf(tc.mV[0]);
+		F32 v = tc.mV[1] - floorf(tc.mV[1]);
+
+		if (u < 0.f || u > 1.f ||
+		    v < 0.f || v > 1.f)
+		{
+			llerrs << "WTF?" << llendl;
+		}
+		
+		S32 x = (S32)(u * width);
+		S32 y = (S32)(v * height);
+
+		S32 idx = y*width+x;
+		S32 offset = idx%8;
+
+		res = mPickMask[idx/8] & (1 << offset) ? TRUE : FALSE;
+	}
+	
+	return res;
+}
+
 //----------------------------------------------------------------------------
 
+
 // Manual Mip Generation
 /*
 		S32 width = getWidth(discard_level);
diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h
index 3f231ee..dbe11da 100644
--- a/indra/llrender/llimagegl.h
+++ b/indra/llrender/llimagegl.h
@@ -37,6 +37,9 @@
 
 #include "llgltypes.h"
 #include "llmemory.h"
+#include "v2math.h"
+
+#include "llrender.h"
 
 //============================================================================
 
@@ -48,11 +51,7 @@ public:
 	static S32 dataFormatBytes(S32 dataformat, S32 width, S32 height);
 	static S32 dataFormatComponents(S32 dataformat);
 
-	// Wrapper for glBindTexture that keeps LLImageGL in sync.
-	// Usually you want stage = 0 and bind_target = GL_TEXTURE_2D
-	static void bindExternalTexture( LLGLuint gl_name, S32 stage, LLGLenum bind_target);
-	static void unbindTexture(S32 stage, LLGLenum target);
-	static void unbindTexture(S32 stage); // Uses GL_TEXTURE_2D (not a default arg to avoid gl.h dependency)
+	void updateBindStats(void) const;
 
 	// needs to be called every frame
 	static void updateStats(F32 current_time);
@@ -79,7 +78,6 @@ public:
 	
 protected:
 	virtual ~LLImageGL();
-	BOOL bindTextureInternal(const S32 stage = 0) const;
 
 private:
 	void glClamp (BOOL clamps, BOOL clampt);
@@ -87,7 +85,8 @@ private:
 
 public:
 	virtual void dump();	// debugging info to llinfos
-	virtual BOOL bind(const S32 stage = 0) const;
+	virtual bool bindError(const S32 stage = 0) const;
+	virtual bool bindDefaultImage(const S32 stage = 0) const;
 
 	void setSize(S32 width, S32 height, S32 ncomponents);
 
@@ -132,7 +131,11 @@ public:
 
 	BOOL getIsResident(BOOL test_now = FALSE); // not const
 
-	void setTarget(const LLGLenum target, const LLGLenum bind_target);
+	void setTarget(const LLGLenum target, const LLTexUnit::eTextureType bind_target);
+
+	LLTexUnit::eTextureType getTarget(void) const { return mBindTarget; }
+	bool isInitialized(void) const { return mInitialized; }
+	void setInitialized (bool initialized) { mInitialized = initialized; }
 
 	BOOL getUseMipMaps() const { return mUseMipMaps; }
 	void setUseMipMaps(BOOL usemips) { mUseMipMaps = usemips; }
@@ -141,6 +144,9 @@ public:
 
 	BOOL isValidForSculpt(S32 discard_level, S32 image_width, S32 image_height, S32 ncomponents) ;
 
+	void updatePickMask(S32 width, S32 height, const U8* data_in);
+	BOOL getMask(const LLVector2 &tc);
+
 protected:
 	void init(BOOL usemipmaps);
 	virtual void cleanup(); // Clean up the LLImageGL so it can be reinitialized.  Be careful when using this in derived class destructors
@@ -152,6 +158,7 @@ public:
 
 private:
 	LLPointer<LLImageRaw> mSaveData; // used for destroyGL/restoreGL
+	U8* mPickMask;  //downsampled bitmap approximation of alpha channel.  NULL if no alpha channel
 	S8 mUseMipMaps;
 	S8 mHasMipMaps;
 	S8 mHasExplicitFormat; // If false (default), GL format is f(mComponents)
@@ -159,7 +166,8 @@ private:
 	
 protected:
 	LLGLenum mTarget;		// Normally GL_TEXTURE2D, sometimes something else (ex. cube maps)
-	LLGLenum mBindTarget;	// NOrmally GL_TEXTURE2D, sometimes something else (ex. cube maps)
+	LLTexUnit::eTextureType mBindTarget;	// Normally TT_TEXTURE, sometimes something else (ex. cube maps)
+	bool mInitialized;
 
 	LLGLuint mTexName;
 
diff --git a/indra/llrender/llpostprocess.cpp b/indra/llrender/llpostprocess.cpp
index c884951..0f1ad5c 100644
--- a/indra/llrender/llpostprocess.cpp
+++ b/indra/llrender/llpostprocess.cpp
@@ -220,9 +220,9 @@ void LLPostProcess::applyColorFilterShader(void)
 	gPostColorFilterProgram.bind();
 
 	gGL.getTexUnit(0)->activate();
-	glEnable(GL_TEXTURE_RECTANGLE_ARB);	
+	gGL.getTexUnit(0)->enable(LLTexUnit::TT_RECT_TEXTURE);
 
-	glBindTexture(GL_TEXTURE_RECTANGLE_ARB, sceneRenderTexture);
+	gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_RECT_TEXTURE, sceneRenderTexture);
 
 	getShaderUniforms(colorFilterUniforms, gPostColorFilterProgram.mProgramObject);
 	glUniform1iARB(colorFilterUniforms["RenderTexture"], 0);
@@ -264,16 +264,16 @@ void LLPostProcess::applyNightVisionShader(void)
 	gPostNightVisionProgram.bind();
 
 	gGL.getTexUnit(0)->activate();
-	glEnable(GL_TEXTURE_RECTANGLE_ARB);	
+	gGL.getTexUnit(0)->enable(LLTexUnit::TT_RECT_TEXTURE);
 
 	getShaderUniforms(nightVisionUniforms, gPostNightVisionProgram.mProgramObject);
-	glBindTexture(GL_TEXTURE_RECTANGLE_ARB, sceneRenderTexture);
+	gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_RECT_TEXTURE, sceneRenderTexture);
 	glUniform1iARB(nightVisionUniforms["RenderTexture"], 0);
 
 	gGL.getTexUnit(1)->activate();
-	glEnable(GL_TEXTURE_2D);	
+	gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);	
 
-	glBindTexture(GL_TEXTURE_2D, noiseTexture);
+	gGL.getTexUnit(1)->bindManual(LLTexUnit::TT_TEXTURE, noiseTexture);
 	glUniform1iARB(nightVisionUniforms["NoiseTexture"], 1);
 
 	
@@ -373,7 +373,7 @@ void LLPostProcess::doEffects(void)
 
 void LLPostProcess::copyFrameBuffer(GLuint & texture, unsigned int width, unsigned int height)
 {
-	glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture);
+	gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_RECT_TEXTURE, texture);
 	glCopyTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, 0, 0, width, height, 0);
 }
 
@@ -487,7 +487,7 @@ void LLPostProcess::createTexture(GLuint & texture, unsigned int width, unsigned
 	std::vector<GLubyte> data(width * height * 4, 0);
 
 	glGenTextures(1, &texture);
-	glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture);
+	gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_RECT_TEXTURE, texture);
 	glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 4, width, height, 0,
 		GL_RGBA, GL_UNSIGNED_BYTE, &data[0]);
 	glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
@@ -509,7 +509,7 @@ void LLPostProcess::createNoiseTexture(GLuint & texture)
 			buffer[(i * NOISE_SIZE) + k] = (GLubyte)((double) rand() / ((double) RAND_MAX + 1.f) * 255.f);
 		}
 	}
-	glBindTexture(GL_TEXTURE_2D, texture);
+	gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, texture);
 	glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, NOISE_SIZE, NOISE_SIZE, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, &buffer[0]);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 7be06af..80fed06 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -32,7 +32,11 @@
 #include "linden_common.h"
 
 #include "llrender.h"
+
 #include "llvertexbuffer.h"
+#include "llcubemap.h"
+#include "llimagegl.h"
+#include "llrendertarget.h"
 
 LLRender gGL;
 
@@ -44,6 +48,20 @@ S32	gGLViewport[4];
 
 static const U32 LL_NUM_TEXTURE_LAYERS = 8; 
 
+static GLenum sGLTextureType[] =
+{
+	GL_TEXTURE_2D,
+	GL_TEXTURE_RECTANGLE_ARB,
+	GL_TEXTURE_CUBE_MAP_ARB
+};
+
+static GLint sGLAddressMode[] =
+{	
+	GL_REPEAT,
+	GL_MIRRORED_REPEAT,
+	GL_CLAMP_TO_EDGE
+};
+
 static GLenum sGLCompareFunc[] =
 {
 	GL_NEVER,
@@ -72,82 +90,217 @@ static GLenum sGLBlendFactor[] =
 	GL_ONE_MINUS_SRC_ALPHA
 };
 
-LLTexUnit::LLTexUnit(U32 index)
-: mIsEnabled(false), mCurrBlendType(TB_MULT), 
+LLTexUnit::LLTexUnit(S32 index)
+: mCurrTexType(TT_NONE), mCurrBlendType(TB_MULT), 
 mCurrColorOp(TBO_MULT), mCurrAlphaOp(TBO_MULT),
 mCurrColorSrc1(TBS_TEX_COLOR), mCurrColorSrc2(TBS_PREV_COLOR),
 mCurrAlphaSrc1(TBS_TEX_ALPHA), mCurrAlphaSrc2(TBS_PREV_ALPHA),
-mCurrColorScale(1), mCurrAlphaScale(1)
+mCurrColorScale(1), mCurrAlphaScale(1), mCurrTexture(0)
 {
 	llassert_always(index < LL_NUM_TEXTURE_LAYERS);
 	mIndex = index;
 }
 
-U32 LLTexUnit::getIndex(void)
+//static
+U32 LLTexUnit::getInternalType(eTextureType type)
 {
-	return mIndex;
+	return sGLTextureType[type];
 }
 
-void LLTexUnit::enable(void)
+void LLTexUnit::refreshState(void)
 {
-	if (!mIsEnabled)
+	// We set dirty to true so that the tex unit knows to ignore caching
+	// and we reset the cached tex unit state
+
+	glActiveTextureARB(GL_TEXTURE0_ARB + mIndex);
+	if (mCurrTexType != TT_NONE)
 	{
-		activate();
-		glEnable(GL_TEXTURE_2D);
-		mIsEnabled = true;
+		glEnable(sGLTextureType[mCurrTexType]);
+		glBindTexture(sGLTextureType[mCurrTexType], mCurrTexture);
 	}
-}
-
-void LLTexUnit::disable(void)
-{
-	if (mIsEnabled)
+	else
 	{
-		activate();
 		glDisable(GL_TEXTURE_2D);
-		mIsEnabled = false;
+		glBindTexture(GL_TEXTURE_2D, 0);	
+	}
+
+	if (mCurrBlendType != TB_COMBINE)
+	{
+		setTextureBlendType(mCurrBlendType);
+	}
+	else
+	{
+		setTextureCombiner(mCurrColorOp, mCurrColorSrc1, mCurrColorSrc2, false);
+		setTextureCombiner(mCurrAlphaOp, mCurrAlphaSrc1, mCurrAlphaSrc2, true);
 	}
 }
 
 void LLTexUnit::activate(void)
 {
-	//if (gGL.mCurrTextureUnitIndex != mIndex)
+	if (mIndex < 0) return;
+
+	if (gGL.mCurrTextureUnitIndex != mIndex || gGL.mDirty)
 	{
 		glActiveTextureARB(GL_TEXTURE0_ARB + mIndex);
 		gGL.mCurrTextureUnitIndex = mIndex;
 	}
 }
 
-// Useful for debugging that you've manually assigned a texture operation to the correct 
-// texture unit based on the currently set active texture in opengl.
-void LLTexUnit::debugTextureUnit(void)
+void LLTexUnit::enable(eTextureType type)
 {
-	GLint activeTexture;
-	glGetIntegerv(GL_ACTIVE_TEXTURE_ARB, &activeTexture);
-	if ((GL_TEXTURE0_ARB + mIndex) != activeTexture)
+	if (mIndex < 0) return;
+
+	if ( (mCurrTexType != type || gGL.mDirty) && (type != TT_NONE) )
+	{
+		activate();
+		if (mCurrTexType != TT_NONE && !gGL.mDirty)
+		{
+			disable(); // Force a disable of a previous texture type if it's enabled.
+		}
+		mCurrTexType = type;
+		glEnable(sGLTextureType[type]);
+	}
+}
+
+void LLTexUnit::disable(void)
+{
+	if (mIndex < 0) return;
+
+	if (mCurrTexType != TT_NONE)
 	{
-		llerrs << "Incorrect Texture Unit!  Expected: " << (activeTexture - GL_TEXTURE0_ARB) << " Actual: " << mIndex << llendl;
+		activate();
+		unbind(mCurrTexType);
+		glDisable(sGLTextureType[mCurrTexType]);
+		mCurrTexType = TT_NONE;
 	}
 }
 
-void LLTexUnit::bindTexture(const LLImageGL* texture)
+bool LLTexUnit::bind(const LLImageGL* texture)
 {
+	if (mIndex < 0) return false;
+
+	gGL.flush();
+
+	if (texture == NULL)
+	{
+		return texture->bindError(mIndex);
+	}
+
+	if (!texture->isInitialized())
+	{
+		return texture->bindDefaultImage(mIndex);
+	}
+
+	// Disabled caching of binding state.
 	if (texture != NULL)
 	{
 		activate();
-		texture->bind(mIndex);
+		enable(texture->getTarget());
+		mCurrTexture = texture->getTexName();
+		glBindTexture(sGLTextureType[texture->getTarget()], mCurrTexture);
+		texture->updateBindStats();
+		return true;
 	}
+	return false;
 }
 
-void LLTexUnit::unbindTexture(void)
+bool LLTexUnit::bind(LLCubeMap* cubeMap)
 {
+	if (mIndex < 0) return false;
+
+	gGL.flush();
+
+	// Disabled caching of binding state.
+	if (cubeMap != NULL)
+	{
+		if (gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps)
+		{
+			activate();
+			enable(LLTexUnit::TT_CUBE_MAP);
+			mCurrTexture = cubeMap->mImages[0]->getTexName();
+			glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, mCurrTexture);
+			cubeMap->mImages[0]->updateBindStats();
+			cubeMap->mImages[0]->setMipFilterNearest (FALSE, FALSE);
+			return true;
+		}
+		else
+		{
+			llwarns << "Using cube map without extension!" << llendl
+		}
+	}
+	return false;
+}
+
+bool LLTexUnit::bind(LLRenderTarget* renderTarget, bool bindDepth)
+{
+	if (mIndex < 0) return false;
+
+	gGL.flush();
+
+	if (bindDepth)
+	{
+		bindManual(renderTarget->getUsage(), renderTarget->getDepth());
+	}
+	else
+	{
+		bindManual(renderTarget->getUsage(), renderTarget->getTexture());
+	}
+
+	return true;
+}
+
+bool LLTexUnit::bindManual(eTextureType type, U32 texture)
+{
+	if (mIndex < 0) return false;
+
+	// Disabled caching of binding state.
+	gGL.flush();
+	
 	activate();
-	glBindTexture(GL_TEXTURE_2D, 0);
+	enable(type);
+	mCurrTexture = texture;
+	glBindTexture(sGLTextureType[type], texture);
+	return true;
+}
+
+void LLTexUnit::unbind(eTextureType type)
+{
+	if (mIndex < 0) return;
+
+	// Disabled caching of binding state.
+	if (mCurrTexType == type)
+	{
+		gGL.flush();
+
+		activate();
+		mCurrTexture = 0;
+		glBindTexture(sGLTextureType[type], 0);
+	}
+}
+
+void LLTexUnit::setTextureAddressMode(eTextureAddressMode mode)
+{
+	if (mIndex < 0) return;
+
+	if (true)
+	{
+		activate();
+
+		glTexParameteri (sGLTextureType[mCurrTexType], GL_TEXTURE_WRAP_S, sGLAddressMode[mode]);
+		glTexParameteri (sGLTextureType[mCurrTexType], GL_TEXTURE_WRAP_T, sGLAddressMode[mode]);
+		if (mCurrTexType == TT_CUBE_MAP)
+		{
+			glTexParameteri (GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_R, sGLAddressMode[mode]);
+		}
+	}
 }
 
 void LLTexUnit::setTextureBlendType(eTextureBlendType type)
 {
+	if (mIndex < 0) return;
+
 	// Do nothing if it's already correctly set.
-	if (mCurrBlendType == type)
+	if (mCurrBlendType == type && !gGL.mDirty)
 	{
 		return;
 	}
@@ -262,16 +415,18 @@ GLint LLTexUnit::getTextureSourceType(eTextureBlendSrc src, bool isAlpha)
 
 void LLTexUnit::setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eTextureBlendSrc src2, bool isAlpha)
 {
+	if (mIndex < 0) return;
+
 	activate();
-	if (mCurrBlendType != TB_COMBINE)
+	if (mCurrBlendType != TB_COMBINE || gGL.mDirty)
 	{
 		mCurrBlendType = TB_COMBINE;
 		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
 	}
 
 	// We want an early out, because this function does a LOT of stuff.
-	if ( (isAlpha && (mCurrAlphaOp == op) && (mCurrAlphaSrc1 == src1) && (mCurrAlphaSrc2 == src2) )
-		|| (!isAlpha && (mCurrColorOp == op) && (mCurrColorSrc1 == src1) && (mCurrColorSrc2 == src2) ))
+	if ( ( (isAlpha && (mCurrAlphaOp == op) && (mCurrAlphaSrc1 == src1) && (mCurrAlphaSrc2 == src2))
+			|| (!isAlpha && (mCurrColorOp == op) && (mCurrColorSrc1 == src1) && (mCurrColorSrc2 == src2)) ) && !gGL.mDirty)
 	{
 		return;
 	}
@@ -304,7 +459,7 @@ void LLTexUnit::setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eT
 	}
 	else 
 	{
-		// Set enums to ALPHA ones
+		// Set enums to RGB ones
 		comb_enum = GL_COMBINE_RGB_ARB;
 		src0_enum = GL_SOURCE0_RGB_ARB;
 		src1_enum = GL_SOURCE1_RGB_ARB;
@@ -405,7 +560,7 @@ void LLTexUnit::setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eT
 
 void LLTexUnit::setColorScale(S32 scale)
 {
-	if (mCurrColorScale != scale)
+	if (mCurrColorScale != scale || gGL.mDirty)
 	{
 		mCurrColorScale = scale;
 		glTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE, scale );
@@ -414,27 +569,52 @@ void LLTexUnit::setColorScale(S32 scale)
 
 void LLTexUnit::setAlphaScale(S32 scale)
 {
-	if (mCurrAlphaScale != scale)
+	if (mCurrAlphaScale != scale || gGL.mDirty)
 	{
 		mCurrAlphaScale = scale;
 		glTexEnvi( GL_TEXTURE_ENV, GL_ALPHA_SCALE, scale );
 	}
 }
 
+// Useful for debugging that you've manually assigned a texture operation to the correct 
+// texture unit based on the currently set active texture in opengl.
+void LLTexUnit::debugTextureUnit(void)
+{
+	if (mIndex < 0) return;
+
+	GLint activeTexture;
+	glGetIntegerv(GL_ACTIVE_TEXTURE_ARB, &activeTexture);
+	if ((GL_TEXTURE0_ARB + mIndex) != activeTexture)
+	{
+		U32 set_unit = (activeTexture - GL_TEXTURE0_ARB);
+		llwarns << "Incorrect Texture Unit!  Expected: " << set_unit << " Actual: " << mIndex << llendl;
+	}
+}
+
+
 LLRender::LLRender()
+: mDirty(false), mCount(0), mMode(LLRender::TRIANGLES)
 {
-	mCount = 0;
-	mMode = LLVertexBuffer::TRIANGLES;
 	mBuffer = new LLVertexBuffer(immediate_mask, 0);
 	mBuffer->allocateBuffer(4096, 0, TRUE);
 	mBuffer->getVertexStrider(mVerticesp);
 	mBuffer->getTexCoordStrider(mTexcoordsp);
 	mBuffer->getColorStrider(mColorsp);
-
-	for (unsigned int i = 0; i < LL_NUM_TEXTURE_LAYERS; i++)
+	
+	mTexUnits.reserve(LL_NUM_TEXTURE_LAYERS);
+	for (U32 i = 0; i < LL_NUM_TEXTURE_LAYERS; i++)
 	{
 		mTexUnits.push_back(new LLTexUnit(i));
 	}
+	mDummyTexUnit = new LLTexUnit(-1);
+
+	for (U32 i = 0; i < 4; i++)
+	{
+		mCurrColorMask[i] = true;
+	}
+
+	mCurrAlphaFunc = CF_DEFAULT;
+	mCurrAlphaFuncVal = 0.01f;
 }
 
 LLRender::~LLRender()
@@ -449,6 +629,28 @@ void LLRender::shutdown()
 		delete mTexUnits[i];
 	}
 	mTexUnits.clear();
+	delete mDummyTexUnit;
+	mDummyTexUnit = NULL;
+}
+
+void LLRender::refreshState(void)
+{
+	mDirty = true;
+
+	U32 active_unit = mCurrTextureUnitIndex;
+
+	for (U32 i = 0; i < mTexUnits.size(); i++)
+	{
+		mTexUnits[i]->refreshState();
+	}
+	
+	mTexUnits[active_unit]->activate();
+
+	setColorMask(mCurrColorMask[0], mCurrColorMask[1], mCurrColorMask[2], mCurrColorMask[3]);
+	
+	setAlphaRejectSettings(mCurrAlphaFunc, mCurrAlphaFuncVal);
+
+	mDirty = false;
 }
 
 void LLRender::translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z)
@@ -483,6 +685,12 @@ void LLRender::setColorMask(bool writeColor, bool writeAlpha)
 void LLRender::setColorMask(bool writeColorR, bool writeColorG, bool writeColorB, bool writeAlpha)
 {
 	flush();
+
+	mCurrColorMask[0] = writeColorR;
+	mCurrColorMask[1] = writeColorG;
+	mCurrColorMask[2] = writeColorB;
+	mCurrColorMask[3] = writeAlpha;
+
 	glColorMask(writeColorR, writeColorG, writeColorB, writeAlpha);
 }
 
@@ -518,6 +726,9 @@ void LLRender::setSceneBlendType(eBlendType type)
 void LLRender::setAlphaRejectSettings(eCompareFunc func, F32 value)
 {
 	flush();
+
+	mCurrAlphaFunc = func;
+	mCurrAlphaFuncVal = value;
 	if (func == CF_DEFAULT)
 	{
 		glAlphaFunc(GL_GREATER, 0.01f);
@@ -536,22 +747,38 @@ void LLRender::blendFunc(eBlendFactor sfactor, eBlendFactor dfactor)
 
 LLTexUnit* LLRender::getTexUnit(U32 index)
 {
-	if (index < mTexUnits.size())
+	if ((index >= 0) && (index < mTexUnits.size()))
 	{
 		return mTexUnits[index];
 	}
-	llerrs << "Non-existing texture unit layer requested: " << index << llendl;
-	return NULL;
+	else 
+	{
+		lldebugs << "Non-existing texture unit layer requested: " << index << llendl;
+		return mDummyTexUnit;
+	}
+}
+
+bool LLRender::verifyTexUnitActive(U32 unitToVerify)
+{
+	if (mCurrTextureUnitIndex == unitToVerify)
+	{
+		return true;
+	}
+	else 
+	{
+		llwarns << "TexUnit currently active: " << mCurrTextureUnitIndex << " (expecting " << unitToVerify << ")" << llendl;
+		return false;
+	}
 }
 
 void LLRender::begin(const GLuint& mode)
 {
 	if (mode != mMode)
 	{
-		if (mMode == LLVertexBuffer::QUADS ||
-			mMode == LLVertexBuffer::LINES ||
-			mMode == LLVertexBuffer::TRIANGLES ||
-			mMode == LLVertexBuffer::POINTS)
+		if (mMode == LLRender::QUADS ||
+			mMode == LLRender::LINES ||
+			mMode == LLRender::TRIANGLES ||
+			mMode == LLRender::POINTS)
 		{
 			flush();
 		}
@@ -572,10 +799,10 @@ void LLRender::end()
 		//IMM_ERRS << "GL begin and end called with no vertices specified." << llendl;
 	}
 
-	if ((mMode != LLVertexBuffer::QUADS && 
-		mMode != LLVertexBuffer::LINES &&
-		mMode != LLVertexBuffer::TRIANGLES &&
-		mMode != LLVertexBuffer::POINTS) ||
+	if ((mMode != LLRender::QUADS && 
+		mMode != LLRender::LINES &&
+		mMode != LLRender::TRIANGLES &&
+		mMode != LLRender::POINTS) ||
 		mCount > 2048)
 	{
 		flush();
@@ -638,7 +865,8 @@ void LLRender::flush()
 }
 void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)
 { 
-	if (mCount >= 4096)
+	//the range of mVerticesp, mColorsp and mTexcoordsp is [0, 4095]
+	if (mCount > 4094)
 	{
 	//	llwarns << "GL immediate mode overflow.  Some geometry not drawn." << llendl;
 		return;
@@ -720,3 +948,35 @@ void LLRender::color3fv(const GLfloat* c)
 	color4f(c[0],c[1],c[2],1);
 }
 
+void LLRender::debugTexUnits(void)
+{
+	LL_INFOS("TextureUnit") << "Active TexUnit: " << mCurrTextureUnitIndex << LL_ENDL;
+	std::string active_enabled = "false";
+	for (U32 i = 0; i < mTexUnits.size(); i++)
+	{
+		if (getTexUnit(i)->mCurrTexType != LLTexUnit::TT_NONE)
+		{
+			if (i == mCurrTextureUnitIndex) active_enabled = "true";
+			LL_INFOS("TextureUnit") << "TexUnit: " << i << " Enabled" << LL_ENDL;
+			LL_INFOS("TextureUnit") << "Enabled As: " ;
+			switch (getTexUnit(i)->mCurrTexType)
+			{
+				case LLTexUnit::TT_TEXTURE:
+					LL_CONT << "Texture 2D";
+					break;
+				case LLTexUnit::TT_RECT_TEXTURE:
+					LL_CONT << "Texture Rectangle";
+					break;
+				case LLTexUnit::TT_CUBE_MAP:
+					LL_CONT << "Cube Map";
+					break;
+				default:
+					LL_CONT << "ARGH!!! NONE!";
+					break;
+			}
+			LL_CONT << ", Texture Bound: " << getTexUnit(i)->mCurrTexture << LL_ENDL;
+		}
+	}
+	LL_INFOS("TextureUnit") << "Active TexUnit Enabled : " << active_enabled << LL_ENDL;
+}
+
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index 15360a3..8c648f3 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -37,14 +37,39 @@
 #ifndef LL_LLGLRENDER_H
 #define LL_LLGLRENDER_H
 
-#include "stdtypes.h"
-#include "llgltypes.h"
+//#include "linden_common.h"
+
+#include "v2math.h"
+#include "v3math.h"
+#include "v4coloru.h"
+#include "llstrider.h"
+#include "llmemory.h"
 #include "llglheaders.h"
-#include "llvertexbuffer.h"
+
+class LLVertexBuffer;
+class LLCubeMap;
+class LLImageGL;
+class LLRenderTarget;
 
 class LLTexUnit
 {
+	friend class LLRender;
 public:
+	typedef enum
+	{
+		TT_TEXTURE = 0,			// Standard 2D Texture
+		TT_RECT_TEXTURE,	// Non power of 2 texture
+		TT_CUBE_MAP,		// 6-sided cube map texture
+		TT_NONE 		// No texture type is currently enabled
+	} eTextureType;
+
+	typedef enum
+	{
+		TAM_WRAP = 0,			// Standard 2D Texture
+		TAM_MIRROR,				// Non power of 2 texture
+		TAM_CLAMP 				// No texture type is currently enabled
+	} eTextureAddressMode;
+
 	typedef enum 
 	{
 		TB_REPLACE = 0,
@@ -93,15 +118,36 @@ public:
 		TBS_ONE_MINUS_CONST_ALPHA
 	} eTextureBlendSrc;
 
-	LLTexUnit(U32 index);
-	U32 getIndex(void);
+	LLTexUnit(S32 index);
+
+	// Refreshes renderer state of the texture unit to the cached values
+	// Needed when the render context has changed and invalidated the current state
+	void refreshState(void);
+
+	// returns the index of this texture unit
+	S32 getIndex(void) const { return mIndex; }
 
-	void enable(void);
-	void disable(void);
-	void activate(void);
+	// Sets this tex unit to be the currently active one
+	void activate(void); 
+
+	// Enables this texture unit for the given texture type (automatically disables any previously enabled texture type)
+	void enable(eTextureType type); 
+	// Disables the current texture unit
+	void disable(void);	
+	
+	// Binds the LLImageGL to this texture unit (automatically enables the unit for the LLImageGL's texture type)
+	bool bind(const LLImageGL* texture);
+	// Binds a cubemap to this texture unit (automatically enables the texture unit for cubemaps)
+	bool bind(LLCubeMap* cubeMap);
+	// Binds a render target to this texture unit (automatically enables the texture unit for the RT's texture type)
+	bool bind(LLRenderTarget * renderTarget, bool bindDepth = false);
+	// Manually binds a texture to the texture unit (automatically enables the tex unit for the given texture type)
+	bool bindManual(eTextureType type, U32 texture);
+	
+	// Unbinds the currently bound texture of the given type (only if there's a texture of the given type currently bound)
+	void unbind(eTextureType type);
 
-	void bindTexture(const LLImageGL* texture);
-	void unbindTexture(void);
+	void setTextureAddressMode(eTextureAddressMode mode);
 
 	void setTextureBlendType(eTextureBlendType type);
 
@@ -110,11 +156,14 @@ public:
 
 	// NOTE: If *_COLOR enums are passed to src1 or src2, the corresponding *_ALPHA enum will be used instead.
 	inline void setTextureAlphaBlend(eTextureBlendOp op, eTextureBlendSrc src1, eTextureBlendSrc src2 = TBS_PREV_ALPHA)
-	{ setTextureCombiner(op, src1, src2, true); }	
+	{ setTextureCombiner(op, src1, src2, true); }
 
-private:
-	U32					mIndex;
-	bool				mIsEnabled;
+	static U32 getInternalType(eTextureType type);
+
+protected:
+	S32					mIndex;
+	U32					mCurrTexture;
+	eTextureType		mCurrTexType;
 	eTextureBlendType	mCurrBlendType;
 	eTextureBlendOp		mCurrColorOp;
 	eTextureBlendSrc	mCurrColorSrc1;
@@ -137,6 +186,19 @@ class LLRender
 {
 	friend class LLTexUnit;
 public:
+
+	typedef enum {
+		TRIANGLES = 0,
+		TRIANGLE_STRIP,
+		TRIANGLE_FAN,
+		POINTS,
+		LINES,
+		LINE_STRIP,
+		QUADS,
+		LINE_LOOP,
+		NUM_MODES
+	} eGeomModes;
+
 	typedef enum 
 	{
 		CF_NEVER = 0,
@@ -178,6 +240,10 @@ public:
 	~LLRender();
 	void shutdown();
 	
+	// Refreshes renderer state to the cached values
+	// Needed when the render context has changed and invalidated the current state
+	void refreshState(void);
+
 	void translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z);
 	void scalef(const GLfloat& x, const GLfloat& y, const GLfloat& z);
 	void pushMatrix();
@@ -214,7 +280,13 @@ public:
 
 	LLTexUnit* getTexUnit(U32 index);
 
-	typedef struct Vertex
+	U32	getCurrentTexUnitIndex(void) const { return mCurrTextureUnitIndex; }
+
+	bool verifyTexUnitActive(U32 unitToVerify);
+
+	void debugTexUnits(void);
+
+	struct Vertex
 	{
 		GLfloat v[3];
 		GLubyte c[4];
@@ -224,14 +296,20 @@ public:
 public:
 
 private:
-	U32 mCount;
-	U32 mMode;
-	U32 mCurrTextureUnitIndex;
-	LLPointer<LLVertexBuffer> mBuffer;
-	LLStrider<LLVector3> mVerticesp;
-	LLStrider<LLVector2> mTexcoordsp;
-	LLStrider<LLColor4U> mColorsp;
-	std::vector<LLTexUnit*> mTexUnits;
+	bool				mDirty;
+	U32				mCount;
+	U32				mMode;
+	U32				mCurrTextureUnitIndex;
+	bool				mCurrColorMask[4];
+	eCompareFunc			mCurrAlphaFunc;
+	F32				mCurrAlphaFuncVal;
+
+	LLPointer<LLVertexBuffer>	mBuffer;
+	LLStrider<LLVector3>		mVerticesp;
+	LLStrider<LLVector2>		mTexcoordsp;
+	LLStrider<LLColor4U>		mColorsp;
+	std::vector<LLTexUnit*>		mTexUnits;
+	LLTexUnit*			mDummyTexUnit;
 };
 
 extern F64 gGLModelView[16];
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index e18ec56..9d693a7 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -47,7 +47,7 @@ LLRenderTarget::LLRenderTarget() :
 	mStencil(0),
 	mUseDepth(FALSE),
 	mRenderDepth(FALSE),
-	mUsage(GL_TEXTURE_2D)
+	mUsage(LLTexUnit::TT_TEXTURE)
 {
 }
 
@@ -56,7 +56,7 @@ LLRenderTarget::~LLRenderTarget()
 	release();
 }
 
-void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, U32 usage, BOOL use_fbo)
+void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, LLTexUnit::eTextureType usage, BOOL use_fbo)
 {
 	stop_glerror();
 	mResX = resx;
@@ -67,22 +67,22 @@ void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, U32
 	release();
 
 	glGenTextures(1, (GLuint *) &mTex);
-	glBindTexture(mUsage, mTex);
-	glTexImage2D(mUsage, 0, color_fmt, mResX, mResY, 0, color_fmt, GL_UNSIGNED_BYTE, NULL);
+	gGL.getTexUnit(0)->bindManual(mUsage, mTex);
+	glTexImage2D(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, 0, color_fmt, GL_UNSIGNED_BYTE, NULL);
 
-	glTexParameteri(mUsage, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri(mUsage, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+	glTexParameteri(LLTexUnit::getInternalType(mUsage), GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+	glTexParameteri(LLTexUnit::getInternalType(mUsage), GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 
-	if (mUsage != GL_TEXTURE_RECTANGLE_ARB)
+	if (mUsage != LLTexUnit::TT_RECT_TEXTURE)
 	{
-		glTexParameteri(mUsage, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
-		glTexParameteri(mUsage, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
+		glTexParameteri(LLTexUnit::getInternalType(mUsage), GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
+		glTexParameteri(LLTexUnit::getInternalType(mUsage), GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
 	}
 	else
 	{
 		// ATI doesn't support mirrored repeat for rectangular textures.
-		glTexParameteri(mUsage, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-		glTexParameteri(mUsage, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+		glTexParameteri(LLTexUnit::getInternalType(mUsage), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+		glTexParameteri(LLTexUnit::getInternalType(mUsage), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 	}
 
 	stop_glerror();
@@ -107,14 +107,14 @@ void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, U32
 
 		if (mDepth)
 		{
-			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, mUsage, mDepth, 0);
+			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
 			stop_glerror();
-			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, mUsage, mDepth, 0);
+			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
 			stop_glerror();
 		}
 
 		glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
-						mUsage, mTex, 0);
+						LLTexUnit::getInternalType(mUsage), mTex, 0);
 		stop_glerror();
 
 		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
@@ -125,10 +125,11 @@ void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, U32
 void LLRenderTarget::allocateDepth()
 {
 	glGenTextures(1, (GLuint *) &mDepth);
-	glBindTexture(mUsage, mDepth);
-	glTexParameteri(mUsage, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-	glTexParameteri(mUsage, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-	glTexImage2D(mUsage, 0, GL_DEPTH24_STENCIL8_EXT, mResX, mResY, 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, NULL);
+	gGL.getTexUnit(0)->bindManual(mUsage, mDepth);
+	U32 internal_type = LLTexUnit::getInternalType(mUsage);
+	glTexParameteri(internal_type, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexParameteri(internal_type, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexImage2D(internal_type, 0, GL_DEPTH24_STENCIL8_EXT, mResX, mResY, 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, NULL);
 }
 
 void LLRenderTarget::release()
@@ -191,24 +192,13 @@ void LLRenderTarget::clear()
 	}
 }
 
-void LLRenderTarget::bindTexture()
-{
-	glBindTexture(mUsage, mTex);
-}
-
-void LLRenderTarget::bindDepth()
-{
-	glBindTexture(mUsage, mDepth);
-}
-
-
 void LLRenderTarget::flush(BOOL fetch_depth)
 {
 	gGL.flush();
 	if (!mFBO)
 	{
-		bindTexture();
-		glCopyTexSubImage2D(mUsage, 0, 0, 0, 0, 0, mResX, mResY);
+		gGL.getTexUnit(0)->bind(this);
+		glCopyTexSubImage2D(LLTexUnit::getInternalType(mUsage), 0, 0, 0, 0, 0, mResX, mResY);
 
 		if (fetch_depth)
 		{
@@ -217,8 +207,8 @@ void LLRenderTarget::flush(BOOL fetch_depth)
 				allocateDepth();
 			}
 
-			bindDepth();
-			glCopyTexImage2D(mUsage, 0, GL_DEPTH24_STENCIL8_EXT, 0, 0, mResX, mResY, 0);
+			gGL.getTexUnit(0)->bind(this, true);
+			glCopyTexImage2D(LLTexUnit::getInternalType(mUsage), 0, GL_DEPTH24_STENCIL8_EXT, 0, 0, mResX, mResY, 0);
 		}
 	}
 	else
diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h
index 5e3c4d9..65bab8b 100644
--- a/indra/llrender/llrendertarget.h
+++ b/indra/llrender/llrendertarget.h
@@ -33,6 +33,7 @@
 #define LL_LLRENDERTARGET_H
 
 #include "llgl.h"
+#include "llrender.h"
 
 /*
  SAMPLE USAGE:
@@ -53,7 +54,7 @@
 	...
 
 	//use target as a texture
-	target.bindTexture();
+	gGL.getTexUnit(INDEX)->bind(&target);
 	... <issue drawing commands> ...
 
 */
@@ -71,7 +72,7 @@ public:
 	//allocate resources for rendering
 	//must be called before use
 	//multiple calls will release previously allocated resources
-	void allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, U32 usage = GL_TEXTURE_2D, BOOL use_fbo = FALSE);
+	void allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, BOOL use_fbo = FALSE);
 
 	//allocate a depth texture
 	void allocateDepth();
@@ -100,11 +101,11 @@ public:
 	//get Y resolution
 	U32 getHeight() const { return mResY; }
 
-	//bind results of render for sampling
-	void bindTexture();
+	LLTexUnit::eTextureType getUsage(void) const { return mUsage; }
 
-	//bind results of render for sampling depth buffer
-	void bindDepth();
+	U32 getTexture(void) const { return mTex; }
+
+	U32 getDepth(void) const { return mDepth; }
 
 	//flush rendering operations
 	//must be called when rendering is complete
@@ -128,7 +129,7 @@ private:
 	U32 mStencil;
 	BOOL mUseDepth;
 	BOOL mRenderDepth;
-	U32 mUsage;
+	LLTexUnit::eTextureType mUsage;
 	
 };
 
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index 4416775..d884c15 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -307,7 +307,7 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns)
 		{
 			LL_DEBUGS("ShaderLoading") << log << LL_ENDL;
 		}
-}
+	}
 }
 
 GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type)
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 547663b..465c4ca 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -76,7 +76,7 @@ S32 LLVertexBuffer::sTypeOffsets[LLVertexBuffer::TYPE_MAX] =
 	sizeof(LLVector4), // TYPE_CLOTHWEIGHT,
 };
 
-U32 LLVertexBuffer::sGLMode[LLVertexBuffer::NUM_MODES] = 
+U32 LLVertexBuffer::sGLMode[LLRender::NUM_MODES] = 
 {
 	GL_TRIANGLES,
 	GL_TRIANGLE_STRIP,
@@ -187,7 +187,7 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
 		llerrs << "Wrong vertex buffer bound." << llendl;
 	}
 
-	if (mode > NUM_MODES)
+	if (mode > LLRender::NUM_MODES)
 	{
 		llerrs << "Invalid draw mode: " << mode << llendl;
 		return;
@@ -216,7 +216,7 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
 		llerrs << "Wrong vertex buffer bound." << llendl;
 	}
 
-	if (mode > NUM_MODES)
+	if (mode > LLRender::NUM_MODES)
 	{
 		llerrs << "Invalid draw mode: " << mode << llendl;
 		return;
@@ -240,7 +240,7 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
 		llerrs << "Wrong vertex buffer bound." << llendl;
 	}
 
-	if (mode > NUM_MODES)
+	if (mode > LLRender::NUM_MODES)
 	{
 		llerrs << "Invalid draw mode: " << mode << llendl;
 		return;
diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h
index 8edcf69..a97c74e 100644
--- a/indra/llrender/llvertexbuffer.h
+++ b/indra/llrender/llvertexbuffer.h
@@ -39,6 +39,7 @@
 #include "v4coloru.h"
 #include "llstrider.h"
 #include "llmemory.h"
+#include "llrender.h"
 #include <set>
 #include <vector>
 #include <list>
@@ -123,19 +124,8 @@ public:
 		MAP_UNMAPPED = 0x8000 // Indicates that buffer has been logically un-mapped
 	};
 	
-	enum {
-		TRIANGLES = 0,
-		TRIANGLE_STRIP,
-		TRIANGLE_FAN,
-		POINTS,
-		LINES,
-		LINE_STRIP,
-		QUADS,
-		LINE_LOOP,
-		NUM_MODES
-	};
 protected:
-	friend class LLGLImmediate;
+	friend class LLRender;
 
 	virtual ~LLVertexBuffer(); // use unref()
 
@@ -255,7 +245,7 @@ public:
 		
 	static BOOL sEnableVBOs;
 	static S32 sTypeOffsets[TYPE_MAX];
-	static U32 sGLMode[NUM_MODES];
+	static U32 sGLMode[LLRender::NUM_MODES];
 	static U32 sGLRenderBuffer;
 	static U32 sGLRenderIndices;
 	static BOOL sVBOActive;
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 9f8cd65..047342f 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -127,6 +127,7 @@ LLFloaterView* gFloaterView = NULL;
 
 LLFloater::LLFloater() :
 	//FIXME: we should initialize *all* member variables here
+	LLPanel(), mAutoFocus(TRUE),
 	mResizable(FALSE),
 	mDragOnLeft(FALSE),
 	mMinWidth(0),
@@ -139,6 +140,11 @@ LLFloater::LLFloater() :
 		mButtonsEnabled[i] = FALSE;
 		mButtons[i] = NULL;
 	}
+	for (S32 i = 0; i < 4; i++) 
+	{
+		mResizeBar[i] = NULL; 
+		mResizeHandle[i] = NULL;
+	}
 	mDragHandle = NULL;
 	mHandle.bind(this);
 }
@@ -151,6 +157,11 @@ LLFloater::LLFloater(const std::string& name)
 		mButtonsEnabled[i] = FALSE;
 		mButtons[i] = NULL;
 	}
+	for (S32 i = 0; i < 4; i++) 
+	{
+		mResizeBar[i] = NULL; 
+		mResizeHandle[i] = NULL;
+	}
 	std::string title; // null string
 	initFloater(title, FALSE, DEFAULT_MIN_WIDTH, DEFAULT_MIN_HEIGHT, FALSE, TRUE, TRUE); // defaults
 }
@@ -171,6 +182,11 @@ LLFloater::LLFloater(const std::string& name, const LLRect& rect, const std::str
 		mButtonsEnabled[i] = FALSE;
 		mButtons[i] = NULL;
 	}
+	for (S32 i = 0; i < 4; i++) 
+	{
+		mResizeBar[i] = NULL; 
+		mResizeHandle[i] = NULL;
+	}
 	initFloater( title, resizable, min_width, min_height, drag_on_left, minimizable, close_btn);
 }
 
@@ -189,6 +205,11 @@ LLFloater::LLFloater(const std::string& name, const std::string& rect_control, c
 		mButtonsEnabled[i] = FALSE;
 		mButtons[i] = NULL;
 	}
+	for (S32 i = 0; i < 4; i++) 
+	{
+		mResizeBar[i] = NULL; 
+		mResizeHandle[i] = NULL;
+	}
 	initFloater( title, resizable, min_width, min_height, drag_on_left, minimizable, close_btn);
 }
 
@@ -1580,6 +1601,7 @@ void LLFloater::updateButtons()
 	S32 button_count = 0;
 	for (S32 i = 0; i < BUTTON_COUNT; i++)
 	{
+		if(!mButtons[i]) continue;
 		mButtons[i]->setEnabled(mButtonsEnabled[i]);
 
 		if (mButtonsEnabled[i] 
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 12d1929..a0af463 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -35,6 +35,7 @@
  
 #include "lllineeditor.h"
 
+#include "lltexteditor.h"
 #include "audioengine.h"
 #include "llmath.h"
 #include "llfontgl.h"
@@ -450,19 +451,19 @@ BOOL LLLineEditor::handleDoubleClick(S32 x, S32 y, MASK mask)
 		BOOL doSelectAll = TRUE;
 
 		// Select the word we're on
-		if( isPartOfWord( wtext[mCursorPos] ) )
+		if( LLTextEditor::isPartOfWord( wtext[mCursorPos] ) )
 		{
 			S32 old_selection_start = mLastSelectionStart;
 			S32 old_selection_end = mLastSelectionEnd;
 
 			// Select word the cursor is over
-			while ((mCursorPos > 0) && isPartOfWord( wtext[mCursorPos-1] ))
+			while ((mCursorPos > 0) && LLTextEditor::isPartOfWord( wtext[mCursorPos-1] ))
 			{	// Find the start of the word
 				mCursorPos--;
 			}
 			startSelection();	
 
-			while ((mCursorPos < (S32)wtext.length()) && isPartOfWord( wtext[mCursorPos] ) )
+			while ((mCursorPos < (S32)wtext.length()) && LLTextEditor::isPartOfWord( wtext[mCursorPos] ) )
 			{	// Find the end of the word
 				mCursorPos++;
 			}
@@ -764,7 +765,7 @@ S32 LLLineEditor::prevWordPos(S32 cursorPos) const
 	{
 		cursorPos--;
 	}
-	while( (cursorPos > 0) && isPartOfWord( wtext[cursorPos-1] ) )
+	while( (cursorPos > 0) && LLTextEditor::isPartOfWord( wtext[cursorPos-1] ) )
 	{
 		cursorPos--;
 	}
@@ -774,7 +775,7 @@ S32 LLLineEditor::prevWordPos(S32 cursorPos) const
 S32 LLLineEditor::nextWordPos(S32 cursorPos) const
 {
 	const LLWString& wtext = mText.getWString();
-	while( (cursorPos < getLength()) && isPartOfWord( wtext[cursorPos] ) )
+	while( (cursorPos < getLength()) && LLTextEditor::isPartOfWord( wtext[cursorPos] ) )
 	{
 		cursorPos++;
 	} 
@@ -1422,7 +1423,7 @@ void LLLineEditor::draw()
 #else // the old programmer art.
 	// drawing solids requires texturing be disabled
 	{
-		LLGLSNoTexture no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		// draw background for text
 		if( !mReadOnly )
 		{
@@ -1817,9 +1818,6 @@ BOOL LLLineEditor::prevalidateFloat(const LLWString &str)
 	return success;
 }
 
-//static
-BOOL LLLineEditor::isPartOfWord(llwchar c) { return (c == '_') || isalnum(c); }
-
 // static
 BOOL LLLineEditor::postvalidateFloat(const std::string &str)
 {
@@ -1993,7 +1991,7 @@ BOOL LLLineEditor::prevalidateAlphaNum(const LLWString &str)
 	if(len == 0) return rv;
 	while(len--)
 	{
-		if( !isalnum(str[len]) )
+		if( !LLStringOps::isAlnum((char)str[len]) )
 		{
 			rv = FALSE;
 			break;
@@ -2012,7 +2010,7 @@ BOOL LLLineEditor::prevalidateAlphaNumSpace(const LLWString &str)
 	if(len == 0) return rv;
 	while(len--)
 	{
-		if(!(isalnum(str[len]) || (' ' == str[len])))
+		if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len])))
 		{
 			rv = FALSE;
 			break;
@@ -2034,7 +2032,7 @@ BOOL LLLineEditor::prevalidatePrintableNotPipe(const LLWString &str)
 			rv = FALSE;
 			break;
 		}
-		if(!((' ' == str[len]) || isalnum(str[len]) || ispunct(str[len])))
+		if(!((' ' == str[len]) || LLStringOps::isAlnum((char)str[len]) || LLStringOps::isPunct((char)str[len])))
 		{
 			rv = FALSE;
 			break;
@@ -2052,12 +2050,13 @@ BOOL LLLineEditor::prevalidatePrintableNoSpace(const LLWString &str)
 	if(len == 0) return rv;
 	while(len--)
 	{
-		if(iswspace(str[len]))
+		if(LLStringOps::isSpace(str[len]))
 		{
 			rv = FALSE;
 			break;
 		}
-		if( !(isalnum(str[len]) || ispunct(str[len]) ) )
+		if( !(LLStringOps::isAlnum((char)str[len]) ||
+		      LLStringOps::isPunct((char)str[len]) ) )
 		{
 			rv = FALSE;
 			break;
@@ -2282,7 +2281,7 @@ LLView* LLLineEditor::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory
 }
 
 //static
-void LLLineEditor::cleanupClass()
+void LLLineEditor::cleanupLineEditor()
 {
 	sImage = NULL;
 }
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 09a240b..bc9e406 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -82,7 +82,7 @@ public:
 	virtual LLXMLNodePtr getXML(bool save_children = true) const;
 	void setColorParameters(LLXMLNodePtr node);
 	static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory);
-	static void cleanupClass();
+	static void cleanupLineEditor();
 
 	// mousehandler overrides
 	/*virtual*/ BOOL	handleMouseDown(S32 x, S32 y, MASK mask);
@@ -194,7 +194,6 @@ public:
 	void			setMaxTextLength(S32 max_text_length);
 	void			setTextPadding(S32 left, S32 right); // Used to specify room for children before or after text.
 
-	static BOOL		isPartOfWord(llwchar c);
 	// Prevalidation controls which keystrokes can affect the editor
 	void			setPrevalidate( BOOL (*func)(const LLWString &) );
 	static BOOL		prevalidateFloat(const LLWString &str );
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 24cc47e..4766267 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -1309,6 +1309,7 @@ void LLMenuItemBranchGL::openMenu()
 		}
 		mBranch->translate( delta_x, delta_y );
 		mBranch->setVisible( TRUE );
+		mBranch->getParent()->sendChildToFront(mBranch);
 	}
 }
 
@@ -1427,6 +1428,7 @@ void LLMenuItemBranchDownGL::openMenu( void )
 
 			setHighlight(TRUE);
 			branch->setVisible( TRUE );
+			branch->getParent()->sendChildToFront(branch);
 		}
 	}
 }
@@ -2958,6 +2960,7 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)
 	}
 	menu->translate( delta_x, delta_y );
 	menu->setVisible( TRUE );
+	menu->getParent()->sendChildToFront(menu);
 }
 
 //-----------------------------------------------------------------------------
diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp
index 227cf98..11c2cba 100644
--- a/indra/llui/llmultislider.cpp
+++ b/indra/llui/llmultislider.cpp
@@ -431,7 +431,7 @@ void LLMultiSlider::draw()
 	// Draw background and thumb.
 
 	// drawing solids requires texturing be disabled
-	LLGLSNoTexture no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	LLRect rect(mDragStartThumbRect);
 
diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp
index 1ba2923..51face6 100644
--- a/indra/llui/llscrollcontainer.cpp
+++ b/indra/llui/llscrollcontainer.cpp
@@ -425,7 +425,7 @@ void LLScrollableContainerView::draw()
 	// Draw background
 	if( mIsOpaque )
 	{
-		LLGLSNoTexture no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gGL.color4fv( mBackgroundColor.mV );
 		gl_rect_2d( mInnerRect );
 	}
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index d342378..92bcb88 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -435,7 +435,7 @@ void LLScrollListItem::draw(const LLRect& rect, const LLColor4& fg_color, const
 	// draw background rect
 	LLRect bg_rect = rect;
 	{
-		LLGLSNoTexture no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gGL.color4fv(bg_color.mV);
 		gl_rect_2d( bg_rect );
 	}
@@ -1758,7 +1758,7 @@ void LLScrollListCtrl::draw()
 	// Draw background
 	if (mBackgroundVisible)
 	{
-		LLGLSNoTexture no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gGL.color4fv( getEnabled() ? mBgWriteableColor.mV : mBgReadOnlyColor.mV );
 		gl_rect_2d(background);
 	}
diff --git a/indra/llui/llslider.cpp b/indra/llui/llslider.cpp
index 4cc558f..b2438af 100644
--- a/indra/llui/llslider.cpp
+++ b/indra/llui/llslider.cpp
@@ -253,7 +253,7 @@ void LLSlider::draw()
 	// Draw background and thumb.
 
 	// drawing solids requires texturing be disabled
-	LLGLSNoTexture no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	F32 opacity = getEnabled() ? 1.f : 0.3f;
 	LLColor4 center_color = (mThumbCenterColor % opacity);
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index e56002f..281dbe4 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -260,7 +260,7 @@ LLTextEditor::LLTextEditor(
 	mIsSelecting( FALSE ),
 	mSelectionStart( 0 ),
 	mSelectionEnd( 0 ),
-	mScrolledToBottom( FALSE ),
+	mScrolledToBottom( TRUE ),
 	mOnScrollEndCallback( NULL ),
 	mOnScrollEndData( NULL ),
 	mCursorColor(		LLUI::sColorsGroup->getColor( "TextCursorColor" ) ),
@@ -277,14 +277,16 @@ LLTextEditor::LLTextEditor(
 	mCommitOnFocusLost( FALSE ),
 	mHideScrollbarForShortDocs( FALSE ),
 	mTakesNonScrollClicks( TRUE ),
-	mTrackBottom( TRUE ),
+	mTrackBottom( FALSE ),
 	mAllowEmbeddedItems( allow_embedded_items ),
 	mAcceptCallingCardNames(FALSE),
 	mHandleEditKeysDirectly( FALSE ),
 	mMouseDownX(0),
 	mMouseDownY(0),
 	mLastSelectionX(-1),
-	mLastSelectionY(-1)
+	mLastSelectionY(-1),
+	mReflowNeeded(FALSE),
+	mScrollNeeded(FALSE)
 {
 	mSourceID.generate();
 
@@ -468,6 +470,13 @@ void LLTextEditor::updateLineStartList(S32 startpos)
 		mScrollbar->setVisible(!short_doc);
 	}
 
+	// if scrolled to bottom, stay at bottom
+	// unless user is editing text
+	// do this after updating page size
+	if (mScrolledToBottom && mTrackBottom && !hasFocus())
+	{
+		endOfDoc();
+	}
 }
 
 ////////////////////////////////////////////////////////////
@@ -511,8 +520,7 @@ void LLTextEditor::setText(const LLStringExplicit &utf8str)
 	setCursorPos(0);
 	deselect();
 
-	updateLineStartList();
-	updateScrollFromCursor();
+	needsReflow();
 
 	resetDirty();
 }
@@ -529,8 +537,7 @@ void LLTextEditor::setWText(const LLWString &wtext)
 	setCursorPos(0);
 	deselect();
 
-	updateLineStartList();
-	updateScrollFromCursor();
+	needsReflow();
 
 	resetDirty();
 }
@@ -568,8 +575,7 @@ void LLTextEditor::setWordWrap(BOOL b)
 	setCursorPos(0);
 	deselect();
 	
-	updateLineStartList();
-	updateScrollFromCursor();
+	needsReflow();
 }
 
 
@@ -734,6 +740,7 @@ S32 LLTextEditor::getLineStart( S32 line ) const
     {
 		return 0;
     }
+
 	line = llclamp(line, 0, num_lines-1);
 	S32 segidx = mLineStartList[line].mSegment;
 	S32 segoffset = mLineStartList[line].mOffset;
@@ -781,14 +788,14 @@ void LLTextEditor::getSegmentAndOffset( S32 startpos, S32* segidxp, S32* offsetp
 	*offsetp = startpos - (*seg_iter)->getStart();
 }
 
-const LLTextSegment*	LLTextEditor::getPreviousSegment()
+const LLTextSegment*	LLTextEditor::getPreviousSegment() const
 {
 	// find segment index at character to left of cursor (or rightmost edge of selection)
 	S32 idx = llmax(0, getSegmentIdxAtOffset(mCursorPos) - 1);
 	return idx >= 0 ? mSegments[idx] : NULL;
 }
 
-void LLTextEditor::getSelectedSegments(std::vector<const LLTextSegment*>& segments)
+void LLTextEditor::getSelectedSegments(std::vector<const LLTextSegment*>& segments) const
 {
 	S32 left = hasSelection() ? llmin(mSelectionStart, mSelectionEnd) : mCursorPos;
 	S32 right = hasSelection() ? llmax(mSelectionStart, mSelectionEnd) : mCursorPos;
@@ -875,13 +882,12 @@ void LLTextEditor::setCursor(S32 row, S32 column)
 	}
 	doc += column;
 	setCursorPos(doc - mWText.c_str());
-	updateScrollFromCursor();
 }
 
 void LLTextEditor::setCursorPos(S32 offset)
 {
 	mCursorPos = llclamp(offset, 0, (S32)getLength());
-	updateScrollFromCursor();
+	needsScroll();
 	// reset desired x cursor position
 	mDesiredXPixel = -1;
 }
@@ -1222,8 +1228,6 @@ BOOL LLTextEditor::handleHover(S32 x, S32 y, MASK mask)
 
 			setCursorAtLocalPos( x, y, TRUE );
 			mSelectionEnd = mCursorPos;
-			
-			updateScrollFromCursor();
 		}
 
 		lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active)" << llendl;		
@@ -1317,8 +1321,6 @@ BOOL LLTextEditor::handleMouseUp(S32 x, S32 y, MASK mask)
 			
 			setCursorAtLocalPos( x, y, TRUE );
 			endSelection();
-
-			updateScrollFromCursor();
 		}
 		
 		if( !hasSelection() )
@@ -1839,8 +1841,7 @@ void LLTextEditor::cut()
 	gClipboard.copyFromSubstring( mWText, left_pos, length, mSourceID );
 	deleteSelection( FALSE );
 
-	updateLineStartList();
-	updateScrollFromCursor();
+	needsReflow();
 }
 
 BOOL LLTextEditor::canCopy() const
@@ -1910,8 +1911,7 @@ void LLTextEditor::paste()
 	setCursorPos(mCursorPos + insert(mCursorPos, clean_string, FALSE));
 	deselect();
 
-	updateLineStartList();
-	updateScrollFromCursor();
+	needsReflow();
 }
 
 
@@ -2235,9 +2235,9 @@ BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask )
 
 			if(text_may_have_changed)
 			{
-				updateLineStartList();
+				needsReflow();
 			}
-			updateScrollFromCursor();
+			needsScroll();
 		}
 	}
 
@@ -2280,8 +2280,7 @@ BOOL LLTextEditor::handleUnicodeCharHere(llwchar uni_char)
 			// Most keystrokes will make the selection box go away, but not all will.
 			deselect();
 
-			updateLineStartList();
-			updateScrollFromCursor();
+			needsReflow();
 		}
 	}
 
@@ -2339,8 +2338,7 @@ void LLTextEditor::doDelete()
 		}
 	}
 
-	updateLineStartList();
-	updateScrollFromCursor();
+	needsReflow();
 }
 
 //----------------------------------------------------------------------------
@@ -2383,8 +2381,7 @@ void LLTextEditor::undo()
 
 		setCursorPos(pos);
 
-	updateLineStartList();
-	updateScrollFromCursor();
+	needsReflow();
 }
 
 BOOL LLTextEditor::canRedo() const
@@ -2426,8 +2423,7 @@ void LLTextEditor::redo()
 		
 		setCursorPos(pos);
 
-	updateLineStartList();
-	updateScrollFromCursor();
+	needsReflow();
 }
 
 void LLTextEditor::onFocusReceived()
@@ -2594,7 +2590,7 @@ void LLTextEditor::drawSelectionBackground()
 		BOOL selection_visible = (left_visible_pos <= selection_right) && (selection_left <= right_visible_pos);
 		if( selection_visible )
 		{
-			LLGLSNoTexture no_texture;
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			const LLColor4& color = mReadOnly ? mReadOnlyBgColor : mWriteableBgColor;
 			F32 alpha = hasFocus() ? 1.f : 0.5f;
 			gGL.color4f( 1.f - color.mV[0], 1.f - color.mV[1], 1.f - color.mV[2], alpha );
@@ -2729,7 +2725,7 @@ void LLTextEditor::drawCursor()
 					}
 				}
 				
-				LLGLSNoTexture no_texture;
+				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 				gGL.color4fv( mCursorColor.mV );
 				
@@ -3100,6 +3096,20 @@ void LLTextEditor::drawClippedSegment(const LLWString &text, S32 seg_start, S32
 
 void LLTextEditor::draw()
 {
+	// do on-demand reflow 
+	if (mReflowNeeded)
+	{
+		updateLineStartList();
+		mReflowNeeded = FALSE;
+	}
+
+	// then update scroll position, as cursor may have moved
+	if (mScrollNeeded)
+	{
+		updateScrollFromCursor();
+		mScrollNeeded = FALSE; 
+	}
+
 	{
 		LLLocalClipRect clip(LLRect(0, getRect().getHeight(), getRect().getWidth() - (mScrollbar->getVisible() ? SCROLLBAR_SIZE : 0), 0));
 
@@ -3118,10 +3128,10 @@ void LLTextEditor::draw()
 		mBorder->setKeyboardFocusHighlight( gFocusMgr.getKeyboardFocus() == this);// && !mReadOnly);
 	}
 	
+	LLView::draw();  // Draw children (scrollbar and border)
+
 	// remember if we are supposed to be at the bottom of the buffer
 	mScrolledToBottom = isScrolledToBottom();
-
-	LLView::draw();  // Draw children (scrollbar and border)
 }
 
 
@@ -3311,7 +3321,7 @@ void LLTextEditor::setCursorAndScrollToEnd()
 {
 	deselect();
 	endOfDoc();
-	updateScrollFromCursor();
+	needsScroll();
 }
 
 void LLTextEditor::getLineAndColumnForPosition( S32 position, S32* line, S32* col, BOOL include_wordwrap )
@@ -3438,7 +3448,7 @@ void LLTextEditor::reshape(S32 width, S32 height, BOOL called_from_parent)
 	// up-to-date mTextRect
 	updateTextRect();
 	
-	updateLineStartList();
+	needsReflow();
 
 	// propagate shape information to scrollbar
 	mScrollbar->setDocSize( getLineCount() );
@@ -3446,14 +3456,6 @@ void LLTextEditor::reshape(S32 width, S32 height, BOOL called_from_parent)
 	S32 line_height = llround( mGLFont->getLineHeight() );
 	S32 page_lines = mTextRect.getHeight() / line_height;
 	mScrollbar->setPageSize( page_lines );
-
-	// if scrolled to bottom, stay at bottom
-	// unless user is editing text
-	// do this after updating page size
-	if (mScrolledToBottom && mTrackBottom && !hasFocus())
-	{
-		endOfDoc();
-	}
 }
 
 void LLTextEditor::autoIndent()
@@ -3500,8 +3502,7 @@ void LLTextEditor::insertText(const std::string &new_text)
 
 	setCursorPos(mCursorPos + insert( mCursorPos, utf8str_to_wstring(new_text), FALSE ));
 	
-	updateLineStartList();
-	updateScrollFromCursor();
+	needsReflow();
 
 	setEnabled( enabled );
 }
@@ -3600,7 +3601,7 @@ void LLTextEditor::appendText(const std::string &new_text, bool allow_undo, bool
 		mSegments.push_back(segment);
 	}
 	
-	updateLineStartList(old_length);
+	needsReflow();
 	
 	// Set the cursor and scroll position
 	// Maintain the scroll position unless the scroll was at the end of the doc (in which 
@@ -3639,14 +3640,6 @@ void LLTextEditor::appendText(const std::string &new_text, bool allow_undo, bool
 	{
 		blockUndo();
 	}
-
-	// if scrolled to bottom, stay at bottom
-	// unless user is editing text
-	// do this after updating page size
-	if (mScrolledToBottom && mTrackBottom && !hasFocus())
-	{
-		endOfDoc();
-	}
 }
 
 void LLTextEditor::removeTextFromEnd(S32 num_chars)
@@ -3661,7 +3654,10 @@ void LLTextEditor::removeTextFromEnd(S32 num_chars)
 	mSelectionEnd = llclamp(mSelectionEnd, 0, len);
 
 	pruneSegments();
+	
+	// pruneSegments will invalidate mLineStartList.
 	updateLineStartList();
+	needsScroll();
 }
 
 ///////////////////////////////////////////////////////////////////
@@ -3759,8 +3755,7 @@ BOOL LLTextEditor::tryToRevertToPristineState()
 			}
 		}
 
-		updateLineStartList();
-		updateScrollFromCursor();
+		needsReflow();
 	}
 
 	return isPristine(); // TRUE => success
@@ -3808,6 +3803,7 @@ void LLTextEditor::updateSegments()
 	{
 		findEmbeddedItemSegments();
 	}
+
 	// Make sure we have at least one segment
 	if (mSegments.size() == 1 && mSegments[0]->getIsDefault())
 	{
@@ -3824,6 +3820,7 @@ void LLTextEditor::updateSegments()
 }
 
 // Only effective if text was removed from the end of the editor
+// *NOTE: Using this will invalidate references to mSegments from mLineStartList.
 void LLTextEditor::pruneSegments()
 {
 	S32 len = mWText.length();
@@ -4066,9 +4063,7 @@ BOOL LLTextEditor::importBuffer(const char* buffer, S32 length )
 	setCursorPos(0);
 	deselect();
 
-	updateLineStartList();
-	updateScrollFromCursor();
-
+	needsReflow();
 	return success;
 }
 
@@ -4260,35 +4255,35 @@ S32 LLTextEditor::findHTMLToken(const std::string &line, S32 pos, BOOL reverse)
 	std::string openers=" \t\n('\"[{<>";
 	std::string closers=" \t\n)'\"]}><;";
 
-	S32 m2 = 0;
-	S32 retval = 0;
+	S32 index = 0;
 	
 	if (reverse)
 	{
-		
-		for (retval=pos; retval >= 0; retval--)
+		for (index=pos; index >= 0; index--)
 		{
-			m2 = openers.find(line.substr(retval,1));
+			char c = line[index];
+			S32 m2 = openers.find(c);
 			if (m2 >= 0)
 			{
-				break;
+				return index+1;
 			}
 		}
-		return retval+1;
 	} 
 	else
 	{
 		
-		for (retval=pos; retval<(S32)line.length(); retval++)
+		for (index=pos; index<(S32)line.length(); index++)
 		{
-			m2 = closers.find(line.substr(retval,1));
+			char c = line[index];
+			S32 m2 = closers.find(c);
 			if (m2 >= 0)
 			{
-				break;
+				return index;
 			}
 		} 
-		return retval;
-	}
+	}		
+	
+	return index;
 }
 
 BOOL LLTextEditor::findHTML(const std::string &line, S32 *begin, S32 *end) const
@@ -4476,9 +4471,8 @@ void LLTextEditor::updatePreedit(const LLWString &preedit_string,
 
 	mPreeditStandouts = preedit_standouts;
 
-	updateLineStartList();
+	needsReflow();
 	setCursorPos(insert_preedit_at + caret_position);
-	// updateScrollFromCursor();
 
 	// Update of the preedit should be caused by some key strokes.
 	mKeystrokeTimer.reset();
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index 3cff91d..3604cf6 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -245,9 +245,11 @@ public:
 	llwchar			getWChar(S32 pos) const { return mWText[pos]; }
 	LLWString		getWSubString(S32 pos, S32 len) const { return mWText.substr(pos, len); }
 	
-	const LLTextSegment*	getCurrentSegment() { return getSegmentAtOffset(mCursorPos); }
-	const LLTextSegment*	getPreviousSegment();
-	void getSelectedSegments(std::vector<const LLTextSegment*>& segments);
+	const LLTextSegment*	getCurrentSegment() const { return getSegmentAtOffset(mCursorPos); }
+	const LLTextSegment*	getPreviousSegment() const;
+	void getSelectedSegments(std::vector<const LLTextSegment*>& segments) const;
+
+	static bool		isPartOfWord(llwchar c) { return (c == '_') || LLStringOps::isAlnum((char)c); }
 
 protected:
 	//
@@ -266,8 +268,6 @@ protected:
 	void 			assignEmbedded(const std::string &s);
 	BOOL 			truncate();				// Returns true if truncation occurs
 	
-	static BOOL		isPartOfWord(llwchar c) { return (c == '_') || isalnum(c); }
-
 	void			removeCharOrTab();
 	void			setCursorAtLocalPos(S32 x, S32 y, BOOL round);
 	S32				getCursorPosFromLocalCoord( S32 local_x, S32 local_y, BOOL round ) const;
@@ -433,6 +433,14 @@ private:
 	void			drawText();
 	void			drawClippedSegment(const LLWString &wtext, S32 seg_start, S32 seg_end, F32 x, F32 y, S32 selection_left, S32 selection_right, const LLStyleSP& color, F32* right_x);
 
+	void			needsReflow() 
+	{ 
+		mReflowNeeded = TRUE; 
+		// cursor might have moved, need to scroll
+		mScrollNeeded = TRUE;
+	}
+	void			needsScroll() { mScrollNeeded = TRUE; }
+
 	//
 	// Data
 	//
@@ -489,6 +497,8 @@ private:
 	};
 	typedef std::vector<line_info> line_list_t;
 	line_list_t mLineStartList;
+	BOOL			mReflowNeeded;
+	BOOL			mScrollNeeded;
 
 	LLFrameTimer	mKeystrokeTimer;
 
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index 734aecf..5502246 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -143,11 +143,11 @@ void gl_state_for_2d(S32 width, S32 height)
 
 void gl_draw_x(const LLRect& rect, const LLColor4& color)
 {
-	LLGLSNoTexture no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	gGL.color4fv( color.mV );
 
-	gGL.begin( LLVertexBuffer::LINES );
+	gGL.begin( LLRender::LINES );
 		gGL.vertex2i( rect.mLeft,		rect.mTop );
 		gGL.vertex2i( rect.mRight,	rect.mBottom );
 		gGL.vertex2i( rect.mLeft,		rect.mBottom );
@@ -183,12 +183,12 @@ void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixe
 void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled )
 {
 	stop_glerror();
-	LLGLSNoTexture no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	// Counterclockwise quad will face the viewer
 	if( filled )
 	{
-		gGL.begin( LLVertexBuffer::QUADS );
+		gGL.begin( LLRender::QUADS );
 			gGL.vertex2i(left, top);
 			gGL.vertex2i(left, bottom);
 			gGL.vertex2i(right, bottom);
@@ -200,7 +200,7 @@ void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled )
 		if( gGLManager.mATIOffsetVerticalLines )
 		{
 			// Work around bug in ATI driver: vertical lines are offset by (-1,-1)
-			gGL.begin( LLVertexBuffer::LINES );
+			gGL.begin( LLRender::LINES );
 
 				// Verticals 
 				gGL.vertex2i(left + 1, top);
@@ -223,7 +223,7 @@ void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled )
 		{
 			top--;
 			right--;
-			gGL.begin( LLVertexBuffer::LINE_STRIP );
+			gGL.begin( LLRender::LINE_STRIP );
 				gGL.vertex2i(left, top);
 				gGL.vertex2i(left, bottom);
 				gGL.vertex2i(right, bottom);
@@ -254,7 +254,7 @@ void gl_rect_2d( const LLRect& rect, const LLColor4& color, BOOL filled )
 void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &start_color, S32 lines)
 {
 	stop_glerror();
-	LLGLSNoTexture no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	
 	// HACK: Overlap with the rectangle by a single pixel.
 	right--;
@@ -264,7 +264,7 @@ void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &st
 	LLColor4 end_color = start_color;
 	end_color.mV[VALPHA] = 0.f;
 
-	gGL.begin(LLVertexBuffer::QUADS);
+	gGL.begin(LLRender::QUADS);
 
 	// Right edge, CCW faces screen
 	gGL.color4fv(start_color.mV);
@@ -324,9 +324,9 @@ void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2 )
 		y2++;
 	}
 
-	LLGLSNoTexture no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	
-	gGL.begin(LLVertexBuffer::LINES);
+	gGL.begin(LLRender::LINES);
 		gGL.vertex2i(x1, y1);
 		gGL.vertex2i(x2, y2);
 	gGL.end();
@@ -343,11 +343,11 @@ void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2, const LLColor4 &color )
 		y2++;
 	}
 
-	LLGLSNoTexture no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	gGL.color4fv( color.mV );
 
-	gGL.begin(LLVertexBuffer::LINES);
+	gGL.begin(LLRender::LINES);
 		gGL.vertex2i(x1, y1);
 		gGL.vertex2i(x2, y2);
 	gGL.end();
@@ -355,17 +355,17 @@ void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2, const LLColor4 &color )
 
 void gl_triangle_2d(S32 x1, S32 y1, S32 x2, S32 y2, S32 x3, S32 y3, const LLColor4& color, BOOL filled)
 {
-	LLGLSNoTexture no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	gGL.color4fv(color.mV);
 
 	if (filled)
 	{
-		gGL.begin(LLVertexBuffer::TRIANGLES);
+		gGL.begin(LLRender::TRIANGLES);
 	}
 	else
 	{
-		gGL.begin(LLVertexBuffer::LINE_LOOP);
+		gGL.begin(LLRender::LINE_LOOP);
 	}
 	gGL.vertex2i(x1, y1);
 	gGL.vertex2i(x2, y2);
@@ -375,11 +375,11 @@ void gl_triangle_2d(S32 x1, S32 y1, S32 x2, S32 y2, S32 x3, S32 y3, const LLColo
 
 void gl_corners_2d(S32 left, S32 top, S32 right, S32 bottom, S32 length, F32 max_frac)
 {
-	LLGLSNoTexture no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	length = llmin((S32)(max_frac*(right - left)), length);
 	length = llmin((S32)(max_frac*(top - bottom)), length);
-	gGL.begin(LLVertexBuffer::LINES);
+	gGL.begin(LLRender::LINES);
 	gGL.vertex2i(left, top);
 	gGL.vertex2i(left + length, top);
 	
@@ -496,11 +496,11 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLIma
 	{
 		gGL.translatef((F32)x, (F32)y, 0.f);
 
-		image->bind();
+		gGL.getTexUnit(0)->bind(image);
 
 		gGL.color4fv(color.mV);
 		
-		gGL.begin(LLVertexBuffer::QUADS);
+		gGL.begin(LLRender::QUADS);
 		{
 			// draw bottom left
 			gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom);
@@ -656,11 +656,11 @@ void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degre
 			gGL.translatef( -offset_x, -offset_y, 0.f );
 		}
 
-		image->bind();
+		gGL.getTexUnit(0)->bind(image);
 
 		gGL.color4fv(color.mV);
 		
-		gGL.begin(LLVertexBuffer::QUADS);
+		gGL.begin(LLRender::QUADS);
 		{
 			gGL.texCoord2f(uv_rect.mRight, uv_rect.mTop);
 			gGL.vertex2i(width, height );
@@ -694,11 +694,11 @@ void gl_draw_scaled_image_inverted(S32 x, S32 y, S32 width, S32 height, LLImageG
 	{
 		gGL.translatef((F32)x, (F32)y, 0.f);
 
-		image->bind();
+		gGL.getTexUnit(0)->bind(image);
 
 		gGL.color4fv(color.mV);
 		
-		gGL.begin(LLVertexBuffer::QUADS);
+		gGL.begin(LLRender::QUADS);
 		{
 			gGL.texCoord2f(uv_rect.mRight, uv_rect.mBottom);
 			gGL.vertex2i(width, height );
@@ -733,7 +733,7 @@ void gl_stippled_line_3d( const LLVector3& start, const LLVector3& end, const LL
 	glLineWidth(2.5f);
 	glLineStipple(2, 0x3333 << shift);
 
-	gGL.begin(LLVertexBuffer::LINES);
+	gGL.begin(LLRender::LINES);
 	{
 		gGL.vertex3fv( start.mV );
 		gGL.vertex3fv( end.mV );
@@ -750,7 +750,7 @@ void gl_rect_2d_xor(S32 left, S32 top, S32 right, S32 bottom)
 	glLogicOp( GL_XOR );
 	stop_glerror();
 
-	gGL.begin(LLVertexBuffer::QUADS);
+	gGL.begin(LLRender::QUADS);
 		gGL.vertex2i(left, top);
 		gGL.vertex2i(left, bottom);
 		gGL.vertex2i(right, bottom);
@@ -782,14 +782,14 @@ void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F
 
 		if (filled)
 		{
-			gGL.begin(LLVertexBuffer::TRIANGLE_FAN);
+			gGL.begin(LLRender::TRIANGLE_FAN);
 			gGL.vertex2f(0.f, 0.f);
 			// make sure circle is complete
 			steps += 1;
 		}
 		else
 		{
-			gGL.begin(LLVertexBuffer::LINE_STRIP);
+			gGL.begin(LLRender::LINE_STRIP);
 		}
 
 		while( steps-- )
@@ -809,7 +809,7 @@ void gl_circle_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled
 {
 	gGL.pushMatrix();
 	{
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gGL.translatef(center_x, center_y, 0.f);
 
 		// Inexact, but reasonably fast.
@@ -821,14 +821,14 @@ void gl_circle_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled
 
 		if (filled)
 		{
-			gGL.begin(LLVertexBuffer::TRIANGLE_FAN);
+			gGL.begin(LLRender::TRIANGLE_FAN);
 			gGL.vertex2f(0.f, 0.f);
 			// make sure circle is complete
 			steps += 1;
 		}
 		else
 		{
-			gGL.begin(LLVertexBuffer::LINE_LOOP);
+			gGL.begin(LLRender::LINE_LOOP);
 		}
 
 		while( steps-- )
@@ -850,7 +850,7 @@ void gl_deep_circle( F32 radius, F32 depth, S32 steps )
 	F32 x = radius;
 	F32 y = 0.f;
 	F32 angle_delta = F_TWO_PI / (F32)steps;
-	gGL.begin( LLVertexBuffer::TRIANGLE_STRIP  );
+	gGL.begin( LLRender::TRIANGLE_STRIP  );
 	{
 		S32 step = steps + 1; // An extra step to close the circle.
 		while( step-- )
@@ -905,7 +905,7 @@ void gl_rect_2d_checkerboard(const LLRect& rect)
 		first = FALSE;
 	}
 	
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	// ...white squares
 	gGL.color3f( 1.f, 1.f, 1.f );
@@ -935,9 +935,9 @@ void gl_washer_2d(F32 outer_radius, F32 inner_radius, S32 steps, const LLColor4&
 	F32 x2 = inner_radius;
 	F32 y2 = 0.f;
 
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
-	gGL.begin( LLVertexBuffer::TRIANGLE_STRIP  );
+	gGL.begin( LLRender::TRIANGLE_STRIP  );
 	{
 		steps += 1; // An extra step to close the circle.
 		while( steps-- )
@@ -972,8 +972,8 @@ void gl_washer_segment_2d(F32 outer_radius, F32 inner_radius, F32 start_radians,
 	F32 x2 = inner_radius * cos( start_radians );
 	F32 y2 = inner_radius * sin( start_radians );
 
-	LLGLSNoTexture gls_no_texture;
-	gGL.begin( LLVertexBuffer::TRIANGLE_STRIP  );
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+	gGL.begin( LLRender::TRIANGLE_STRIP  );
 	{
 		steps += 1; // An extra step to close the circle.
 		while( steps-- )
@@ -1008,9 +1008,9 @@ void gl_washer_spokes_2d(F32 outer_radius, F32 inner_radius, S32 count, const LL
 	F32 x2 = inner_radius * cos( HALF_DELTA );
 	F32 y2 = inner_radius * sin( HALF_DELTA );
 
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
-	gGL.begin( LLVertexBuffer::LINES  );
+	gGL.begin( LLRender::LINES  );
 	{
 		while( count-- )
 		{
@@ -1033,7 +1033,7 @@ void gl_washer_spokes_2d(F32 outer_radius, F32 inner_radius, S32 count, const LL
 
 void gl_rect_2d_simple_tex( S32 width, S32 height )
 {
-	gGL.begin( LLVertexBuffer::QUADS );
+	gGL.begin( LLRender::QUADS );
 
 		gGL.texCoord2f(1.f, 1.f);
 		gGL.vertex2i(width, height);
@@ -1052,7 +1052,7 @@ void gl_rect_2d_simple_tex( S32 width, S32 height )
 
 void gl_rect_2d_simple( S32 width, S32 height )
 {
-	gGL.begin( LLVertexBuffer::QUADS );
+	gGL.begin( LLRender::QUADS );
 		gGL.vertex2i(width, height);
 		gGL.vertex2i(0, height);
 		gGL.vertex2i(0, 0);
@@ -1094,7 +1094,7 @@ void gl_segmented_rect_2d_tex(const S32 left,
 	LLVector2 width_vec((F32)width, 0.f);
 	LLVector2 height_vec(0.f, (F32)height);
 
-	gGL.begin(LLVertexBuffer::QUADS);
+	gGL.begin(LLRender::QUADS);
 	{
 		// draw bottom left
 		gGL.texCoord2f(0.f, 0.f);
@@ -1262,7 +1262,7 @@ void gl_segmented_rect_2d_fragment_tex(const S32 left,
 	LLVector2 x_min;
 	LLVector2 x_max;
 
-	gGL.begin(LLVertexBuffer::QUADS);
+	gGL.begin(LLRender::QUADS);
 	{
 		if (start_fragment < middle_start)
 		{
@@ -1419,7 +1419,7 @@ void gl_segmented_rect_3d_tex(const LLVector2& border_scale, const LLVector3& bo
 	LLVector3 bottom_border_height = ((edges & (~(U32)ROUNDED_RECT_TOP)) != 0) ? border_height : LLVector3::zero;
 
 
-	gGL.begin(LLVertexBuffer::QUADS);
+	gGL.begin(LLRender::QUADS);
 	{
 		// draw bottom left
 		gGL.texCoord2f(0.f, 0.f);
@@ -1575,7 +1575,7 @@ void LLUI::initClass(LLControlGroup* config,
 void LLUI::cleanupClass()
 {
 	sImageProvider->cleanUp();
-	LLLineEditor::cleanupClass();
+	LLLineEditor::cleanupLineEditor();
 }
 
 
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 034c49b..bc6fe7e 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -1281,7 +1281,7 @@ void LLView::drawDebugRect()
 	LLUI::pushMatrix();
 	{
 		// drawing solids requires texturing be disabled
-		LLGLSNoTexture no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 		if (mUseBoundingRect)
 		{
@@ -1303,7 +1303,7 @@ void LLView::drawDebugRect()
 
 		gGL.color4fv( border_color.mV );
 
-		gGL.begin(LLVertexBuffer::LINES);
+		gGL.begin(LLRender::LINES);
 			gGL.vertex2i(0, debug_rect.getHeight() - 1);
 			gGL.vertex2i(0, 0);
 
diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp
index 8a5beea..a1c26d6 100644
--- a/indra/llui/llviewborder.cpp
+++ b/indra/llui/llviewborder.cpp
@@ -111,7 +111,7 @@ void LLViewBorder::draw()
 
 void LLViewBorder::drawOnePixelLines()
 {
-	LLGLSNoTexture uiNoTexture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	LLColor4 top_color = mHighlightLight;
 	LLColor4 bottom_color = mHighlightLight;
@@ -158,7 +158,7 @@ void LLViewBorder::drawOnePixelLines()
 
 void LLViewBorder::drawTwoPixelLines()
 {
-	LLGLSNoTexture no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	
 	LLColor4 focus_color = gFocusMgr.getFocusColor();
 
@@ -230,7 +230,7 @@ void LLViewBorder::drawTextures()
 
 	//gGL.color4fv(UI_VERTEX_COLOR.mV);
 
-	//mTexture->bind();
+	//gGL.getTexUnit(0)->bind(mTexture);
 	//glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
 	//glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
 
@@ -248,7 +248,7 @@ void LLViewBorder::drawTextureTrapezoid( F32 degrees, S32 width, S32 length, F32
 		gGL.translatef(start_x, start_y, 0.f);
 		glRotatef( degrees, 0, 0, 1 );
 
-		gGL.begin(LLVertexBuffer::QUADS);
+		gGL.begin(LLRender::QUADS);
 		{
 			//      width, width   /---------\ length-width, width		//
 			//	   			      /           \							//
diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt
index 9f136f7..c3c12ef 100644
--- a/indra/llvfs/CMakeLists.txt
+++ b/indra/llvfs/CMakeLists.txt
@@ -56,3 +56,9 @@ set_source_files_properties(${llvfs_HEADER_FILES}
 list(APPEND llvfs_SOURCE_FILES ${llvfs_HEADER_FILES})
 
 add_library (llvfs ${llvfs_SOURCE_FILES})
+
+if (DARWIN)
+  include(CMakeFindFrameworks)
+  find_library(CARBON_LIBRARY Carbon)
+  target_link_libraries(llvfs ${CARBON_LIBRARY})
+endif (DARWIN)
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index 0e014d9..5bfe11f 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -497,6 +497,29 @@ std::string LLDir::getTempFilename() const
 	return temp_filename;
 }
 
+// static
+std::string LLDir::getScrubbedFileName(const std::string uncleanFileName)
+{
+	std::string name(uncleanFileName);
+	const std::string illegalChars(getForbiddenFileChars());
+	// replace any illegal file chars with and underscore '_'
+	for( unsigned int i = 0; i < illegalChars.length(); i++ )
+	{
+		int j = -1;
+		while((j = name.find(illegalChars[i])) > -1)
+		{
+			name[j] = '_';
+		}
+	}
+	return name;
+}
+
+// static
+std::string LLDir::getForbiddenFileChars()
+{
+	return "\\/:*?\"<>|";
+}
+
 void LLDir::setLindenUserDir(const std::string &first, const std::string &last)
 {
 	// if both first and last aren't set, assume we're grabbing the cached dir
diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h
index dbddf7d..2626d19 100644
--- a/indra/llvfs/lldir.h
+++ b/indra/llvfs/lldir.h
@@ -64,12 +64,12 @@ class LLDir
 
 	virtual void initAppDirs(const std::string &app_name) = 0;
  public:	
-	 virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask);
+	virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask);
 
 // pure virtual functions
-	 virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask) = 0;
-	 virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) = 0;
-	 virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) = 0;
+	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask) = 0;
+	virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) = 0;
+	virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) = 0;
 	virtual std::string getCurPath() = 0;
 	virtual BOOL fileExists(const std::string &filename) const = 0;
 
@@ -104,7 +104,7 @@ class LLDir
 	std::string getBaseFileName(const std::string& filepath, bool strip_exten = false) const;
 	std::string getDirName(const std::string& filepath) const;
 	std::string getExtension(const std::string& filepath) const; // Excludes '.', e.g getExtension("foo.wav") == "wav"
-	
+
 	// these methods search the various skin paths for the specified file in the following order:
 	// getUserSkinDir(), getSkinDir(), getDefaultSkinDir()
 	std::string findSkinnedFilename(const std::string &filename) const;
@@ -114,6 +114,10 @@ class LLDir
 	// random filename in common temporary directory
 	std::string getTempFilename() const;
 
+	// For producing safe download file names from potentially unsafe ones
+	static std::string getScrubbedFileName(const std::string uncleanFileName);
+	static std::string getForbiddenFileChars();
+
 	virtual void setChatLogsDir(const std::string &path);		// Set the chat logs dir to this user's dir
 	virtual void setPerAccountChatLogsDir(const std::string &first, const std::string &last);		// Set the per user chat log directory.
 	virtual void setLindenUserDir(const std::string &first, const std::string &last);		// Set the linden user dir to this user's dir
diff --git a/indra/llvfs/llvfile.cpp b/indra/llvfs/llvfile.cpp
index 61de885..fbdd738 100644
--- a/indra/llvfs/llvfile.cpp
+++ b/indra/llvfs/llvfile.cpp
@@ -35,6 +35,7 @@
 
 #include "llerror.h"
 #include "llthread.h"
+#include "llstat.h"
 #include "llvfs.h"
 
 const S32 LLVFile::READ			= 0x00000001;
diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp
index b3d02a5..82d2723 100644
--- a/indra/llvfs/llvfs.cpp
+++ b/indra/llvfs/llvfs.cpp
@@ -1266,7 +1266,7 @@ void LLVFS::eraseBlockLength(LLVFSBlock *block)
 	}
 	if(!found_block)
 	{
-		llwarns << "eraseBlock could not find block" << llendl;
+		llerrs << "eraseBlock could not find block" << llendl;
 	}
 }
 
diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp
index e8b0a1b..9ce227b 100644
--- a/indra/llwindow/llwindow.cpp
+++ b/indra/llwindow/llwindow.cpp
@@ -321,6 +321,12 @@ std::string LLWindow::getFontListSans()
 #endif
 }
 
+//virtual
+void LLWindow::processMiscNativeEvents()
+{
+	// do nothing unless subclassed
+}
+
 #define UTF16_IS_HIGH_SURROGATE(U) ((U16)((U) - 0xD800) < 0x0400)
 #define UTF16_IS_LOW_SURROGATE(U)  ((U16)((U) - 0xDC00) < 0x0400)
 #define UTF16_SURROGATE_PAIR_TO_UTF32(H,L) (((H) << 10) + (L) - (0xD800 << 10) - 0xDC00 + 0x00010000)
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index 7e948b9..e2c28a2 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -194,6 +194,7 @@ public:
 	virtual U32	 getFSAASamples() = 0;
 	virtual BOOL restoreGamma() = 0;			// Restore original gamma table (before updating gamma)
 	virtual ESwapMethod getSwapMethod() { return mSwapMethod; }
+	virtual void processMiscNativeEvents();
 	virtual void gatherInput() = 0;
 	virtual void delayInputProcessing() = 0;
 	virtual void swapBuffers() = 0;
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index e5d15c4..361126d 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -104,7 +104,8 @@ void maybe_unlock_display(void)
 
 #if LL_GTK
 // Lazily initialize and check the runtime GTK version for goodness.
-BOOL ll_try_gtk_init(void)
+// static
+bool LLWindowSDL::ll_try_gtk_init(void)
 {
 	static BOOL done_gtk_diag = FALSE;
 	static BOOL gtk_is_good = FALSE;
@@ -166,7 +167,8 @@ BOOL ll_try_gtk_init(void)
 
 
 #if LL_X11
-Window get_SDL_XWindowID(void)
+// static
+Window LLWindowSDL::get_SDL_XWindowID(void)
 {
 	if (gWindowImplementation) {
 		return gWindowImplementation->mSDL_XWindowID;
@@ -174,7 +176,8 @@ Window get_SDL_XWindowID(void)
 	return None;
 }
 
-Display* get_SDL_Display(void)
+//static
+Display* LLWindowSDL::get_SDL_Display(void)
 {
 	if (gWindowImplementation) {
 		return gWindowImplementation->mSDL_Display;
@@ -1235,7 +1238,7 @@ typedef Atom x11clipboard_type;
  */
 static x11clipboard_type get_x11_readwrite_clipboard_type(void)
 {
-	return XInternAtom(get_SDL_Display(), "CLIPBOARD", False);
+	return XInternAtom(LLWindowSDL::get_SDL_Display(), "CLIPBOARD", False);
 }
 
 static x11clipboard_type get_x11_write_clipboard_type(void)
@@ -1248,18 +1251,18 @@ static x11clipboard_type get_x11_write_clipboard_type(void)
    storage because their use isn't really defined for holding UTF8. */
 static x11clipboard_type get_x11_cutbuffer_clipboard_type(void)
 {
-	return XInternAtom(get_SDL_Display(), "SECONDLIFE_CUTBUFFER", False);
+	return XInternAtom(LLWindowSDL::get_SDL_Display(), "SECONDLIFE_CUTBUFFER", False);
 }
 
 /* Some X11 atom-generators */
 static Atom get_x11_targets_atom(void)
 {
-	return XInternAtom(get_SDL_Display(), "TARGETS", False);
+	return XInternAtom(LLWindowSDL::get_SDL_Display(), "TARGETS", False);
 }
 
 static Atom get_x11_text_atom(void)
 {
-	return XInternAtom(get_SDL_Display(), "TEXT", False);
+	return XInternAtom(LLWindowSDL::get_SDL_Display(), "TEXT", False);
 }
 
 /* These defines, and convert_data/convert_x11clipboard,
@@ -1544,7 +1547,7 @@ int clipboard_filter_callback(const SDL_Event *event)
 		sevent.xselection.property = None;
 		sevent.xselection.requestor = req->requestor;
 		sevent.xselection.time = req->time;
-		if ( XGetWindowProperty(get_SDL_Display(), DefaultRootWindow(get_SDL_Display()),
+		if ( XGetWindowProperty(LLWindowSDL::get_SDL_Display(), DefaultRootWindow(LLWindowSDL::get_SDL_Display()),
 					get_x11_cutbuffer_clipboard_type(), 0, INT_MAX/4, False, req->target,
 					&sevent.xselection.target, &seln_format,
 					&nbytes, &overflow, &seln_data) == Success )
@@ -1558,7 +1561,7 @@ int clipboard_filter_callback(const SDL_Event *event)
 					if ( seln_data[nbytes-1] == '\0' )
 						--nbytes;
 				}
-				XChangeProperty(get_SDL_Display(), req->requestor, req->property,
+				XChangeProperty(LLWindowSDL::get_SDL_Display(), req->requestor, req->property,
 						req->target, seln_format, PropModeReplace,
 						seln_data, nbytes);
 				sevent.xselection.property = req->property;
@@ -1571,7 +1574,7 @@ int clipboard_filter_callback(const SDL_Event *event)
 					get_x11_targets_atom()
 				};
 				supported[0] = sevent.xselection.target;
-				XChangeProperty(get_SDL_Display(), req->requestor,
+				XChangeProperty(LLWindowSDL::get_SDL_Display(), req->requestor,
 						req->property, XA_ATOM, 32, PropModeReplace,
 						(unsigned char*)supported,
 						num_supported);
@@ -1584,10 +1587,10 @@ int clipboard_filter_callback(const SDL_Event *event)
 			XFree(seln_data);
 		}
 		int sendret =
-			XSendEvent(get_SDL_Display(),req->requestor,False,0,&sevent);
+			XSendEvent(LLWindowSDL::get_SDL_Display(),req->requestor,False,0,&sevent);
 		if ((sendret==BadValue) || (sendret==BadWindow))
 			llwarns << "Clipboard SendEvent failed" << llendl;
-		XSync(get_SDL_Display(), False);
+		XSync(LLWindowSDL::get_SDL_Display(), False);
 	}
 		break;
 	}
@@ -1959,17 +1962,14 @@ U32 LLWindowSDL::SDLCheckGrabbyKeys(SDLKey keysym, BOOL gain)
 	return mGrabbyKeyFlags;
 }
 
-void LLWindowSDL::gatherInput()
+// virtual
+void LLWindowSDL::processMiscNativeEvents()
 {
-    const Uint32 CLICK_THRESHOLD = 300;  // milliseconds
-    static int leftClick = 0;
-    static int rightClick = 0;
-    static Uint32 lastLeftDown = 0;
-    static Uint32 lastRightDown = 0;
-    SDL_Event event;
-
-#if LL_GTK && LL_LLMOZLIB_ENABLED
-    // Pump GTK events so embedded Gecko doesn't starve.
+#if LL_GTK && (LL_LLMOZLIB_ENABLED || LL_DBUS_ENABLED)
+	// Pump GTK events to avoid starvation for:
+	// * Embedded Gecko
+	// * DBUS servicing
+	// * Anything else which quietly hooks into the default glib/GTK loop
     if (ll_try_gtk_init())
     {
 	    // Yuck, Mozilla's GTK callbacks play with the locale - push/pop
@@ -1992,7 +1992,17 @@ void LLWindowSDL::gatherInput()
 
 	    setlocale(LC_ALL, saved_locale.c_str() );
     }
-#endif // LL_GTK && LL_LLMOZLIB_ENABLED
+#endif // LL_GTK && (LL_LLMOZLIB_ENABLED || LL_DBUS_ENABLED)
+}
+
+void LLWindowSDL::gatherInput()
+{
+    const Uint32 CLICK_THRESHOLD = 300;  // milliseconds
+    static int leftClick = 0;
+    static int rightClick = 0;
+    static Uint32 lastLeftDown = 0;
+    static Uint32 lastRightDown = 0;
+    SDL_Event event;
 
     // Handle all outstanding SDL events
     while (SDL_PollEvent(&event))
@@ -2497,12 +2507,10 @@ S32 OSMessageBoxSDL(const std::string& text, const std::string& caption, U32 typ
 {
 	S32 rtn = OSBTN_CANCEL;
 
-	ll_try_gtk_init();
-
 	if(gWindowImplementation != NULL)
 		gWindowImplementation->beforeDialog();
 
-	if (ll_try_gtk_init()
+	if (LLWindowSDL::ll_try_gtk_init()
 	    // We can NOT expect to combine GTK and SDL's aggressive fullscreen
 	    && ((NULL==gWindowImplementation) || (!was_fullscreen))
 	    )
@@ -2530,7 +2538,8 @@ S32 OSMessageBoxSDL(const std::string& text, const std::string& caption, U32 typ
 			buttons = GTK_BUTTONS_YES_NO;
 			break;
 		}
-		win = gtk_message_dialog_new(NULL,flags, messagetype, buttons, text.c_str());
+		win = gtk_message_dialog_new(NULL, flags, messagetype, buttons, "%s",
+									 text.c_str());
 
 # if LL_X11
 		// Make GTK tell the window manager to associate this
@@ -2754,7 +2763,7 @@ void LLWindowSDL::spawnWebBrowser(const std::string& escaped_url)
 void *LLWindowSDL::getPlatformWindow()
 {
 #if LL_GTK && LL_LLMOZLIB_ENABLED
-	if (ll_try_gtk_init())
+	if (LLWindowSDL::ll_try_gtk_init())
 	{
 		maybe_lock_display();
 
diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h
index a395ccd..547fe12 100644
--- a/indra/llwindow/llwindowsdl.h
+++ b/indra/llwindow/llwindowsdl.h
@@ -89,6 +89,7 @@ public:
 	/*virtual*/ void setFSAASamples(const U32 samples);
 	/*virtual*/ BOOL restoreGamma();			// Restore original gamma table (before updating gamma)
 	/*virtual*/ ESwapMethod getSwapMethod() { return mSwapMethod; }
+	/*virtual*/ void processMiscNativeEvents();
 	/*virtual*/ void gatherInput();
 	/*virtual*/ void swapBuffers();
 
@@ -129,6 +130,16 @@ public:
 	void (*Lock_Display)(void);
 	void (*Unlock_Display)(void);
 
+#if LL_GTK
+	// Lazily initialize and check the runtime GTK version for goodness.
+	static bool ll_try_gtk_init(void);
+#endif // LL_GTK
+
+#if LL_X11
+	static Window get_SDL_XWindowID(void);
+	static Display* get_SDL_Display(void);
+#endif // LL_X11	
+
 protected:
 	LLWindowSDL(
 		const std::string& title, int x, int y, int width, int height, U32 flags,
@@ -205,8 +216,6 @@ private:
 	BOOL mFlashing;
 	LLTimer mFlashTimer;
 #endif //LL_X11
-
-	
 };
 
 
@@ -223,16 +232,4 @@ public:
 
 S32 OSMessageBoxSDL(const std::string& text, const std::string& caption, U32 type);
 
-void load_url_external(const char* url);
-
-#if LL_GTK
-// Lazily initialize and check the runtime GTK version for goodness.
-BOOL ll_try_gtk_init(void);
-#endif // LL_GTK
-
-#if LL_X11
-Window get_SDL_XWindowID(void);
-Display* get_SDL_Display(void);
-#endif // LL_X11
-
 #endif //LL_LLWINDOWSDL_H
diff --git a/indra/llxml/CMakeLists.txt b/indra/llxml/CMakeLists.txt
index d86bc0d..9febd97 100644
--- a/indra/llxml/CMakeLists.txt
+++ b/indra/llxml/CMakeLists.txt
@@ -34,3 +34,8 @@ set_source_files_properties(${llxml_HEADER_FILES}
 list(APPEND llxml_SOURCE_FILES ${llxml_HEADER_FILES})
 
 add_library (llxml ${llxml_SOURCE_FILES})
+target_link_libraries(
+    llxml
+    ${BOOST_SIGNALS_LIBRARY}
+    ${EXPAT_LIBRARIES}
+    )
diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp
index 8fa58e8..e7bac77 100644
--- a/indra/llxml/llcontrol.cpp
+++ b/indra/llxml/llcontrol.cpp
@@ -50,9 +50,9 @@
 #include "llsdserialize.h"
 
 #if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG
-#define CONTROL_ERRS LL_WARNS("ControlErrors")
-#else
 #define CONTROL_ERRS LL_ERRS("ControlErrors")
+#else
+#define CONTROL_ERRS LL_WARNS("ControlErrors")
 #endif
 
 //this defines the current version of the settings file
diff --git a/indra/lscript/lscript_byteconvert.h b/indra/lscript/lscript_byteconvert.h
index 9530b63..664a25e 100644
--- a/indra/lscript/lscript_byteconvert.h
+++ b/indra/lscript/lscript_byteconvert.h
@@ -250,7 +250,7 @@ inline void bytestream2vector(LLVector3 &vector, const U8 *stream, S32 &offset)
 	}
 }
 
-inline void vector2bytestream(U8 *stream, S32 &offset, LLVector3 &vector)
+inline void vector2bytestream(U8 *stream, S32 &offset, const LLVector3 &vector)
 {
 	S32 value = *(S32 *)&vector.mV[VZ];
 	integer2bytestream(stream, offset, value);
@@ -292,7 +292,7 @@ inline void bytestream2quaternion(LLQuaternion &quat, const U8 *stream, S32 &off
 	}
 }
 
-inline void quaternion2bytestream(U8 *stream, S32 &offset, LLQuaternion &quat)
+inline void quaternion2bytestream(U8 *stream, S32 &offset, const LLQuaternion &quat)
 {
 	S32 value = *(S32 *)&quat.mQ[VS];
 	integer2bytestream(stream, offset, value);
@@ -528,7 +528,7 @@ inline void lscript_push(U8 *stream, F32 value)
 	}
 }
 
-inline void lscript_push(U8 *stream, LLVector3 &value)
+inline void lscript_push(U8 *stream, const LLVector3 &value)
 {
 	S32 sp = get_register(stream, LREG_SP);
 	sp -= LSCRIPTDataSize[LST_VECTOR];
@@ -539,7 +539,7 @@ inline void lscript_push(U8 *stream, LLVector3 &value)
 	}
 }
 
-inline void lscript_push(U8 *stream, LLQuaternion &value)
+inline void lscript_push(U8 *stream, const LLQuaternion &value)
 {
 	S32 sp = get_register(stream, LREG_SP);
 	sp -= LSCRIPTDataSize[LST_QUATERNION];
@@ -679,13 +679,13 @@ inline void lscript_local_store(U8 *stream, S32 address, F32 value)
 		float2bytestream(stream, address, value);
 }
 
-inline void lscript_local_store(U8 *stream, S32 address, LLVector3 value)
+inline void lscript_local_store(U8 *stream, S32 address, const LLVector3 value)
 {
 	if (lscript_check_local(stream, address, LSCRIPTDataSize[LST_VECTOR]))
 		vector2bytestream(stream, address, value);
 }
 
-inline void lscript_local_store(U8 *stream, S32 address, LLQuaternion value)
+inline void lscript_local_store(U8 *stream, S32 address, const LLQuaternion value)
 {
 	if (lscript_check_local(stream, address, LSCRIPTDataSize[LST_QUATERNION]))
 		quaternion2bytestream(stream, address, value);
@@ -703,13 +703,13 @@ inline void lscript_global_store(U8 *stream, S32 address, F32 value)
 		float2bytestream(stream, address, value);
 }
 
-inline void lscript_global_store(U8 *stream, S32 address, LLVector3 value)
+inline void lscript_global_store(U8 *stream, S32 address, const LLVector3 value)
 {
 	if (lscript_check_global(stream, address, LSCRIPTDataSize[LST_VECTOR]))
 		vector2bytestream(stream, address, value);
 }
 
-inline void lscript_global_store(U8 *stream, S32 address, LLQuaternion value)
+inline void lscript_global_store(U8 *stream, S32 address, const LLQuaternion value)
 {
 	if (lscript_check_global(stream, address, LSCRIPTDataSize[LST_QUATERNION]))
 		quaternion2bytestream(stream, address, value);
@@ -1125,7 +1125,7 @@ inline void safe_instruction_bytestream2vector(LLVector3 &value, U8 *stream, S32
 	}
 }
 
-inline void safe_instruction_vector2bytestream(U8 *stream, S32 &offset, LLVector3 &value)
+inline void safe_instruction_vector2bytestream(U8 *stream, S32 &offset, const LLVector3 &value)
 {
 	if (safe_instruction_check_address(stream, offset, LSCRIPTDataSize[LST_VECTOR]))
 	{
@@ -1141,7 +1141,7 @@ inline void safe_instruction_bytestream2quaternion(LLQuaternion &value, U8 *stre
 	}
 }
 
-inline void safe_instruction_quaternion2bytestream(U8 *stream, S32 &offset, LLQuaternion &value)
+inline void safe_instruction_quaternion2bytestream(U8 *stream, S32 &offset, const LLQuaternion &value)
 {
 	if (safe_instruction_check_address(stream, offset, LSCRIPTDataSize[LST_QUATERNION]))
 	{
diff --git a/indra/lscript/lscript_byteformat.h b/indra/lscript/lscript_byteformat.h
index 1f201d8..fa82e6b 100644
--- a/indra/lscript/lscript_byteformat.h
+++ b/indra/lscript/lscript_byteformat.h
@@ -470,6 +470,7 @@ const U8 LSCRIPTTypeHi4Bits[LST_EOF] =
 	LST_VECTOR << 4,
 	LST_QUATERNION << 4,
 	LST_LIST << 4,
+	LST_UNDEFINED << 4,
 };
 
 const char * const LSCRIPTTypeNames[LST_EOF] = 	/*Flawfinder: ignore*/
diff --git a/indra/lscript/lscript_compile/lscript_tree.cpp b/indra/lscript/lscript_compile/lscript_tree.cpp
index 71e7f19..f62b4e7 100644
--- a/indra/lscript/lscript_compile/lscript_tree.cpp
+++ b/indra/lscript/lscript_compile/lscript_tree.cpp
@@ -46,7 +46,8 @@
 
 static void print_cil_box(LLFILE* fp, LSCRIPTType type)
 {
-	switch(type)
+	
+switch(type)
 	{
 	case LST_INTEGER:
 		fprintf(fp, "box [mscorlib]System.Int32\n");
@@ -1257,10 +1258,10 @@ static void print_cil_init_variable(LLFILE* fp, LSCRIPTType type)
 		fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Vector class [LslUserScript]LindenLab.SecondLife.LslUserScript::'CreateVector'(float32, float32, float32)\n");
 		break;
 	case LST_QUATERNION:
-		fprintf(fp, "ldc.r8 1\n");
 		fprintf(fp, "ldc.r8 0\n");
 		fprintf(fp, "ldc.r8 0\n");
 		fprintf(fp, "ldc.r8 0\n");
+		fprintf(fp, "ldc.r8 1\n");
 		fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Quaternion class [LslUserScript]LindenLab.SecondLife.LslUserScript::'CreateQuaternion'(float32, float32, float32, float32)\n");
 		break;
 	case LST_LIST:
@@ -3517,7 +3518,7 @@ void LLScriptRezEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompile
 		fprintf(fp, " )\n");
 		break;
 	case LSCP_SCOPE_PASS1:
-	  checkForDuplicateHandler(fp, this, scope, "rez");
+		checkForDuplicateHandler(fp, this, scope, "on_rez");
 		if (scope->checkEntry(mStartParam->mName))
 		{
 			gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
@@ -7885,10 +7886,10 @@ void LLScriptFunctionCall::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCom
 			{
 				// Prefix function name with g to distinguish from
 				// event handlers.
-				fprintf(fp, gScriptp->getClassName());
+				fprintf(fp, "%s", gScriptp->getClassName());
 				fprintf(fp, "::'g");
 			}
-			fprintf(fp, mIdentifier->mName);
+			fprintf(fp, "%s", mIdentifier->mName);
 			fprintf(fp, "'(");
 			print_cil_arg_list(fp, mIdentifier->mScopeEntry->mFunctionArgs);
 			fprintf(fp, ")\n");
@@ -8689,8 +8690,12 @@ void LLScriptIf::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass p
 		break;
 	case LSCP_TYPE:
 		mExpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
+		if (type == LST_NULL)
+		{
+			gErrorToText.writeError(fp, mExpression, LSERROR_TYPE_MISMATCH);
+		}
 		mType = type;
-		mStatement->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
+		mStatement->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);		
 		break;
 	case LSCP_EMIT_BYTE_CODE:
 		{
@@ -8770,6 +8775,10 @@ void LLScriptIfElse::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePa
 		break;
 	case LSCP_TYPE:
 		mExpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
+		if (type == LST_NULL)
+		{
+			gErrorToText.writeError(fp, mExpression, LSERROR_TYPE_MISMATCH);
+		}
 		mType = type;
 		mStatement1->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
 		mStatement2->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
@@ -8869,6 +8878,10 @@ void LLScriptFor::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass
 		if(mSequence)
 			mSequence->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
 		mExpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
+		if (type == LST_NULL)
+		{
+			gErrorToText.writeError(fp, mExpression, LSERROR_TYPE_MISMATCH);
+		}
 		mType = type;
 		if(mExpressionList)
 			mExpressionList->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
@@ -8968,6 +8981,10 @@ void LLScriptDoWhile::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompileP
 	case LSCP_TYPE:
 		mStatement->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
 		mExpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
+		if (type == LST_NULL)
+		{
+			gErrorToText.writeError(fp, mExpression, LSERROR_TYPE_MISMATCH);
+		}
 		mType = type;
 		break;
 	case LSCP_EMIT_BYTE_CODE:
@@ -9039,6 +9056,10 @@ void LLScriptWhile::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePas
 		break;
 	case LSCP_TYPE:
 		mExpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
+		if (type == LST_NULL)
+		{
+			gErrorToText.writeError(fp, mExpression, LSERROR_TYPE_MISMATCH);
+		}
 		mType = type;
 		mStatement->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
 		break;
@@ -9720,7 +9741,7 @@ void LLScriptEventHandler::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCom
 		// Allows state changing by finding handlers prefixed with new
 		// state name. Prefix disambiguates functions and event handlers.
 		fprintf(fp, "e");
-		fprintf(fp, entry->mIdentifier);
+		fprintf(fp, "%s", entry->mIdentifier);
 
 		// Handler name and arguments.
 		mEventp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
@@ -10152,7 +10173,7 @@ void LLScriptGlobalFunctions::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPT
 			fprintf(fp, ".method public hidebysig instance default ");
 			print_cil_type(fp, mType ? mType->mType : LST_NULL);
 			fprintf(fp, " 'g");
-			fprintf(fp, mIdentifier->mName);
+			fprintf(fp, "%s", mIdentifier->mName);
 			fprintf(fp, "'");
 			if (mParameters)
 			{
diff --git a/indra/lscript/lscript_execute.h b/indra/lscript/lscript_execute.h
index ac23ff3..77e9c21 100644
--- a/indra/lscript/lscript_execute.h
+++ b/indra/lscript/lscript_execute.h
@@ -370,7 +370,7 @@ public:
 	LLScriptExecute();
 	virtual ~LLScriptExecute() {;}
 
-	virtual S32 getVersion() = 0;
+	virtual S32 getVersion() const = 0;
 	virtual void deleteAllEvents() = 0;
 	virtual void addEvent(LLScriptDataCollection* event) = 0;
 	virtual U32 getEventCount() = 0;
@@ -384,12 +384,12 @@ public:
 	virtual void setSleep(F32 value) = 0;
 	virtual F32 getEnergy() const = 0;
 	virtual void setEnergy(F32 value) = 0;
-	virtual U64 getCurrentEvents(S32 version) = 0;
-	virtual void setCurrentEvents(U64 value, S32 version) = 0;
-	virtual U64 getEventHandlers(S32 version) = 0;
-	virtual void setEventHandlers(U64 value, S32 version) = 0;
-	virtual U64 getCurrentHandler(S32 version) = 0;
-	virtual void setCurrentHandler(U64 value, S32 version) = 0;
+	virtual U64 getCurrentEvents() = 0;
+	virtual void setCurrentEvents(U64 value) = 0;
+	virtual U64 getEventHandlers() = 0;
+	virtual void setEventHandlers(U64 value) = 0;
+	virtual U64 getCurrentHandler() = 0;
+	virtual void setCurrentHandler(U64 value) = 0;
 	virtual BOOL isFinished() const = 0;
 	virtual BOOL isStateChangePending() const = 0;
 	virtual S32 writeState(U8 **dest, U32 header_size, U32 footer_size) = 0; // Allocate memory for header, state and footer return size of state.
@@ -409,17 +409,17 @@ public:
 
 	// Run handler for event for a maximum of time_slice seconds.
 	// Updates current handler and current events registers.
-	virtual void callEventHandler(LSCRIPTStateEventType event, S32 major_version, const LLUUID &id, F32 time_slice) = 0;;
+	virtual void callEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice) = 0;;
 
 	// Run handler for next queued event for maximum of time_slice seconds. 
 	// Updates current handler and current events registers.
 	// Removes processed event from queue.
-	virtual void callNextQueuedEventHandler(U64 event_register, S32 major_version, const LLUUID &id, F32 time_slice) = 0;
+	virtual void callNextQueuedEventHandler(U64 event_register, const LLUUID &id, F32 time_slice) = 0;
 
 	// Run handler for event for a maximum of time_slice seconds.
 	// Updates current handler and current events registers.
 	// Removes processed event from queue.
-	virtual void callQueuedEventHandler(LSCRIPTStateEventType event, S32 major_version, const LLUUID &id, F32 time_slice) = 0;
+	virtual void callQueuedEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice) = 0;
 
 	// Switch to next state.
 	// Returns new set of handled events.
@@ -428,14 +428,14 @@ public:
 	// Returns time taken.
 	virtual F32 runQuanta(BOOL b_print, const LLUUID &id,
 						  const char **errorstr, 
-						  BOOL &state_transition, F32 quanta,
+						  F32 quanta,
 						  U32& events_processed, LLTimer& timer);
 
 	// Run smallest possible amount of code: an instruction for LSL2, a segment
 	// between save tests for Mono
 	void runInstructions(BOOL b_print, const LLUUID &id,
 						 const char **errorstr, 
-						 BOOL &state_transition, U32& events_processed,
+						 U32& events_processed,
 						 F32 quanta);
 
 	bool isYieldDue() const;
@@ -443,6 +443,12 @@ public:
 	void setReset(BOOL b) {mReset = b;}
 	BOOL getReset() const { return mReset; }
 
+	// Called when the script is scheduled to be run from newsim/LLScriptData
+	virtual void startRunning() = 0;
+
+	// Called when the script is scheduled to be stopped from newsim/LLScriptData
+	virtual void stopRunning() = 0;
+	
 private:
 
 	BOOL mReset;
@@ -455,7 +461,7 @@ public:
 	LLScriptExecuteLSL2(const U8* bytecode, U32 bytecode_size);
 	virtual ~LLScriptExecuteLSL2();
 
-	virtual S32 getVersion() {return get_register(mBuffer, LREG_VN);}
+	virtual S32 getVersion() const {return get_register(mBuffer, LREG_VN);}
 	virtual void deleteAllEvents() {mEventData.mEventDataList.deleteAllData();}
 	virtual void addEvent(LLScriptDataCollection* event);
 	virtual U32 getEventCount() {return mEventData.mEventDataList.getLength();}
@@ -469,12 +475,12 @@ public:
 	virtual void setSleep(F32 value);
 	virtual F32 getEnergy() const;
 	virtual void setEnergy(F32 value);
-	virtual U64 getCurrentEvents(S32 version) {return get_event_register(mBuffer, LREG_CE, version);}
-	virtual void setCurrentEvents(U64 value, S32 version) {return set_event_register(mBuffer, LREG_CE, value, version);}
-	virtual U64 getEventHandlers(S32 version) {return get_event_register(mBuffer, LREG_ER, version);}
-	virtual void setEventHandlers(U64 value, S32 version) {set_event_register(mBuffer, LREG_ER, value, version);}
-	virtual U64 getCurrentHandler(S32 version);
-	virtual void setCurrentHandler(U64 value, S32 version) {return set_event_register(mBuffer, LREG_IE, value, version);}	
+	virtual U64 getCurrentEvents() {return get_event_register(mBuffer, LREG_CE, getMajorVersion());}
+	virtual void setCurrentEvents(U64 value) {return set_event_register(mBuffer, LREG_CE, value, getMajorVersion());}
+	virtual U64 getEventHandlers() {return get_event_register(mBuffer, LREG_ER, getMajorVersion());}
+	virtual void setEventHandlers(U64 value) {set_event_register(mBuffer, LREG_ER, value, getMajorVersion());}
+	virtual U64 getCurrentHandler();
+	virtual void setCurrentHandler(U64 value) {return set_event_register(mBuffer, LREG_IE, value, getMajorVersion());}	
 	virtual BOOL isFinished() const {return get_register(mBuffer, LREG_IP) == 0;}
 	virtual BOOL isStateChangePending() const {return get_register(mBuffer, LREG_CS) != get_register(mBuffer, LREG_NS);}
 	virtual S32 writeState(U8 **dest, U32 header_size, U32 footer_size); // Not including Events.
@@ -494,17 +500,17 @@ public:
 
 	// Run handler for event for a maximum of time_slice seconds.
 	// Updates current handler and current events registers.
-	virtual void callEventHandler(LSCRIPTStateEventType event, S32 major_version, const LLUUID &id, F32 time_slice);
+	virtual void callEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice);
 
 	// Run handler for next queued event for maximum of time_slice seconds. 
 	// Updates current handler and current events registers.
 	// Removes processed event from queue.
-	virtual void callNextQueuedEventHandler(U64 event_register, S32 major_version, const LLUUID &id, F32 time_slice);
+	virtual void callNextQueuedEventHandler(U64 event_register, const LLUUID &id, F32 time_slice);
 
 	// Run handler for event for a maximum of time_slice seconds.
 	// Updates current handler and current events registers.
 	// Removes processed event from queue.
-	virtual void callQueuedEventHandler(LSCRIPTStateEventType event, S32 major_version, const LLUUID &id, F32 time_slice);
+	virtual void callQueuedEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice);
 
 	// Switch to next state.
 	// Returns new set of handled events.
@@ -521,8 +527,15 @@ public:
 	U32						mBytecodeSize;
 
 private:
+	S32 getMajorVersion() const;
 	void		recordBoundaryError( const LLUUID &id );
 	void		setStateEventOpcoodeStartSafely( S32 state, LSCRIPTStateEventType event, const LLUUID &id );
+
+	// Called when the script is scheduled to be run from newsim/LLScriptData
+	virtual void startRunning();
+
+	// Called when the script is scheduled to be stopped from newsim/LLScriptData
+	virtual void stopRunning();
 };
 
 #endif
diff --git a/indra/lscript/lscript_execute/lscript_execute.cpp b/indra/lscript/lscript_execute/lscript_execute.cpp
index 3adfe32..2a6f7e3 100644
--- a/indra/lscript/lscript_execute/lscript_execute.cpp
+++ b/indra/lscript/lscript_execute/lscript_execute.cpp
@@ -60,6 +60,9 @@ const char* LSCRIPTRunTimeFaultStrings[LSRF_EOF] =		/*Flawfinder: ignore*/
 	"CLI Exception" // LSRF_CLI
 };
 
+void LLScriptExecuteLSL2::startRunning() {}
+void LLScriptExecuteLSL2::stopRunning() {}
+
 LLScriptExecuteLSL2::LLScriptExecuteLSL2(LLFILE *fp)
 {
 	U8  sizearray[4];
@@ -327,8 +330,9 @@ void LLScriptExecuteLSL2::resumeEventHandler(BOOL b_print, const LLUUID &id, F32
 	// NOTE: Babbage: all mExecuteFuncs return false.
 }
 
-void LLScriptExecuteLSL2::callEventHandler(LSCRIPTStateEventType event, S32 major_version, const LLUUID &id, F32 time_slice)
+void LLScriptExecuteLSL2::callEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice)
 {
+	S32 major_version = getMajorVersion();
 	// push a zero to be popped
 	lscript_push(mBuffer, 0);
 	// push sp as current bp
@@ -403,8 +407,9 @@ void LLScriptExecuteLSL2::callEventHandler(LSCRIPTStateEventType event, S32 majo
 //	set_ip(mBuffer, opcode_start);
 //}
 
-void LLScriptExecuteLSL2::callQueuedEventHandler(LSCRIPTStateEventType event, S32 major_version, const LLUUID &id, F32 time_slice)
+void LLScriptExecuteLSL2::callQueuedEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice)
 {
+	S32 major_version = getMajorVersion();
 	LLScriptDataCollection* eventdata;
 
 	for (eventdata = mEventData.mEventDataList.getFirstData(); eventdata; eventdata = mEventData.mEventDataList.getNextData())
@@ -452,8 +457,9 @@ void LLScriptExecuteLSL2::callQueuedEventHandler(LSCRIPTStateEventType event, S3
 	}
 }
 
-void LLScriptExecuteLSL2::callNextQueuedEventHandler(U64 event_register, S32 major_version, const LLUUID &id, F32 time_slice)
+void LLScriptExecuteLSL2::callNextQueuedEventHandler(U64 event_register, const LLUUID &id, F32 time_slice)
 {
+	S32 major_version = getMajorVersion();
 	LLScriptDataCollection* eventdata = mEventData.getNextEvent();
 	if (eventdata)
 	{
@@ -541,9 +547,9 @@ void LLScriptExecuteLSL2::setSleep(F32 value)
 }
 
 //virtual 
-U64 LLScriptExecuteLSL2::getCurrentHandler(S32 version)
+U64 LLScriptExecuteLSL2::getCurrentHandler()
 {
-	return get_event_register(mBuffer, LREG_IE, version);
+	return get_event_register(mBuffer, LREG_IE, getMajorVersion());
 }
 
 //virtual 
@@ -724,6 +730,20 @@ void LLScriptExecuteLSL2::reset()
 	bytestream2bytestream(mBuffer, dest_offset, src, src_offset, size);
 }
 
+S32 LLScriptExecuteLSL2::getMajorVersion() const
+{
+	S32 version = getVersion();
+	S32 major_version = 0;
+	if (version == LSL2_VERSION1_END_NUMBER){
+		major_version = 1;
+	}
+	else if (version == LSL2_VERSION_NUMBER)
+	{
+		major_version = 2;
+	}
+	return major_version;
+}
+
 LLScriptExecute::LLScriptExecute() :
 	mReset(FALSE)
 {
@@ -751,6 +771,10 @@ bool LLScriptExecute::isYieldDue() const
 		return true;
 	}
 
+	// State changes can occur within a single time slice,
+	// but LLScriptData's clean up is required. Yield here
+	// to allow LLScriptData to perform cleanup and then call
+	// runQuanta again.
 	if(isStateChangePending())
 	{
 		return true;
@@ -763,7 +787,6 @@ bool LLScriptExecute::isYieldDue() const
 // a single instruction for LSL2, a segment between save tests for Mono
 void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id, 
 									 const char **errorstr, 
-									 BOOL &state_transition, 
 									 U32& events_processed,
 									 F32 quanta)
 {
@@ -806,17 +829,15 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
 	else
 	{
 		// make sure that IE is zero
-		setCurrentHandler(0, major_version);
+		setCurrentHandler(0);
 
 		//	if no, we're in a state and waiting for an event
-		U64 current_events = getCurrentEvents(major_version);
-		U64 event_register = getEventHandlers(major_version);
+		U64 current_events = getCurrentEvents();
+		U64 event_register = getEventHandlers();
 
 		//	check NS to see if need to switch states (NS != CS)
 		if (isStateChangePending())
 		{
-			state_transition = TRUE;
-
 			// ok, blow away any pending events
 			deleteAllEvents();
 
@@ -824,16 +845,16 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
 			if (current_events & LSCRIPTStateBitField[LSTT_STATE_EXIT])
 			{
 				// if yes, clear state exit flag
-				setCurrentHandler(LSCRIPTStateBitField[LSTT_STATE_EXIT], major_version);
+				setCurrentHandler(LSCRIPTStateBitField[LSTT_STATE_EXIT]);
 				current_events &= ~LSCRIPTStateBitField[LSTT_STATE_EXIT];
-				setCurrentEvents(current_events, major_version);
+				setCurrentEvents(current_events);
 
 				// check state exit event handler
 				// if there is a handler, call it
 				if (event_register & LSCRIPTStateBitField[LSTT_STATE_EXIT])
 				{
 					++events_processed;
-					callEventHandler(LSTT_STATE_EXIT, major_version, id, quanta);
+					callEventHandler(LSTT_STATE_EXIT, id, quanta);
 					return;
 				}
 			}
@@ -841,32 +862,32 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
 			// if no handler or no state exit flag switch to new state
 			// set state entry flag and clear other CE flags
 			current_events = LSCRIPTStateBitField[LSTT_STATE_ENTRY];
-			setCurrentEvents(current_events, major_version);
+			setCurrentEvents(current_events);
 
 			U64 handled_events = nextState();
-			setEventHandlers(handled_events, major_version);
+			setEventHandlers(handled_events);
 		}
 
 		// try to get next event from stack
 		BOOL b_done = FALSE;
 		LSCRIPTStateEventType event = LSTT_NULL;
 
-		current_events = getCurrentEvents(major_version);
-		event_register = getEventHandlers(major_version);
+		current_events = getCurrentEvents();
+		event_register = getEventHandlers();
 
 		// first, check to see if state_entry or onrez are raised and handled
 		if ((current_events & LSCRIPTStateBitField[LSTT_STATE_ENTRY])
 			&&(current_events & event_register))
 		{
 			++events_processed;
-			callEventHandler(LSTT_STATE_ENTRY, major_version, id, quanta);
+			callEventHandler(LSTT_STATE_ENTRY, id, quanta);
 			b_done = TRUE;
 		}
 		else if ((current_events & LSCRIPTStateBitField[LSTT_REZ])
 				 &&(current_events & event_register))
 		{
 			++events_processed;
-			callQueuedEventHandler(LSTT_REZ, major_version, id, quanta);
+			callQueuedEventHandler(LSTT_REZ, id, quanta);
 			b_done = TRUE;
 		}
 
@@ -876,7 +897,7 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
 			if(getEventCount() > 0)
 			{
 				++events_processed;
-				callNextQueuedEventHandler(event_register, major_version, id, quanta);
+				callNextQueuedEventHandler(event_register, id, quanta);
 				b_done = TRUE;
 			}
 			else
@@ -887,7 +908,7 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
 				{
 					event = return_first_event((S32)handled_current);
 					++events_processed;
-					callEventHandler(event, major_version, id, quanta);
+					callEventHandler(event, id, quanta);
 				}
 				b_done = TRUE;
 			}
@@ -895,8 +916,8 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
 	}
 }
 
-// Run for a single timeslice, or until a yield is due
-F32 LLScriptExecute::runQuanta(BOOL b_print, const LLUUID &id, const char **errorstr, BOOL &state_transition, F32 quanta, U32& events_processed, LLTimer& timer)
+// Run for a single timeslice, or until a yield or state transition is due
+F32 LLScriptExecute::runQuanta(BOOL b_print, const LLUUID &id, const char **errorstr, F32 quanta, U32& events_processed, LLTimer& timer)
 {
 	U32 timer_checks = 0;
 	F32 inloop = 0;
@@ -907,7 +928,7 @@ F32 LLScriptExecute::runQuanta(BOOL b_print, const LLUUID &id, const char **erro
 	// on current execution speed.
 	while(true)
 	{
-		runInstructions(b_print, id, errorstr, state_transition, 
+		runInstructions(b_print, id, errorstr,
 						events_processed, quanta);
 		
 		static const S32 lsl_timer_check_skip = 4;
@@ -3277,7 +3298,7 @@ BOOL run_state(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
 	{
 		major_version = 2;
 	}
-
+					
 	S32 current_state = get_register(buffer, LREG_CS);
 	if (state != current_state)
 	{
@@ -3985,7 +4006,6 @@ void lscript_run(const std::string& filename, BOOL b_debug)
 	LLTimer	timer;
 
 	const char *error;
-	BOOL b_state;
 	LLScriptExecuteLSL2 *execute = NULL;
 
 	if (filename.empty())
@@ -4009,7 +4029,7 @@ void lscript_run(const std::string& filename, BOOL b_debug)
 
 		do {
 			LLTimer timer2;
-			execute->runQuanta(b_debug, LLUUID::null, &error, b_state, 
+			execute->runQuanta(b_debug, LLUUID::null, &error,
 							   time_slice, events_processed, timer2);
 		} while (!execute->isFinished());
 
@@ -4044,7 +4064,8 @@ void lscript_pop_variable(LLScriptLibData *data, U8 *buffer, char type)
 		break;
 	case 'k':
 		data->mType = LST_KEY;
-
+		data->mKey = NULL;
+		
 		base_address = lscript_pop_int(buffer);
 	// this bit of nastiness is to get around that code paths to local variables can result in lack of initialization
 	// and function clean up of ref counts isn't based on scope (a mistake, I know)
@@ -4063,7 +4084,7 @@ void lscript_pop_variable(LLScriptLibData *data, U8 *buffer, char type)
 			}
 			lsa_decrease_ref_count(buffer, base_address);
 		}
-		else
+		if (data->mKey == NULL)
 		{
 			data->mKey = new char[1];
 			data->mKey[0] = 0;
@@ -4071,6 +4092,7 @@ void lscript_pop_variable(LLScriptLibData *data, U8 *buffer, char type)
 		break;
 	case 's':
 		data->mType = LST_STRING;
+		data->mString = NULL;
 
 		base_address = lscript_pop_int(buffer);
 	// this bit of nastiness is to get around that code paths to local variables can result in lack of initialization
@@ -4090,7 +4112,7 @@ void lscript_pop_variable(LLScriptLibData *data, U8 *buffer, char type)
 			}
 			lsa_decrease_ref_count(buffer, base_address);
 		}
-		else
+		if (data->mString == NULL)
 		{
 			data->mString = new char[1];
 			data->mString[0] = 0;
diff --git a/indra/lscript/lscript_library/lscript_library.cpp b/indra/lscript/lscript_library/lscript_library.cpp
index e7d8284..505b123 100644
--- a/indra/lscript/lscript_library/lscript_library.cpp
+++ b/indra/lscript/lscript_library/lscript_library.cpp
@@ -448,6 +448,7 @@ void LLScriptLibrary::init()
 	addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llDetectedTouchBinormal", "v", "i", "vector llDetectedTouchBinormal(integer number)\nreturns the surface binormal for a triggered touch event"));
 	addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llDetectedTouchST", "v", "i", "vector llDetectedTouchST(integer number)\nreturns the s and t coordinates in the first two components of a vector, for a triggered touch event"));
 
+	addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llSHA1String", "s", "s", "string llSHA1String(string sr)\nPerforms a SHA1 security Hash.  Returns a 40 character hex string."));
 
 
 	// energy, sleep, dummy_func, name, return type, parameters, help text, gods-only
diff --git a/indra/mac_crash_logger/CMakeLists.txt b/indra/mac_crash_logger/CMakeLists.txt
index 9cddb56..daf3e10 100644
--- a/indra/mac_crash_logger/CMakeLists.txt
+++ b/indra/mac_crash_logger/CMakeLists.txt
@@ -3,7 +3,6 @@
 project(mac_crash_logger)
 
 include(00-Common)
-include(Boost)
 include(LLCommon)
 include(LLCrashLogger)
 include(LLMath)
@@ -36,7 +35,6 @@ set_source_files_properties(${mac_crash_logger_HEADER_FILES}
 list(APPEND mac_crash_logger_SOURCE_FILES ${mac_crash_logger_HEADER_FILES})
 
 set(mac_crash_logger_RESOURCE_FILES
-  Info.plist
   CrashReporter.nib/
   )
 set_source_files_properties(
@@ -44,11 +42,6 @@ set_source_files_properties(
   PROPERTIES
   HEADER_FILE_ONLY TRUE
   )
-set_source_files_properties(
-  Info.plist
-  PROPERTIES
-  MACOSX_PACKAGE_LOCATION . # will it blend? + poppy
-  )
 SOURCE_GROUP("Resources" FILES ${mac_crash_logger_RESOURCE_FILES})
 list(APPEND mac_crash_logger_SOURCE_FILES ${mac_crash_logger_RESOURCE_FILES})
 
@@ -56,6 +49,11 @@ add_executable(mac-crash-logger
   MACOSX_BUNDLE
   ${mac_crash_logger_SOURCE_FILES})
 
+set_target_properties(mac-crash-logger
+  PROPERTIES
+  MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist
+  )
+
 target_link_libraries(mac-crash-logger
     ${LLCRASHLOGGER_LIBRARIES}
     ${LLVFS_LIBRARIES}
@@ -64,7 +62,6 @@ target_link_libraries(mac-crash-logger
     ${LLVFS_LIBRARIES}
     ${LLMATH_LIBRARIES}
     ${LLCOMMON_LIBRARIES}
-    ${BOOST_SIGNALS_LIBRARY}
     )
 
 add_custom_command(
diff --git a/indra/mac_crash_logger/CrashReporter.nib/info.nib b/indra/mac_crash_logger/CrashReporter.nib/info.nib
index b541744..06805c0 100644
--- a/indra/mac_crash_logger/CrashReporter.nib/info.nib
+++ b/indra/mac_crash_logger/CrashReporter.nib/info.nib
@@ -5,15 +5,13 @@
 	<key>IBFramework Version</key>
 	<string>629</string>
 	<key>IBLastKnownRelativeProjectPath</key>
-	<string>../macview.xcodeproj</string>
+	<string>../../build-darwin-i386/SecondLife.xcodeproj</string>
 	<key>IBOldestOS</key>
 	<integer>5</integer>
 	<key>IBOpenObjects</key>
-	<array>
-		<integer>193</integer>
-	</array>
+	<array/>
 	<key>IBSystem Version</key>
-	<string>9B18</string>
+	<string>9E17</string>
 	<key>targetFramework</key>
 	<string>IBCarbonFramework</string>
 </dict>
diff --git a/indra/mac_updater/CMakeLists.txt b/indra/mac_updater/CMakeLists.txt
index 3ac5aee..0eac76f 100644
--- a/indra/mac_updater/CMakeLists.txt
+++ b/indra/mac_updater/CMakeLists.txt
@@ -42,7 +42,6 @@ list(APPEND mac_updater_SOURCE_FILES ${mac_updater_HEADER_FILES})
 
 
 set(mac_updater_RESOURCE_FILES
-  Info.plist
   AutoUpdater.nib/
   )
 set_source_files_properties(
@@ -50,19 +49,18 @@ set_source_files_properties(
   PROPERTIES
   HEADER_FILE_ONLY TRUE
   )
-set_source_files_properties(
-  Info.plist
-  PROPERTIES
-  MACOSX_PACKAGE_LOCATION . # will it blend? + poppy
-  )
 SOURCE_GROUP("Resources" FILES ${mac_updater_RESOURCE_FILES})
 list(APPEND mac_updater_SOURCE_FILES ${mac_updater_RESOURCE_FILES})
 
-
 add_executable(mac-updater
   MACOSX_BUNDLE
   ${mac_updater_SOURCE_FILES})
 
+set_target_properties(mac-updater
+  PROPERTIES
+  MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist
+  )
+
 target_link_libraries(mac-updater
     ${LLVFS_LIBRARIES}
     ${CURL_LIBRARIES}
@@ -79,4 +77,3 @@ add_custom_command(
     ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-updater.app/Contents/Resources/AutoUpdater.nib
   )
 
-
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index e93ea57..4dd4c74 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -5,6 +5,7 @@ project(viewer)
 include(00-Common)
 include(Boost)
 include(BuildVersion)
+include(DBusGlib)
 include(DirectX)
 include(ELFIO)
 include(FMOD)
@@ -123,6 +124,7 @@ set(viewer_SOURCE_FILES
     llfloateravatarinfo.cpp
     llfloateravatarpicker.cpp
     llfloateravatartextures.cpp
+    llfloaterbeacons.cpp
     llfloaterbuildoptions.cpp
     llfloaterbump.cpp
     llfloaterbuycontents.cpp
@@ -198,6 +200,7 @@ set(viewer_SOURCE_FILES
     llglsandbox.cpp
     llgroupmgr.cpp
     llgroupnotify.cpp
+    llhomelocationresponder.cpp
     llhoverview.cpp
     llhudeffectbeam.cpp
     llhudeffect.cpp
@@ -429,6 +432,9 @@ set(viewer_SOURCE_FILES
     pipeline.cpp
     )
 
+set(VIEWER_BINARY_NAME "secondlife-bin" CACHE STRING
+    "The name of the viewer executable to create.")
+
 if (LINUX)
   # We can't set these flags for Darwin, because they get passed to
   # the PPC compiler.  Ugh.
@@ -513,6 +519,7 @@ set(viewer_HEADER_FILES
     llfloateravatarinfo.h
     llfloateravatarpicker.h
     llfloateravatartextures.h
+    llfloaterbeacons.h
     llfloaterbuildoptions.h
     llfloaterbump.h
     llfloaterbuy.h
@@ -587,6 +594,7 @@ set(viewer_HEADER_FILES
     llgivemoney.h
     llgroupmgr.h
     llgroupnotify.h
+    llhomelocationresponder.h
     llhoverview.h
     llhudeffect.h
     llhudeffectbeam.h
@@ -869,6 +877,7 @@ endif (DARWIN)
 
 if (LINUX)
     LIST(APPEND viewer_SOURCE_FILES llappviewerlinux.cpp)
+    LIST(APPEND viewer_SOURCE_FILES llappviewerlinux_api_dbus.cpp)
     LIST(APPEND CMAKE_EXE_LINKER_FLAGS -Wl,--as-needed)
 
     set(viewer_LIBRARIES
@@ -1018,6 +1027,7 @@ set(viewer_XUI_FILES
     skins/default/xui/en-us/floater_audio_volume.xml
     skins/default/xui/en-us/floater_avatar_picker.xml
     skins/default/xui/en-us/floater_avatar_textures.xml
+    skins/default/xui/en-us/floater_beacons.xml
     skins/default/xui/en-us/floater_build_options.xml
     skins/default/xui/en-us/floater_bumps.xml
     skins/default/xui/en-us/floater_buy_contents.xml
@@ -1236,6 +1246,17 @@ set_source_files_properties(${viewer_CHARACTER_FILES}
 
 list(APPEND viewer_SOURCE_FILES ${viewer_CHARACTER_FILES})
 
+if (WINDOWS)
+  file(GLOB viewer_INSTALLER_FILES installers/windows/*.nsi)
+
+  source_group("Installer Files" FILES ${viewer_INSTALLER_FILES})
+
+  set_source_files_properties(${viewer_INSTALLER_FILES}
+                              PROPERTIES HEADER_FILE_ONLY TRUE)
+
+  list(APPEND viewer_SOURCE_FILES ${viewer_INSTALLER_FILES})
+endif (WINDOWS)
+
 if (FMOD)
   set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS -DLL_FMOD)
 
@@ -1262,15 +1283,15 @@ list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES})
 set_source_files_properties(${viewer_HEADER_FILES}
                             PROPERTIES HEADER_FILE_ONLY TRUE)
 
-add_executable(secondlife-bin
+add_executable(${VIEWER_BINARY_NAME}
     WIN32
     MACOSX_BUNDLE
     ${viewer_SOURCE_FILES}
     )
-check_message_template(secondlife-bin)
+check_message_template(${VIEWER_BINARY_NAME})
 
 if (LLKDU_LIBRARY)
-  add_dependencies(secondlife-bin ${LLKDU_LIBRARY})
+  add_dependencies(${VIEWER_BINARY_NAME} ${LLKDU_LIBRARY})
 endif (LLKDU_LIBRARY)
 
 set(PACKAGE OFF CACHE BOOL
@@ -1278,12 +1299,12 @@ set(PACKAGE OFF CACHE BOOL
 
 if (WINDOWS)
     if(MSVC71)
-        set(release_flags "/MAP:Release/secondlife-bin.map /MAPINFO:LINES")
+        set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map /MAPINFO:LINES")
     else(MSVC71)
-        set(release_flags "/MAP:Release/secondlife-bin.map")
+        set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map")
     endif(MSVC71)
     
-    set_target_properties(secondlife-bin
+    set_target_properties(${VIEWER_BINARY_NAME}
         PROPERTIES
         LINK_FLAGS "/debug /NODEFAULTLIB:MSVCRT /SUBSYSTEM:WINDOWS"
         LINK_FLAGS_DEBUG "/NODEFAULTLIB:LIBCMT /NODEFAULTLIB:MSVCRTD"
@@ -1293,20 +1314,20 @@ if (WINDOWS)
     # sets the 'working directory' for debugging from visual studio.
     if (NOT UNATTENDED)
         add_custom_command(
-            TARGET secondlife-bin PRE_BUILD
+            TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
             COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
             ARGS
               --solution 
               ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
               --workingdir
-              secondlife-bin
+              ${VIEWER_BINARY_NAME}
               ${CMAKE_CURRENT_SOURCE_DIR}
-            COMMENT "Setting the secondlife-bin working directory for debugging."
+            COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."
             )
     endif (NOT UNATTENDED)
 
     add_custom_command(
-        TARGET secondlife-bin PRE_BUILD
+        TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
         COMMAND ${CMAKE_COMMAND}
         ARGS
           -E
@@ -1317,7 +1338,7 @@ if (WINDOWS)
         )
 
     add_custom_command(
-        TARGET secondlife-bin PRE_BUILD
+        TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
         COMMAND ${CMAKE_COMMAND}
         ARGS
           -E
@@ -1327,10 +1348,10 @@ if (WINDOWS)
         COMMENT "Copying message.xml to the runtime folder."
         )
        
-    add_dependencies(secondlife-bin copy_win_libs)
+    add_dependencies(${VIEWER_BINARY_NAME} copy_win_libs)
 
     if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
-      add_dependencies(secondlife-bin copy_win_scripts)
+      add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts)
     endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
         
     add_custom_command(
@@ -1340,14 +1361,14 @@ if (WINDOWS)
           ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
           --configuration=${CMAKE_CFG_INTDIR}
           --channel=${VIEWER_CHANNEL}
-          --login_channel=${VIEWER_CHANNEL}
+          --login_channel=${VIEWER_LOGIN_CHANNEL}
           --grid=${GRID}
           --source=${CMAKE_CURRENT_SOURCE_DIR}
               --artwork=${ARTWORK_DIR}
               --build=${CMAKE_CURRENT_BINARY_DIR}
               --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
               --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat
-        DEPENDS secondlife-bin ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+        DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
         )
     if (PACKAGE)
       add_custom_target(package ALL DEPENDS ${CMAKE_CFG_INTDIR}/touched.bat)
@@ -1355,7 +1376,7 @@ if (WINDOWS)
     endif (PACKAGE)
 endif (WINDOWS)
 
-target_link_libraries(secondlife-bin
+target_link_libraries(${VIEWER_BINARY_NAME}
     ${LLAUDIO_LIBRARIES}
     ${LLCHARACTER_LIBRARIES}
     ${LLIMAGE_LIBRARIES}
@@ -1376,7 +1397,7 @@ target_link_libraries(secondlife-bin
     ${viewer_LIBRARIES}
     ${BOOST_PROGRAM_OPTIONS_LIBRARY}
     ${BOOST_REGEX_LIBRARY}
-    ${BOOST_SIGNALS_LIBRARY}
+    ${DBUSGLIB_LIBRARIES}
     ${OPENGL_LIBRARIES}
     ${FMODWRAPPER_LIBRARY}
     ${OPENGL_LIBRARIES}
@@ -1388,7 +1409,6 @@ target_link_libraries(secondlife-bin
     ${QUICKTIME_LIBRARY}
     ${WINDOWS_LIBRARIES}
     ${XMLRPCEPI_LIBRARIES}
-    ${ZLIB_LIBRARIES}
     ${ELFIO_LIBRARIES}
     )
 
@@ -1402,8 +1422,8 @@ if (LINUX)
   add_custom_command(
       OUTPUT secondlife-stripped
       COMMAND strip
-      ARGS --strip-debug -o secondlife-stripped secondlife-bin
-      DEPENDS secondlife-bin
+      ARGS --strip-debug -o secondlife-stripped ${VIEWER_BINARY_NAME}
+      DEPENDS ${VIEWER_BINARY_NAME}
       )
 
   set(product SecondLife-${ARCH}-${viewer_VERSION})
@@ -1415,7 +1435,7 @@ if (LINUX)
         ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
         --grid=${GRID}
         --channel=${VIEWER_CHANNEL}
-        --login_channel=${VIEWER_CHANNEL}
+        --login_channel=${VIEWER_LOGIN_CHANNEL}
         --installer_name=${product}
         --arch=${ARCH}
         --source=${CMAKE_CURRENT_SOURCE_DIR}
@@ -1435,7 +1455,7 @@ endif (LINUX)
 if (DARWIN)
   set(product "Second Life")
   set_target_properties(
-    secondlife-bin
+    ${VIEWER_BINARY_NAME}
     PROPERTIES
     OUTPUT_NAME "${product}"
     MACOSX_BUNDLE_INFO_STRING "info string - localize me"
@@ -1449,7 +1469,7 @@ if (DARWIN)
     )
 
   add_custom_command(
-    TARGET secondlife-bin POST_BUILD
+    TARGET ${VIEWER_BINARY_NAME} POST_BUILD
     COMMAND ${PYTHON_EXECUTABLE}
     ARGS
       ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
@@ -1460,28 +1480,31 @@ if (DARWIN)
       --artwork=${ARTWORK_DIR}
       --build=${CMAKE_CURRENT_BINARY_DIR}
       --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app
-    DEPENDS secondlife-bin ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+    DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
     )
 
   if (PACKAGE)
-    add_custom_target(package
-      COMMAND
-        ${PYTHON_EXECUTABLE}
-        ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
-        --grid=${GRID}
-        --configuration=${CMAKE_CFG_INTDIR}
-        --channel=${VIEWER_CHANNEL}
-        --login_channel=${VIEWER_CHANNEL}
-        --source=${CMAKE_CURRENT_SOURCE_DIR}
-        --artwork=${ARTWORK_DIR}
-        --build=${CMAKE_CURRENT_BINARY_DIR}
-        --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app
-        --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
-      DEPENDS
-        secondlife-bin
-        ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
-      )
+      add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME}) 
       add_dependencies(package mac-updater mac-crash-logger)
+
+      add_custom_command(
+        TARGET package POST_BUILD
+        COMMAND ${PYTHON_EXECUTABLE}
+        ARGS
+          ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+          --grid=${GRID}
+          --configuration=${CMAKE_CFG_INTDIR}
+          --channel=${VIEWER_CHANNEL}
+          --login_channel=${VIEWER_LOGIN_CHANNEL}
+          --source=${CMAKE_CURRENT_SOURCE_DIR}
+          --artwork=${ARTWORK_DIR}
+          --build=${CMAKE_CURRENT_BINARY_DIR}
+          --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app
+          --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
+        DEPENDS
+          ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+      )
+
   endif (PACKAGE)
 endif (DARWIN)
 
diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings
index 881483e..90646be 100644
--- a/indra/newview/English.lproj/InfoPlist.strings
+++ b/indra/newview/English.lproj/InfoPlist.strings
@@ -1,6 +1,6 @@
 /* Localized versions of Info.plist keys */
 
 CFBundleName = "Second Life";
-CFBundleShortVersionString = "Second Life version 1.20.9.87416";
-CFBundleGetInfoString = "Second Life version 1.20.9.87416, Copyright 2004-2008 Linden Research, Inc.";
+CFBundleShortVersionString = "Second Life version 1.20.15.97417";
+CFBundleGetInfoString = "Second Life version 1.20.15.97417, Copyright 2004-2008 Linden Research, Inc.";
 
diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist
index b889d45..3c55bad 100644
--- a/indra/newview/Info-SecondLife.plist
+++ b/indra/newview/Info-SecondLife.plist
@@ -32,7 +32,7 @@
 		</dict>
 	</array>
 	<key>CFBundleVersion</key>
-	<string>1.20.9.87416</string>
+	<string>1.20.15.97417</string>
 	<key>CSResourcesFileMapped</key>
 	<true/>
 </dict>
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 3679c38..0ab977d 100644
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -332,11 +332,11 @@ REMOTE_DATA_REQUEST	Value of event_type in remote_event if XML-RPC request is re
 REMOTE_DATA_REPLY	Value of event_type in remote_event if XML-RPC reply is received
 
 
-PRIM_TYPE			Followed by PRIM_TYPE_BOX, PRIM_TYPE_CYLINDER, PRIM_TYPE_PRISM, PRIM_TYPE_SPHERE,:PRIM_TYPE_TORUS, or PRIM_TYPE_TUBE and their arguments
-PRIM_MATERIAL		Sets material to PRIM_MATERIAL_STONE, PRIM_MATERIAL_METAL, PRIM_MATERIAL_GLASS,:PRIM_MATERIAL_WOOD, PRIM_MATERIAL_FLESH, PRIM_MATERIAL_PLASTIC,:PRIM_MATERIAL_RUBBER, or PRIM_MATERIAL_LIGHT
+PRIM_TYPE			Followed by PRIM_TYPE_BOX, PRIM_TYPE_CYLINDER, PRIM_TYPE_PRISM, PRIM_TYPE_SPHERE, PRIM_TYPE_TORUS, PRIM_TYPE_TUBE, or PRIM_TYPE_SCULPT and their arguments
+PRIM_MATERIAL		Followed by PRIM_MATERIAL_STONE, PRIM_MATERIAL_METAL, PRIM_MATERIAL_GLASS, PRIM_MATERIAL_WOOD, PRIM_MATERIAL_FLESH, PRIM_MATERIAL_PLASTIC, or PRIM_MATERIAL_RUBBER
 PRIM_PHYSICS		Sets physics to TRUE or FALSE
-PRIM_FLEXIBLE		Sets primitive flexibility to TRUE or FALSE
-PRIM_POINT_LIGHT	Sets light emission to TRUE or FALSE
+PRIM_FLEXIBLE		Followed by TRUE or FALSE, integer softness, float gravity, float friction, float wind, float tension, and vector force
+PRIM_POINT_LIGHT	Followed by TRUE or FALSE, vector color, float intensity, float radius, float falloff
 PRIM_TEMP_ON_REZ	Sets temporay on rez to TRUE or FALSE
 PRIM_PHANTOM		Sets phantom to TRUE or FALSE
 PRIM_CAST_SHADOWS	DEPRECATED. Takes 1 parameter, an integer, but has no effect when set and always returns 0 if used in llGetPrimitiveParams.
@@ -357,7 +357,7 @@ PRIM_TYPE_SPHERE	Followed by integer hole shape, vector cut, float hollow, vecto
 PRIM_TYPE_TORUS		Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew
 PRIM_TYPE_TUBE		Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew
 PRIM_TYPE_RING		Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew
-PRIM_TYPE_SCULPT	Followed by a key or string texture uuid.
+PRIM_TYPE_SCULPT	Followed by a key/string texture uuid, and one of PRIM_SCULPT_TYPE_SPHERE, PRIM_SCULPT_TYPE_TORUS, PRIM_SCULPT_TYPE_PLANE, or PRIM_SCULPT_TYPE_CYLINDER
 
 PRIM_HOLE_DEFAULT	Sets hole type to match the prim type.
 PRIM_HOLE_SQUARE	Sets hole type to square.
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 07fa71c..9dac926 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1838,17 +1838,6 @@
         <integer>0</integer>
       </array>
     </map>
-    <key>CompressSnapshotsToDisk</key>
-    <map>
-      <key>Comment</key>
-      <string>Compress snapshots saved to disk (Using JPEG 2000)</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>0</integer>
-    </map>
     <key>ConnectAsGod</key>
     <map>
       <key>Comment</key>
@@ -2660,6 +2649,22 @@
         <integer>0</integer>
       </array>
     </map>
+    <key>FloaterBeaconsRect</key>
+    <map>
+        <key>Comment</key>
+        <string>Rectangle for beacon and highlight controls</string>
+        <key>Persist</key>
+        <integer>1</integer>
+        <key>Type</key>
+        <string>Rect</string>
+        <key>Value</key>
+        <array>
+            <integer>200</integer>
+            <integer>250</integer>
+            <integer>250</integer>
+            <integer>200</integer>
+    </array>
+  </map>
     <key>FloaterBuildOptionsRect</key>
     <map>
       <key>Comment</key>
@@ -3595,6 +3600,17 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>ForceMandatoryUpdate</key>
+    <map>
+      <key>Comment</key>
+      <string>For QA: On next startup, forces the auto-updater to run</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>ForwardBtnRect</key>
     <map>
       <key>Comment</key>
@@ -4178,7 +4194,7 @@
       <key>Type</key>
       <string>String</string>
       <key>Value</key>
-      <string>https://wiki.secondlife.com/wiki/[LSL_STRING]</string>
+      <string>http://wiki.secondlife.com/wiki/[LSL_STRING]</string>
     </map>
     <key>LagMeterShrunk</key>
     <map>
@@ -4268,10 +4284,11 @@
       <key>Value</key>
       <string>0.0.0</string>
     </map>
-    <key>LastSnapshotHeight</key>
+  
+    <key>LastSnapshotToEmailHeight</key>
     <map>
       <key>Comment</key>
-      <string>The height of the last snapshot, in px</string>
+      <string>The height of the last email snapshot, in px</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -4279,21 +4296,32 @@
       <key>Value</key>
       <integer>768</integer>
     </map>
-    <key>LastSnapshotType</key>
+    <key>LastSnapshotToEmailWidth</key>
     <map>
       <key>Comment</key>
-      <string>Select this as next type of snapshot to take (0 = postcard, 1 = texture, 2 = local image)</string>
+      <string>The width of the last email snapshot, in px</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
       <string>S32</string>
       <key>Value</key>
-      <integer>0</integer>
+      <integer>1024</integer>
     </map>
-    <key>LastSnapshotWidth</key>
+    <key>LastSnapshotToDiskHeight</key>
     <map>
       <key>Comment</key>
-      <string>The width of the last snapshot, in px</string>
+      <string>The height of the last disk snapshot, in px</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>S32</string>
+      <key>Value</key>
+      <integer>768</integer>
+    </map>
+    <key>LastSnapshotToDiskWidth</key>
+    <map>
+      <key>Comment</key>
+      <string>The width of the last disk snapshot, in px</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -4301,6 +4329,39 @@
       <key>Value</key>
       <integer>1024</integer>
     </map>
+    <key>LastSnapshotToInventoryHeight</key>
+    <map>
+      <key>Comment</key>
+      <string>The height of the last texture snapshot, in px</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>S32</string>
+      <key>Value</key>
+      <integer>512</integer>
+    </map>
+    <key>LastSnapshotToInventoryWidth</key>
+    <map>
+      <key>Comment</key>
+      <string>The width of the last texture snapshot, in px</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>S32</string>
+      <key>Value</key>
+      <integer>512</integer>
+    </map>
+    <key>LastSnapshotType</key>
+    <map>
+      <key>Comment</key>
+      <string>Select this as next type of snapshot to take (0 = postcard, 1 = texture, 2 = local image)</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>S32</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>LeftClickShowMenu</key>
     <map>
       <key>Comment</key>
@@ -4477,17 +4538,6 @@
       <key>Value</key>
       <real>20.0</real>
     </map>
-    <key>MainloopTimeoutDefault</key>
-        <map>
-        <key>Comment</key>
-            <string>Timeout duration for mainloop lock detection, in seconds.</string>
-        <key>Persist</key>
-            <integer>1</integer>
-        <key>Type</key>
-            <string>F32</string>
-        <key>Value</key>
-            <real>10.0</real>
-        </map>
     <key>MapOverlayIndex</key>
     <map>
       <key>Comment</key>
@@ -6055,6 +6105,17 @@
       <key>Value</key>
       <real>1.3</real>
     </map>
+    <key>RenderGround</key>
+    <map>
+      <key>Comment</key>
+	  <string>Determines whether we can render the ground pool or not</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
     <key>RenderHUDInSnapshot</key>
     <map>
       <key>Comment</key>
@@ -10039,7 +10100,7 @@
       <key>Type</key>
       <string>Boolean</string>
       <key>Value</key>
-      <integer>0</integer>
+      <integer>1</integer>
     </map>
     <key>WaterEditPresets</key>
     <map>
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
index 0df89c8..78b96b3 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
@@ -11,7 +11,7 @@ void calcAtmospherics(vec3 inPositionEye);
 void main()
 {
 	//transform vertex
-	gl_Position = ftransform(); //gl_ModelViewProjectionMatrix * gl_Vertex;
+	gl_Position = ftransform();
 	gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
 	
 	vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index b227043..7af05a5 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -1,4 +1,4 @@
-version 17
+version 18
 
 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences
 // Should be combined into one table
@@ -33,6 +33,7 @@ RenderFlexTimeFactor		1	1.0
 RenderFogRatio				1	4.0
 RenderGamma					1	0
 RenderGlowResolutionPow		1	9
+RenderGround				1	1
 RenderLightingDetail		1	1
 RenderMaxPartCount			1	8192
 RenderNightBrightness		1	1.0
@@ -347,21 +348,7 @@ RenderVBOEnable				0	0
 list ATI_All-in-Wonder_7500
 RenderVBOEnable				0	0
 
-
-list ATI_Mobility_Radeon_9800
-RenderAvatarCloth			0	0
-VertexShaderEnable			0	0
-WindLightUseAtmosShaders	0	0
-
-list ATI_Mobility_Radeon_9700
-RenderAvatarCloth			0	0
-VertexShaderEnable			0	0
-WindLightUseAtmosShaders	0	0
-
 list ATI_Mobility_Radeon_9600
-RenderAvatarCloth			0	0
-VertexShaderEnable			0	0
-WindLightUseAtmosShaders	0	0
 Disregard96DefaultDrawDistance	1	0
 
 
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index 3eaa781..0036f11 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -1,4 +1,4 @@
-version 17
+version 18
 
 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences
 // Should be combined into one table
@@ -33,6 +33,7 @@ RenderFlexTimeFactor		1	1.0
 RenderFogRatio				1	4.0
 RenderGamma					1	0
 RenderGlowResolutionPow		1	9
+RenderGround				1	1
 RenderLightingDetail		1	1
 RenderMaxPartCount			1	8192
 RenderNightBrightness		1	1.0
@@ -343,21 +344,7 @@ RenderVBOEnable				0	0
 list ATI_All-in-Wonder_7500
 RenderVBOEnable				0	0
 
-
-list ATI_Mobility_Radeon_9800
-RenderAvatarCloth			0	0
-VertexShaderEnable			0	0
-WindLightUseAtmosShaders	0	0
-
-list ATI_Mobility_Radeon_9700
-RenderAvatarCloth			0	0
-VertexShaderEnable			0	0
-WindLightUseAtmosShaders	0	0
-
 list ATI_Mobility_Radeon_9600
-RenderAvatarCloth			0	0
-VertexShaderEnable			0	0
-WindLightUseAtmosShaders	0	0
 Disregard96DefaultDrawDistance	1	0
 
 
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index fab8ea9..54a7c11 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -1,4 +1,4 @@
-version 16
+version 18
 
 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences
 // Should be combined into one table
@@ -33,6 +33,7 @@ RenderFlexTimeFactor			1	1.0
 RenderFogRatio					1	4.0
 RenderGamma						1	0
 RenderGlowResolutionPow			1	9
+RenderGround					1	1
 RenderLightingDetail			1	1
 RenderMaxPartCount				1	8192
 RenderNightBrightness			1	1.0
@@ -291,6 +292,7 @@ RenderVBOEnable				1	0
 list Intel_950
 RenderTerrainDetail			1	0
 RenderVBOEnable				1	0
+RenderGround				1	0
 
 list Intel_965
 RenderTerrainDetail			1	0
@@ -324,20 +326,7 @@ list Intel_Springdale
 RenderTerrainDetail			1	0
 RenderVBOEnable				1	0
 
-list ATI_Mobility_Radeon_9800
-RenderAvatarCloth			0	0
-VertexShaderEnable			0	0
-WindLightUseAtmosShaders	0	0
-
-list ATI_Mobility_Radeon_9700
-RenderAvatarCloth			0	0
-VertexShaderEnable			0	0
-WindLightUseAtmosShaders	0	0
-
 list ATI_Mobility_Radeon_9600
-RenderAvatarCloth			0	0
-VertexShaderEnable			0	0
-WindLightUseAtmosShaders	0	0
 Disregard96DefaultDrawDistance	1	0
 
 list NVIDIA_GeForce_8600
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index 48af543..eee1831 100644
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -26,6 +26,7 @@ ATI All-in-Wonder 7500			.*ATI.*All-in-Wonder 75.*			0		1
 ATI All-in-Wonder 8500			.*ATI.*All-in-Wonder 85.*			0		1
 ATI All-in-Wonder 9200			.*ATI.*All-in-Wonder 92.*			0		1
 ATI All-in-Wonder 9xxx			.*ATI.*All-in-Wonder 9.*			1		1
+ATI All-in-Wonder HD			.*ATI.*All-in-Wonder HD.*			1		1
 ATI All-in-Wonder X600			.*ATI.*All-in-Wonder X6.*			1		1
 ATI All-in-Wonder X800			.*ATI.*All-in-Wonder X8.*			2		1
 ATI All-in-Wonder X1800			.*ATI.*All-in-Wonder X18.*			3		1
@@ -35,7 +36,9 @@ ATI All-in-Wonder Radeon 		.*ATI.*All-in-Wonder Radeon.*		0		1
 ATI ASUS A9xxx					.*ATI.*ASUS.*A9.*					1		1
 ATI ASUS AH24xx					.*ATI.*ASUS.*AH24.*					1		1
 ATI ASUS AH26xx					.*ATI.*ASUS.*AH26.*					3		1
+ATI ASUS AH34xx					.*ATI.*ASUS.*AH34.*					1		1
 ATI ASUS AH36xx					.*ATI.*ASUS.*AH36.*					3		1
+ATI ASUS AH46xx					.*ATI.*ASUS.*AH46.*					3		1
 ATI ASUS AX3xx					.*ATI.*ASUS.*AX3.*					1		1
 ATI ASUS AX5xx					.*ATI.*ASUS.*AX5.*					1		1
 ATI ASUS AX8xx					.*ATI.*ASUS.*AX8.* 					2		1
@@ -51,6 +54,7 @@ ATI Diamond X550				.*ATI.*Diamond X550.*				1		1
 ATI Diamond X13xx				.*ATI.*Diamond X13.*				1		1
 ATI Diamond X16xx				.*ATI.*Diamond X16.*				1		1
 ATI Diamond X19xx				.*ATI.*Diamond X19.*				1		1
+ATI Display Adapter				.*ATI.*display adapter.*			0		1
 ATI FireGL 5200					.*ATI.*FireGL V52.*					0		1
 ATI FireGL 5xxx					.*ATI.*FireGL V5.*					1		1
 ATI FireGL						.*ATI.*Fire.*GL.*					0		1
@@ -61,6 +65,8 @@ ATI IGP 340M					.*ATI.*IGP.*340M.*					0		0
 ATI M52							.*ATI.*M52.*						1		1
 ATI M54							.*ATI.*M54.*						1		1
 ATI M56							.*ATI.*M56.*						1		1
+ATI M71							.*ATI.*M71.*						1		1
+ATI M72							.*ATI.*M72.*						1		1
 ATI M76							.*ATI.*M76.*						3		1
 ATI Mobility Radeon 7xxx		.*ATI.*Mobility.*Radeon 7.*			0		1
 ATI Mobility Radeon 8xxx		.*ATI.*Mobility.*Radeon 8.*			0		1
@@ -84,9 +90,13 @@ ATI Radeon HD 2300				.*ATI.*Radeon HD 23.*				0		1
 ATI Radeon HD 2400				.*ATI.*Radeon HD.*24.*				1		1
 ATI Radeon HD 2600				.*ATI.*Radeon HD 26.*				2		1
 ATI Radeon HD 2900				.*ATI.*Radeon HD 29.*				3		1
+ATI Radeon HD 3200				.*ATI.*Radeon HD.*32.*				1		1
+ATI Radeon HD 3300				.*ATI.*Radeon HD.*33.*				1		1
 ATI Radeon HD 3400				.*ATI.*Radeon HD.*34.*				1		1
 ATI Radeon HD 3600				.*ATI.*Radeon HD.*36.*				3		1
 ATI Radeon HD 3800				.*ATI.*Radeon HD.*38.*				3		1
+ATI Radeon HD 4300				.*ATI.*Radeon HD 43.*				1		1
+ATI Radeon HD 4600				.*ATI.*Radeon HD 46.*				3		1
 ATI Radeon HD 4800				.*ATI.*Radeon HD.*48.*				3		1
 ATI Radeon OpenGL				.*ATI.*Radeon OpenGL.* 				0		0
 ATI Radeon 2100					.*ATI.*Radeon 21.*					0		1
@@ -104,13 +114,14 @@ ATI Radeon RV250				.*ATI.*RV250.*						0		1
 ATI Radeon RV600				.*ATI.*RV6.*						1		1
 ATI Radeon RX700				.*ATI.*RX70.*						1		1
 ATI Radeon RX800				.*ATI.*Radeon *RX80.*				2		1
+ATI Radeon RX9550				.*ATI.*RX9550.*						1		1
 ATI Radeon VE					.*ATI.*Radeon.*VE.*					0		0
 ATI Radeon X1000				.*ATI.*Radeon *X10.*				0		1
 ATI Radeon X1200				.*ATI.*Radeon *X12.*				0		1
 ATI Radeon X1300				.*ATI.*Radeon *X13.*				1		1
 ATI Radeon X1400				.*ATI.*Radeon X14.*					1		1
 ATI Radeon X1500				.*ATI.*Radeon X15.*					1		1
-ATI Radeon X1600				.*ATI.*Radeon X16.*					1		1
+ATI Radeon X1600				.*ATI.*Radeon *X16.*				1		1
 ATI Radeon X1700				.*ATI.*Radeon X17.*					1		1
 ATI Radeon X1800				.*ATI.*Radeon X18.*					3		1
 ATI Radeon X1900				.*ATI.*Radeon X19.*					3		1
@@ -134,8 +145,8 @@ Intel 865G						.*Intel.*865G						0		0
 Intel 900						.*Intel.*900.*900					0		0
 Intel 915GM						.*Intel.*915GM						0		0
 Intel 915G						.*Intel.*915G						0		0
-Intel 945GM						.*Intel.*945GM						0		1
-Intel 945G						.*Intel.*945G						0		1
+Intel 945GM						.*Intel.*945GM.*					0		1
+Intel 945G						.*Intel.*945G.*						0		1
 Intel 950						.*Intel.*950.*						0		1
 Intel 965						.*Intel.*965.*						0		1
 Intel G33						.*Intel.*G33.*						0		0
@@ -143,15 +154,20 @@ Intel G45						.*Intel.*G45.*						0		1
 Intel Bear Lake					.*Intel.*Bear Lake.*				0		0
 Intel Broadwater 				.*Intel.*Broadwater.*				0		0
 Intel Brookdale					.*Intel.*Brookdale.*				0		0
-Intel Eaglelake					.*Intel.*Eaglelake.*				0		1
+Intel Cantiga					.*Intel.*Cantiga.*					0		0
+Intel Eaglelake					.*Intel.*Eaglelake.*				0		0
 Intel Montara					.*Intel.*Montara.*					0		0
 Intel Springdale				.*Intel.*Springdale.*				0		0
 Matrox							.*Matrox.*							0		0
 Mesa							.*Mesa.*							0		0
 NVIDIA GTX 260					.*NVIDIA.*GeForce.*GTX.*260.*		3		1
 NVIDIA GTX 280					.*NVIDIA.*GeForce.*GTX.*280.*		3		1
+NVIDIA C51						.*NVIDIA.*C51.*						0		1
 NVIDIA G72						.*NVIDIA.*G72.*						1		1
 NVIDIA G73						.*NVIDIA.*G73.*						1		1
+NVIDIA G84						.*NVIDIA.*G84.*						3		1
+NVIDIA G86						.*NVIDIA.*G86.*						3		1
+NVIDIA G92						.*NVIDIA.*G92.*						3		1
 NVIDIA GeForce					.*GeForce 256.*						0		0
 NVIDIA GeForce 2				.*GeForce2.*						0		1
 NVIDIA GeForce 3				.*GeForce3.*						0		1
@@ -170,17 +186,24 @@ NVIDIA GeForce 7200				.*NVIDIA.*GeForce 72.*				1		1
 NVIDIA GeForce 7300				.*NVIDIA.*GeForce 73.*				1		1
 NVIDIA GeForce 7500				.*NVIDIA.*GeForce 75.*				1		1
 NVIDIA GeForce 7600				.*NVIDIA.*GeForce 76.*				2		1
-NVIDIA GeForce 7800				.*NVIDIA.*GeForce 78.*				2		1
+NVIDIA GeForce 7800				.*NVIDIA.*GeForce.*78.*				2		1
 NVIDIA GeForce 7900				.*NVIDIA.*GeForce 79.*				2		1
+NVIDIA GeForce 8100				.*NVIDIA.*GeForce 81.*				1		1
 NVIDIA GeForce 8200				.*NVIDIA.*GeForce 82.*				1		1
 NVIDIA GeForce 8300				.*NVIDIA.*GeForce 83.*				1		1
 NVIDIA GeForce 8400				.*NVIDIA.*GeForce 84.*				1		1
-NVIDIA GeForce 8500				.*NVIDIA.*GeForce 85.*				3		1
+NVIDIA GeForce 8500				.*GeForce 85.*						3		1
 NVIDIA GeForce 8600				.*NVIDIA.*GeForce 86.*				3		1
 NVIDIA GeForce 8700				.*NVIDIA.*GeForce 87.*				3		1
 NVIDIA GeForce 8800				.*NVIDIA.*GeForce 88.*				3		1
 NVIDIA GeForce 9300M			.*NVIDIA.*GeForce 9300M.*			1		1
+NVIDIA GeForce 9400M			.*NVIDIA.*GeForce 9400M.*			1		1
 NVIDIA GeForce 9500M			.*NVIDIA.*GeForce 9500M.*			2		1
+NVIDIA GeForce 9600M			.*NVIDIA.*GeForce 9600M.*			2		1
+NVIDIA GeForce 9700M			.*NVIDIA.*GeForce 9700M.*			2		1
+NVIDIA GeForce 9300				.*NVIDIA.*GeForce 93.*				1		1
+NVIDIA GeForce 9400				.*GeForce 94.*						1		1
+NVIDIA GeForce 9500				.*NVIDIA.*GeForce 95.*				2		1
 NVIDIA GeForce 9600				.*NVIDIA.*GeForce 96.*				3		1
 NVIDIA GeForce 9800				.*NVIDIA.*GeForce 98.*				3		1
 NVIDIA GeForce FX 5100			.*NVIDIA.*GeForce FX 51.*			0		1
@@ -212,11 +235,23 @@ NVIDIA GeForce Go 7600			.*NVIDIA.*GeForce Go 76.*			2		1
 NVIDIA GeForce Go 7700			.*NVIDIA.*GeForce Go 77.*			2		1
 NVIDIA GeForce Go 7800			.*NVIDIA.*GeForce Go 78.*			2		1
 NVIDIA GeForce Go 7900			.*NVIDIA.*GeForce Go 79.*			2		1
+NVIDIA GeForce GTX 260			.*NVIDIA.*GeForce GTX 26.*			3		1
+NVIDIA GeForce GTX 280			.*NVIDIA.*GeForce GTX 28.*			3		1
+NVIDIA D9M						.*D9M.*								1		1
+NVIDIA G84						.*G84.*								1		1
+NVIDIA G92						.*G92.*								3		1
+NVIDIA G94						.*G94.*								3		1
 NVIDIA GeForce Go 6				.*GeForce Go 6.*					1		1
+NVIDIA NB9M						.*GeForce NB9M.*					1		1
+NVIDIA NB9P						.*GeForce NB9P.*					1		1
 NVIDIA GeForce PCX				.*GeForce PCX.*						0		1
 NVIDIA Generic					.*NVIDIA.*Unknown.*					0		0
+NVIDIA NV17						.*GeForce NV17.*					0		1
 NVIDIA NV34						.*NVIDIA.*NV34.*					0		1
+NVIDIA NV36						.*GeForce NV36.*					1		1
 NVIDIA NV43						.*NVIDIA.*NV43.*					1		1
+NVIDIA NV44						.*NVIDIA.*NV44.*					1		1
+NVIDIA nForce					.*NVIDIA.*nForce.*					0		0
 NVIDIA MCP78					.*NVIDIA.*MCP78.*					1		1
 NVIDIA Quadro2					.*Quadro2.*							0		1
 NVIDIA Quadro4					.*Quadro4.*							0		1
@@ -225,10 +260,12 @@ NVIDIA Quadro FX 4500			.*Quadro.*FX.*4500.*				3		1
 NVIDIA Quadro FX				.*Quadro FX.*						1		1
 NVIDIA Quadro NVS				.*Quadro NVS.*						0		1
 NVIDIA RIVA TNT					.*RIVA TNT.*						0		0
+NVIDIA PCI						.*NVIDIA.*/PCI/SSE2					0		0
 S3								.*S3 Graphics.*						0		0
 SiS								SiS.*								0		0
 Trident							Trident.*							0		0
 Tungsten Graphics				Tungsten.*							0		0
 XGI								XGI.*								0		0
 VIA								VIA.*								0		0
-
+Apple Generic					Apple.*Generic.*					0		0
+Apple Software Renderer			Apple.*Software Renderer.*			0		0
diff --git a/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store b/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store
index c73ba24..a8b7573 100644
Binary files a/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store and b/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store differ
diff --git a/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt b/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt
new file mode 100644
index 0000000..185c018
--- /dev/null
+++ b/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt
@@ -0,0 +1,6 @@
+The language files in this directory are Unicode (Little-Endian) format, also known as UTF-16 LE.
+
+This is the format required for NSIS Unicode.  See http://www.scratchpaper.com/ for details.
+
+James Cook
+September 2008
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index c795507..01bd98f 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -1,30 +1,22 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; secondlife setup.nsi
-;; Copyright 2004-2007, Linden Research, Inc.
-;; For info, see http://www.nullsoft.com/free/nsis/
+;; Copyright 2004-2008, Linden Research, Inc.
+;;
+;; NSIS Unicode 2.38.1 or higher required
+;; http://www.scratchpaper.com/
 ;;
-;; NSIS 2.22 or higher required
 ;; Author: James Cook, Don Kjer, Callum Prentice
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Detect NSIS compiler version
-!define "NSIS${NSIS_VERSION}"
-!ifdef "NSISv2.02" | "NSISv2.03" | "NSISv2.04" | "NSISv2.05" | "NSISv2.06"
-    ;; before 2.07 defaulted lzma to solid (whole file)
-    SetCompressor lzma
-!else
-    ;; after 2.07 required /solid for whole file compression
-    SetCompressor /solid lzma
-!endif
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Compiler flags
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 SetOverwrite on				; overwrite files
 SetCompress auto			; compress iff saves space
+SetCompressor /solid lzma	; compress whole installer as one block
 SetDatablockOptimize off	; only saves us 0.1%, not worth it
 XPStyle on                  ; add an XP manifest to the installer
+RequestExecutionLevel admin	; on Vista we must be admin because we write to Program Files
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Project flags
@@ -41,9 +33,22 @@ XPStyle on                  ; add an XP manifest to the installer
 !include "%%SOURCE%%\installers\windows\lang_en-us.nsi"
 !include "%%SOURCE%%\installers\windows\lang_ja.nsi"
 !include "%%SOURCE%%\installers\windows\lang_ko.nsi"
+!include "%%SOURCE%%\installers\windows\lang_pt-br.nsi"
+!include "%%SOURCE%%\installers\windows\lang_fr.nsi"
+!include "%%SOURCE%%\installers\windows\lang_es.nsi"
+!include "%%SOURCE%%\installers\windows\lang_it.nsi"
+!include "%%SOURCE%%\installers\windows\lang_nl.nsi"
+!include "%%SOURCE%%\installers\windows\lang_zh.nsi"
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Tweak for different servers/builds (this placeholder is replaced by viewer_manifest.py)
+;; For example:
+;; !define INSTFLAGS "%(flags)s"
+;; !define INSTNAME   "SecondLife%(grid_caps)s"
+;; !define SHORTCUT   "Second Life (%(grid_caps)s)"
+;; !define URLNAME   "secondlife%(grid)s"
+;; !define UNINSTALL_SETTINGS 1
+
 %%GRID_VARS%%
 
 Name ${INSTNAME}
@@ -63,11 +68,7 @@ AutoCloseWindow true					; after all files install, close window
 
 InstallDir "$PROGRAMFILES\${INSTNAME}"
 InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" ""
-!ifdef UPDATE
-DirText $(DirectoryChooseTitle) $(DirectoryChooseUpdate)
-!else
 DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup)
-!endif
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -76,145 +77,41 @@ DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup)
 Var INSTPROG
 Var INSTEXE
 Var INSTFLAGS
-Var LANGFLAGS
 Var INSTSHORTCUT
+Var COMMANDLINE         ; command line passed to this installer, set in .onInit
 
-;;; Function definitions should go before file includes, because the NSIS package
-;;; is a single stream of bytecodes + file data.  So if your function definitions are at
-;;; the end of the file it has to decompress the whole thing before it can call a function. JC
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; PostInstallExe
-; This just runs any post installation scripts.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function PostInstallExe
-push $0
-  ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "PostInstallExe"
-  ;MessageBox MB_OK '$0'
-  ExecWait '$0'
-pop $0
-FunctionEnd
+;;; Function definitions should go before file includes, because calls to
+;;; DLLs like LangDLL trigger an implicit file include, so if that call is at
+;;; the end of this script NSIS has to decompress the whole installer before 
+;;; it can call the DLL function. JC
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; CheckStartupParameters
-; Sets INSTFLAGS, INSTPROG, and INSTEXE.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function CheckStartupParams
-push $0
-push $R0
-
-  ; Look for a registry entry with info about where to update.
-  Call GetProgramName
-  pop $R0
-  StrCpy $INSTPROG "$R0"
-  StrCpy $INSTEXE "$R0.exe"
-
-  ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" ""
-  ; If key doesn't exist, skip install
-  IfErrors ABORT
-  StrCpy $INSTDIR "$0"
-
-  ; We now have a directory to install to.  Get the startup parameters and shortcut as well.
-  ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags"
-  IfErrors +2
-  StrCpy $INSTFLAGS "$0"
-  ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut"
-  IfErrors +2
-  StrCpy $INSTSHORTCUT "$0"
-  ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe"
-  IfErrors +2
-  StrCpy $INSTEXE "$0"
-  Goto FINISHED
-
-ABORT:
-  MessageBox MB_OK $(CheckStartupParamsMB)
-  Quit
-
-FINISHED:
-  ;MessageBox MB_OK "INSTPROG: $INSTPROG, INSTEXE: $INSTEXE, INSTFLAGS: $INSTFLAGS"
-pop $R0
-pop $0
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function un.CheckStartupParams
-push $0
-push $R0
-
-  ; Look for a registry entry with info about where to update.
-  Call un.GetProgramName
-  pop $R0
-  StrCpy $INSTPROG "$R0"
-  StrCpy $INSTEXE "$R0.exe"
-
-  ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" ""
-  ; If key doesn't exist, skip install
-  IfErrors ABORT
-  StrCpy $INSTDIR "$0"
-
-  ; We now have a directory to install to.  Get the startup parameters and shortcut as well.
-  ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags"
-  IfErrors +2
-  StrCpy $INSTFLAGS "$0"
-  ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut"
-  IfErrors +2
-  StrCpy $INSTSHORTCUT "$0"
-  ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe"
-  IfErrors +2
-  StrCpy $INSTEXE "$0"
-  Goto FINISHED
-
-ABORT:
-  MessageBox MB_OK $(CheckStartupParamsMB)
-  Quit
-
-FINISHED:
-  ;MessageBox MB_OK "INSTPROG: $INSTPROG, INSTEXE: $INSTEXE, INSTFLAGS: $INSTFLAGS"
-pop $R0
-pop $0
-FunctionEnd
+!include "FileFunc.nsh"     ; For GetParameters, GetOptions
+!insertmacro GetParameters
+!insertmacro GetOptions
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; After install completes, offer readme file
+;;; After install completes, launch app
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 Function .onInstSuccess
-	MessageBox MB_YESNO \
-	$(InstSuccesssQuestion) /SD IDYES IDNO NoReadme
-		; Assumes SetOutPath $INSTDIR
-		Exec '"$INSTDIR\$INSTEXE" $INSTFLAGS'
-	NoReadme:
+    Push $R0	# Option value, unused
+    ${GetOptions} $COMMANDLINE "/AUTOSTART" $R0
+    # If parameter was there (no error) just launch
+    # Otherwise ask
+    IfErrors label_ask_launch label_launch
+    
+label_ask_launch:
+    # Don't launch by default when silent
+    IfSilent label_no_launch
+	MessageBox MB_YESNO $(InstSuccesssQuestion) \
+        IDYES label_launch IDNO label_no_launch
+        
+label_launch:
+	# Assumes SetOutPath $INSTDIR
+	Exec '"$INSTDIR\$INSTEXE" $INSTFLAGS'
+label_no_launch:
+	Pop $R0
 FunctionEnd
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Remove old NSIS version. Modifies no variables.
-; Does NOT delete the LindenWorld directory, or any
-; user files in that directory.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function RemoveNSIS
-  Push $0
-  ; Grab the installation directory of the old version
-  DetailPrint $(RemoveOldNSISVersion)
-  ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" ""
-
-  ; If key doesn't exist, skip uninstall
-  IfErrors NO_NSIS
-
-  ; Clean up legacy beta shortcuts
-  Delete "$SMPROGRAMS\Second Life Beta.lnk"
-  Delete "$DESKTOP\Second Life Beta.lnk"
-  Delete "$SMPROGRAMS\Second Life.lnk"
-  
-  ; Clean up old newview.exe file
-  Delete "$INSTDIR\newview.exe"
-
-  ; Intentionally don't delete the stuff in
-  ; Documents and Settings, so we keep the user's settings
-
-  NO_NSIS:
-  Pop $0
-FunctionEnd
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Make sure we're not on Windows 98 / ME
@@ -242,28 +139,28 @@ FunctionEnd
 ; Make sure the user can install/uninstall
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 Function CheckIfAdministrator
-		DetailPrint $(CheckAdministratorInstDP)
-         UserInfo::GetAccountType
-         Pop $R0
-         StrCmp $R0 "Admin" is_admin
-         MessageBox MB_OK $(CheckAdministratorInstMB)
-         Quit
-is_admin:
-         Return
+    DetailPrint $(CheckAdministratorInstDP)
+    UserInfo::GetAccountType
+    Pop $R0
+    StrCmp $R0 "Admin" lbl_is_admin
+        MessageBox MB_OK $(CheckAdministratorInstMB)
+        Quit
+lbl_is_admin:
+    Return
 FunctionEnd
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 Function un.CheckIfAdministrator
-	DetailPrint $(CheckAdministratorUnInstDP)
-         UserInfo::GetAccountType
-         Pop $R0
-         StrCmp $R0 "Admin" is_admin
-         MessageBox MB_OK $(CheckAdministratorUnInstMB)
-         Quit
-is_admin:
-         Return
+    DetailPrint $(CheckAdministratorUnInstDP)
+    UserInfo::GetAccountType
+    Pop $R0
+    StrCmp $R0 "Admin" lbl_is_admin
+        MessageBox MB_OK $(CheckAdministratorUnInstMB)
+        Quit
+lbl_is_admin:
+    Return
 FunctionEnd
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -310,6 +207,33 @@ Function CloseSecondLife
     Return
 FunctionEnd
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Test our connection to secondlife.com
+; Also allows us to count attempted installs by examining web logs.
+; *TODO: Return current SL version info and have installer check
+; if it is up to date.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function CheckNetworkConnection
+    Push $0
+    Push $1
+    DetailPrint $(CheckNetworkConnectionDP)
+    GetTempFileName $0
+    !define HTTP_TIMEOUT 5000 ; milliseconds
+    ; Don't show secondary progress bar, this will be quick.
+    NSISdl::download_quiet \
+        /TIMEOUT=${HTTP_TIMEOUT} \
+        "http://join.secondlife.com/installer-check/?v=${VERSION_LONG}" \
+        $0
+    Pop $1 ; Return value, either "success", "cancel" or an error message
+    ; MessageBox MB_OK "Download result: $1"
+    ; Result ignored for now
+	; StrCmp $1 "success" +2
+	;	DetailPrint "Connection failed: $1"
+    Delete $0 ; temporary file
+    Pop $1
+    Pop $0
+    Return
+FunctionEnd
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Delete files in Documents and Settings\<user>\SecondLife\cache
@@ -577,7 +501,6 @@ StrCpy $INSTFLAGS ""
 StrCpy $INSTPROG "${INSTNAME}"
 StrCpy $INSTEXE "${INSTEXE}"
 StrCpy $INSTSHORTCUT "${SHORTCUT}"
-Call un.CheckStartupParams              ; Figure out where, what and how to uninstall.
 Call un.CheckIfAdministrator		; Make sure the user can install/uninstall
 
 ; uninstall for all users (if you change this, change it in the install as well)
@@ -586,10 +509,9 @@ SetShellVarContext all
 ; Make sure we're not running
 Call un.CloseSecondLife
 
-; Clean up registry keys (these should all be !defines somewhere)
+; Clean up registry keys and subkeys (these should all be !defines somewhere)
 DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG"
 DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG"
-DeleteRegKey HKEY_LOCAL_MACHINE "Software\Linden Research, Inc.\Installer Language" 
 
 ; Clean up shortcuts
 Delete "$SMPROGRAMS\$INSTSHORTCUT\*.*"
@@ -613,123 +535,6 @@ Call un.ProgramFiles
 
 SectionEnd 				; end of uninstall section
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; (From the NSIS wiki, DK)
-; GetParameterValue
-;
-; Usage:
-; !insertmacro GetParameterValue "/L=" "1033"
-; pop $R0
-;
-; Returns on top of stack
-;
-; Example command lines:
-; foo.exe /S /L=1033 /D=C:\Program Files\Foo
-; or:
-; foo.exe /S "/L=1033" /D="C:\Program Files\Foo"
-; gpv "/L=" "1033"
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- !macro GetParameterValue SWITCH DEFAULT
-   Push $0
-   Push $1
-   Push $2
-   Push $3
-   Push $4
-
- ;$CMDLINE='"My Setup\Setup.exe" /L=1033 /S'
-   Push "$CMDLINE"
-   Push '${SWITCH}"'
-   !insertmacro StrStr
-   Pop $0
-   StrCmp "$0" "" gpv_notquoted
- ;$0='/L="1033" /S'
-   StrLen $2 "$0"
-   Strlen $1 "${SWITCH}"
-   IntOp $1 $1 + 1
-   StrCpy $0 "$0" $2 $1
- ;$0='1033" /S'
-   Push "$0"
-   Push '"'
-   !insertmacro StrStr
-   Pop $1
-   StrLen $2 "$0"
-   StrLen $3 "$1"
-   IntOp $4 $2 - $3
-   StrCpy $0 $0 $4 0
-   Goto gpv_done
-
-   gpv_notquoted:
-   Push "$CMDLINE"
-   Push "${SWITCH}"
-   !insertmacro StrStr
-   Pop $0
-   StrCmp "$0" "" gpv_done
- ;$0='/L="1033" /S'
-   StrLen $2 "$0"
-   Strlen $1 "${SWITCH}"
-   StrCpy $0 "$0" $2 $1
- ;$0=1033 /S'
-   Push "$0"
-   Push ' '
-   !insertmacro StrStr
-   Pop $1
-   StrLen $2 "$0"
-   StrLen $3 "$1"
-   IntOp $4 $2 - $3
-   StrCpy $0 $0 $4 0
-   Goto gpv_done
-
-   gpv_done:
-   StrCmp "$0" "" 0 +2
-   StrCpy $0 "${DEFAULT}"
-
-   Pop $4
-   Pop $3
-   Pop $2
-   Pop $1
-   Exch $0
- !macroend
-
-; And I had to modify StrStr a tiny bit.
-; Possible upgrade switch the goto's to use ${__LINE__}
-
-!macro STRSTR
-  Exch $R1 ; st=haystack,old$R1, $R1=needle
-  Exch    ; st=old$R1,haystack
-  Exch $R2 ; st=old$R1,old$R2, $R2=haystack
-  Push $R3
-  Push $R4
-  Push $R5
-  StrLen $R3 $R1
-  StrCpy $R4 0
-  ; $R1=needle
-  ; $R2=haystack
-  ; $R3=len(needle)
-  ; $R4=cnt
-  ; $R5=tmp
- ;  loop;
-    StrCpy $R5 $R2 $R3 $R4
-    StrCmp $R5 $R1 +4
-    StrCmp $R5 "" +3
-    IntOp $R4 $R4 + 1
-    Goto -4
- ;  done;
-  StrCpy $R1 $R2 "" $R4
-  Pop $R5
-  Pop $R4
-  Pop $R3
-  Pop $R2
-  Exch $R1
-!macroend
-
-Function GetProgramName
-  !insertmacro GetParameterValue "/P=" "SecondLife"
-FunctionEnd
-
-Function un.GetProgramName
-  !insertmacro GetParameterValue "/P=" "SecondLife"
-FunctionEnd
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; (From the NSIS documentation, JC)
@@ -827,42 +632,59 @@ FunctionEnd
 ;;  entry to the language ID selector below
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 Function .onInit
-
-	; read the language from registry (ok if not there) and set langauge menu
+    Push $0
+    ${GetParameters} $COMMANDLINE              ; get our command line
+    ${GetOptions} $COMMANDLINE "/LANGID=" $0   ; /LANGID=1033 implies US English
+    ; If no language (error), then proceed
+    IfErrors lbl_check_silent
+    ; No error means we got a language, so use it
+    StrCpy $LANGUAGE $0
+    Goto lbl_return
+
+lbl_check_silent:
+    ; For silent installs, no language prompt, use default
+    IfSilent lbl_return
+    
+	; If we currently have a version of SL installed, default to the language of that install
+    ; Otherwise don't change $LANGUAGE and it will default to the OS UI language.
 	ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage"
+    IfErrors lbl_build_menu
 	StrCpy $LANGUAGE $0
 
+lbl_build_menu:
 	Push ""
-	Push ${LANG_ENGLISH}
-	Push English
-	Push ${LANG_GERMAN}
-	Push German
-	Push ${LANG_JAPANESE}
-	Push Japanese
-	Push ${LANG_KOREAN}
-	Push Korean
+    # Use separate file so labels can be UTF-16 but we can still merge changes
+    # into this ASCII file. JC
+    !include "%%SOURCE%%\installers\windows\language_menu.nsi"
+    
 	Push A ; A means auto count languages for the auto count to work the first empty push (Push "") must remain
-	LangDLL::LangDialog "Installer Language" "Please select the language of the installer"
-	Pop $LANGUAGE
-	StrCmp $LANGUAGE "cancel" 0 +2
+	LangDLL::LangDialog $(InstallerLanguageTitle) $(SelectInstallerLanguage)
+	Pop $0
+	StrCmp $0 "cancel" 0 +2
 		Abort
+    StrCpy $LANGUAGE $0
 
 	; save language in registry		
 	WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" $LANGUAGE
+lbl_return:
+    Pop $0
+    Return
 FunctionEnd
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 Function un.onInit
-
-	; read language from registry and set for ininstaller
+	; read language from registry and set for uninstaller
+    ; Key will be removed on successful uninstall
 	ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage"
+    IfErrors lbl_end
 	StrCpy $LANGUAGE $0
-
+lbl_end:
+    Return
 FunctionEnd
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Sections
+;;; MAIN SECTION
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 Section ""						; (default section)
 
@@ -874,15 +696,11 @@ StrCpy $INSTPROG "${INSTNAME}"
 StrCpy $INSTEXE "${INSTEXE}"
 StrCpy $INSTSHORTCUT "${SHORTCUT}"
 
-IfSilent +2
-Goto NOT_SILENT
-  Call CheckStartupParams                 ; Figure out where, what and how to install.
-NOT_SILENT:
 Call CheckWindowsVersion		; warn if on Windows 98/ME
 Call CheckIfAdministrator		; Make sure the user can install/uninstall
 Call CheckIfAlreadyCurrent		; Make sure that we haven't already installed this version
 Call CloseSecondLife			; Make sure we're not running
-Call RemoveNSIS					; Check for old NSIS install to remove
+Call CheckNetworkConnection		; ping secondlife.com
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Don't remove cache files during a regular install, removing the inventory cache on upgrades results in lots of damage to the servers.
@@ -907,9 +725,6 @@ Call RemoveOldReleaseNotes
 ;; This placeholder is replaced by the complete list of all the files in the installer, by viewer_manifest.py
 %%INSTALL_FILES%%
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; If this is a silent update, we don't need to re-create these shortcuts or registry entries.
-IfSilent POST_INSTALL
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Shortcuts in start menu
@@ -918,25 +733,18 @@ SetOutPath "$INSTDIR"
 CreateShortCut	"$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT.lnk" \
 				"$INSTDIR\$INSTEXE" "$INSTFLAGS"
 
-!ifdef MUSEUM
-CreateShortCut	"$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT Museum.lnk" \
 
-				"$INSTDIR\$INSTEXE" "$INSTFLAGS -simple"
-CreateShortCut	"$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT Museum Spanish.lnk" \
-
-				"$INSTDIR\$INSTEXE" "$INSTFLAGS -simple -spanish"
-!endif
-
-WriteINIStr		"$SMPROGRAMS\$INSTSHORTCUT\SL Create Trial Account.url" \
+WriteINIStr		"$SMPROGRAMS\$INSTSHORTCUT\SL Create Account.url" \
 				"InternetShortcut" "URL" \
 				"http://www.secondlife.com/registration/"
 WriteINIStr		"$SMPROGRAMS\$INSTSHORTCUT\SL Your Account.url" \
 				"InternetShortcut" "URL" \
 				"http://www.secondlife.com/account/"
-CreateShortCut	"$SMPROGRAMS\$INSTSHORTCUT\SL Scripting Language Help.lnk" \
-				"$INSTDIR\lsl_guide.html"
+WriteINIStr		"$SMPROGRAMS\$INSTSHORTCUT\SL Scripting Language Help.url" \
+				"InternetShortcut" "URL" \
+                "http://wiki.secondlife.com/wiki/LSL_Portal"
 CreateShortCut	"$SMPROGRAMS\$INSTSHORTCUT\Uninstall $INSTSHORTCUT.lnk" \
-				'"$INSTDIR\uninst.exe"' '/P="$INSTPROG"'
+				'"$INSTDIR\uninst.exe"' ''
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Other shortcuts
@@ -944,18 +752,8 @@ SetOutPath "$INSTDIR"
 CreateShortCut "$DESKTOP\$INSTSHORTCUT.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS"
 CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS"
 CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \
-				'"$INSTDIR\uninst.exe"' '/P="$INSTPROG"'
-
-!ifdef MUSEUM
-CreateShortCut "$DESKTOP\$INSTSHORTCUT Museum.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple"
+				'"$INSTDIR\uninst.exe"' ''
 
-CreateShortCut "$DESKTOP\$INSTSHORTCUT Museum Spanish.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple -spanish"
-
-CreateShortCut "$INSTDIR\$INSTSHORTCUT Museum.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple"
-
-CreateShortCut "$INSTDIR\$INSTSHORTCUT Museum Spanish.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple -spanish"
-
-!endif
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Write registry
@@ -965,22 +763,17 @@ WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags
 WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut" "$INSTSHORTCUT"
 WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe" "$INSTEXE"
 WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayName" "$INSTPROG (remove only)"
-WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" '"$INSTDIR\uninst.exe" /P="$INSTPROG"'
+WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" '"$INSTDIR\uninst.exe"'
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Write URL registry info
 WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "(default)" "URL:Second Life"
 WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "URL Protocol" ""
 WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}\DefaultIcon" "" '"$INSTDIR\$INSTEXE"'
+;; URL param must be last item passed to viewer, it ignores subsequent params
+;; to avoid parameter injection attacks.
 WriteRegExpandStr HKEY_CLASSES_ROOT "${URLNAME}\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"'
 
-Goto WRITE_UNINST
-
-POST_INSTALL:
-; Run a post-executable script if necessary.
-Call PostInstallExe
-
-WRITE_UNINST:
 ; write out uninstaller
 WriteUninstaller "$INSTDIR\uninst.exe"
 
diff --git a/indra/newview/installers/windows/lang_de.nsi b/indra/newview/installers/windows/lang_de.nsi
index c410128..911ed74 100644
Binary files a/indra/newview/installers/windows/lang_de.nsi and b/indra/newview/installers/windows/lang_de.nsi differ
diff --git a/indra/newview/installers/windows/lang_en-us.nsi b/indra/newview/installers/windows/lang_en-us.nsi
index 218f1c6..a015413 100644
Binary files a/indra/newview/installers/windows/lang_en-us.nsi and b/indra/newview/installers/windows/lang_en-us.nsi differ
diff --git a/indra/newview/installers/windows/lang_es.nsi b/indra/newview/installers/windows/lang_es.nsi
new file mode 100644
index 0000000..3340a12
Binary files /dev/null and b/indra/newview/installers/windows/lang_es.nsi differ
diff --git a/indra/newview/installers/windows/lang_fr.nsi b/indra/newview/installers/windows/lang_fr.nsi
new file mode 100644
index 0000000..5c17ad0
Binary files /dev/null and b/indra/newview/installers/windows/lang_fr.nsi differ
diff --git a/indra/newview/installers/windows/lang_it.nsi b/indra/newview/installers/windows/lang_it.nsi
new file mode 100644
index 0000000..9f18013
Binary files /dev/null and b/indra/newview/installers/windows/lang_it.nsi differ
diff --git a/indra/newview/installers/windows/lang_ja.nsi b/indra/newview/installers/windows/lang_ja.nsi
index 5e0496e..f564291 100644
Binary files a/indra/newview/installers/windows/lang_ja.nsi and b/indra/newview/installers/windows/lang_ja.nsi differ
diff --git a/indra/newview/installers/windows/lang_ko.nsi b/indra/newview/installers/windows/lang_ko.nsi
index b570315..5162b7d 100644
Binary files a/indra/newview/installers/windows/lang_ko.nsi and b/indra/newview/installers/windows/lang_ko.nsi differ
diff --git a/indra/newview/installers/windows/lang_nl.nsi b/indra/newview/installers/windows/lang_nl.nsi
new file mode 100644
index 0000000..42453ba
Binary files /dev/null and b/indra/newview/installers/windows/lang_nl.nsi differ
diff --git a/indra/newview/installers/windows/lang_pt-br.nsi b/indra/newview/installers/windows/lang_pt-br.nsi
new file mode 100644
index 0000000..6524cc7
Binary files /dev/null and b/indra/newview/installers/windows/lang_pt-br.nsi differ
diff --git a/indra/newview/installers/windows/lang_zh.nsi b/indra/newview/installers/windows/lang_zh.nsi
new file mode 100644
index 0000000..e644e63
Binary files /dev/null and b/indra/newview/installers/windows/lang_zh.nsi differ
diff --git a/indra/newview/installers/windows/language_menu.nsi b/indra/newview/installers/windows/language_menu.nsi
new file mode 100644
index 0000000..473f9e0
Binary files /dev/null and b/indra/newview/installers/windows/language_menu.nsi differ
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index d268397..2237d67 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -80,6 +80,7 @@
 #include "llfloatertools.h"
 #include "llfloaterworldmap.h"
 #include "llgroupmgr.h"
+#include "llhomelocationresponder.h"
 #include "llhudeffectlookat.h"
 #include "llhudmanager.h"
 #include "llinventorymodel.h"
@@ -90,6 +91,7 @@
 #include "llmoveview.h"
 #include "llnotify.h"
 #include "llquantize.h"
+#include "llsdutil.h"
 #include "llselectmgr.h"
 #include "llsky.h"
 #include "llrendersphere.h"
@@ -445,7 +447,7 @@ void LLAgent::init()
 	mCameraFocusOffsetTarget = LLVector4(gSavedSettings.getVector3("CameraOffsetBuild"));
 	mCameraOffsetDefault = gSavedSettings.getVector3("CameraOffsetDefault");
 //	mCameraOffsetNorm = mCameraOffsetDefault;
-//	mCameraOffsetNorm.normVec();
+//	mCameraOffsetNorm.normalize();
 	mCameraCollidePlane.clearVec();
 	mCurrentCameraDistance = mCameraOffsetDefault.magVec();
 	mTargetCameraDistance = mCurrentCameraDistance;
@@ -490,7 +492,7 @@ LLAgent::~LLAgent()
 //-----------------------------------------------------------------------------
 // resetView()
 //-----------------------------------------------------------------------------
-void LLAgent::resetView(BOOL reset_camera)
+void LLAgent::resetView(BOOL reset_camera, BOOL change_camera)
 {
 	if (mAutoPilot)
 	{
@@ -515,6 +517,30 @@ void LLAgent::resetView(BOOL reset_camera)
 		gMenuHolder->hideMenus();
 	}
 
+	if (change_camera && !gSavedSettings.getBOOL("FreezeTime"))
+	{
+		changeCameraToDefault();
+		
+		if (LLViewerJoystick::getInstance()->getOverrideCamera())
+		{
+			handle_toggle_flycam();
+		}
+
+		// reset avatar mode from eventual residual motion
+		if (LLToolMgr::getInstance()->inBuildMode())
+		{
+			LLViewerJoystick::getInstance()->moveAvatar(true);
+		}
+
+		gFloaterTools->close();
+		
+		gViewerWindow->showCursor();
+
+		// Switch back to basic toolset
+		LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
+	}
+
+
 	if (reset_camera && !gSavedSettings.getBOOL("FreezeTime"))
 	{
 		if (!gViewerWindow->getLeftMouseDown() && cameraThirdPerson())
@@ -522,7 +548,7 @@ void LLAgent::resetView(BOOL reset_camera)
 			// leaving mouse-steer mode
 			LLVector3 agent_at_axis = getAtAxis();
 			agent_at_axis -= projected_vec(agent_at_axis, getReferenceUpVector());
-			agent_at_axis.normVec();
+			agent_at_axis.normalize();
 			gAgent.resetAxes(lerp(getAtAxis(), agent_at_axis, LLCriticalDamp::getInterpolant(0.3f)));
 		}
 
@@ -1033,7 +1059,7 @@ void LLAgent::slamLookAt(const LLVector3 &look_at)
 {
 	LLVector3 look_at_norm = look_at;
 	look_at_norm.mV[VZ] = 0.f;
-	look_at_norm.normVec();
+	look_at_norm.normalize();
 	resetAxes(look_at_norm);
 }
 
@@ -1294,7 +1320,7 @@ LLQuaternion LLAgent::getQuat() const
 //-----------------------------------------------------------------------------
 // calcFocusOffset()
 //-----------------------------------------------------------------------------
-LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, S32 x, S32 y)
+LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, LLVector3 pos_agent, S32 x, S32 y)
 {
 	// calculate offset based on view direction
 	BOOL is_avatar = object->isAvatar();
@@ -1305,7 +1331,7 @@ LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, S32 x, S32 y)
 
 	LLVector3 obj_dir_abs = obj_pos - LLViewerCamera::getInstance()->getOrigin();
 	obj_dir_abs.rotVec(inv_obj_rot);
-	obj_dir_abs.normVec();
+	obj_dir_abs.normalize();
 	obj_dir_abs.abs();
 
 	LLVector3 object_extents = object->getScale();
@@ -1330,7 +1356,7 @@ LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, S32 x, S32 y)
 	{
 		normal.setVec(obj_matrix.getUpRow4());
 	}
-	normal.normVec();
+	normal.normalize();
 
 	LLVector3d focus_pt_global;
 	// RN: should we check return value for valid pick?
@@ -1397,7 +1423,7 @@ LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, S32 x, S32 y)
 	if (!is_avatar) 
 	{
 		//unproject relative clicked coordinate from window coordinate using GL
-		GLint viewport[4];
+		/*GLint viewport[4];
 		GLdouble modelview[16];
 		GLdouble projection[16];
 		GLfloat winX, winY, winZ;
@@ -1419,11 +1445,9 @@ LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, S32 x, S32 y)
 		winY = ((F32)y) * gViewerWindow->getDisplayScale().mV[VY];
 		glReadPixels( llfloor(winX), llfloor(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
 
-		gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
+		gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);*/
 
-		LLVector3 obj_rel((F32)posX, (F32)posY, (F32)posZ);
-		obj_rel = obj_rel * object->getRenderMatrix();
-		obj_rel -= object->getRenderPosition();
+		LLVector3 obj_rel = pos_agent - object->getRenderPosition();
 		
 		LLVector3 obj_center = LLVector3(0, 0, 0) * object->getRenderMatrix();
 
@@ -1534,7 +1558,7 @@ BOOL LLAgent::calcCameraMinDistance(F32 &obj_min_distance)
 	camera_offset_target_abs_norm.abs();
 	// make sure offset is non-zero
 	camera_offset_target_abs_norm.clamp(0.001f, F32_MAX);
-	camera_offset_target_abs_norm.normVec();
+	camera_offset_target_abs_norm.normalize();
 
 	// find camera position relative to normalized object extents
 	LLVector3 camera_offset_target_scaled = camera_offset_target_abs_norm;
@@ -1580,7 +1604,7 @@ BOOL LLAgent::calcCameraMinDistance(F32 &obj_min_distance)
 	LLVector3 object_split_axis;
 	LLVector3 target_offset_scaled = target_offset_origin;
 	target_offset_scaled.abs();
-	target_offset_scaled.normVec();
+	target_offset_scaled.normalize();
 	target_offset_scaled.mV[VX] /= object_extents.mV[VX];
 	target_offset_scaled.mV[VY] /= object_extents.mV[VY];
 	target_offset_scaled.mV[VZ] /= object_extents.mV[VZ];
@@ -1703,7 +1727,7 @@ void LLAgent::setCameraZoomFraction(F32 fraction)
 	else if (cameraCustomizeAvatar())
 	{
 		LLVector3d camera_offset_dir = mCameraFocusOffsetTarget;
-		camera_offset_dir.normVec();
+		camera_offset_dir.normalize();
 		mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, APPEARANCE_MAX_ZOOM, APPEARANCE_MIN_ZOOM);
 	}
 	else
@@ -1730,7 +1754,7 @@ void LLAgent::setCameraZoomFraction(F32 fraction)
 		}
 
 		LLVector3d camera_offset_dir = mCameraFocusOffsetTarget;
-		camera_offset_dir.normVec();
+		camera_offset_dir.normalize();
 		mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, max_zoom, min_zoom);
 	}
 	startCameraAnimation();
@@ -1777,7 +1801,7 @@ void LLAgent::cameraOrbitOver(const F32 angle)
 	else
 	{
 		LLVector3 camera_offset_unit(mCameraFocusOffsetTarget);
-		camera_offset_unit.normVec();
+		camera_offset_unit.normalize();
 
 		F32 angle_from_up = acos( camera_offset_unit * getReferenceUpVector() );
 
@@ -1812,7 +1836,7 @@ void LLAgent::cameraZoomIn(const F32 fraction)
 	LLVector3d	camera_offset(mCameraFocusOffsetTarget);
 	LLVector3d	camera_offset_unit(mCameraFocusOffsetTarget);
 	F32 min_zoom = LAND_MIN_ZOOM;
-	F32 current_distance = (F32)camera_offset_unit.normVec();
+	F32 current_distance = (F32)camera_offset_unit.normalize();
 	F32 new_distance = current_distance * fraction;
 
 	// Don't move through focus point
@@ -1881,7 +1905,7 @@ void LLAgent::cameraOrbitIn(const F32 meters)
 	{
 		LLVector3d	camera_offset(mCameraFocusOffsetTarget);
 		LLVector3d	camera_offset_unit(mCameraFocusOffsetTarget);
-		F32 current_distance = (F32)camera_offset_unit.normVec();
+		F32 current_distance = (F32)camera_offset_unit.normalize();
 		F32 new_distance = current_distance - meters;
 		F32 min_zoom = LAND_MIN_ZOOM;
 		
@@ -1938,6 +1962,8 @@ void LLAgent::cameraPanIn(F32 meters)
 	mFocusGlobal = mFocusTargetGlobal;
 	// don't enforce zoom constraints as this is the only way for users to get past them easily
 	updateFocusOffset();
+	// NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind -Nyx
+	mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
 }
 
 //-----------------------------------------------------------------------------
@@ -1956,6 +1982,8 @@ void LLAgent::cameraPanLeft(F32 meters)
 	
 	cameraZoomIn(1.f);
 	updateFocusOffset();
+	// NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind - Nyx
+	mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
 }
 
 //-----------------------------------------------------------------------------
@@ -1974,6 +2002,8 @@ void LLAgent::cameraPanUp(F32 meters)
 
 	cameraZoomIn(1.f);
 	updateFocusOffset();
+	// NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind -Nyx
+	mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
 }
 
 //-----------------------------------------------------------------------------
@@ -2246,7 +2276,7 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s
 		mAutoPilotUseRotation = TRUE;
 		mAutoPilotTargetFacing = LLVector3::x_axis * *target_rotation;
 		mAutoPilotTargetFacing.mV[VZ] = 0.f;
-		mAutoPilotTargetFacing.normVec();
+		mAutoPilotTargetFacing.normalize();
 	}
 	else
 	{
@@ -2369,8 +2399,8 @@ void LLAgent::autoPilot(F32 *delta_yaw)
 		at.mV[VZ] = 0.f;
 		direction.mV[VZ] = 0.f;
 
-		at.normVec();
-		F32 xy_distance = direction.normVec();
+		at.normalize();
+		F32 xy_distance = direction.normalize();
 
 		F32 yaw = 0.f;
 		if (mAutoPilotTargetDist > mAutoPilotStopDistance)
@@ -3529,7 +3559,7 @@ void LLAgent::setupSitCamera()
 		// slam agent coordinate frame to proper parent local version
 		LLVector3 at_axis = mFrameAgent.getAtAxis();
 		at_axis.mV[VZ] = 0.f;
-		at_axis.normVec();
+		at_axis.normalize();
 		resetAxes(at_axis * ~parent_rot);
 	}
 }
@@ -3665,7 +3695,7 @@ LLVector3d LLAgent::calcCameraPositionTargetGlobal(BOOL *hit_limit)
 				// slam agent coordinate frame to proper parent local version
 				LLVector3 at_axis = mFrameAgent.getAtAxis() * parent_rot;
 				at_axis.mV[VZ] = 0.f;
-				at_axis.normVec();
+				at_axis.normalize();
 				resetAxes(at_axis * ~parent_rot);
 
 				local_camera_offset = local_camera_offset * mFrameAgent.getQuaternion() * parent_rot;
@@ -3686,7 +3716,7 @@ LLVector3d LLAgent::calcCameraPositionTargetGlobal(BOOL *hit_limit)
 					offset_dot_norm = 0.001f;
 				}
 				
-				camera_distance = local_camera_offset.normVec();
+				camera_distance = local_camera_offset.normalize();
 
 				F32 pos_dot_norm = getPosAgentFromGlobal(frame_center_global + head_offset) * plane_normal;
 				
@@ -3710,7 +3740,7 @@ LLVector3d LLAgent::calcCameraPositionTargetGlobal(BOOL *hit_limit)
 			}
 			else
 			{
-				camera_distance = local_camera_offset.normVec();
+				camera_distance = local_camera_offset.normalize();
 			}
 
 			mTargetCameraDistance = llmax(camera_distance, MIN_CAMERA_DISTANCE);
@@ -3745,7 +3775,7 @@ LLVector3d LLAgent::calcCameraPositionTargetGlobal(BOOL *hit_limit)
 				{
 					LLVector3 frame_at_axis = mFrameAgent.getAtAxis();
 					frame_at_axis -= projected_vec(frame_at_axis, getReferenceUpVector());
-					frame_at_axis.normVec();
+					frame_at_axis.normalize();
 
 					//transition smoothly in air mode, to avoid camera pop
 					F32 u = (time_in_air - GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME) / GROUND_TO_AIR_CAMERA_TRANSITION_TIME;
@@ -3932,7 +3962,7 @@ void LLAgent::resetCamera()
 	// Remove any pitch from the avatar
 	LLVector3 at = mFrameAgent.getAtAxis();
 	at.mV[VZ] = 0.f;
-	at.normVec();
+	at.normalize();
 	gAgent.resetAxes(at);
 	// have to explicitly clear field of view zoom now
 	mCameraFOVZoomFactor = 0.f;
@@ -4101,7 +4131,10 @@ void LLAgent::changeCameraToThirdPerson(BOOL animate)
 
 	if (mAvatarObject)
 	{
-		mAvatarObject->mPelvisp->setPosition(LLVector3::zero);
+		if (!mAvatarObject->mIsSitting)
+		{
+			mAvatarObject->mPelvisp->setPosition(LLVector3::zero);
+		}
 		mAvatarObject->startMotion( ANIM_AGENT_BODY_NOISE );
 		mAvatarObject->startMotion( ANIM_AGENT_BREATHE_ROT );
 	}
@@ -4147,14 +4180,14 @@ void LLAgent::changeCameraToThirdPerson(BOOL animate)
 		LLQuaternion obj_rot = ((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation();
 		at_axis = LLViewerCamera::getInstance()->getAtAxis();
 		at_axis.mV[VZ] = 0.f;
-		at_axis.normVec();
+		at_axis.normalize();
 		resetAxes(at_axis * ~obj_rot);
 	}
 	else
 	{
 		at_axis = mFrameAgent.getAtAxis();
 		at_axis.mV[VZ] = 0.f;
-		at_axis.normVec();
+		at_axis.normalize();
 		resetAxes(at_axis);
 	}
 
@@ -4201,7 +4234,7 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_ani
 	// Remove any pitch from the avatar
 	//LLVector3 at = mFrameAgent.getAtAxis();
 	//at.mV[VZ] = 0.f;
-	//at.normVec();
+	//at.normalize();
 	//gAgent.resetAxes(at);
 
 	if( mCameraMode != CAMERA_MODE_CUSTOMIZE_AVATAR )
@@ -4228,7 +4261,7 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_ani
 				// Remove any pitch from the avatar
 			LLVector3 at = mFrameAgent.getAtAxis();
 			at.mV[VZ] = 0.f;
-			at.normVec();
+			at.normalize();
 			gAgent.resetAxes(at);
 
 			sendAnimationRequest(ANIM_AGENT_CUSTOMIZE, ANIM_REQUEST_START);
@@ -4508,14 +4541,14 @@ void LLAgent::setFocusOnAvatar(BOOL focus_on_avatar, BOOL animate)
 				LLQuaternion obj_rot = ((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation();
 				at_axis = LLViewerCamera::getInstance()->getAtAxis();
 				at_axis.mV[VZ] = 0.f;
-				at_axis.normVec();
+				at_axis.normalize();
 				resetAxes(at_axis * ~obj_rot);
 			}
 			else
 			{
 				at_axis = LLViewerCamera::getInstance()->getAtAxis();
 				at_axis.mV[VZ] = 0.f;
-				at_axis.normVec();
+				at_axis.normalize();
 				resetAxes(at_axis);
 			}
 		}
@@ -4578,7 +4611,7 @@ void LLAgent::lookAtLastChat()
 			{
 				delta_pos = chatter->getPositionAgent() - getPositionAgent();
 			}
-			delta_pos.normVec();
+			delta_pos.normalize();
 
 			setControlFlags(AGENT_CONTROL_STOP);
 
@@ -4586,9 +4619,9 @@ void LLAgent::lookAtLastChat()
 
 			LLVector3 new_camera_pos = mAvatarObject->mHeadp->getWorldPosition();
 			LLVector3 left = delta_pos % LLVector3::z_axis;
-			left.normVec();
+			left.normalize();
 			LLVector3 up = left % delta_pos;
-			up.normVec();
+			up.normalize();
 			new_camera_pos -= delta_pos * 0.4f;
 			new_camera_pos += left * 0.3f;
 			new_camera_pos += up * 0.2f;
@@ -4607,7 +4640,7 @@ void LLAgent::lookAtLastChat()
 		else
 		{
 			delta_pos = chatter->getRenderPosition() - getPositionAgent();
-			delta_pos.normVec();
+			delta_pos.normalize();
 
 			setControlFlags(AGENT_CONTROL_STOP);
 
@@ -4615,9 +4648,9 @@ void LLAgent::lookAtLastChat()
 
 			LLVector3 new_camera_pos = mAvatarObject->mHeadp->getWorldPosition();
 			LLVector3 left = delta_pos % LLVector3::z_axis;
-			left.normVec();
+			left.normalize();
 			LLVector3 up = left % delta_pos;
-			up.normVec();
+			up.normalize();
 			new_camera_pos -= delta_pos * 0.4f;
 			new_camera_pos += left * 0.3f;
 			new_camera_pos += up * 0.2f;
@@ -4631,68 +4664,107 @@ void LLAgent::lookAtLastChat()
 
 const F32 SIT_POINT_EXTENTS = 0.2f;
 
-// Grabs current position
-void LLAgent::setStartPosition(U32 location_id)
-{
-	LLViewerObject		*object;
-
-	if ( !(gAgentID == LLUUID::null) )
-	{
-		// we've got an ID for an agent viewerobject
-		object = gObjectList.findObject(gAgentID);
-		if (object)
-		{
-			// we've got the viewer object
-			// Sometimes the agent can be velocity interpolated off of
-			// this simulator.  Clamp it to the region the agent is
-			// in, a little bit in on each side.
-			const F32 INSET = 0.5f;	//meters
-			const F32 REGION_WIDTH = LLWorld::getInstance()->getRegionWidthInMeters();
-
-			LLVector3 agent_pos = getPositionAgent();
-
-			if (mAvatarObject)
-			{
-				// the z height is at the agent's feet
-				agent_pos.mV[VZ] -= 0.5f * mAvatarObject->mBodySize.mV[VZ];
-			}
-
-			agent_pos.mV[VX] = llclamp( agent_pos.mV[VX], INSET, REGION_WIDTH - INSET );
-			agent_pos.mV[VY] = llclamp( agent_pos.mV[VY], INSET, REGION_WIDTH - INSET );
-
-			// Don't let them go below ground, or too high.
-			agent_pos.mV[VZ] = llclamp( agent_pos.mV[VZ], 
-				mRegionp->getLandHeightRegion( agent_pos ), 
-				LLWorld::getInstance()->getRegionMaxHeight() );
-
-			LLMessageSystem* msg = gMessageSystem;
-			msg->newMessageFast(_PREHASH_SetStartLocationRequest);
-			msg->nextBlockFast( _PREHASH_AgentData);
-			msg->addUUIDFast(_PREHASH_AgentID, getID());
-			msg->addUUIDFast(_PREHASH_SessionID, getSessionID());
-			msg->nextBlockFast( _PREHASH_StartLocationData);
-			// corrected by sim
-			msg->addStringFast(_PREHASH_SimName, "");
-			msg->addU32Fast(_PREHASH_LocationID, location_id);
-			msg->addVector3Fast(_PREHASH_LocationPos, agent_pos);
-			msg->addVector3Fast(_PREHASH_LocationLookAt,mFrameAgent.getAtAxis());
-
-			// Reliable only helps when setting home location.  Last
-			// location is sent on quit, and we don't have time to ack
-			// the packets.
-			msg->sendReliable(mRegionp->getHost());
-
-			const U32 HOME_INDEX = 1;
-			if( HOME_INDEX == location_id )
-			{
-				setHomePosRegion( mRegionp->getHandle(), getPositionAgent() );
-			}
-		}
-		else
-		{
-			llinfos << "setStartPosition - Can't find agent viewerobject id " << gAgentID << llendl;
-		}
-	}
+void LLAgent::setStartPosition( U32 location_id )
+{
+  LLViewerObject          *object;
+
+  if ( !(gAgentID == LLUUID::null) )
+  {
+    // we've got an ID for an agent viewerobject
+    object = gObjectList.findObject(gAgentID);
+    if (object)
+    {
+      // we've got the viewer object
+      // Sometimes the agent can be velocity interpolated off of
+      // this simulator.  Clamp it to the region the agent is
+      // in, a little bit in on each side.
+      const F32 INSET = 0.5f; //meters
+      const F32 REGION_WIDTH = LLWorld::getInstance()->getRegionWidthInMeters();
+
+      LLVector3 agent_pos = getPositionAgent();
+      LLVector3 agent_look_at = mFrameAgent.getAtAxis();
+
+      if (mAvatarObject)
+      {
+	// the z height is at the agent's feet
+	agent_pos.mV[VZ] -= 0.5f * mAvatarObject->mBodySize.mV[VZ];
+      }
+
+      agent_pos.mV[VX] = llclamp( agent_pos.mV[VX], INSET, REGION_WIDTH - INSET );
+      agent_pos.mV[VY] = llclamp( agent_pos.mV[VY], INSET, REGION_WIDTH - INSET );
+
+      // Don't let them go below ground, or too high.
+      agent_pos.mV[VZ] = llclamp( agent_pos.mV[VZ],
+				  mRegionp->getLandHeightRegion( agent_pos ),
+				  LLWorld::getInstance()->getRegionMaxHeight() );
+      // Send the CapReq
+
+      LLSD body;
+
+      std::string url = gAgent.getRegion()->getCapability("HomeLocation");
+      std::ostringstream strBuffer;
+      if( url.empty() )
+      {
+	LLMessageSystem* msg = gMessageSystem;
+	msg->newMessageFast(_PREHASH_SetStartLocationRequest);
+	msg->nextBlockFast( _PREHASH_AgentData);
+	msg->addUUIDFast(_PREHASH_AgentID, getID());
+	msg->addUUIDFast(_PREHASH_SessionID, getSessionID());
+	msg->nextBlockFast( _PREHASH_StartLocationData);
+	// corrected by sim
+	msg->addStringFast(_PREHASH_SimName, "");
+	msg->addU32Fast(_PREHASH_LocationID, location_id);
+	msg->addVector3Fast(_PREHASH_LocationPos, agent_pos);
+	msg->addVector3Fast(_PREHASH_LocationLookAt,mFrameAgent.getAtAxis());
+	
+	// Reliable only helps when setting home location.  Last
+	// location is sent on quit, and we don't have time to ack
+	// the packets.
+	msg->sendReliable(mRegionp->getHost());
+
+	const U32 HOME_INDEX = 1;
+	if( HOME_INDEX == location_id )
+	  {
+	    setHomePosRegion( mRegionp->getHandle(), getPositionAgent() );
+	  }
+      }
+      else
+      {
+	strBuffer << location_id;
+	body["HomeLocation"]["LocationId"] = strBuffer.str();
+
+	strBuffer.str("");
+	strBuffer << agent_pos.mV[VX];
+	body["HomeLocation"]["LocationPos"]["X"] = strBuffer.str();
+
+	strBuffer.str("");
+	strBuffer << agent_pos.mV[VY];
+	body["HomeLocation"]["LocationPos"]["Y"] = strBuffer.str();
+
+	strBuffer.str("");
+	strBuffer << agent_pos.mV[VZ];
+	body["HomeLocation"]["LocationPos"]["Z"] = strBuffer.str();
+
+	strBuffer.str("");
+	strBuffer << agent_look_at.mV[VX];
+	body["HomeLocation"]["LocationLookAt"]["X"] = strBuffer.str();
+
+	strBuffer.str("");
+	strBuffer << agent_look_at.mV[VY];
+	body["HomeLocation"]["LocationLookAt"]["Y"] = strBuffer.str();
+
+	strBuffer.str("");
+	strBuffer << agent_look_at.mV[VZ];
+	body["HomeLocation"]["LocationLookAt"]["Z"] = strBuffer.str();
+
+	LLHTTPClient::post( url, body, new LLHomeLocationResponder() );
+      }
+    }
+    else
+    {
+      llinfos << "setStartPosition - Can't find agent viewerobject id " << gAgentID << llendl;
+    }
+  }
 }
 
 void LLAgent::requestStopMotion( LLMotion* motion )
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 97f9aed..2befeb0 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -139,7 +139,7 @@ public:
 
 	// Called whenever the agent moves.  Puts camera back in default position,
 	// deselects items, etc.
-	void			resetView(BOOL reset_camera = TRUE);
+	void			resetView(BOOL reset_camera = TRUE, BOOL change_camera = FALSE);
 
 	// Called on camera movement, to allow the camera to be unlocked from the 
 	// default position behind the avatar.
@@ -378,7 +378,7 @@ public:
 	void			sendAnimationRequests(LLDynamicArray<LLUUID> &anim_ids, EAnimRequest request);
 	void			sendAnimationRequest(const LLUUID &anim_id, EAnimRequest request);
 
-	LLVector3		calcFocusOffset(LLViewerObject *object, S32 x, S32 y);
+	LLVector3		calcFocusOffset(LLViewerObject *object, LLVector3 pos_agent, S32 x, S32 y);
 	BOOL			calcCameraMinDistance(F32 &obj_min_distance);
 
 	void			startCameraAnimation();
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index f1b2e32..49991b4 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -191,18 +191,11 @@
 
 //----------------------------------------------------------------------------
 // viewer.cpp - these are only used in viewer, should be easily moved.
-extern void disable_win_error_reporting();
 
 #if LL_DARWIN
-#include <Carbon/Carbon.h>
 extern void init_apple_menu(const char* product);
-extern OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn);
-extern OSErr AEQuitHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn);
-extern OSStatus simpleDialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata);
-#include <boost/tokenizer.hpp>
 #endif // LL_DARWIN
 
-
 extern BOOL gRandomizeFramerate;
 extern BOOL gPeriodicSlowFrame;
 extern BOOL gDebugGL;
@@ -216,10 +209,6 @@ const F32 DEFAULT_AFK_TIMEOUT = 5.f * 60.f; // time with no input before user fl
 F32 gSimLastTime; // Used in LLAppViewer::init and send_stats()
 F32 gSimFrames;
 
-std::string gDisabledMessage; // Set in LLAppViewer::initConfiguration used in idle_startup
-
-BOOL gHideLinks = FALSE; // Set in LLAppViewer::initConfiguration, used externally
-
 BOOL gAllowIdleAFK = TRUE;
 BOOL gAllowTapTapHoldRun = TRUE;
 BOOL gShowObjectUpdates = FALSE;
@@ -307,14 +296,13 @@ const char *VFS_INDEX_FILE_BASE = "index.db2.x.";
 
 static std::string gSecondLife;
 static std::string gWindowTitle;
-#ifdef LL_WINDOWS
-	static char sWindowClass[] = "Second Life";
-#endif
 
 std::string gLoginPage;
 std::vector<std::string> gLoginURIs;
 static std::string gHelperURI;
 
+LLAppViewer::LLUpdaterInfo *LLAppViewer::sUpdaterInfo = NULL ;
+
 void idle_afk_check()
 {
 	// check idle timers
@@ -329,8 +317,7 @@ static void ui_audio_callback(const LLUUID& uuid)
 {
 	if (gAudiop)
 	{
-		F32 volume = gSavedSettings.getBOOL("MuteUI") ? 0.f : gSavedSettings.getF32("AudioLevelUI");
-		gAudiop->triggerSound(uuid, gAgent.getID(), volume);
+		gAudiop->triggerSound(uuid, gAgent.getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_UI);
 	}
 }
 
@@ -496,30 +483,17 @@ void LLAppViewer::initGridChoice()
 	}
 }
 
-bool send_url_to_other_instance(const std::string& url)
+//virtual
+bool LLAppViewer::initSLURLHandler()
 {
-#if LL_WINDOWS
-	wchar_t window_class[256]; /* Flawfinder: ignore */   // Assume max length < 255 chars.
-	mbstowcs(window_class, sWindowClass, 255);
-	window_class[255] = 0;
-	// Use the class instead of the window name.
-	HWND other_window = FindWindow(window_class, NULL);
-
-	if (other_window != NULL)
-	{
-		lldebugs << "Found other window with the name '" << gWindowTitle << "'" << llendl;
-		COPYDATASTRUCT cds;
-		const S32 SLURL_MESSAGE_TYPE = 0;
-		cds.dwData = SLURL_MESSAGE_TYPE;
-		cds.cbData = url.length() + 1;
-		cds.lpData = (void*)url.c_str();
-
-		LRESULT msg_result = SendMessage(other_window, WM_COPYDATA, NULL, (LPARAM)&cds);
-		lldebugs << "SendMessage(WM_COPYDATA) to other window '" 
-				 << gWindowTitle << "' returned " << msg_result << llendl;
-		return true;
-	}
-#endif
+	// does nothing unless subclassed
+	return false;
+}
+
+//virtual
+bool LLAppViewer::sendURLToOtherInstance(const std::string& url)
+{
+	// does nothing unless subclassed
 	return false;
 }
 
@@ -683,6 +657,7 @@ bool LLAppViewer::init()
 					ui_audio_callback,
 					&LLUI::sGLScaleFactor);
 	LLWeb::initClass();			  // do this after LLUI
+
 	LLTextEditor::setURLCallbacks(&LLWeb::loadURL,
 				&LLURLDispatcher::dispatchFromTextEditor,
 				&LLURLDispatcher::dispatchFromTextEditor);
@@ -703,7 +678,6 @@ bool LLAppViewer::init()
 	// load MIME type -> media impl mappings
 	LLMIMETypes::parseMIMETypes( std::string("mime_types.xml") ); 
 
-
 	// Copy settings to globals. *TODO: Remove or move to appropriage class initializers
 	settings_to_globals();
 	// Setup settings listeners
@@ -714,6 +688,9 @@ bool LLAppViewer::init()
 	// Find partition serial number (Windows) or hardware serial (Mac)
 	mSerialNumber = generateSerialNumber();
 
+	// do any necessary set-up for accepting incoming SLURLs from apps
+	initSLURLHandler();
+
 	if(false == initHardwareTest())
 	{
 		// Early out from user choice.
@@ -844,7 +821,10 @@ bool LLAppViewer::init()
 		}
 
 	}
-	
+
+	// save the graphics card
+	gDebugInfo["GraphicsCard"] = LLFeatureManager::getInstance()->getGPUString();
+
 	// Save the current version to the prefs file
 	gSavedSettings.setString("LastRunVersion", gCurrentVersion);
 
@@ -889,16 +869,21 @@ bool LLAppViewer::mainLoop()
 		{
 			LLFastTimer t(LLFastTimer::FTM_FRAME);
 			
+			pingMainloopTimeout("Main:MiscNativeWindowEvents");
+			
+			{
+				LLFastTimer t2(LLFastTimer::FTM_MESSAGES);
+				gViewerWindow->mWindow->processMiscNativeEvents();
+			}
+			
 			pingMainloopTimeout("Main:GatherInput");
 			
 			{
 				LLFastTimer t2(LLFastTimer::FTM_MESSAGES);
-			#if LL_WINDOWS
-				if (!LLWinDebug::checkExceptionHandler())
+				if (!restoreErrorTrap())
 				{
-					llwarns << " Someone took over my exception handler (post messagehandling)!" << llendl;
+					llwarns << " Someone took over my signal/exception handler (post messagehandling)!" << llendl;
 				}
-			#endif
 
 				gViewerWindow->mWindow->gatherInput();
 			}
@@ -954,7 +939,7 @@ bool LLAppViewer::mainLoop()
 					
 					resumeMainloopTimeout();
 				}
-
+ 
 				if (gDoDisconnect && (LLStartUp::getStartupState() == STATE_STARTED))
 				{
 					pauseMainloopTimeout();
@@ -1365,12 +1350,15 @@ bool LLAppViewer::cleanup()
 	delete sImageDecodeThread;
     sImageDecodeThread = NULL;
 
+	//Note:
+	//LLViewerMedia::cleanupClass() has to be put before gImageList.shutdown()
+	//because some new image might be generated during cleaning up media. --bao
+	LLViewerMedia::cleanupClass();
 	gImageList.shutdown(); // shutdown again in case a callback added something
 	LLUIImageList::getInstance()->cleanUp();
 	
 	// This should eventually be done in LLAppViewer
-	LLImageJ2C::closeDSO();
-	LLImageFormatted::cleanupClass();
+	LLImage::cleanupClass();
 	LLVFSThread::cleanupClass();
 	LLLFSThread::cleanupClass();
 
@@ -1409,8 +1397,6 @@ bool LLAppViewer::cleanup()
 
 		LLWeb::loadURLExternal( gLaunchFileOnQuit );
 	}
-	
-	LLViewerMedia::cleanupClass();
 
     llinfos << "Goodbye" << llendflush;
 
@@ -1440,8 +1426,7 @@ bool LLAppViewer::initThreads()
 	LLAppViewer::sImageDecodeThread = new LLWorkerThread("ImageDecode", enable_threads && true);
 	LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true);
 	LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), enable_threads && false);
-	LLImageWorker::initClass(LLAppViewer::getImageDecodeThread());
-	LLImageJ2C::openDSO();
+	LLImage::initClass(LLAppViewer::getImageDecodeThread());
 
 	// *FIX: no error handling here!
 	return true;
@@ -1878,22 +1863,6 @@ bool LLAppViewer::initConfiguration()
 	//		llerrs << "Failed to parse skin definition." << llendl;
 	//	}
 
-	//	LLXmlTreeNode* rootp = skin_def_tree.getRoot();
-	//	LLXmlTreeNode* disabled_message_node = rootp->getChildByName("disabled_message");	
-	//	if (disabled_message_node)
-	//	{
-	//		gDisabledMessage = disabled_message_node->getContents();
-	//	}
-
-	//	static LLStdStringHandle hide_links_string = LLXmlTree::addAttributeString("hide_links");
-	//	rootp->getFastAttributeBOOL(hide_links_string, gHideLinks);
-
-	//	// Legacy string.  This flag really meant we didn't want to expose references to "Second Life".
-	//	// Just set gHideLinks instead.
-	//	static LLStdStringHandle silent_string = LLXmlTree::addAttributeString("silent_update");
-	//	BOOL silent_update;
-	//	rootp->getFastAttributeBOOL(silent_string, silent_update);
-	//	gHideLinks = (gHideLinks || silent_update);
 	//}
 
 #if LL_DARWIN
@@ -1946,7 +1915,7 @@ bool LLAppViewer::initConfiguration()
 #endif
 	LLStringUtil::truncate(gWindowTitle, 255);
 
-	//RN: if we received a URL, hand it off to the existing instance
+	//RN: if we received a URL, hand it off to the existing instance.
 	// don't call anotherInstanceRunning() when doing URL handoff, as
 	// it relies on checking a marker file which will not work when running
 	// out of different directories
@@ -1961,7 +1930,7 @@ bool LLAppViewer::initConfiguration()
 	}
 	if (!slurl.empty())
 	{
-		if (send_url_to_other_instance(slurl))
+		if (sendURLToOtherInstance(slurl))
 		{
 			// successfully handed off URL to existing instance, exit
 			return false;
@@ -1992,7 +1961,7 @@ bool LLAppViewer::initConfiguration()
 		}
 
 		initMarkerFile();
-
+		
 #if LL_SEND_CRASH_REPORTS
 		if (gLastExecEvent == LAST_EXEC_FROZE)
 		{
@@ -2014,52 +1983,8 @@ bool LLAppViewer::initConfiguration()
 			{
 				llinfos << "Sending crash report." << llendl;
 
-#if LL_WINDOWS
-				std::string exe_path = gDirUtilp->getAppRODataDir();
-				exe_path += gDirUtilp->getDirDelimiter();
-				exe_path += "win_crash_logger.exe";
-
-				std::string arg_string = "-previous ";
-				// Spawn crash logger.
-				// NEEDS to wait until completion, otherwise log files will get smashed.
-				_spawnl(_P_WAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL);
-#elif LL_DARWIN
-				std::string command_str;
-				command_str = "mac-crash-logger.app/Contents/MacOS/mac-crash-logger ";
-				command_str += "-previous";
-				// XXX -- We need to exit fullscreen mode for this to work.
-				// XXX -- system() also doesn't wait for completion.  Hmm...
-				system(command_str.c_str());		/* Flawfinder: Ignore */
-#elif LL_LINUX || LL_SOLARIS
-				std::string cmd =gDirUtilp->getAppRODataDir();
-				cmd += gDirUtilp->getDirDelimiter();
-#if LL_LINUX
-				cmd += "linux-crash-logger.bin";
-#else // LL_SOLARIS
-				cmd += "bin/solaris-crash-logger";
-#endif // LL_LINUX
-				char* const cmdargv[] =
-					{(char*)cmd.c_str(),
-					 (char*)"-previous",
-					 NULL};
-				fflush(NULL); // flush all buffers before the child inherits them
-				pid_t pid = fork();
-				if (pid == 0)
-				{ // child
-					execv(cmd.c_str(), cmdargv);		/* Flawfinder: Ignore */
-					llwarns << "execv failure when trying to start " << cmd << llendl;
-					_exit(1); // avoid atexit()
-				} else {
-					if (pid > 0)
-					{
-						// wait for child proc to die
-						int childExitStatus;
-						waitpid(pid, &childExitStatus, 0);
-					} else {
-						llwarns << "fork failure." << llendl;
-					}
-				}
-#endif
+				bool report_freeze = true;
+				handleCrashReporting(report_freeze);
 			}
 			else
 			{
@@ -2262,7 +2187,7 @@ void LLAppViewer::writeSystemInfo()
 	gDebugInfo["RAMInfo"]["Physical"] = (LLSD::Integer)(gSysMemory.getPhysicalMemoryKB());
 	gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer)(gMemoryAllocated>>10); // MB -> KB
 	gDebugInfo["OSInfo"] = getOSInfo().getOSStringSimple();
-		
+
 	// The user is not logged on yet, but record the current grid choice login url
 	// which may have been the intended grid. This can b
 	gDebugInfo["GridName"] = LLViewerLogin::getInstance()->getGridLabel();
@@ -2273,6 +2198,13 @@ void LLAppViewer::writeSystemInfo()
 	gDebugInfo["MainloopThreadID"] = (S32)thread_id;
 #endif
 
+	// "CrashNotHandled" is set here, while things are running well,
+	// in case of a freeze. If there is a freeze, the crash logger will be launched
+	// and can read this value from the debug_info.log.
+	// If the crash is handled by LLAppViewer::handleViewerCrash, ie not a freeze,
+	// then the value of "CrashNotHandled" will be set to true.
+	gDebugInfo["CrashNotHandled"] = (LLSD::Boolean)true;
+	
 	// Dump some debugging info
 	LL_INFOS("SystemInfo") << gSecondLife
 			<< " version " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH
@@ -2347,6 +2279,8 @@ void LLAppViewer::handleViewerCrash()
 	gDebugInfo["CAFilename"] = gDirUtilp->getCAFile();
 	gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName();
 	gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath();
+	gDebugInfo["SessionLength"] = F32(LLFrameTimer::getElapsedSeconds());
+	
 	if(gLogoutInProgress)
 	{
 		gDebugInfo["LastExecEvent"] = LAST_EXEC_LOGOUT_CRASH;
@@ -2372,6 +2306,9 @@ void LLAppViewer::handleViewerCrash()
 		gDebugInfo["MainloopTimeoutState"] = LLAppViewer::instance()->mMainloopTimeout->getState();
 	}
 	
+	// The crash is being handled here so set this value to false.
+	// Otherwise the crash logger will think this crash was a freeze.
+	gDebugInfo["CrashNotHandled"] = (LLSD::Boolean)false;
     
 	//Write out the crash status file
 	//Use marker file style setup, as that's the simplest, especially since
@@ -2455,24 +2392,23 @@ bool LLAppViewer::anotherInstanceRunning()
 		{
 			// Another instance is running. Skip the rest of these operations.
 			LL_INFOS("MarkerFile") << "Marker file is locked." << LL_ENDL;
-			return TRUE;
+			return true;
 		}
 		if (apr_file_lock(fMarker, APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE) != APR_SUCCESS) //flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1)
 		{
 			apr_file_close(fMarker);
 			LL_INFOS("MarkerFile") << "Marker file is locked." << LL_ENDL;
-			return TRUE;
+			return true;
 		}
 		// No other instances; we'll lock this file now & delete on quit.
 		apr_file_close(fMarker);
 	}
 	LL_DEBUGS("MarkerFile") << "Marker file isn't locked." << LL_ENDL;
-	return FALSE;
+	return false;
 }
 
 void LLAppViewer::initMarkerFile()
 {
-
 	//First, check for the existence of other files.
 	//There are marker files for two different types of crashes
 	
@@ -2727,7 +2663,7 @@ bool LLAppViewer::initCache()
 	
 	// Init the texture cache
 	// Allocate 80% of the cache size for textures
-	BOOL read_only = mSecondInstance ? true : false;
+	BOOL read_only = mSecondInstance ? TRUE : FALSE;
 	const S32 MB = 1024*1024;
 	S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB;
 	const S64 MAX_CACHE_SIZE = 1024*MB;
@@ -3796,6 +3732,11 @@ void LLAppViewer::pauseMainloopTimeout()
 
 void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs)
 {
+//	if(!restoreErrorTrap())
+//	{
+//		llwarns << "!!!!!!!!!!!!! Its an error trap!!!!" << state << llendl;
+//	}
+	
 	if(mMainloopTimeout)
 	{
 		if(secs < 0.0f)
@@ -3808,3 +3749,42 @@ void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs)
 	}
 }
 
+void LLAppViewer::handleLoginComplete()
+{
+	initMainloopTimeout("Mainloop Init");
+
+	// Store some data to DebugInfo in case of a freeze.
+	gDebugInfo["ClientInfo"]["Name"] = gSavedSettings.getString("VersionChannelName");
+
+	gDebugInfo["ClientInfo"]["MajorVersion"] = LL_VERSION_MAJOR;
+	gDebugInfo["ClientInfo"]["MinorVersion"] = LL_VERSION_MINOR;
+	gDebugInfo["ClientInfo"]["PatchVersion"] = LL_VERSION_PATCH;
+	gDebugInfo["ClientInfo"]["BuildVersion"] = LL_VERSION_BUILD;
+
+	LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+	if ( parcel && parcel->getMusicURL()[0])
+	{
+		gDebugInfo["ParcelMusicURL"] = parcel->getMusicURL();
+	}	
+	if ( parcel && parcel->getMediaURL()[0])
+	{
+		gDebugInfo["ParcelMediaURL"] = parcel->getMediaURL();
+	}
+	
+	gDebugInfo["SettingsFilename"] = gSavedSettings.getString("ClientSettingsFile");
+	gDebugInfo["CAFilename"] = gDirUtilp->getCAFile();
+	gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName();
+	gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath();
+
+	if(gAgent.getRegion())
+	{
+		gDebugInfo["CurrentSimHost"] = gAgent.getRegionHost().getHostName();
+		gDebugInfo["CurrentRegion"] = gAgent.getRegion()->getName();
+	}
+
+	if(LLAppViewer::instance()->mMainloopTimeout)
+	{
+		gDebugInfo["MainloopTimeoutState"] = LLAppViewer::instance()->mMainloopTimeout->getState();
+	}
+	writeDebugInfo();
+}
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 801deb1..6545a61 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -77,7 +77,9 @@ public:
 	// Report true if under the control of a debugger. A null-op default.
 	virtual bool beingDebugged() { return false; } 
 
-	virtual void handleCrashReporting() = 0; // What to do with crash report?
+	virtual bool restoreErrorTrap() = 0; // Require platform specific override to reset error handling mechanism.
+	                                     // return false if the error trap needed restoration.
+	virtual void handleCrashReporting(bool reportFreeze = false) = 0; // What to do with crash report?
 	virtual void handleSyncCrashTrace() = 0; // any low-level crash-prep that has to happen in the context of the crashing thread before the crash report is delivered.
 	static void handleViewerCrash(); // Hey! The viewer crashed. Do this, soon.
 	static void handleSyncViewerCrash(); // Hey! The viewer crashed. Do this right NOW in the context of the crashing thread.
@@ -136,15 +138,21 @@ public:
 	void resumeMainloopTimeout(const std::string& state = "", F32 secs = -1.0f);
 	void pingMainloopTimeout(const std::string& state, F32 secs = -1.0f);
 
+	// Handle the 'login completed' event.
+	// *NOTE:Mani Fix this for login abstraction!!
+	void handleLoginComplete();
+
 protected:
 	virtual bool initWindow(); // Initialize the viewer's window.
 	virtual bool initLogging(); // Initialize log files, logging system, return false on failure.
 	virtual void initConsole() {}; // Initialize OS level debugging console.
 	virtual bool initHardwareTest() { return true; } // A false result indicates the app should quit.
+	virtual bool initSLURLHandler();
+	virtual bool sendURLToOtherInstance(const std::string& url);
 
-    virtual bool initParseCommandLine(LLCommandLineParser& clp) 
+	virtual bool initParseCommandLine(LLCommandLineParser& clp) 
         { return true; } // Allow platforms to specify the command line args.
-	
+
 	virtual std::string generateSerialNumber() = 0; // Platforms specific classes generate this.
 
 
@@ -211,6 +219,15 @@ private:
 	// for tracking viewer<->region circuit death
 	bool mAgentRegionLastAlive;
 	LLUUID mAgentRegionLastID;
+
+public:
+	//some information for updater
+	typedef struct
+	{
+		std::string mUpdateExePath;
+		std::ostringstream mParams;
+	}LLUpdaterInfo ;
+	static LLUpdaterInfo *sUpdaterInfo ;
 };
 
 // consts from viewer.h
@@ -222,8 +239,6 @@ const S32 AGENT_UPDATES_PER_SECOND  = 10;
 // "// llstartup" indicates that llstartup is the only client for this global.
 
 extern BOOL gHandleKeysAsync; // gSavedSettings used by llviewerdisplay.cpp & llviewermenu.cpp
-extern std::string gDisabledMessage; // llstartup
-extern BOOL gHideLinks; // used by llpanellogin, lllfloaterbuycurrency, llstartup
 extern LLSD gDebugInfo;
 
 extern BOOL	gAllowIdleAFK;
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index 0a4a9cf..643013b 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -1,6 +1,6 @@
 /**
  * @file llappviewerlinux.cpp
- * @brief The LLAppViewerWin32 class definitions
+ * @brief The LLAppViewerLinux class definitions
  *
  * $LicenseInfo:firstyear=2007&license=viewergpl$
  * 
@@ -36,8 +36,10 @@
 #include "llcommandlineparser.h"
 
 #include "llmemtype.h"
+#include "llurldispatcher.h"		// SLURL from other app instance
 #include "llviewernetwork.h"
 #include "llviewercontrol.h"
+#include "llwindowsdl.h"
 #include "llmd5.h"
 #include "llfindlocale.h"
 
@@ -60,6 +62,17 @@
 # include "ELFIO/ELFIO.h"		// for better backtraces
 #endif
 
+#if LL_DBUS_ENABLED
+# include "llappviewerlinux_api_dbus.h"
+
+// regrettable hacks to give us better runtime compatibility with older systems inside llappviewerlinux_api.h:
+#define llg_return_if_fail(COND) do{if (!(COND)) return;}while(0)
+#undef g_return_if_fail
+#define g_return_if_fail(COND) llg_return_if_fail(COND)
+// The generated API
+# include "llappviewerlinux_api.h"
+#endif
+
 namespace
 {
 	int gArgC = 0;
@@ -321,6 +334,193 @@ bool LLAppViewerLinux::init()
 	return LLAppViewer::init();
 }
 
+bool LLAppViewerLinux::restoreErrorTrap()
+{
+	// *NOTE:Mani there is a case for implementing this or the mac.
+	// Linux doesn't need it to my knowledge.
+	return true;
+}
+
+/////////////////////////////////////////
+#if LL_DBUS_ENABLED
+
+typedef struct
+{
+        GObjectClass parent_class;
+} ViewerAppAPIClass;
+
+static void viewerappapi_init(ViewerAppAPI *server);
+static void viewerappapi_class_init(ViewerAppAPIClass *klass);
+
+///
+
+// regrettable hacks to give us better runtime compatibility with older systems in general
+static GType llg_type_register_static_simple_ONCE(GType parent_type,
+						  const gchar *type_name,
+						  guint class_size,
+						  GClassInitFunc class_init,
+						  guint instance_size,
+						  GInstanceInitFunc instance_init,
+						  GTypeFlags flags)
+{
+	static GTypeInfo type_info;
+	memset(&type_info, 0, sizeof(type_info));
+
+	type_info.class_size = class_size;
+	type_info.class_init = class_init;
+	type_info.instance_size = instance_size;
+	type_info.instance_init = instance_init;
+
+	return g_type_register_static(parent_type, type_name, &type_info, flags);
+}
+#define llg_intern_static_string(S) (S)
+#define g_intern_static_string(S) llg_intern_static_string(S)
+#define g_type_register_static_simple(parent_type, type_name, class_size, class_init, instance_size, instance_init, flags) llg_type_register_static_simple_ONCE(parent_type, type_name, class_size, class_init, instance_size, instance_init, flags)
+
+G_DEFINE_TYPE(ViewerAppAPI, viewerappapi, G_TYPE_OBJECT);
+
+void viewerappapi_class_init(ViewerAppAPIClass *klass)
+{
+}
+
+static bool dbus_server_init = false;
+
+void viewerappapi_init(ViewerAppAPI *server)
+{
+	// Connect to the default DBUS, register our service/API.
+
+	if (!dbus_server_init)
+	{
+		GError *error = NULL;
+		
+		server->connection = lldbus_g_bus_get(DBUS_BUS_SESSION, &error);
+		if (server->connection)
+		{
+			lldbus_g_object_type_install_info(viewerappapi_get_type(), &dbus_glib_viewerapp_object_info);
+			
+			lldbus_g_connection_register_g_object(server->connection, VIEWERAPI_PATH, G_OBJECT(server));
+			
+			DBusGProxy *serverproxy = lldbus_g_proxy_new_for_name(server->connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
+
+			guint request_name_ret_unused;
+			// akin to org_freedesktop_DBus_request_name
+			if (lldbus_g_proxy_call(serverproxy, "RequestName", &error, G_TYPE_STRING, VIEWERAPI_SERVICE, G_TYPE_UINT, 0, G_TYPE_INVALID, G_TYPE_UINT, &request_name_ret_unused, G_TYPE_INVALID))
+			{
+				// total success.
+				dbus_server_init = true;
+			}
+			else 
+			{
+				llwarns << "Unable to register service name: " << error->message << llendl;
+			}
+	
+			g_object_unref(serverproxy);
+		}
+		else
+		{
+			g_warning("Unable to connect to dbus: %s", error->message);
+		}
+
+		if (error)
+			g_error_free(error);
+	}
+}
+
+gboolean viewer_app_api_GoSLURL(ViewerAppAPI *obj, gchar *slurl, gboolean **success_rtn, GError **error)
+{
+	bool success = false;
+
+	llinfos << "Was asked to go to slurl: " << slurl << llendl;
+
+	const bool from_external_browser = true;
+	if (LLURLDispatcher::dispatch(slurl, from_external_browser))
+	{
+		// bring window to foreground, as it has just been "launched" from a URL
+		// todo: hmm, how to get there from here?
+		//xxx->mWindow->bringToFront();
+		success = true;
+	}		
+
+	*success_rtn = g_new (gboolean, 1);
+	(*success_rtn)[0] = (gboolean)success;
+
+	return TRUE; // the invokation succeeded, even if the actual dispatch didn't.
+}
+
+///
+
+//virtual
+bool LLAppViewerLinux::initSLURLHandler()
+{
+	if (!grab_dbus_syms(DBUSGLIB_DYLIB_DEFAULT_NAME))
+	{
+		return false; // failed
+	}
+
+	g_type_init();
+
+	//ViewerAppAPI *api_server = (ViewerAppAPI*)
+	g_object_new(viewerappapi_get_type(), NULL);
+
+	return true;
+}
+
+//virtual
+bool LLAppViewerLinux::sendURLToOtherInstance(const std::string& url)
+{
+	if (!grab_dbus_syms(DBUSGLIB_DYLIB_DEFAULT_NAME))
+	{
+		return false; // failed
+	}
+
+	bool success = false;
+	DBusGConnection *bus;
+	GError *error = NULL;
+
+	g_type_init();
+	
+	bus = lldbus_g_bus_get (DBUS_BUS_SESSION, &error);
+	if (bus)
+	{
+		gboolean rtn = FALSE;
+		DBusGProxy *remote_object =
+			lldbus_g_proxy_new_for_name(bus, VIEWERAPI_SERVICE, VIEWERAPI_PATH, VIEWERAPI_INTERFACE);
+
+		if (lldbus_g_proxy_call(remote_object, "GoSLURL", &error,
+					G_TYPE_STRING, url.c_str(), G_TYPE_INVALID,
+				       G_TYPE_BOOLEAN, &rtn, G_TYPE_INVALID))
+		{
+			success = rtn;
+		}
+		else
+		{
+			llinfos << "Call-out to other instance failed (perhaps not running): " << error->message << llendl;
+		}
+
+		g_object_unref(G_OBJECT(remote_object));
+	}
+	else
+	{
+		llwarns << "Couldn't connect to session bus: " << error->message << llendl;
+	}
+
+	if (error)
+		g_error_free(error);
+	
+	return success;
+}
+
+#else // LL_DBUS_ENABLED
+bool LLAppViewerLinux::initSLURLHandler()
+{
+	return false; // not implemented without dbus
+}
+bool LLAppViewerLinux::sendURLToOtherInstance(const std::string& url)
+{
+	return false; // not implemented without dbus
+}
+#endif // LL_DBUS_ENABLED
+
 void LLAppViewerLinux::handleSyncCrashTrace()
 {
 	// This backtrace writes into stack_trace.log
@@ -331,57 +531,90 @@ void LLAppViewerLinux::handleSyncCrashTrace()
 #  endif // LL_ELFBIN
 }
 
-void LLAppViewerLinux::handleCrashReporting()
+void LLAppViewerLinux::handleCrashReporting(bool reportFreeze)
 {
-	const S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
-
-	// Always generate the report, have the logger do the asking, and
-	// don't wait for the logger before exiting (-> total cleanup).
-	if (CRASH_BEHAVIOR_NEVER_SEND != cb)
-	{	
-		// launch the actual crash logger
-		const char* ask_dialog = "-dialog";
-		if (CRASH_BEHAVIOR_ASK != cb)
-			ask_dialog = ""; // omit '-dialog' option
-		std::string cmd =gDirUtilp->getAppRODataDir();
-		cmd += gDirUtilp->getDirDelimiter();
-		cmd += "linux-crash-logger.bin";
-		const char * cmdargv[] =
-			{cmd.c_str(),
-			 ask_dialog,
-			 "-user",
-			 (char*)LLViewerLogin::getInstance()->getGridLabel().c_str(),
-			 "-name",
-			 LLAppViewer::instance()->getSecondLifeTitle().c_str(),
+	std::string cmd =gDirUtilp->getAppRODataDir();
+	cmd += gDirUtilp->getDirDelimiter();
+#if LL_LINUX
+	cmd += "linux-crash-logger.bin";
+#else // LL_SOLARIS
+	cmd += "bin/solaris-crash-logger";
+#endif // LL_LINUX
+
+	if(reportFreeze)
+	{
+		char* const cmdargv[] =
+			{(char*)cmd.c_str(),
+			 (char*)"-previous",
 			 NULL};
-		fflush(NULL);
+
+		fflush(NULL); // flush all buffers before the child inherits them
 		pid_t pid = fork();
 		if (pid == 0)
 		{ // child
-			execv(cmd.c_str(), (char* const*) cmdargv);		/* Flawfinder: ignore */
+			execv(cmd.c_str(), cmdargv);		/* Flawfinder: Ignore */
 			llwarns << "execv failure when trying to start " << cmd << llendl;
 			_exit(1); // avoid atexit()
-		} 
-		else
-		{
+		} else {
 			if (pid > 0)
 			{
-				// DO NOT wait for child proc to die; we want
-				// the logger to outlive us while we quit to
-				// free up the screen/keyboard/etc.
-				////int childExitStatus;
-				////waitpid(pid, &childExitStatus, 0);
+				// wait for child proc to die
+				int childExitStatus;
+				waitpid(pid, &childExitStatus, 0);
+			} else {
+				llwarns << "fork failure." << llendl;
+			}
+		}
+	}
+	else
+	{
+		const S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
+
+		// Always generate the report, have the logger do the asking, and
+		// don't wait for the logger before exiting (-> total cleanup).
+		if (CRASH_BEHAVIOR_NEVER_SEND != cb)
+		{	
+			// launch the actual crash logger
+			const char* ask_dialog = "-dialog";
+			if (CRASH_BEHAVIOR_ASK != cb)
+				ask_dialog = ""; // omit '-dialog' option
+			const char * cmdargv[] =
+				{cmd.c_str(),
+				 ask_dialog,
+				 "-user",
+				 (char*)LLViewerLogin::getInstance()->getGridLabel().c_str(),
+				 "-name",
+				 LLAppViewer::instance()->getSecondLifeTitle().c_str(),
+				 NULL};
+			fflush(NULL);
+			pid_t pid = fork();
+			if (pid == 0)
+			{ // child
+				execv(cmd.c_str(), (char* const*) cmdargv);		/* Flawfinder: ignore */
+				llwarns << "execv failure when trying to start " << cmd << llendl;
+				_exit(1); // avoid atexit()
 			} 
 			else
 			{
-				llwarns << "fork failure." << llendl;
+				if (pid > 0)
+				{
+					// DO NOT wait for child proc to die; we want
+					// the logger to outlive us while we quit to
+					// free up the screen/keyboard/etc.
+					////int childExitStatus;
+					////waitpid(pid, &childExitStatus, 0);
+				} 
+				else
+				{
+					llwarns << "fork failure." << llendl;
+				}
 			}
 		}
+		// Sometimes signals don't seem to quit the viewer.  Also, we may
+		// have been called explicitly instead of from a signal handler.
+		// Make sure we exit so as to not totally confuse the user.
+		_exit(1); // avoid atexit(), else we may re-crash in dtors.
 	}
-	// Sometimes signals don't seem to quit the viewer.  Also, we may
-	// have been called explicitly instead of from a signal handler.
-	// Make sure we exit so as to not totally confuse the user.
-	_exit(1); // avoid atexit(), else we may re-crash in dtors.
 }
 
 bool LLAppViewerLinux::beingDebugged()
diff --git a/indra/newview/llappviewerlinux.h b/indra/newview/llappviewerlinux.h
index a180b4d..7b6d75c 100644
--- a/indra/newview/llappviewerlinux.h
+++ b/indra/newview/llappviewerlinux.h
@@ -32,6 +32,14 @@
 #ifndef LL_LLAPPVIEWERLINUX_H
 #define LL_LLAPPVIEWERLINUX_H
 
+#if LL_DBUS_ENABLED
+extern "C" {
+# include <glib.h>
+# include <glib-object.h>
+# include <dbus/dbus-glib.h>
+}
+#endif
+
 #ifndef LL_LLAPPVIEWER_H
 #include "llappviewer.h"
 #endif
@@ -49,15 +57,37 @@ public:
 	//
 	virtual bool init();			// Override to do application initialization
 	std::string generateSerialNumber();
+	bool setupSLURLHandler();
 
 protected:
 	virtual bool beingDebugged();
-
-	virtual void handleCrashReporting();
+	
+	virtual bool restoreErrorTrap();
+	virtual void handleCrashReporting(bool reportFreeze);
 	virtual void handleSyncCrashTrace();
 
 	virtual bool initLogging();
 	virtual bool initParseCommandLine(LLCommandLineParser& clp);
+
+	virtual bool initSLURLHandler();
+	virtual bool sendURLToOtherInstance(const std::string& url);
 };
 
+#if LL_DBUS_ENABLED
+typedef struct
+{
+        GObject parent;
+        DBusGConnection *connection;
+} ViewerAppAPI;
+
+extern "C" {
+	gboolean viewer_app_api_GoSLURL(ViewerAppAPI *obj, gchar *slurl, gboolean **success_rtn, GError **error);
+}
+
+#define VIEWERAPI_SERVICE "com.secondlife.ViewerAppAPIService"
+#define VIEWERAPI_PATH "/com/secondlife/ViewerAppAPI"
+#define VIEWERAPI_INTERFACE "com.secondlife.ViewerAppAPI"
+
+#endif // LL_DBUS_ENABLED
+
 #endif // LL_LLAPPVIEWERLINUX_H
diff --git a/indra/newview/llappviewerlinux_api.h b/indra/newview/llappviewerlinux_api.h
new file mode 100644
index 0000000..bd17599
--- /dev/null
+++ b/indra/newview/llappviewerlinux_api.h
@@ -0,0 +1,148 @@
+/* Generated by dbus-binding-tool; do not edit! */
+/**
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ * 
+ * Copyright (c) 2008, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */ 
+
+#ifndef __dbus_glib_marshal_viewerapp_MARSHAL_H__
+#define __dbus_glib_marshal_viewerapp_MARSHAL_H__
+
+#include	<glib-object.h>
+
+G_BEGIN_DECLS
+
+#ifdef G_ENABLE_DEBUG
+#define g_marshal_value_peek_boolean(v)  g_value_get_boolean (v)
+#define g_marshal_value_peek_char(v)     g_value_get_char (v)
+#define g_marshal_value_peek_uchar(v)    g_value_get_uchar (v)
+#define g_marshal_value_peek_int(v)      g_value_get_int (v)
+#define g_marshal_value_peek_uint(v)     g_value_get_uint (v)
+#define g_marshal_value_peek_long(v)     g_value_get_long (v)
+#define g_marshal_value_peek_ulong(v)    g_value_get_ulong (v)
+#define g_marshal_value_peek_int64(v)    g_value_get_int64 (v)
+#define g_marshal_value_peek_uint64(v)   g_value_get_uint64 (v)
+#define g_marshal_value_peek_enum(v)     g_value_get_enum (v)
+#define g_marshal_value_peek_flags(v)    g_value_get_flags (v)
+#define g_marshal_value_peek_float(v)    g_value_get_float (v)
+#define g_marshal_value_peek_double(v)   g_value_get_double (v)
+#define g_marshal_value_peek_string(v)   (char*) g_value_get_string (v)
+#define g_marshal_value_peek_param(v)    g_value_get_param (v)
+#define g_marshal_value_peek_boxed(v)    g_value_get_boxed (v)
+#define g_marshal_value_peek_pointer(v)  g_value_get_pointer (v)
+#define g_marshal_value_peek_object(v)   g_value_get_object (v)
+#else /* !G_ENABLE_DEBUG */
+/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
+ *          Do not access GValues directly in your code. Instead, use the
+ *          g_value_get_*() functions
+ */
+#define g_marshal_value_peek_boolean(v)  (v)->data[0].v_int
+#define g_marshal_value_peek_char(v)     (v)->data[0].v_int
+#define g_marshal_value_peek_uchar(v)    (v)->data[0].v_uint
+#define g_marshal_value_peek_int(v)      (v)->data[0].v_int
+#define g_marshal_value_peek_uint(v)     (v)->data[0].v_uint
+#define g_marshal_value_peek_long(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_ulong(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_int64(v)    (v)->data[0].v_int64
+#define g_marshal_value_peek_uint64(v)   (v)->data[0].v_uint64
+#define g_marshal_value_peek_enum(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_flags(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_float(v)    (v)->data[0].v_float
+#define g_marshal_value_peek_double(v)   (v)->data[0].v_double
+#define g_marshal_value_peek_string(v)   (v)->data[0].v_pointer
+#define g_marshal_value_peek_param(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_boxed(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_pointer(v)  (v)->data[0].v_pointer
+#define g_marshal_value_peek_object(v)   (v)->data[0].v_pointer
+#endif /* !G_ENABLE_DEBUG */
+
+
+/* BOOLEAN:STRING,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.5XXD8T:1) */
+extern void dbus_glib_marshal_viewerapp_BOOLEAN__STRING_POINTER_POINTER (GClosure     *closure,
+                                                                         GValue       *return_value,
+                                                                         guint         n_param_values,
+                                                                         const GValue *param_values,
+                                                                         gpointer      invocation_hint,
+                                                                         gpointer      marshal_data);
+void
+dbus_glib_marshal_viewerapp_BOOLEAN__STRING_POINTER_POINTER (GClosure     *closure,
+                                                             GValue       *return_value,
+                                                             guint         n_param_values,
+                                                             const GValue *param_values,
+                                                             gpointer      invocation_hint,
+                                                             gpointer      marshal_data)
+{
+  typedef gboolean (*GMarshalFunc_BOOLEAN__STRING_POINTER_POINTER) (gpointer     data1,
+                                                                    gpointer     arg_1,
+                                                                    gpointer     arg_2,
+                                                                    gpointer     arg_3,
+                                                                    gpointer     data2);
+  register GMarshalFunc_BOOLEAN__STRING_POINTER_POINTER callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+  gboolean v_return;
+
+  g_return_if_fail (return_value != NULL);
+  g_return_if_fail (n_param_values == 4);
+
+  if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+      data1 = closure->data;
+      data2 = g_value_peek_pointer (param_values + 0);
+    }
+  else
+    {
+      data1 = g_value_peek_pointer (param_values + 0);
+      data2 = closure->data;
+    }
+  callback = (GMarshalFunc_BOOLEAN__STRING_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback);
+
+  v_return = callback (data1,
+                       g_marshal_value_peek_string (param_values + 1),
+                       g_marshal_value_peek_pointer (param_values + 2),
+                       g_marshal_value_peek_pointer (param_values + 3),
+                       data2);
+
+  g_value_set_boolean (return_value, v_return);
+}
+
+G_END_DECLS
+
+#endif /* __dbus_glib_marshal_viewerapp_MARSHAL_H__ */
+
+#include <dbus/dbus-glib.h>
+static const DBusGMethodInfo dbus_glib_viewerapp_methods[] = {
+  { (GCallback) viewer_app_api_GoSLURL, dbus_glib_marshal_viewerapp_BOOLEAN__STRING_POINTER_POINTER, 0 },
+};
+
+const DBusGObjectInfo dbus_glib_viewerapp_object_info = {
+  0,
+  dbus_glib_viewerapp_methods,
+  1,
+"com.secondlife.ViewerAppAPI\0GoSLURL\0S\0slurl\0I\0s\0success_ret\0O\0F\0N\0b\0\0\0",
+"\0",
+"\0"
+};
+
diff --git a/indra/newview/llappviewerlinux_api.xml b/indra/newview/llappviewerlinux_api.xml
new file mode 100644
index 0000000..fac35b7
--- /dev/null
+++ b/indra/newview/llappviewerlinux_api.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!-- dbus-binding-tool -mode=glib-server llappviewerlinux_api.xml -prefix=viewerapp -output=llappviewerlinux_api.h -->
+
+<node name="/com/secondlife/ViewerAppAPI">
+  <interface name="com.secondlife.ViewerAppAPI">
+    <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="viewer_app_api"/>
+    <method name="GoSLURL">
+      <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="viewer_app_api_GoSLURL"/>
+      <arg type="s" name="slurl" direction="in" />
+      <arg type="b" name="success_ret" direction="out" />
+    </method>
+  </interface>
+</node>
diff --git a/indra/newview/llappviewerlinux_api_dbus.cpp b/indra/newview/llappviewerlinux_api_dbus.cpp
new file mode 100644
index 0000000..806714f
--- /dev/null
+++ b/indra/newview/llappviewerlinux_api_dbus.cpp
@@ -0,0 +1,131 @@
+/** 
+ * @file llappviewerlinux_api_dbus.cpp
+ * @brief dynamic DBus symbol-grabbing code
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ * 
+ * Copyright (c) 2008, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#if LL_DBUS_ENABLED
+
+#include "linden_common.h"
+
+extern "C" {
+#include <dbus/dbus-glib.h>
+
+#include "apr_pools.h"
+#include "apr_dso.h"
+}
+
+#define DEBUGMSG(...) lldebugs << llformat(__VA_ARGS__) << llendl
+#define INFOMSG(...) llinfos << llformat(__VA_ARGS__) << llendl
+#define WARNMSG(...) llwarns << llformat(__VA_ARGS__) << llendl
+
+#define LL_DBUS_SYM(REQUIRED, DBUSSYM, RTN, ...) RTN (*ll##DBUSSYM)(__VA_ARGS__) = NULL
+#include "llappviewerlinux_api_dbus_syms_raw.inc"
+#undef LL_DBUS_SYM
+
+static bool sSymsGrabbed = false;
+static apr_pool_t *sSymDBUSDSOMemoryPool = NULL;
+static apr_dso_handle_t *sSymDBUSDSOHandleG = NULL;
+
+bool grab_dbus_syms(std::string dbus_dso_name)
+{
+	if (sSymsGrabbed)
+	{
+		// already have grabbed good syms
+		return TRUE;
+	}
+
+	bool sym_error = false;
+	bool rtn = false;
+	apr_status_t rv;
+	apr_dso_handle_t *sSymDBUSDSOHandle = NULL;
+
+#define LL_DBUS_SYM(REQUIRED, DBUSSYM, RTN, ...) do{rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll##DBUSSYM, sSymDBUSDSOHandle, #DBUSSYM); if (rv != APR_SUCCESS) {INFOMSG("Failed to grab symbol: %s", #DBUSSYM); if (REQUIRED) sym_error = true;} else DEBUGMSG("grabbed symbol: %s from %p", #DBUSSYM, (void*)ll##DBUSSYM);}while(0)
+
+	//attempt to load the shared library
+	apr_pool_create(&sSymDBUSDSOMemoryPool, NULL);
+  
+	if ( APR_SUCCESS == (rv = apr_dso_load(&sSymDBUSDSOHandle,
+					       dbus_dso_name.c_str(),
+					       sSymDBUSDSOMemoryPool) ))
+	{
+		INFOMSG("Found DSO: %s", dbus_dso_name.c_str());
+
+#include "llappviewerlinux_api_dbus_syms_raw.inc"
+      
+		if ( sSymDBUSDSOHandle )
+		{
+			sSymDBUSDSOHandleG = sSymDBUSDSOHandle;
+			sSymDBUSDSOHandle = NULL;
+		}
+      
+		rtn = !sym_error;
+	}
+	else
+	{
+		INFOMSG("Couldn't load DSO: %s", dbus_dso_name.c_str());
+		rtn = false; // failure
+	}
+
+	if (sym_error)
+	{
+		WARNMSG("Failed to find necessary symbols in DBUS-GLIB libraries.");
+	}
+#undef LL_DBUS_SYM
+
+	sSymsGrabbed = rtn;
+	return rtn;
+}
+
+
+void ungrab_dbus_syms()
+{ 
+	// should be safe to call regardless of whether we've
+	// actually grabbed syms.
+
+	if ( sSymDBUSDSOHandleG )
+	{
+		apr_dso_unload(sSymDBUSDSOHandleG);
+		sSymDBUSDSOHandleG = NULL;
+	}
+	
+	if ( sSymDBUSDSOMemoryPool )
+	{
+		apr_pool_destroy(sSymDBUSDSOMemoryPool);
+		sSymDBUSDSOMemoryPool = NULL;
+	}
+	
+	// NULL-out all of the symbols we'd grabbed
+#define LL_DBUS_SYM(REQUIRED, DBUSSYM, RTN, ...) do{ll##DBUSSYM = NULL;}while(0)
+#include "llappviewerlinux_api_dbus_syms_raw.inc"
+#undef LL_DBUS_SYM
+
+	sSymsGrabbed = false;
+}
+
+#endif // LL_DBUS_ENABLED
diff --git a/indra/newview/llappviewerlinux_api_dbus.h b/indra/newview/llappviewerlinux_api_dbus.h
new file mode 100644
index 0000000..6d6c1b0
--- /dev/null
+++ b/indra/newview/llappviewerlinux_api_dbus.h
@@ -0,0 +1,49 @@
+/** 
+ * @file llappviewerlinux_api_dbus.h
+ * @brief DBus-glib symbol handling
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ * 
+ * Copyright (c) 2008, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#if LL_DBUS_ENABLED
+
+extern "C" {
+#include <dbus/dbus-glib.h>
+}
+
+#define DBUSGLIB_DYLIB_DEFAULT_NAME "libdbus-glib-1.so.2"
+
+bool grab_dbus_syms(std::string dbus_dso_name);
+void ungrab_dbus_syms();
+
+#define LL_DBUS_SYM(REQUIRED, DBUSSYM, RTN, ...) extern RTN (*ll##DBUSSYM)(__VA_ARGS__)
+#include "llappviewerlinux_api_dbus_syms_raw.inc"
+#undef LL_DBUS_SYM
+
+#endif // LL_DBUS_ENABLED
diff --git a/indra/newview/llappviewerlinux_api_dbus_syms_raw.inc b/indra/newview/llappviewerlinux_api_dbus_syms_raw.inc
new file mode 100644
index 0000000..c0548e2
--- /dev/null
+++ b/indra/newview/llappviewerlinux_api_dbus_syms_raw.inc
@@ -0,0 +1,9 @@
+
+// required symbols to grab
+LL_DBUS_SYM(true, dbus_g_bus_get, DBusGConnection*, DBusBusType, GError**);
+LL_DBUS_SYM(true, dbus_g_proxy_new_for_name, DBusGProxy*, DBusGConnection*, const char *, const char*, const char*);
+LL_DBUS_SYM(true, dbus_g_proxy_call, gboolean, DBusGProxy*, const char*, GError**, GType, ...);
+LL_DBUS_SYM(true, dbus_g_object_type_install_info, void, GType, const DBusGObjectInfo*);
+LL_DBUS_SYM(true, dbus_g_connection_register_g_object, void, DBusGConnection*, const char*, GObject*);
+
+// optional symbols to grab
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index 68c3a16..e3fd425 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -48,6 +48,7 @@
 #include "llurldispatcher.h"
 #include <Carbon/Carbon.h>
 #include "lldir.h"
+#include <signal.h>
 namespace 
 {
 	// The command line args stored.
@@ -193,22 +194,106 @@ bool LLAppViewerMacOSX::initParseCommandLine(LLCommandLineParser& clp)
     return true;
 }
 
+// *FIX:Mani It would be nice to provide a clean interface to get the
+// default_unix_signal_handler for the LLApp class.
+extern void default_unix_signal_handler(int, siginfo_t *, void *);
+bool LLAppViewerMacOSX::restoreErrorTrap()
+{
+	// This method intends to reinstate signal handlers.
+	// *NOTE:Mani It was found that the first execution of a shader was overriding
+	// our initial signal handlers somehow.
+	// This method will be called (at least) once per mainloop execution.
+	// *NOTE:Mani The signals used below are copied over from the 
+	// setup_signals() func in LLApp.cpp
+	// LLApp could use some way of overriding that func, but for this viewer
+	// fix I opt to avoid affecting the server code.
+	
+	// Set up signal handlers that may result in program termination
+	//
+	struct sigaction act;
+	struct sigaction old_act;
+	act.sa_sigaction = default_unix_signal_handler;
+	sigemptyset( &act.sa_mask );
+	act.sa_flags = SA_SIGINFO;
+	
+	unsigned int reset_count = 0;
+	
+#define SET_SIG(S) 	sigaction(SIGABRT, &act, &old_act); \
+					if((unsigned int)act.sa_sigaction != (unsigned int) old_act.sa_sigaction) \
+						++reset_count;
+	// Synchronous signals
+	SET_SIG(SIGABRT)
+	SET_SIG(SIGALRM)
+	SET_SIG(SIGBUS)
+	SET_SIG(SIGFPE)
+	SET_SIG(SIGHUP) 
+	SET_SIG(SIGILL)
+	SET_SIG(SIGPIPE)
+	SET_SIG(SIGSEGV)
+	SET_SIG(SIGSYS)
+	
+	SET_SIG(LL_HEARTBEAT_SIGNAL)
+	SET_SIG(LL_SMACKDOWN_SIGNAL)
+	
+	// Asynchronous signals that are normally ignored
+	SET_SIG(SIGCHLD)
+	SET_SIG(SIGUSR2)
+	
+	// Asynchronous signals that result in attempted graceful exit
+	SET_SIG(SIGHUP)
+	SET_SIG(SIGTERM)
+	SET_SIG(SIGINT)
+	
+	// Asynchronous signals that result in core
+	SET_SIG(SIGQUIT)	
+#undef SET_SIG
+	
+	return reset_count == 0;
+}
+
 void LLAppViewerMacOSX::handleSyncCrashTrace()
 {
 	// do nothing
 }
 
-void LLAppViewerMacOSX::handleCrashReporting()
+void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze)
 {
-	// Macintosh
 	std::string command_str;
-	command_str += "open mac-crash-logger.app";	
+	//command_str = "open Second Life.app/Contents/Resources/mac-crash-logger.app";
+	command_str = "mac-crash-logger.app/Contents/MacOS/mac-crash-logger";
 	
-	clear_signals();
-	llinfos << "Launching crash reporter using: '" << command_str << "'" << llendl;
-	system(command_str.c_str());		/* Flawfinder: ignore */
-	llinfos << "returned from crash reporter... dying" << llendl;	
-	_exit(1);
+	FSRef appRef;
+	Boolean isDir = 0;
+	OSStatus os_result = FSPathMakeRef((UInt8*)command_str.c_str(),
+									   &appRef,
+									   &isDir);
+	if(os_result >= 0)
+	{
+		LSApplicationParameters appParams;
+		memset(&appParams, 0, sizeof(appParams));
+	 	appParams.version = 0;
+		appParams.flags = kLSLaunchNoParams | kLSLaunchStartClassic;
+		appParams.application = &appRef;
+		
+		if(reportFreeze)
+		{
+			// Make sure freeze reporting launches the crash logger synchronously, lest 
+			// Log files get changed by SL while the logger is running.
+		}
+		else
+		{
+			appParams.flags |= kLSLaunchAsync;
+			clear_signals();
+		}
+		
+		ProcessSerialNumber o_psn;
+		os_result = LSOpenApplication(&appParams, &o_psn);
+	}
+
+	if(!reportFreeze)
+	{
+		_exit(1);
+	}
 }
 
 std::string LLAppViewerMacOSX::generateSerialNumber()
diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h
index 0d8c460..85193a8 100644
--- a/indra/newview/llappviewermacosx.h
+++ b/indra/newview/llappviewermacosx.h
@@ -49,7 +49,8 @@ public:
 
 
 protected:
-	virtual void handleCrashReporting(); 
+	virtual bool restoreErrorTrap();
+	virtual void handleCrashReporting(bool reportFreeze); 
 	virtual void handleSyncCrashTrace();
 
 	std::string generateSerialNumber();
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 9f37534..bf02087 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -64,7 +64,7 @@
 
 #include "llcommandlineparser.h"
 
-//*FIX:Mani - This hack is to fix a linker issue with libndofdev.lib
+// *FIX:Mani - This hack is to fix a linker issue with libndofdev.lib
 // The lib was compiled under VS2005 - in VS2003 we need to remap assert
 #ifdef LL_DEBUG
 #ifdef LL_MSVC7 
@@ -77,6 +77,8 @@ extern "C" {
 #endif
 #endif
 
+const std::string LLAppViewerWin32::sWindowClass = "Second Life";
+
 LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop)
 {
     // *NOTE:Mani - this code is stolen from LLApp, where its never actually used.
@@ -91,6 +93,7 @@ LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *excepti
 	if (LLApp::isError())
 	{
 		llwarns << "Got another fatal signal while in the error handler, die now!" << llendl;
+
 		retval = EXCEPTION_EXECUTE_HANDLER;
 		return retval;
 	}
@@ -119,7 +122,6 @@ LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *excepti
 	return retval;
 }
 
-
 #if DEBUGGING_SEH_FILTER
 #	define WINMAIN DebuggingWinMain
 #else
@@ -195,6 +197,19 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
 	}
 	delete viewer_app_ptr;
 	viewer_app_ptr = NULL;
+
+	//start updater
+	if(LLAppViewer::sUpdaterInfo)
+	{
+#if LL_WINDOWS
+		_spawnl(_P_NOWAIT, LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str(), LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str(), LLAppViewer::sUpdaterInfo->mParams.str().c_str(), NULL);
+#elif LL_DARWIN
+		system(LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str());		/* Flawfinder: ignore */
+#endif
+		delete LLAppViewer::sUpdaterInfo ;
+		LLAppViewer::sUpdaterInfo = NULL ;
+	}
+
 	return 0;
 }
 
@@ -324,6 +339,17 @@ bool LLAppViewerWin32::cleanup()
 	return result;
 }
 
+bool LLAppViewerWin32::initLogging()
+{
+	// Remove the crash stack log from previous executions.
+	// Since we've started logging a new instance of the app, we can assume 
+	// *NOTE: This should happen before the we send a 'previous instance froze'
+	// crash report, but it must happen after we initialize the DirUtil.
+	LLWinDebug::clearCrashStacks();
+
+	return LLAppViewer::initLogging();
+}
+
 void LLAppViewerWin32::initConsole()
 {
 	// pop up debug console
@@ -405,7 +431,7 @@ bool LLAppViewerWin32::initHardwareTest()
 		LLSplashScreen::update(splash_msg.str());
 	}
 
-	if (!LLWinDebug::checkExceptionHandler())
+	if (!restoreErrorTrap())
 	{
 		LL_WARNS("AppInit") << " Someone took over my exception handler (post hardware probe)!" << LL_ENDL;
 	}
@@ -445,39 +471,69 @@ bool LLAppViewerWin32::initParseCommandLine(LLCommandLineParser& clp)
 	return true;
 }
 
+bool LLAppViewerWin32::restoreErrorTrap()
+{
+	return LLWinDebug::checkExceptionHandler();
+}
+
 void LLAppViewerWin32::handleSyncCrashTrace()
 {
 	// do nothing
 }
 
-void LLAppViewerWin32::handleCrashReporting()
+void LLAppViewerWin32::handleCrashReporting(bool reportFreeze)
 {
-	// Windows only behaivor. Spawn win crash reporter.
-	std::string exe_path = gDirUtilp->getAppRODataDir();
+	const char* logger_name = "win_crash_logger.exe";
+	std::string exe_path = gDirUtilp->getExecutableDir();
 	exe_path += gDirUtilp->getDirDelimiter();
-	exe_path += "win_crash_logger.exe";
+	exe_path += logger_name;
 
-	std::string arg_string = "-user ";
-	arg_string += LLViewerLogin::getInstance()->getGridLabel();
-	
-	S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
-	switch(cb)
+	const char* arg_str = logger_name;
+
+	// *NOTE:Mani - win_crash_logger.exe no longer parses command line options.
+	if(reportFreeze)
+	{
+		// Spawn crash logger.
+		// NEEDS to wait until completion, otherwise log files will get smashed.
+		_spawnl(_P_WAIT, exe_path.c_str(), arg_str, NULL);
+	}
+	else
+	{
+		S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
+		if(cb != CRASH_BEHAVIOR_NEVER_SEND)
+		{
+			_spawnl(_P_NOWAIT, exe_path.c_str(), arg_str, NULL);
+		}
+	}
+}
+
+//virtual
+bool LLAppViewerWin32::sendURLToOtherInstance(const std::string& url)
+{
+	wchar_t window_class[256]; /* Flawfinder: ignore */   // Assume max length < 255 chars.
+	mbstowcs(window_class, sWindowClass.c_str(), 255);
+	window_class[255] = 0;
+	// Use the class instead of the window name.
+	HWND other_window = FindWindow(window_class, NULL);
+
+	if (other_window != NULL)
 	{
-	case CRASH_BEHAVIOR_ASK:
-	default:
-		arg_string += " -dialog ";
-		_spawnl(_P_NOWAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL);
-		break;
-
-	case CRASH_BEHAVIOR_ALWAYS_SEND:
-		_spawnl(_P_NOWAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL);
-		break;
-
-	case CRASH_BEHAVIOR_NEVER_SEND:
-		break;
+		lldebugs << "Found other window with the name '" << getWindowTitle() << "'" << llendl;
+		COPYDATASTRUCT cds;
+		const S32 SLURL_MESSAGE_TYPE = 0;
+		cds.dwData = SLURL_MESSAGE_TYPE;
+		cds.cbData = url.length() + 1;
+		cds.lpData = (void*)url.c_str();
+
+		LRESULT msg_result = SendMessage(other_window, WM_COPYDATA, NULL, (LPARAM)&cds);
+		lldebugs << "SendMessage(WM_COPYDATA) to other window '" 
+				 << getWindowTitle() << "' returned " << msg_result << llendl;
+		return true;
 	}
+	return false;
 }
 
+
 std::string LLAppViewerWin32::generateSerialNumber()
 {
 	char serial_md5[MD5HEX_STR_SIZE];		// Flawfinder: ignore
diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h
index fe16ec4..6a5b0b1 100644
--- a/indra/newview/llappviewerwin32.h
+++ b/indra/newview/llappviewerwin32.h
@@ -49,15 +49,21 @@ public:
 	virtual bool cleanup();
 
 protected:
+	virtual bool initLogging(); // Override to clean stack_trace info.
 	virtual void initConsole(); // Initialize OS level debugging console.
 	virtual bool initHardwareTest(); // Win32 uses DX9 to test hardware.
 	virtual bool initParseCommandLine(LLCommandLineParser& clp);
 
-	virtual void handleCrashReporting(); 
+	virtual bool restoreErrorTrap();
+	virtual void handleCrashReporting(bool reportFreeze); 
 	virtual void handleSyncCrashTrace();
 
+	virtual bool sendURLToOtherInstance(const std::string& url);
+
 	std::string generateSerialNumber();
 
+	static const std::string sWindowClass;
+
 private:
 	void disableWinErrorReporting();
 
diff --git a/indra/newview/llaudiosourcevo.cpp b/indra/newview/llaudiosourcevo.cpp
index e668078..50cd8cd 100644
--- a/indra/newview/llaudiosourcevo.cpp
+++ b/indra/newview/llaudiosourcevo.cpp
@@ -39,7 +39,7 @@
 #include "llviewerparcelmgr.h"
 
 LLAudioSourceVO::LLAudioSourceVO(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, LLViewerObject *objectp)
-:	LLAudioSource(sound_id, owner_id, gain), 
+	:	LLAudioSource(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX), 
 	mObjectp(objectp), 
 	mActualGain(gain)
 {
diff --git a/indra/newview/llbox.cpp b/indra/newview/llbox.cpp
index 1e6d282..1bcec7a 100644
--- a/indra/newview/llbox.cpp
+++ b/indra/newview/llbox.cpp
@@ -81,7 +81,7 @@ void LLBox::renderface(S32 which_face)
 		{7, 4, 0, 3}
 	};
 
-	gGL.begin(LLVertexBuffer::QUADS);
+	gGL.begin(LLRender::QUADS);
 		//gGL.normal3fv(&normals[which_face][0]);
 		gGL.texCoord2f(1,0);
 		gGL.vertex3fv(&mVertex[ faces[which_face][0] ][0]);
diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp
index 31fa653..2d9d356 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -553,15 +553,17 @@ void LLChatBar::onInputEditorGainFocus( LLFocusableElement* caller, void* userda
 // static
 void LLChatBar::onClickSay( LLUICtrl* ctrl, void* userdata )
 {
-	LLChatBar* self = (LLChatBar*) userdata;
+	e_chat_type chat_type = CHAT_TYPE_NORMAL;
 	if (ctrl->getValue().asString() == "shout")
 	{
-		self->sendChat( CHAT_TYPE_SHOUT );
+		chat_type = CHAT_TYPE_SHOUT;
 	}
-	else
+	else if (ctrl->getValue().asString() == "whisper")
 	{
-		self->sendChat( CHAT_TYPE_NORMAL );
+		chat_type = CHAT_TYPE_WHISPER;
 	}
+	LLChatBar* self = (LLChatBar*) userdata;
+	self->sendChat(chat_type);
 }
 
 void LLChatBar::sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate)
diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp
index dc6a1e2..5dafe78 100644
--- a/indra/newview/llcommandlineparser.cpp
+++ b/indra/newview/llcommandlineparser.cpp
@@ -416,11 +416,6 @@ void setControlValueCB(const LLCommandLineParser::token_vector_t& value,
                        const std::string& opt_name, 
                        LLControlGroup* ctrlGroup)
 {
-    if(value.size() > 1)
-    {
-        llwarns << "Ignoring extra tokens mapped to the setting: " << opt_name << "." << llendl; 
-    }
-    
     // *FIX: Do sematic conversion here.
     // LLSD (ImplString) Is no good for doing string to type conversion for...
     // booleans
@@ -457,7 +452,7 @@ void setControlValueCB(const LLCommandLineParser::token_vector_t& value,
         default:
             {
                 // For the default types, let llsd do the conversion.
-                if(value.size() > 1)
+                if(value.size() > 1 && ctrl->isType(TYPE_LLSD))
                 {
                     // Assume its an array...
                     LLSD llsdArray;
@@ -472,6 +467,11 @@ void setControlValueCB(const LLCommandLineParser::token_vector_t& value,
                 }
                 else if(value.size() > 0)
                 {
+					if(value.size() > 1)
+					{
+						llwarns << "Ignoring extra tokens mapped to the setting: " << opt_name << "." << llendl; 
+					}
+
                     LLSD llsdValue;
                     llsdValue.assign(LLSD::String(value[0]));
                     ctrl->setValue(llsdValue, false);
diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp
index fc2742f..00ca833 100644
--- a/indra/newview/llcompilequeue.cpp
+++ b/indra/newview/llcompilequeue.cpp
@@ -60,6 +60,8 @@
 #include "llviewerstats.h"
 #include "lluictrlfactory.h"
 
+#include "llselectmgr.h"
+
 ///----------------------------------------------------------------------------
 /// Local function declarations, constants, enums, and typedefs
 ///----------------------------------------------------------------------------
@@ -194,7 +196,20 @@ BOOL LLFloaterScriptQueue::start()
 {
 	//llinfos << "LLFloaterCompileQueue::start()" << llendl;
 	std::string buffer;
-	buffer = llformat("Starting %s of %d items.", mStartString.c_str(), mObjectIDs.count()); // *TODO: Translate
+
+	LLSelectMgr *mgr = LLSelectMgr::getInstance();
+	LLObjectSelectionHandle selectHandle = mgr->getSelection();
+	U32 n_objects = 0;
+	if (gSavedSettings.getBOOL("EditLinkedParts"))
+	{
+		n_objects = selectHandle->getObjectCount();
+	}
+	else
+	{
+		n_objects = selectHandle->getRootObjectCount();
+	}
+
+	buffer = llformat("Starting %s of %d items.", mStartString.c_str(), n_objects); // *TODO: Translate
 	
 	LLScrollListCtrl* list = getChild<LLScrollListCtrl>("queue output");
 	list->addCommentText(buffer);
diff --git a/indra/newview/llcontainerview.cpp b/indra/newview/llcontainerview.cpp
index dbec409..4a09265 100644
--- a/indra/newview/llcontainerview.cpp
+++ b/indra/newview/llcontainerview.cpp
@@ -88,7 +88,7 @@ BOOL LLContainerView::handleMouseUp(S32 x, S32 y, MASK mask)
 void LLContainerView::draw()
 {
 	{
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 		gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4(0.f, 0.f, 0.f, 0.25f));
 	}
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 0f89585..ac90fdf 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -362,6 +362,7 @@ void LLDrawable::makeActive()
 		if (pcode == LLViewerObject::LL_VO_WATER ||
 			pcode == LLViewerObject::LL_VO_SURFACE_PATCH ||
 			pcode == LLViewerObject::LL_VO_PART_GROUP ||
+			pcode == LLViewerObject::LL_VO_HUD_PART_GROUP ||
 			pcode == LLViewerObject::LL_VO_CLOUDS ||
 			pcode == LLViewerObject::LL_VO_GROUND ||
 			pcode == LLViewerObject::LL_VO_SKY)
@@ -951,6 +952,9 @@ BOOL LLDrawable::isVisible() const
 		return TRUE;
 	}
 	
+#if 0
+	//disabling this code fixes DEV-20105.  Leaving in place in case some other bug pops up as a a result.
+	//should be safe to just always ask the spatial group for visibility.
 	if (isActive())
 	{
 		if (isRoot())
@@ -973,6 +977,7 @@ BOOL LLDrawable::isVisible() const
 		}
 	}
 	else
+#endif
 	{
 		LLSpatialGroup* group = getSpatialGroup();
 		if (group && group->isVisible())
@@ -1380,7 +1385,10 @@ BOOL LLDrawable::isAnimating() const
 	{
 		return TRUE;
 	}
-
+	if (mVObjp->getPCode() == LLViewerObject::LL_VO_HUD_PART_GROUP)
+	{
+		return TRUE;
+	}
 	if (mVObjp->getPCode() == LLViewerObject::LL_VO_CLOUDS)
 	{
 		return TRUE;
diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index 9d8bd0a..196f8c1 100644
--- a/indra/newview/lldrawpool.cpp
+++ b/indra/newview/lldrawpool.cpp
@@ -194,7 +194,8 @@ S32 LLFacePool::drawLoopSetTex(face_array_t& face_list, S32 stage)
 			 iter != face_list.end(); iter++)
 		{
 			LLFace *facep = *iter;
-			facep->bindTexture(stage);
+			gGL.getTexUnit(stage)->bind(facep->getTexture());
+			gGL.getTexUnit(0)->activate();
 			res += facep->renderIndexed();
 		}
 	}
@@ -395,7 +396,7 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
 	{
 		if (params.mTexture.notNull())
 		{
-			params.mTexture->bind();
+			gGL.getTexUnit(0)->bind(params.mTexture.get());
 			if (params.mTextureMatrix)
 			{
 				glMatrixMode(GL_TEXTURE);
@@ -406,14 +407,14 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
 		}
 		else
 		{
-			LLImageGL::unbindTexture(0);
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		}
 	}
 	
 	if (params.mVertexBuffer.notNull())
 	{
 		params.mVertexBuffer->setBuffer(mask);
-		params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
+		params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
 		gPipeline.addTrianglesDrawn(params.mCount/3);
 	}
 
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 28263b2..d997c30 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -129,7 +129,7 @@ void LLDrawPoolAlpha::render(S32 pass)
 		gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
 		glColor4f(1,0,0,1);
 		LLViewerImage::sSmokeImagep->addTextureStats(1024.f*1024.f);
-        LLViewerImage::sSmokeImagep->bind();
+		gGL.getTexUnit(0)->bind(LLViewerImage::sSmokeImagep.get());
 		renderAlphaHighlight(LLVertexBuffer::MAP_VERTEX |
 							LLVertexBuffer::MAP_TEXCOORD);
 	}
@@ -170,7 +170,7 @@ void LLDrawPoolAlpha::renderAlphaHighlight(U32 mask)
 				LLRenderPass::applyModelMatrix(params);
 
 				params.mVertexBuffer->setBuffer(mask);
-				params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
+				params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
 				gPipeline.addTrianglesDrawn(params.mCount/3);
 			}
 		}
@@ -231,7 +231,7 @@ void LLDrawPoolAlpha::renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask
 		if (texture && params.mTexture.notNull())
 		{
 			gGL.getTexUnit(0)->activate();
-			params.mTexture->bind();
+			gGL.getTexUnit(0)->bind(params.mTexture.get());
 			params.mTexture->addTextureStats(params.mVSize);
 			if (params.mTextureMatrix)
 			{
@@ -288,7 +288,7 @@ void LLDrawPoolAlpha::renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask
 		}
 
 		params.mVertexBuffer->setBuffer(mask);
-		params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
+		params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
 		gPipeline.addTrianglesDrawn(params.mCount/3);
 
 		if (params.mTextureMatrix && texture && params.mTexture.notNull())
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 97ff072..a5231dd 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -396,7 +396,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
 	{
 		
 		/* // debug code to draw a cube in place of avatar
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		LLVector3 pos = avatarp->getPositionAgent();
 
 		gGL.color4f(1.0f, 0.0f, 0.0f, 0.8f);
@@ -495,17 +495,17 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
 	{
 		if (LLVOAvatar::sShowCollisionVolumes)
 		{
-			LLGLSNoTexture no_texture;
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			avatarp->renderCollisionVolumes();
 		}
 
 		if (avatarp->mIsSelf && LLAgent::sDebugDisplayTarget)
 		{
-			LLGLSNoTexture gls_no_texture;
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			LLVector3 pos = avatarp->getPositionAgent();
 
 			gGL.color4f(1.0f, 0.0f, 0.0f, 0.8f);
-			gGL.begin(LLVertexBuffer::LINES);
+			gGL.begin(LLRender::LINES);
 			{
 				gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
 				gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
@@ -517,7 +517,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
 
 			pos = avatarp->mDrawable->getPositionAgent();
 			gGL.color4f(1.0f, 0.0f, 0.0f, 0.8f);
-			gGL.begin(LLVertexBuffer::LINES);
+			gGL.begin(LLRender::LINES);
 			{
 				gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
 				gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
@@ -529,7 +529,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
 
 			pos = avatarp->mRoot.getWorldPosition();
 			gGL.color4f(1.0f, 1.0f, 1.0f, 0.8f);
-			gGL.begin(LLVertexBuffer::LINES);
+			gGL.begin(LLRender::LINES);
 			{
 				gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
 				gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
@@ -541,7 +541,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
 
 			pos = avatarp->mPelvisp->getWorldPosition();
 			gGL.color4f(0.0f, 0.0f, 1.0f, 0.8f);
-			gGL.begin(LLVertexBuffer::LINES);
+			gGL.begin(LLRender::LINES);
 			{
 				gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
 				gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 0dd11d6..6593547 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -349,27 +349,29 @@ void LLDrawPoolBump::beginShiny(bool invisible)
 				cube_map->setMatrix(1);
 				// Make sure that texture coord generation happens for tex unit 1, as that's the one we use for 
 				// the cube map in the one pass shiny shaders
-				cube_channel = shader->enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
+				cube_channel = shader->enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
 				cube_map->enableTexture(cube_channel);
 				cube_map->enableTextureCoords(1);
 				diffuse_channel = shader->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
 			}
 			else
 			{
-				cube_channel = 0;
+				cube_channel = shader->enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
 				diffuse_channel = -1;
 				cube_map->setMatrix(0);
-				cube_map->enable(shader->enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB));
+				cube_map->enable(cube_channel);
 			}			
-			cube_map->bind();
+			gGL.getTexUnit(cube_channel)->bind(cube_map);
+			gGL.getTexUnit(0)->activate();
 		}
 		else
 		{
 			cube_channel = 0;
 			diffuse_channel = -1;
+			gGL.getTexUnit(0)->disable();
 			cube_map->enable(0);
 			cube_map->setMatrix(0);
-			cube_map->bind();
+			gGL.getTexUnit(0)->bind(cube_map);
 
 			gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR);
 			gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_VERT_ALPHA);
@@ -423,7 +425,7 @@ void LLDrawPoolBump::endShiny(bool invisible)
 
 		if (!invisible && mVertexShaderLevel > 1)
 		{
-			shader->disableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
+			shader->disableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
 					
 			if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0)
 			{
@@ -435,18 +437,20 @@ void LLDrawPoolBump::endShiny(bool invisible)
 
 			shader->unbind();
 			gGL.getTexUnit(0)->activate();
-			glEnable(GL_TEXTURE_2D);
+			gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
 		}
 		if (cube_channel >= 0)
 		{
+			gGL.getTexUnit(cube_channel)->enable(LLTexUnit::TT_TEXTURE);
 			gGL.getTexUnit(cube_channel)->setTextureBlendType(LLTexUnit::TB_MULT);
 		}
 	}
-	
-	gGL.getTexUnit(0)->activate();
-	LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+	gGL.getTexUnit(diffuse_channel)->disable();
+	gGL.getTexUnit(cube_channel)->disable();
+
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
-	
+
 	diffuse_channel = -1;
 	cube_channel = 0;
 	mShiny = FALSE;
@@ -489,12 +493,14 @@ void LLDrawPoolBump::beginFullbrightShiny()
 		cube_map->setMatrix(1);
 		// Make sure that texture coord generation happens for tex unit 1, as that's the one we use for 
 		// the cube map in the one pass shiny shaders
-		cube_channel = shader->enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
+		gGL.getTexUnit(1)->disable();
+		cube_channel = shader->enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
 		cube_map->enableTexture(cube_channel);
 		cube_map->enableTextureCoords(1);
 		diffuse_channel = shader->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
 
-		cube_map->bind();
+		gGL.getTexUnit(cube_channel)->bind(cube_map);
+		gGL.getTexUnit(0)->activate();
 	}
 	mShiny = TRUE;
 }
@@ -535,14 +541,13 @@ void LLDrawPoolBump::endFullbrightShiny()
 			shader->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
 		}
 		gGL.getTexUnit(0)->activate();
-		glEnable(GL_TEXTURE_2D);
+		gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
 
 		shader->unbind();
-
 		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
 	}
 	
-	LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
 
 	diffuse_channel = -1;
@@ -561,7 +566,7 @@ void LLDrawPoolBump::renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL
 		applyModelMatrix(params);
 
 		params.mVertexBuffer->setBuffer(mask);
-		params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
+		params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
 		gPipeline.addTrianglesDrawn(params.mCount/3);
 	}
 }
@@ -599,8 +604,8 @@ BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params)
 
 	if (bump)
 	{
-		bump->bind(1);
-		bump->bind(0);
+		gGL.getTexUnit(1)->bind(bump);
+		gGL.getTexUnit(0)->bind(bump);
 		return TRUE;
 	}
 	return FALSE;
@@ -629,7 +634,7 @@ void LLDrawPoolBump::beginBump()
 	// TEXTURE UNIT 1
 	gGL.getTexUnit(1)->activate();
  
-	glEnable(GL_TEXTURE_2D); // Texture unit 1
+	gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
 
 	gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD_SIGNED, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_ONE_MINUS_TEX_ALPHA);
 	gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
@@ -648,7 +653,7 @@ void LLDrawPoolBump::beginBump()
 	gGL.getTexUnit(0)->activate();
 	stop_glerror();
 
-	LLViewerImage::unbindTexture(1, GL_TEXTURE_2D);
+	gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
 }
 
 //static
@@ -680,7 +685,7 @@ void LLDrawPoolBump::endBump()
 
 	// Disable texture unit 1
 	gGL.getTexUnit(1)->activate();
-	glDisable(GL_TEXTURE_2D); // Texture unit 1
+	gGL.getTexUnit(1)->disable();
 	gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);
 
 	// Disable texture unit 0
@@ -1083,17 +1088,17 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
 	{
 		if (params.mTexture.notNull())
 		{
-			params.mTexture->bind(diffuse_channel);
+			gGL.getTexUnit(diffuse_channel)->bind(params.mTexture.get());
 			params.mTexture->addTextureStats(params.mVSize);
 		}
 		else
 		{
-			LLImageGL::unbindTexture(0);
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		}
 	}
 	
 	params.mVertexBuffer->setBuffer(mask);
-	params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
+	params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
 	gPipeline.addTrianglesDrawn(params.mCount/3);
 	if (params.mTextureMatrix)
 	{
diff --git a/indra/newview/lldrawpoolground.cpp b/indra/newview/lldrawpoolground.cpp
index 5698027..c8d110b 100644
--- a/indra/newview/lldrawpoolground.cpp
+++ b/indra/newview/lldrawpoolground.cpp
@@ -63,13 +63,14 @@ void LLDrawPoolGround::prerender()
 
 void LLDrawPoolGround::render(S32 pass)
 {
-	if (mDrawFace.empty())
+	if (mDrawFace.empty() || !gSavedSettings.getBOOL("RenderGround"))
 	{
 		return;
 	}	
 	
 	LLGLSPipelineSkyBox gls_skybox;
-	LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
 	LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
 
 	LLGLClampToFarClip far_clip(glh_get_current_projection());
diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp
index e1dbf95..573061d 100644
--- a/indra/newview/lldrawpoolsky.cpp
+++ b/indra/newview/lldrawpoolsky.cpp
@@ -186,7 +186,7 @@ void LLDrawPoolSky::renderHeavenlyBody(U8 hb, LLFace* face)
 	if (! face->getGeomCount()) return;
 
 	LLImageGL* tex = face->getTexture();
-	tex->bind();
+	gGL.getTexUnit(0)->bind(tex);
 	LLColor4 color(mHB[hb]->getInterpColor());
 	LLOverrideFaceColor override(this, color);
 	face->renderIndexed();
@@ -200,7 +200,7 @@ void LLDrawPoolSky::renderSunHalo(LLFace* face)
 	if (! face->getGeomCount()) return;
 
 	LLImageGL* tex = face->getTexture();
-	tex->bind();
+	gGL.getTexUnit(0)->bind(tex);
 	LLColor4 color(mHB[0]->getInterpColor());
 	color.mV[3] = llclamp(mHB[0]->getHaloBrighness(), 0.f, 1.f);
 
diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp
index ccfbd2d..e99fc91 100644
--- a/indra/newview/lldrawpoolterrain.cpp
+++ b/indra/newview/lldrawpoolterrain.cpp
@@ -72,19 +72,19 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerImage *texturep) :
 													TRUE, TRUE, GL_ALPHA8, GL_ALPHA,
 													LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb"));
 
-	mAlphaRampImagep->bind(0);
+	gGL.getTexUnit(0)->bind(mAlphaRampImagep.get());
 	mAlphaRampImagep->setClamp(TRUE, TRUE);
 
 	m2DAlphaRampImagep = gImageList.getImageFromFile("alpha_gradient_2d.j2c",
 													TRUE, TRUE, GL_ALPHA8, GL_ALPHA,
 													LLUUID("38b86f85-2575-52a9-a531-23108d8da837"));
 
-	m2DAlphaRampImagep->bind(0);
+	gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());
 	m2DAlphaRampImagep->setClamp(TRUE, TRUE);
 	
 	mTexturep->setBoostLevel(LLViewerImage::BOOST_TERRAIN);
 	
-	LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 }
 
 LLDrawPoolTerrain::~LLDrawPoolTerrain()
@@ -240,7 +240,7 @@ void LLDrawPoolTerrain::renderFullShader()
 	// detail texture 0
 	//
 	S32 detail0 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL0);
-	LLViewerImage::bindTexture(detail_texture0p,detail0);
+	gGL.getTexUnit(detail0)->bind(detail_texture0p);
 	gGL.getTexUnit(0)->activate();
 
 	glEnable(GL_TEXTURE_GEN_S);
@@ -258,7 +258,7 @@ void LLDrawPoolTerrain::renderFullShader()
 	// detail texture 1
 	//
 	S32 detail1 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL1); 
-	LLViewerImage::bindTexture(detail_texture1p,detail1);
+	gGL.getTexUnit(detail1)->bind(detail_texture1p);
 	
 	/// ALPHA TEXTURE COORDS 0:
 	gGL.getTexUnit(1)->activate();
@@ -269,11 +269,11 @@ void LLDrawPoolTerrain::renderFullShader()
 	// detail texture 2
 	//
 	S32 detail2 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL2);
-	LLViewerImage::bindTexture(detail_texture2p,detail2);
-	glEnable(GL_TEXTURE_2D);
+	gGL.getTexUnit(detail2)->bind(detail_texture2p);
+
+	gGL.getTexUnit(2)->activate();
 	
 	/// ALPHA TEXTURE COORDS 1:
-	gGL.getTexUnit(2)->activate();
 	glMatrixMode(GL_TEXTURE);
 	glLoadIdentity();
 	glTranslatef(-2.f, 0.f, 0.f);
@@ -283,7 +283,7 @@ void LLDrawPoolTerrain::renderFullShader()
 	// detail texture 3
 	//
 	S32 detail3 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL3);
-	LLViewerImage::bindTexture(detail_texture3p,detail3);
+	gGL.getTexUnit(detail3)->bind(detail_texture3p);
 	
 	/// ALPHA TEXTURE COORDS 2:
 	gGL.getTexUnit(3)->activate();
@@ -296,7 +296,7 @@ void LLDrawPoolTerrain::renderFullShader()
 	// Alpha Ramp 
 	//
 	S32 alpha_ramp = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_ALPHARAMP);
-	LLViewerImage::bindTexture(m2DAlphaRampImagep,alpha_ramp);
+	gGL.getTexUnit(alpha_ramp)->bind(m2DAlphaRampImagep.get());
 		
 	// GL_BLEND disabled by default
 	drawLoop();
@@ -308,36 +308,36 @@ void LLDrawPoolTerrain::renderFullShader()
 	sShader->disableTexture(LLViewerShaderMgr::TERRAIN_DETAIL2);
 	sShader->disableTexture(LLViewerShaderMgr::TERRAIN_DETAIL3);
 
-	LLImageGL::unbindTexture(alpha_ramp, GL_TEXTURE_2D);
+	gGL.getTexUnit(alpha_ramp)->unbind(LLTexUnit::TT_TEXTURE);
+	gGL.getTexUnit(4)->disable();
 	gGL.getTexUnit(4)->activate();
-	glDisable(GL_TEXTURE_2D); // Texture unit 4
 	glDisable(GL_TEXTURE_GEN_S);
 	glDisable(GL_TEXTURE_GEN_T);
 	glMatrixMode(GL_TEXTURE);
 	glLoadIdentity();
 	glMatrixMode(GL_MODELVIEW);
 
-	LLImageGL::unbindTexture(detail3, GL_TEXTURE_2D);
+	gGL.getTexUnit(detail3)->unbind(LLTexUnit::TT_TEXTURE);
+	gGL.getTexUnit(3)->disable();
 	gGL.getTexUnit(3)->activate();
-	glDisable(GL_TEXTURE_2D);	
 	glDisable(GL_TEXTURE_GEN_S);
 	glDisable(GL_TEXTURE_GEN_T);
 	glMatrixMode(GL_TEXTURE);
 	glLoadIdentity();
 	glMatrixMode(GL_MODELVIEW);
 
-	LLImageGL::unbindTexture(detail2, GL_TEXTURE_2D);
+	gGL.getTexUnit(detail2)->unbind(LLTexUnit::TT_TEXTURE);
+	gGL.getTexUnit(2)->disable();
 	gGL.getTexUnit(2)->activate();
-	glDisable(GL_TEXTURE_2D);		
 	glDisable(GL_TEXTURE_GEN_S);
 	glDisable(GL_TEXTURE_GEN_T);
 	glMatrixMode(GL_TEXTURE);
 	glLoadIdentity();
 	glMatrixMode(GL_MODELVIEW);
 
-	LLImageGL::unbindTexture(detail1, GL_TEXTURE_2D);
+	gGL.getTexUnit(detail1)->unbind(LLTexUnit::TT_TEXTURE);
+	gGL.getTexUnit(1)->disable();
 	gGL.getTexUnit(1)->activate();
-	glDisable(GL_TEXTURE_2D);		
 	glDisable(GL_TEXTURE_GEN_S);
 	glDisable(GL_TEXTURE_GEN_T);
 	glMatrixMode(GL_TEXTURE);
@@ -347,9 +347,9 @@ void LLDrawPoolTerrain::renderFullShader()
 	//----------------------------------------------------------------------------
 	// Restore Texture Unit 0 defaults
 	
-	LLImageGL::unbindTexture(detail0, GL_TEXTURE_2D);
+	gGL.getTexUnit(detail0)->unbind(LLTexUnit::TT_TEXTURE);
+	gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
 	gGL.getTexUnit(0)->activate();
-	glEnable(GL_TEXTURE_2D);
 	glDisable(GL_TEXTURE_GEN_S);
 	glDisable(GL_TEXTURE_GEN_T);
 	glMatrixMode(GL_TEXTURE);
@@ -388,7 +388,7 @@ void LLDrawPoolTerrain::renderFull4TU()
 	// Stage 0: detail texture 0
 	//
 	gGL.getTexUnit(0)->activate();
-	LLViewerImage::bindTexture(detail_texture0p,0);
+	gGL.getTexUnit(0)->bind(detail_texture0p);
 	glClientActiveTextureARB(GL_TEXTURE0_ARB);
 	
 	glEnable(GL_TEXTURE_GEN_S);
@@ -405,9 +405,9 @@ void LLDrawPoolTerrain::renderFull4TU()
 	// Stage 1: Generate alpha ramp for detail0/detail1 transition
 	//
 
-	LLViewerImage::bindTexture(m2DAlphaRampImagep,1);
+	gGL.getTexUnit(1)->bind(m2DAlphaRampImagep.get());
+	gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
 	gGL.getTexUnit(1)->activate();
-	glEnable(GL_TEXTURE_2D); // Texture unit 1
 	glClientActiveTextureARB(GL_TEXTURE1_ARB);
 	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 
@@ -418,12 +418,13 @@ void LLDrawPoolTerrain::renderFull4TU()
 	//
 	// Stage 2: Interpolate detail1 with existing based on ramp
 	//
-	LLViewerImage::bindTexture(detail_texture1p,2);
+	gGL.getTexUnit(2)->bind(detail_texture1p);
+	gGL.getTexUnit(2)->enable(LLTexUnit::TT_TEXTURE);
 	gGL.getTexUnit(2)->activate();
-	glEnable(GL_TEXTURE_2D); // Texture unit 2
-	glClientActiveTextureARB(GL_TEXTURE2_ARB);
 
+	glClientActiveTextureARB(GL_TEXTURE2_ARB);
 	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+
 	glEnable(GL_TEXTURE_GEN_S);
 	glEnable(GL_TEXTURE_GEN_T);
 	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
@@ -436,9 +437,9 @@ void LLDrawPoolTerrain::renderFull4TU()
 	//
 	// Stage 3: Modulate with primary (vertex) color for lighting
 	//
-	LLViewerImage::bindTexture(detail_texture1p,3); // bind any texture
+	gGL.getTexUnit(3)->bind(detail_texture1p);
+	gGL.getTexUnit(3)->enable(LLTexUnit::TT_TEXTURE);
 	gGL.getTexUnit(3)->activate();
-	glEnable(GL_TEXTURE_2D); // Texture unit 3
 	glClientActiveTextureARB(GL_TEXTURE3_ARB);
 
 	// Set alpha texture and do lighting modulation
@@ -456,7 +457,7 @@ void LLDrawPoolTerrain::renderFull4TU()
 	// Stage 0: Write detail3 into base
 	//
 	gGL.getTexUnit(0)->activate();
-	LLViewerImage::bindTexture(detail_texture3p,0);
+	gGL.getTexUnit(0)->bind(detail_texture3p);
 	glClientActiveTextureARB(GL_TEXTURE0_ARB);
 
 	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -472,9 +473,9 @@ void LLDrawPoolTerrain::renderFull4TU()
 	//
 	// Stage 1: Generate alpha ramp for detail2/detail3 transition
 	//
-	LLViewerImage::bindTexture(m2DAlphaRampImagep,1);
+	gGL.getTexUnit(1)->bind(m2DAlphaRampImagep.get());
+	gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
 	gGL.getTexUnit(1)->activate();
-	glEnable(GL_TEXTURE_2D); // Texture unit 1
 	glClientActiveTextureARB(GL_TEXTURE1_ARB);
 
 	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -492,9 +493,9 @@ void LLDrawPoolTerrain::renderFull4TU()
 	//
 	// Stage 2: Interpolate detail2 with existing based on ramp
 	//
-	LLViewerImage::bindTexture(detail_texture2p,2);
+	gGL.getTexUnit(2)->bind(detail_texture2p);
+	gGL.getTexUnit(2)->enable(LLTexUnit::TT_TEXTURE);
 	gGL.getTexUnit(2)->activate();
-	glEnable(GL_TEXTURE_2D); // Texture unit 2
 
 	glClientActiveTextureARB(GL_TEXTURE2_ARB);
 	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -511,9 +512,9 @@ void LLDrawPoolTerrain::renderFull4TU()
 	//
 	// Stage 3: Generate alpha ramp for detail1/detail2 transition
 	//
-	LLViewerImage::bindTexture(m2DAlphaRampImagep,3);
+	gGL.getTexUnit(3)->bind(m2DAlphaRampImagep.get());
+	gGL.getTexUnit(3)->enable(LLTexUnit::TT_TEXTURE);
 	gGL.getTexUnit(3)->activate();
-	glEnable(GL_TEXTURE_2D); // Texture unit 3
 
 	glClientActiveTextureARB(GL_TEXTURE3_ARB);
 	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -536,21 +537,21 @@ void LLDrawPoolTerrain::renderFull4TU()
 
 	LLVertexBuffer::unbind();
 	// Disable multitexture
-	LLImageGL::unbindTexture(3, GL_TEXTURE_2D);
+	gGL.getTexUnit(3)->unbind(LLTexUnit::TT_TEXTURE);
+	gGL.getTexUnit(3)->disable();
 	gGL.getTexUnit(3)->activate();
 	glClientActiveTextureARB(GL_TEXTURE3_ARB);
 	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-	glDisable(GL_TEXTURE_2D); // Texture unit 3
 
 	glMatrixMode(GL_TEXTURE);
 	glLoadIdentity();
 	glMatrixMode(GL_MODELVIEW);
 
-	LLImageGL::unbindTexture(2, GL_TEXTURE_2D);
+	gGL.getTexUnit(2)->unbind(LLTexUnit::TT_TEXTURE);
+	gGL.getTexUnit(2)->disable();
 	gGL.getTexUnit(2)->activate();
 	glClientActiveTextureARB(GL_TEXTURE2_ARB);
 	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-	glDisable(GL_TEXTURE_2D); // Texture unit 2
 
 	glDisable(GL_TEXTURE_GEN_S);
 	glDisable(GL_TEXTURE_GEN_T);
@@ -558,11 +559,11 @@ void LLDrawPoolTerrain::renderFull4TU()
 	glLoadIdentity();
 	glMatrixMode(GL_MODELVIEW);
 
-	LLImageGL::unbindTexture(1, GL_TEXTURE_2D);
+	gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);	
+	gGL.getTexUnit(1)->disable();
 	gGL.getTexUnit(1)->activate();
  	glClientActiveTextureARB(GL_TEXTURE1_ARB);
  	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-	glDisable(GL_TEXTURE_2D); // Texture unit 1
 
 	glMatrixMode(GL_TEXTURE);
 	glLoadIdentity();
@@ -575,9 +576,9 @@ void LLDrawPoolTerrain::renderFull4TU()
 	// Restore Texture Unit 0 defaults
 	
 	gGL.getTexUnit(0)->activate();
-	LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
 	glClientActiveTextureARB(GL_TEXTURE0_ARB);
-	gGL.getTexUnit(0)->activate();
 	glDisableClientState(GL_NORMAL_ARRAY);
 
 	glDisable(GL_TEXTURE_GEN_S);
@@ -616,7 +617,7 @@ void LLDrawPoolTerrain::renderFull2TU()
 	//
 	// Stage 0: Render detail 0 into base
 	//
-	LLViewerImage::bindTexture(detail_texture0p,0);
+	gGL.getTexUnit(0)->bind(detail_texture0p);
 	glEnable(GL_TEXTURE_GEN_S);
 	glEnable(GL_TEXTURE_GEN_T);
 	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
@@ -635,7 +636,7 @@ void LLDrawPoolTerrain::renderFull2TU()
 	//
 	// Stage 0: Generate alpha ramp for detail0/detail1 transition
 	//
-	LLViewerImage::bindTexture(m2DAlphaRampImagep,0);
+	gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());
 	
 	glDisable(GL_TEXTURE_GEN_S);
 	glDisable(GL_TEXTURE_GEN_T);
@@ -648,9 +649,9 @@ void LLDrawPoolTerrain::renderFull2TU()
 	//
 	// Stage 1: Write detail1
 	//
-	LLViewerImage::bindTexture(detail_texture1p,1); // Texture unit 1
+	gGL.getTexUnit(1)->bind(detail_texture1p);
+	gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
 	gGL.getTexUnit(1)->activate();
-	glEnable(GL_TEXTURE_2D);		// Texture unit 1
 
 	glEnable(GL_TEXTURE_GEN_S);
 	glEnable(GL_TEXTURE_GEN_T);
@@ -673,7 +674,7 @@ void LLDrawPoolTerrain::renderFull2TU()
 	//
 	// Stage 0: Generate alpha ramp for detail1/detail2 transition
 	//
-	LLViewerImage::bindTexture(m2DAlphaRampImagep,0);
+	gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());
 
 	// Set the texture matrix
 	glMatrixMode(GL_TEXTURE);
@@ -687,9 +688,9 @@ void LLDrawPoolTerrain::renderFull2TU()
 	//
 	// Stage 1: Write detail2
 	//
-	LLViewerImage::bindTexture(detail_texture2p,1);
+	gGL.getTexUnit(1)->bind(detail_texture2p);
+	gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
 	gGL.getTexUnit(1)->activate();
-	glEnable(GL_TEXTURE_2D); // Texture unit 1
 	
 	glEnable(GL_TEXTURE_GEN_S);
 	glEnable(GL_TEXTURE_GEN_T);
@@ -713,7 +714,7 @@ void LLDrawPoolTerrain::renderFull2TU()
 	// Stage 0: Generate alpha ramp for detail2/detail3 transition
 	//
 	gGL.getTexUnit(0)->activate();
-	LLViewerImage::bindTexture(m2DAlphaRampImagep,0);	
+	gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());
 	// Set the texture matrix
 	glMatrixMode(GL_TEXTURE);
 	glLoadIdentity();
@@ -724,9 +725,9 @@ void LLDrawPoolTerrain::renderFull2TU()
 	gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
 
 	// Stage 1: Write detail3
-	LLViewerImage::bindTexture(detail_texture3p,1);
+	gGL.getTexUnit(1)->bind(detail_texture3p);
+	gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
 	gGL.getTexUnit(1)->activate();
-	glEnable(GL_TEXTURE_2D); // Texture unit 1
 
 	glEnable(GL_TEXTURE_GEN_S);
 	glEnable(GL_TEXTURE_GEN_T);
@@ -749,9 +750,9 @@ void LLDrawPoolTerrain::renderFull2TU()
 	
 	// Disable multitexture
 	
-	LLImageGL::unbindTexture(1, GL_TEXTURE_2D);
+	gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
+	gGL.getTexUnit(1)->disable();
 	gGL.getTexUnit(1)->activate();
-	glDisable(GL_TEXTURE_2D); // Texture unit 1
 
 	glDisable(GL_TEXTURE_GEN_S);
 	glDisable(GL_TEXTURE_GEN_T);
@@ -763,9 +764,8 @@ void LLDrawPoolTerrain::renderFull2TU()
 	// Restore Texture Unit 0 defaults
 	
 	gGL.getTexUnit(0)->activate();
-	LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
-	gGL.getTexUnit(0)->activate();
 	glDisable(GL_TEXTURE_GEN_S);
 	glDisable(GL_TEXTURE_GEN_T);
 	glMatrixMode(GL_TEXTURE);
@@ -784,10 +784,10 @@ void LLDrawPoolTerrain::renderSimple()
 
 	// Stage 0: Base terrain texture pass
 	mTexturep->addTextureStats(1024.f*1024.f);
-	mTexturep->bind(0);
 
 	gGL.getTexUnit(0)->activate();
-	glEnable(GL_TEXTURE_2D); // Texture unit 2
+	gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
+	gGL.getTexUnit(0)->bind(mTexturep.get());
 	
 	LLVector3 origin_agent = mDrawFace[0]->getDrawable()->getVObj()->getRegion()->getOriginAgent();
 	F32 tscale = 1.f/256.f;
@@ -808,8 +808,8 @@ void LLDrawPoolTerrain::renderSimple()
 	//----------------------------------------------------------------------------
 	// Restore Texture Unit 0 defaults
 	
-	LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
 	gGL.getTexUnit(0)->activate();
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	glDisable(GL_TEXTURE_GEN_S);
 	glDisable(GL_TEXTURE_GEN_T);
 	glMatrixMode(GL_TEXTURE);
@@ -839,7 +839,7 @@ void LLDrawPoolTerrain::renderOwnership()
 	LLViewerParcelOverlay	*overlayp			= regionp->getParcelOverlay();
 	LLImageGL				*texturep			= overlayp->getTexture();
 
-	LLViewerImage::bindTexture(texturep);
+	gGL.getTexUnit(0)->bind(texturep);
 
 	// *NOTE: Because the region is 256 meters wide, but has 257 pixels, the 
 	// texture coordinates for pixel 256x256 is not 1,1. This makes the
@@ -872,7 +872,7 @@ void LLDrawPoolTerrain::renderForSelect()
 	}
 
 	
-	LLImageGL::unbindTexture(0);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
 		 iter != mDrawFace.end(); iter++)
diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp
index fd178dc..40ba54a 100644
--- a/indra/newview/lldrawpooltree.cpp
+++ b/indra/newview/lldrawpooltree.cpp
@@ -50,7 +50,7 @@ LLDrawPoolTree::LLDrawPoolTree(LLViewerImage *texturep) :
 	LLFacePool(POOL_TREE),
 	mTexturep(texturep)
 {
-	mTexturep->bind(0);
+	gGL.getTexUnit(0)->bind(mTexturep.get());
 	mTexturep->setClamp(FALSE, FALSE);
 }
 
@@ -124,6 +124,7 @@ void LLDrawPoolTree::renderForSelect()
 	LLOverrideFaceColor color(this, 1.f, 1.f, 1.f, 1.f);
 
 	LLGLSObjectSelectAlpha gls_alpha;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	gGL.setSceneBlendType(LLRender::BT_REPLACE);
 	gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
@@ -144,7 +145,7 @@ void LLDrawPoolTree::renderTree(BOOL selecting)
 	LLGLState normalize(GL_NORMALIZE, TRUE);
 	
 	// Bind the texture for this tree.
-	LLViewerImage::bindTexture(mTexturep,sDiffTex);
+	gGL.getTexUnit(sDiffTex)->bind(mTexturep.get());
 		
 	U32 indices_drawn = 0;
 
diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp
index d8303bd..6e2c42a 100644
--- a/indra/newview/lldrawpoolwater.cpp
+++ b/indra/newview/lldrawpoolwater.cpp
@@ -68,11 +68,11 @@ LLDrawPoolWater::LLDrawPoolWater() :
 	LLFacePool(POOL_WATER)
 {
 	mHBTex[0] = gImageList.getImage(gSunTextureID, TRUE, TRUE);
-	mHBTex[0]->bind();
+	gGL.getTexUnit(0)->bind(mHBTex[0].get());
 	mHBTex[0]->setClamp(TRUE, TRUE);
 
 	mHBTex[1] = gImageList.getImage(gMoonTextureID, TRUE, TRUE);
-	mHBTex[1]->bind();
+	gGL.getTexUnit(0)->bind(mHBTex[1].get());
 	mHBTex[1]->setClamp(TRUE, TRUE);
 
 	mWaterImagep = gImageList.getImage(WATER_TEST);
@@ -166,10 +166,9 @@ void LLDrawPoolWater::render(S32 pass)
 	
 	// Set up second pass first
 	mWaterImagep->addTextureStats(1024.f*1024.f);
-	mWaterImagep->bind(1);
 	gGL.getTexUnit(1)->activate();
-	
-	glEnable(GL_TEXTURE_2D); // Texture unit 1
+	gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
+	gGL.getTexUnit(1)->bind(mWaterImagep.get());
 
 	LLVector3 camera_up = LLViewerCamera::getInstance()->getUpAxis();
 	F32 up_dot = camera_up * LLVector3::z_axis;
@@ -218,20 +217,20 @@ void LLDrawPoolWater::render(S32 pass)
 		{
 			continue;
 		}
-		face->bindTexture();
+		gGL.getTexUnit(0)->bind(face->getTexture());
 		face->renderIndexed();
 	}
 
 	// Now, disable texture coord generation on texture state 1
 	gGL.getTexUnit(1)->activate();
-	glDisable(GL_TEXTURE_2D); // Texture unit 1
+	gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
+	gGL.getTexUnit(1)->disable();
 	glDisable(GL_TEXTURE_GEN_S); //texture unit 1
 	glDisable(GL_TEXTURE_GEN_T); //texture unit 1
-	LLImageGL::unbindTexture(1, GL_TEXTURE_2D);
 
 	// Disable texture coordinate and color arrays
 	gGL.getTexUnit(0)->activate();
-	LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	stop_glerror();
 	
@@ -275,8 +274,9 @@ void LLDrawPoolWater::render(S32 pass)
 		{
 			gSky.mVOSkyp->getCubeMap()->disable();
 		}
-		LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
-		glEnable(GL_TEXTURE_2D);
+		
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+		gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
 		glMatrixMode(GL_TEXTURE);
 		glLoadIdentity();
 		glMatrixMode(GL_MODELVIEW);
@@ -316,7 +316,7 @@ void LLDrawPoolWater::renderReflection(LLFace* face)
 
 	LLGLSNoFog noFog;
 
-	LLViewerImage::bindTexture(mHBTex[dr]);
+	gGL.getTexUnit(0)->bind(mHBTex[dr].get());
 
 	LLOverrideFaceColor override(this, face->getFaceColor().mV);
 	face->renderIndexed();
@@ -390,7 +390,7 @@ void LLDrawPoolWater::shade()
 	if (reftex > -1)
 	{
 		gGL.getTexUnit(reftex)->activate();
-		gPipeline.mWaterRef.bindTexture();
+		gGL.getTexUnit(reftex)->bind(&gPipeline.mWaterRef);
 		gGL.getTexUnit(0)->activate();
 	}	
 
@@ -406,7 +406,7 @@ void LLDrawPoolWater::shade()
 	}
 
 	mWaterNormp->addTextureStats(1024.f*1024.f);
-	mWaterNormp->bind(bumpTex);
+	gGL.getTexUnit(bumpTex)->bind(mWaterNormp.get());
 	mWaterNormp->setMipFilterNearest (mWaterNormp->getMipFilterNearest(),
 									  !gSavedSettings.getBOOL("RenderWaterMipNormal"));
 	
@@ -421,8 +421,8 @@ void LLDrawPoolWater::shade()
 		shader->uniform1f(LLViewerShaderMgr::WATER_FOGDENSITY, 
 			param_mgr->getFogDensity());
 	}
-	
-	gPipeline.mWaterDis.bindTexture();
+
+	gGL.getTexUnit(screentex)->bind(&gPipeline.mWaterDis);	
 
 	if (mVertexShaderLevel == 1)
 	{
@@ -502,7 +502,7 @@ void LLDrawPoolWater::shade()
 			}
 
 			LLVOWater* water = (LLVOWater*) face->getViewerObject();
-			face->bindTexture(diffTex);
+			gGL.getTexUnit(diffTex)->bind(face->getTexture());
 
 			sNeedsReflectionUpdate = TRUE;
 			
@@ -527,7 +527,7 @@ void LLDrawPoolWater::shade()
 		}
 	}
 	
-	shader->disableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
+	shader->disableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
 	shader->disableTexture(LLViewerShaderMgr::WATER_SCREENTEX);	
 	shader->disableTexture(LLViewerShaderMgr::BUMP_MAP);
 	shader->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
@@ -536,7 +536,7 @@ void LLDrawPoolWater::shade()
 	shader->unbind();
 
 	gGL.getTexUnit(0)->activate();
-	glEnable(GL_TEXTURE_2D);
+	gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
 	gGL.setColorMask(true, false);
 
 }
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index 8802c1f..a8495d5 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -159,7 +159,7 @@ void LLDrawPoolWLSky::renderStars(void) const
 	// *NOTE: have to have bound the cloud noise texture already since register
 	// combiners blending below requires something to be bound
 	// and we might as well only bind once.
-	//LLGLEnable gl_texture_2d(GL_TEXTURE_2D);
+	//gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
 	
 	gPipeline.disableLights();
 
@@ -202,7 +202,8 @@ void LLDrawPoolWLSky::renderSkyClouds(F32 camHeightLocal) const
 		LLGLSBlendFunc blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
 
-		sCloudNoiseTexture->bind();
+		gGL.getTexUnit(0)->bind(sCloudNoiseTexture);
+
 		shader->bind();
 
 		/// Render the skydome
@@ -223,7 +224,7 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
 	if (gSky.mVOSkyp->getSun().getDraw() && face->getGeomCount())
 	{
 		LLImageGL * tex  = face->getTexture();
-		tex->bind();
+		gGL.getTexUnit(0)->bind(tex);
 		LLColor4 color(gSky.mVOSkyp->getSun().getInterpColor());
 		LLFacePool::LLOverrideFaceColor color_override(this, color);
 		face->renderIndexed();
@@ -238,7 +239,7 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
 		// stars register combiners, we bind again here for defensive reasons,
 		// since LLImageGL::bind detects that it's a noop, and optimizes it out.
 		LLImageGL * tex  = face->getTexture();
-		tex->bind();
+		gGL.getTexUnit(0)->bind(tex);
 		LLColor4 color(gSky.mVOSkyp->getMoon().getInterpColor());
 		F32 a = gSky.mVOSkyp->getMoon().getDirection().mV[2];
 		if (a > 0.f)
@@ -280,7 +281,7 @@ void LLDrawPoolWLSky::render(S32 pass)
 		// renderStars() requires something to be bound and we might as well only
 		// bind the moon's texture once.
 		LLImageGL * tex  = gSky.mVOSkyp->mFace[LLVOSky::FACE_MOON]->getTexture();
-		tex->bind();
+		gGL.getTexUnit(0)->bind(tex);
 
 		renderHeavenlyBodies();
 
@@ -291,7 +292,7 @@ void LLDrawPoolWLSky::render(S32 pass)
 
 	renderSkyClouds(camHeightLocal);
 
-	LLImageGL::unbindTexture(0);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 }
 
 void LLDrawPoolWLSky::prerender()
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index ad0cdec..9ce4515 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -32,7 +32,6 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "lldynamictexture.h"
-#include "llimagegl.h"
 #include "llglheaders.h"
 #include "llviewerwindow.h"
 #include "llviewercamera.h"
@@ -105,7 +104,7 @@ void LLDynamicTexture::generateGLTexture(LLGLint internal_format, LLGLenum prima
 	}
 	releaseGLTexture();
 	LLPointer<LLImageRaw> raw_image = new LLImageRaw(mWidth, mHeight, mComponents);
-	mTexture = new LLImageGL(mWidth, mHeight, mComponents, FALSE);
+	mTexture = new LLViewerImage(mWidth, mHeight, mComponents, FALSE);
 	if (internal_format >= 0)
 	{
 		mTexture->setExplicitFormat(internal_format, primary_format, type_format, swap_bytes);
@@ -113,6 +112,7 @@ void LLDynamicTexture::generateGLTexture(LLGLint internal_format, LLGLenum prima
 // 	llinfos << "ALLOCATING " << (mWidth*mHeight*mComponents)/1024 << "K" << llendl;
 	mTexture->createGLTexture(0, raw_image);
 	mTexture->setClamp(mClamp, mClamp);
+	mTexture->setInitialized(false);
 }
 
 //-----------------------------------------------------------------------------
@@ -144,7 +144,7 @@ void LLDynamicTexture::preRender(BOOL clear_depth)
 			mOrigin.mY = llmax(mOrigin.mY, 0) ;
 		}
 
-		LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	}
 	// Set up camera
 	mCamera.setOrigin(*LLViewerCamera::getInstance());
@@ -184,19 +184,6 @@ void LLDynamicTexture::postRender(BOOL success)
 }
 
 //-----------------------------------------------------------------------------
-// bindTexture()
-//-----------------------------------------------------------------------------
-void LLDynamicTexture::bindTexture()
-{
-	LLViewerImage::bindTexture(mTexture,0);
-}
-
-void LLDynamicTexture::unbindTexture()
-{
-	LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
-}
-
-//-----------------------------------------------------------------------------
 // static
 // updateDynamicTextures()
 // Calls update on each dynamic texture.  Calls each group in order: "first," then "middle," then "last."
diff --git a/indra/newview/lldynamictexture.h b/indra/newview/lldynamictexture.h
index 6069940..ff3e5c1 100644
--- a/indra/newview/lldynamictexture.h
+++ b/indra/newview/lldynamictexture.h
@@ -60,8 +60,8 @@ public:
 	virtual void preRender(BOOL clear_depth = TRUE);
 	virtual BOOL render();
 	virtual void postRender(BOOL success);
-	virtual void bindTexture();
-	virtual void unbindTexture();
+
+	LLImageGL* getTexture(void) const { return mTexture; }
 
 	static BOOL	updateAllInstances();
 
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 5b43fcd..3b5f8ab 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -362,10 +362,10 @@ void LLFace::renderForSelect(U32 data_mask)
 			switch (getPoolType())
 			{
 			case LLDrawPool::POOL_ALPHA:
-				getTexture()->bind();
+				gGL.getTexUnit(0)->bind(getTexture());
 				break;
 			default:
-				LLImageGL::unbindTexture(0);
+				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 				break;
 			}
 		}
@@ -390,19 +390,19 @@ void LLFace::renderForSelect(U32 data_mask)
 				{
 					glPushMatrix();
 					glMultMatrixf((float*) mDrawablep->getRegion()->mRenderMatrix.mMatrix);
-					mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, mIndicesCount, mIndicesIndex);
+					mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex);
 					glPopMatrix();
 				}
 				else
 				{
-					mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, mIndicesCount, mIndicesIndex);
+					mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex);
 				}
 			}
 			else
 			{
 				glPushMatrix();
 				glMultMatrixf((float*)getRenderMatrix().mMatrix);
-				mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, mIndicesCount, mIndicesIndex);
+				mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex);
 				glPopMatrix();
 			}
 		}
@@ -419,7 +419,7 @@ void LLFace::renderSelected(LLImageGL *imagep, const LLColor4& color)
 
 	if (mGeomCount > 0 && mIndicesCount > 0)
 	{
-		LLViewerImage::bindTexture(imagep);
+		gGL.getTexUnit(0)->bind(imagep);
 	
 		gGL.pushMatrix();
 		if (mDrawablep->isActive())
@@ -438,7 +438,7 @@ void LLFace::renderSelected(LLImageGL *imagep, const LLColor4& color)
 #if !LL_RELEASE_FOR_DOWNLOAD
 		LLGLState::checkClientArrays("", LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD);
 #endif
-		mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, mIndicesCount, mIndicesIndex);
+		mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex);
 				
 		unsetFaceColor();
 		gGL.popMatrix();
@@ -1203,7 +1203,7 @@ S32 LLFace::pushVertices(const U16* index_array) const
 {
 	if (mIndicesCount)
 	{
-		mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, mGeomIndex, mGeomIndex+mGeomCount-1, mIndicesCount, mIndicesIndex);
+		mVertexBuffer->drawRange(LLRender::TRIANGLES, mGeomIndex, mGeomIndex+mGeomCount-1, mIndicesCount, mIndicesIndex);
 		gPipeline.addTrianglesDrawn(mIndicesCount/3);
 	}
 
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index 0501dcc..497b93c 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -101,7 +101,6 @@ public:
 	void			setPixelArea(F32 area)	{ mPixelArea = area; }
 	F32				getVirtualSize() const { return mVSize; }
 	F32				getPixelArea() const { return mPixelArea; }
-	void			bindTexture(S32 stage = 0)		const	{ LLViewerImage::bindTexture(mTexture, stage); }
 
 	void			renderSetColor() const;
 	S32				renderElements(const U16 *index_array) const;
@@ -120,6 +119,7 @@ public:
 	LLVertexBuffer* getVertexBuffer()	const	{ return mVertexBuffer; }
 	void			setPoolType(U32 type)		{ mPoolType = type; }
 	S32				getTEOffset()				{ return mTEOffset; }
+	LLViewerImage*	getTexture()				{ return mTexture; }
 
 	void			setViewerObject(LLViewerObject* object);
 	void			setPool(LLFacePool *pool, LLViewerImage *texturep);
diff --git a/indra/newview/llface.inl b/indra/newview/llface.inl
index 8f8cfaf..7e9c9c1 100644
--- a/indra/newview/llface.inl
+++ b/indra/newview/llface.inl
@@ -33,6 +33,7 @@
 #define LL_LLFACE_INL
 
 #include "llglheaders.h"
+#include "llrender.h"
 
 inline BOOL LLFace::getDirty() const
 { 
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index f1ca99f..4449adf 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -116,6 +116,7 @@ static struct ft_display_info ft_display_table[] =
 	{ LLFastTimer::FTM_VFILE_WAIT,			"  VFile Wait",		&LLColor4::cyan6, 0 },
 //	{ LLFastTimer::FTM_IDLE_CB,				"  Callbacks",		&LLColor4::pink1, 0 },
 	{ LLFastTimer::FTM_RENDER,				" Render",			&green0, 1 },
+	{ LLFastTimer::FTM_PICK,				"  Pick",			&LLColor4::purple, 1 },
 	{ LLFastTimer::FTM_HUD_EFFECTS,			"  HUD Effects",	&LLColor4::orange1, 0 },
 	{ LLFastTimer::FTM_HUD_UPDATE,			"  HUD Update",	&LLColor4::orange2, 0 },
 	{ LLFastTimer::FTM_UPDATE_SKY,			"  Sky Update",		&LLColor4::cyan1, 0 },
@@ -463,7 +464,7 @@ void LLFastTimerView::draw()
 	
 	// Draw the window background
 	{
-		LLGLSNoTexture gls_ui_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4(0.f, 0.f, 0.f, 0.25f));
 	}
 	
@@ -755,7 +756,7 @@ void LLFastTimerView::draw()
 		LLRect graph_rect;
 		// Draw borders
 		{
-			LLGLSNoTexture gls_ui_no_texture;
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			gGL.color4f(0.5f,0.5f,0.5f,0.5f);
 
 			S32 by = y + 2;
@@ -792,7 +793,7 @@ void LLFastTimerView::draw()
 		
 		// Draw bars for each history entry
 		// Special: -1 = show running average
-		LLViewerImage::bindTexture(box_imagep->getImage());
+		gGL.getTexUnit(0)->bind(box_imagep->getImage());
 		for (S32 j=-1; j<histmax && y > LINE_GRAPH_HEIGHT; j++)
 		{
 			int sublevel_dx[FTV_DISPLAY_NUM+1];
@@ -936,7 +937,7 @@ void LLFastTimerView::draw()
 		
 		//draw line graph history
 		{
-			LLGLSNoTexture no_texture;
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			LLLocalClipRect clip(graph_rect);
 			
 			//normalize based on last frame's maximum
@@ -980,7 +981,7 @@ void LLFastTimerView::draw()
 
 					gGL.color4f(0.5f,0.5f,0.5f,1);
 				
-					gGL.begin(LLVertexBuffer::LINES);
+					gGL.begin(LLRender::LINES);
 					gGL.vertex2i((S32)bar, graph_rect.mBottom);
 					gGL.vertex2i((S32)bar, graph_rect.mTop);
 					gGL.end();
@@ -1016,7 +1017,7 @@ void LLFastTimerView::draw()
 				}
 
 				gGL.color4f(col[0], col[1], col[2], alpha);				
-				gGL.begin(LLVertexBuffer::LINE_STRIP);
+				gGL.begin(LLRender::LINE_STRIP);
 				for (U32 j = 0; j < LLFastTimer::FTM_HISTORY_NUM; j++)
 				{
 					U64 ticks = ticks_sum[j+1][idx];
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index a3da4f5..7883953 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -447,8 +447,6 @@ void LLFeatureManager::applyRecommendedSettings()
 	{
 		gSavedSettings.setF32("RenderFarClip", 128.0f);
 	}
-
-
 }
 
 void LLFeatureManager::applyFeatures(bool skipFeatures)
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index bbcfba6..088da4b 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -933,7 +933,7 @@ void LLFilePicker::chooser_responder(GtkWidget *widget, gint response, gpointer
 
 GtkWindow* LLFilePicker::buildFilePicker(bool is_save, bool is_folder, std::string context)
 {
-	if (ll_try_gtk_init() &&
+	if (LLWindowSDL::ll_try_gtk_init() &&
 	    ! gViewerWindow->getWindow()->getFullscreen())
 	{
 		GtkWidget *win = NULL;
@@ -974,7 +974,7 @@ GtkWindow* LLFilePicker::buildFilePicker(bool is_save, bool is_folder, std::stri
 		// Make GTK tell the window manager to associate this
 		// dialog with our non-GTK raw X11 window, which should try
 		// to keep it on top etc.
-		Window XWindowID = get_SDL_XWindowID();
+		Window XWindowID = LLWindowSDL::get_SDL_XWindowID();
 		if (None != XWindowID)
 		{
 			gtk_widget_realize(GTK_WIDGET(win)); // so we can get its gdkwin
diff --git a/indra/newview/llfloateractivespeakers.cpp b/indra/newview/llfloateractivespeakers.cpp
index 2352be3..bee6155 100644
--- a/indra/newview/llfloateractivespeakers.cpp
+++ b/indra/newview/llfloateractivespeakers.cpp
@@ -47,6 +47,7 @@
 #include "llsdutil.h"
 #include "llimview.h"
 #include "llviewerwindow.h"
+#include "llappviewer.h"
 
 const F32 SPEAKER_TIMEOUT = 10.f; // seconds of not being on voice channel before removed from list of active speakers
 const F32 RESORT_TIMEOUT = 5.f; // seconds of mouse inactivity before it's ok to sort regardless of mouse-in-view.
@@ -1358,6 +1359,11 @@ void LLLocalSpeakerMgr::updateSpeakerList()
 	// pull speakers from voice channel
 	LLSpeakerMgr::updateSpeakerList();
 
+	if (gDisconnected)//the world is cleared.
+	{
+		return ;
+	}
+
 	// add non-voice speakers in chat range
 	std::vector< LLCharacter* >::iterator avatar_it;
 	for(avatar_it = LLCharacter::sInstances.begin(); avatar_it != LLCharacter::sInstances.end(); ++avatar_it)
diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp
index 66b7a56..95c18df 100644
--- a/indra/newview/llfloateranimpreview.cpp
+++ b/indra/newview/llfloateranimpreview.cpp
@@ -384,9 +384,10 @@ void LLFloaterAnimPreview::draw()
 	if (mMotionID.notNull() && mAnimPreview)
 	{
 		gGL.color3f(1.f, 1.f, 1.f);
-		mAnimPreview->bindTexture();
 
-		gGL.begin( LLVertexBuffer::QUADS );
+		gGL.getTexUnit(0)->bind(mAnimPreview->getTexture());
+
+		gGL.begin( LLRender::QUADS );
 		{
 			gGL.texCoord2f(0.f, 1.f);
 			gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
@@ -399,7 +400,7 @@ void LLFloaterAnimPreview::draw()
 		}
 		gGL.end();
 
-		mAnimPreview->unbindTexture();
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 		LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
 		if (!avatarp->areAnimationsPaused())
@@ -1068,7 +1069,7 @@ BOOL	LLPreviewAnimation::render()
 	glLoadIdentity();
 
 	LLGLSUIDefault def;
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	gGL.color4f(0.15f, 0.2f, 0.3f, 1.f);
 
 	gl_rect_2d_simple( mWidth, mHeight );
diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp
index 80c43ab..a5929fd 100644
--- a/indra/newview/llfloaterauction.cpp
+++ b/indra/newview/llfloaterauction.cpp
@@ -148,7 +148,7 @@ void LLFloaterAuction::draw()
 		if (childGetRect("snapshot_icon", rect))
 		{
 			{
-				LLGLSNoTexture gls_no_texture;
+				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 				gl_rect_2d(rect, LLColor4(0.f, 0.f, 0.f, 1.f));
 				rect.stretch(-1);
 			}
@@ -205,7 +205,7 @@ void LLFloaterAuction::onClickSnapshot(void* data)
 		LLVFile::writeFile(j2c->getData(), j2c->getDataSize(), gVFS, self->mImageID, LLAssetType::AT_TEXTURE);
 
 		self->mImage = new LLImageGL((LLImageRaw*)raw, FALSE);
-		self->mImage->bind();
+		gGL.getTexUnit(0)->bind(self->mImage);
 		self->mImage->setClamp(TRUE, TRUE);
 	}
 	else
diff --git a/indra/newview/llfloaterbeacons.cpp b/indra/newview/llfloaterbeacons.cpp
new file mode 100644
index 0000000..0b73186
--- /dev/null
+++ b/indra/newview/llfloaterbeacons.cpp
@@ -0,0 +1,150 @@
+/** 
+ * @file llfloaterbeacons.cpp
+ * @brief Front-end to LLPipeline controls for highlighting various kinds of objects.
+ * @author Coco
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2008, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llfloaterbeacons.h"
+#include "llviewercontrol.h"
+#include "lluictrlfactory.h"
+#include "llcheckboxctrl.h"
+#include "pipeline.h"
+
+
+LLFloaterBeacons::LLFloaterBeacons(const LLSD& seed)
+{
+	LLUICtrlFactory::getInstance()->buildFloater(this, "floater_beacons.xml");
+
+	// Initialize pipeline states from saved settings.
+	// OK to do at floater constructor time because beacons do not display unless the floater is open
+	// therefore it is OK to not initialize the pipeline state before needed.
+	// Note also that we should replace those pipeline statics with direct lookup of the saved settings
+	// eliminating the need to keep these states in sync.
+	LLPipeline::setRenderScriptedTouchBeacons(gSavedSettings.getBOOL("scripttouchbeacon"));
+	LLPipeline::setRenderScriptedBeacons(     gSavedSettings.getBOOL("scriptsbeacon"));
+	LLPipeline::setRenderPhysicalBeacons(     gSavedSettings.getBOOL("physicalbeacon"));
+	LLPipeline::setRenderSoundBeacons(        gSavedSettings.getBOOL("soundsbeacon"));
+	LLPipeline::setRenderParticleBeacons(     gSavedSettings.getBOOL("particlesbeacon"));
+	LLPipeline::setRenderHighlights(          gSavedSettings.getBOOL("renderhighlights"));
+	LLPipeline::setRenderBeacons(             gSavedSettings.getBOOL("renderbeacons"));
+}
+
+BOOL LLFloaterBeacons::postBuild()
+{
+	childSetCommitCallback("touch_only",      onClickUICheck, this);
+	childSetCommitCallback("scripted",        onClickUICheck, this);
+	childSetCommitCallback("physical",        onClickUICheck, this);
+	childSetCommitCallback("sounds",          onClickUICheck, this);
+	childSetCommitCallback("particles",       onClickUICheck, this);
+	childSetCommitCallback("highlights",      onClickUICheck, this);
+	childSetCommitCallback("beacons",         onClickUICheck, this);
+	return TRUE;
+}
+
+// Needed to make the floater visibility toggle the beacons.
+// Too bad we can't just add control_name="BeaconAlwaysOn" to the XML.
+void LLFloaterBeacons::open()
+{
+	LLFloater::open();
+	gSavedSettings.setBOOL( "BeaconAlwaysOn", TRUE);
+}
+void LLFloaterBeacons::close(bool app_quitting)
+{
+	LLFloater::close(app_quitting);
+	if(!app_quitting)
+	{
+		gSavedSettings.setBOOL( "BeaconAlwaysOn", FALSE);
+	}
+}
+
+// Callback attached to each check box control to both affect their main purpose
+// and to implement the couple screwy interdependency rules that some have.
+//static 
+void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl, void* data)
+{
+	LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl;
+	std::string name = check->getName();
+	LLFloaterBeacons* view = (LLFloaterBeacons*)data;
+	if(     name == "touch_only")
+	{
+		LLPipeline::toggleRenderScriptedTouchBeacons(NULL);
+		// Don't allow both to be ON at the same time. Toggle the other one off if both now on.
+		if (
+			LLPipeline::getRenderScriptedTouchBeacons(NULL) &&
+			LLPipeline::getRenderScriptedBeacons(NULL) )
+		{
+			LLPipeline::setRenderScriptedBeacons(FALSE);
+			view->getChild<LLCheckBoxCtrl>("scripted")->setControlValue(LLSD(FALSE));
+			view->getChild<LLCheckBoxCtrl>("touch_only")->setControlValue(LLSD(TRUE)); // just to be sure it's in sync with llpipeline
+		}
+	}
+	else if(name == "scripted")
+	{
+		LLPipeline::toggleRenderScriptedBeacons(NULL);
+		// Don't allow both to be ON at the same time. Toggle the other one off if both now on.
+		if (
+			LLPipeline::getRenderScriptedTouchBeacons(NULL) &&
+			LLPipeline::getRenderScriptedBeacons(NULL) )
+		{
+			LLPipeline::setRenderScriptedTouchBeacons(FALSE);
+			view->getChild<LLCheckBoxCtrl>("touch_only")->setControlValue(LLSD(FALSE));
+			view->getChild<LLCheckBoxCtrl>("scripted")->setControlValue(LLSD(TRUE)); // just to be sure it's in sync with llpipeline
+		}
+	}
+	else if(name == "physical")       LLPipeline::setRenderPhysicalBeacons(check->get());
+	else if(name == "sounds")         LLPipeline::setRenderSoundBeacons(check->get());
+	else if(name == "particles")      LLPipeline::setRenderParticleBeacons(check->get());
+	else if(name == "highlights")
+	{
+		LLPipeline::toggleRenderHighlights(NULL);
+		// Don't allow both to be OFF at the same time. Toggle the other one on if both now off.
+		if (
+			!LLPipeline::getRenderBeacons(NULL) &&
+			!LLPipeline::getRenderHighlights(NULL) )
+		{
+			LLPipeline::setRenderBeacons(TRUE);
+			view->getChild<LLCheckBoxCtrl>("beacons")->setControlValue(LLSD(TRUE));
+			view->getChild<LLCheckBoxCtrl>("highlights")->setControlValue(LLSD(FALSE)); // just to be sure it's in sync with llpipeline
+		}
+	}
+	else if(name == "beacons")
+	{
+		LLPipeline::toggleRenderBeacons(NULL);
+		// Don't allow both to be OFF at the same time. Toggle the other one on if both now off.
+		if (
+			!LLPipeline::getRenderBeacons(NULL) &&
+			!LLPipeline::getRenderHighlights(NULL) )
+		{
+			LLPipeline::setRenderHighlights(TRUE);
+			view->getChild<LLCheckBoxCtrl>("highlights")->setControlValue(LLSD(TRUE));
+			view->getChild<LLCheckBoxCtrl>("beacons")->setControlValue(LLSD(FALSE)); // just to be sure it's in sync with llpipeline
+		}
+	}
+}
diff --git a/indra/newview/llfloaterbeacons.h b/indra/newview/llfloaterbeacons.h
new file mode 100644
index 0000000..e608dab
--- /dev/null
+++ b/indra/newview/llfloaterbeacons.h
@@ -0,0 +1,56 @@
+/** 
+ * @file llfloaterbeacons.h
+ * @brief Front-end to LLPipeline controls for highlighting various kinds of objects.
+ * @author Coco 
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2008, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERBEACONS_H
+#define LL_LLFLOATERBEACONS_H
+
+#include "llfloater.h"
+
+class LLFloaterBeacons : public LLFloater, public LLFloaterSingleton<LLFloaterBeacons>
+{
+	friend class LLUISingleton<LLFloaterBeacons, VisibilityPolicy<LLFloater> >;
+	
+public:
+	/*virtual*/ BOOL postBuild();
+	
+	// Needed to make the floater visibility toggle the beacons.
+	// Too bad we can't just add control_name="BeaconAlwaysOn" to the XML.
+	/*virtual*/ void open();
+	/*virtual*/ void close(bool app_quitting);
+
+private:
+	LLFloaterBeacons(const LLSD& seed);
+
+	static void onClickUICheck(LLUICtrl *ctrl, void* data);
+};
+
+#endif
diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp
index 5d815fa..9e8556f 100644
--- a/indra/newview/llfloaterbuy.cpp
+++ b/indra/newview/llfloaterbuy.cpp
@@ -289,11 +289,6 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj,
 	removeVOInventoryListener();
 }
 
-void LLFloaterBuy::close(bool app_quitting)
-{
-	LLSelectMgr::getInstance()->deselectAll();
-	LLFloater::close(app_quitting);
-}
 
 // static
 void LLFloaterBuy::onClickBuy(void*)
@@ -325,3 +320,10 @@ void LLFloaterBuy::onClickCancel(void*)
 		sInstance->close();
 	}
 }
+
+void LLFloaterBuy::onClose(bool app_quitting)
+{
+	// drop reference to current selection so selection goes away
+	mObjectSelection = NULL;
+	LLFloater::onClose(app_quitting);
+}
diff --git a/indra/newview/llfloaterbuy.h b/indra/newview/llfloaterbuy.h
index 0eef41b..8c0e144 100644
--- a/indra/newview/llfloaterbuy.h
+++ b/indra/newview/llfloaterbuy.h
@@ -57,6 +57,7 @@ protected:
 	LLFloaterBuy();
 	~LLFloaterBuy();
 
+	/*virtual*/ void onClose(bool app_quitting);
 	void reset();
 
 	void requestObjectInventories();
@@ -65,8 +66,6 @@ protected:
 								 S32 serial_num,
 								 void* data);
 
-	/*virtual*/ void close(bool app_quitting = false);
-
 	static void onClickBuy(void*);
 	static void onClickCancel(void*);
 
diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp
index cbd41f4..1cbf314 100644
--- a/indra/newview/llfloaterbuycurrency.cpp
+++ b/indra/newview/llfloaterbuycurrency.cpp
@@ -358,11 +358,6 @@ void LLFloaterBuyCurrencyUI::onClickErrorWeb(void* data)
 // static
 void LLFloaterBuyCurrency::buyCurrency()
 {
-	if (gHideLinks)
-	{
-		return;
-	}
-
 	LLFloaterBuyCurrencyUI* ui = LLFloaterBuyCurrencyUI::soleInstance(true);
 	ui->noTarget();
 	ui->updateUI();
@@ -371,15 +366,6 @@ void LLFloaterBuyCurrency::buyCurrency()
 
 void LLFloaterBuyCurrency::buyCurrency(const std::string& name, S32 price)
 {
-	if (gHideLinks)
-	{
-		LLStringUtil::format_map_t args;
-		args["[NAME]"] = name;
-		args["[PRICE]"] = llformat("%d", price);
-		gViewerWindow->alertXml("NotEnoughCurrency", args);
-		return;
-	}
-	
 	LLFloaterBuyCurrencyUI* ui = LLFloaterBuyCurrencyUI::soleInstance(true);
 	ui->target(name, price);
 	ui->updateUI();
diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp
index 1ffbeb3..9b2a5f6 100644
--- a/indra/newview/llfloatercolorpicker.cpp
+++ b/indra/newview/llfloatercolorpicker.cpp
@@ -165,7 +165,7 @@ createUI ()
 		}
 	}
 	mRGBImage = new LLImageGL ( (LLImageRaw*)raw, FALSE );
-	mRGBImage->bind();
+	gGL.getTexUnit(0)->bind(mRGBImage);
 	mRGBImage->setClamp(TRUE, TRUE);
 	
 	// create palette
@@ -543,9 +543,9 @@ void LLFloaterColorPicker::draw()
 	LLRect local_rect = getLocalRect();
 	if (gFocusMgr.childHasKeyboardFocus(this) && mSwatch->isInVisibleChain() && mContextConeOpacity > 0.001f)
 	{
-		LLGLSNoTexture no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		LLGLEnable(GL_CULL_FACE);
-		gGL.begin(LLVertexBuffer::QUADS);
+		gGL.begin(LLRender::QUADS);
 		{
 			gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
 			gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mTop);
diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index 912a4fc..8f592b2 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -232,14 +232,14 @@ void LLFloaterImagePreview::draw()
 		
 			if (mGLName)
 			{
-				LLImageGL::bindExternalTexture( mGLName, 0, GL_TEXTURE_2D ); 
+				gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mGLName);
 			}
 			else
 			{
 				glGenTextures(1, &mGLName );
 				stop_glerror();
 
-				LLImageGL::bindExternalTexture( mGLName, 0, GL_TEXTURE_2D ); 
+				gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mGLName);
 				stop_glerror();
 
 				glTexImage2D(
@@ -251,8 +251,7 @@ void LLFloaterImagePreview::draw()
 				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 				
-				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+				gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
 				if (mAvatarPreview)
 				{
 					mAvatarPreview->setTexture(mGLName);
@@ -261,7 +260,7 @@ void LLFloaterImagePreview::draw()
 			}
 
 			gGL.color3f(1.f, 1.f, 1.f);
-			gGL.begin( LLVertexBuffer::QUADS );
+			gGL.begin( LLRender::QUADS );
 			{
 				gGL.texCoord2f(mPreviewImageRect.mLeft, mPreviewImageRect.mTop);
 				gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
@@ -274,7 +273,7 @@ void LLFloaterImagePreview::draw()
 			}
 			gGL.end();
 
-			LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 			stop_glerror();
 		}
@@ -285,11 +284,15 @@ void LLFloaterImagePreview::draw()
 				gGL.color3f(1.f, 1.f, 1.f);
 
 				if (selected == 9)
-					mSculptedPreview->bindTexture();
+				{
+					gGL.getTexUnit(0)->bind(mSculptedPreview->getTexture());
+				}
 				else
-					mAvatarPreview->bindTexture();
+				{
+					gGL.getTexUnit(0)->bind(mAvatarPreview->getTexture());
+				}
 
-				gGL.begin( LLVertexBuffer::QUADS );
+				gGL.begin( LLRender::QUADS );
 				{
 					gGL.texCoord2f(0.f, 1.f);
 					gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
@@ -302,10 +305,7 @@ void LLFloaterImagePreview::draw()
 				}
 				gGL.end();
 
-				if (selected == 9)
-					mSculptedPreview->unbindTexture();
-				else
-					mAvatarPreview->unbindTexture();
+				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			}
 		}
 	}
@@ -774,7 +774,9 @@ LLImagePreviewSculpted::LLImagePreviewSculpted(S32 width, S32 height) : LLDynami
 	LLVolumeParams volume_params;
 	volume_params.setType(LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_CIRCLE);
 	volume_params.setSculptID(LLUUID::null, LL_SCULPT_TYPE_SPHERE);
-	mVolume = new LLVolume(volume_params, (F32) MAX_LOD);
+	
+	F32 const HIGHEST_LOD = 4.0f;
+	mVolume = new LLVolume(volume_params,  HIGHEST_LOD);
 
 	/*
 	mDummyAvatar = new LLVOAvatar(LLUUID::null, LL_PCODE_LEGACY_AVATAR, gAgent.getRegion());
@@ -811,7 +813,36 @@ void LLImagePreviewSculpted::setPreviewTarget(LLImageRaw* imagep, F32 distance)
 	{
 		mVolume->sculpt(imagep->getWidth(), imagep->getHeight(), imagep->getComponents(), imagep->getData(), 0);
 	}
-	
+
+	const LLVolumeFace &vf = mVolume->getVolumeFace(0);
+	U32 num_indices = vf.mIndices.size();
+	U32 num_vertices = vf.mVertices.size();
+
+	mVertexBuffer = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL, 0);
+	mVertexBuffer->allocateBuffer(num_vertices, num_indices, TRUE);
+
+	LLStrider<LLVector3> vertex_strider;
+	LLStrider<LLVector3> normal_strider;
+	LLStrider<U16> index_strider;
+
+	mVertexBuffer->getVertexStrider(vertex_strider);
+	mVertexBuffer->getNormalStrider(normal_strider);
+	mVertexBuffer->getIndexStrider(index_strider);
+
+	// build vertices and normals
+	for (U32 i = 0; (S32)i < num_vertices; i++)
+	{
+		*(vertex_strider++) = vf.mVertices[i].mPosition;
+		LLVector3 normal = vf.mVertices[i].mNormal;
+		normal.normalize();
+		*(normal_strider++) = normal;
+	}
+
+	// build indices
+	for (U16 i = 0; i < num_indices; i++)
+	{
+		*(index_strider++) = vf.mIndices[i];
+	}
 }
 
 
@@ -846,7 +877,7 @@ BOOL LLImagePreviewSculpted::render()
 	glMatrixMode(GL_MODELVIEW);
 	gGL.popMatrix();
 
-	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+	glClear(GL_DEPTH_BUFFER_BIT);
 	
 	LLVector3 target_pos(0, 0, 0);
 
@@ -865,55 +896,21 @@ BOOL LLImagePreviewSculpted::render()
 	LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / mCameraZoom);
 	LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mWidth, mHeight, FALSE);
 
-	gPipeline.enableLightsAvatar();
-		
-	gGL.pushMatrix();
-	glScalef(0.5, 0.5, 0.5);
-	
 	const LLVolumeFace &vf = mVolume->getVolumeFace(0);
 	U32 num_indices = vf.mIndices.size();
-	U32 num_vertices = vf.mVertices.size();
-
-	if (num_vertices > 0 && num_indices > 0)
-	{
-		glEnableClientState(GL_NORMAL_ARRAY);
-		// build vertices and normals
-		F32* vertices = new F32[num_vertices * 3];
-		F32* normals = new F32[num_vertices * 3];
-
-		for (U32 i = 0; (S32)i < num_vertices; i++)
-		{
-			LLVector3 position = vf.mVertices[i].mPosition;
-			vertices[i*3]   = position.mV[VX];
-			vertices[i*3+1] = position.mV[VY];
-			vertices[i*3+2] = position.mV[VZ];
-			
-			LLVector3 normal = vf.mVertices[i].mNormal;
-			normals[i*3]   = normal.mV[VX];
-			normals[i*3+1] = normal.mV[VY];
-			normals[i*3+2] = normal.mV[VZ];
-		}
+	
+	mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL);
 
-		// build indices
-		U16* indices = new U16[num_indices];
-		for (U16 i = 0; i < num_indices; i++)
-		{
-			indices[i] = vf.mIndices[i];
-		}
+	gPipeline.enableLightsAvatar();
+	gGL.pushMatrix();
+	const F32 SCALE = 1.25f;
+	gGL.scalef(SCALE, SCALE, SCALE);
+	const F32 BRIGHTNESS = 0.9f;
+	gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
+	mVertexBuffer->draw(LLRender::TRIANGLES, num_indices, 0);
 
-		gGL.color3f(0.4f, 0.4f, 0.4f);
-		glVertexPointer(3, GL_FLOAT, 0, (void *)vertices);
-		glNormalPointer(GL_FLOAT, 0, (void *)normals);
-		glDrawRangeElements(GL_TRIANGLES, 0, num_vertices-1, num_indices, GL_UNSIGNED_SHORT, (void *)indices);
+	gGL.popMatrix();
 		
-		gGL.popMatrix();
-		glDisableClientState(GL_NORMAL_ARRAY);
-
-		delete [] indices;
-		delete [] vertices;
-		delete [] normals;
-	}
-
 	return TRUE;
 }
 
diff --git a/indra/newview/llfloaterimagepreview.h b/indra/newview/llfloaterimagepreview.h
index 9d80f09..3e72736 100644
--- a/indra/newview/llfloaterimagepreview.h
+++ b/indra/newview/llfloaterimagepreview.h
@@ -41,6 +41,7 @@ class LLJoint;
 class LLViewerJointMesh;
 class LLVOAvatar;
 class LLTextBox;
+class LLVertexBuffer;
 
 class LLImagePreviewSculpted : public LLDynamicTexture
 {
@@ -67,6 +68,7 @@ class LLImagePreviewSculpted : public LLDynamicTexture
 	F32			mCameraZoom;
 	LLVector3	mCameraOffset;
 	LLPointer<LLVolume> mVolume;
+	LLPointer<LLVertexBuffer> mVertexBuffer;
 };
 
 
diff --git a/indra/newview/llfloaterjoystick.cpp b/indra/newview/llfloaterjoystick.cpp
index 172da1d..8f938ed 100644
--- a/indra/newview/llfloaterjoystick.cpp
+++ b/indra/newview/llfloaterjoystick.cpp
@@ -46,7 +46,7 @@
 #include "llviewerjoystick.h"
 
 LLFloaterJoystick::LLFloaterJoystick(const LLSD& data)
-	: LLFloater(std::string("floater_joystick"))
+	: LLFloater("floater_joystick")
 {
 	LLUICtrlFactory::getInstance()->buildFloater(this, "floater_joystick.xml");
 	center();
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 891cde7..a459d4d 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -1448,7 +1448,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
 		msg->getBOOLFast(_PREHASH_Data, _PREHASH_IsGroupOwned,	is_group_owned,	i);
 		msg->getS32Fast (_PREHASH_Data, _PREHASH_Count,			object_count,	i);
 		msg->getBOOLFast(_PREHASH_Data, _PREHASH_OnlineStatus,	is_online,		i);
-		if(msg->getNumberOfBlocks("DataExtended"))
+		if(msg->has("DataExtended"))
 		{
 			msg->getU32("DataExtended", "TimeStamp", most_recent_time, i);
 		}
diff --git a/indra/newview/llfloaterlandmark.cpp b/indra/newview/llfloaterlandmark.cpp
index 71e35e8..a8c08bb 100644
--- a/indra/newview/llfloaterlandmark.cpp
+++ b/indra/newview/llfloaterlandmark.cpp
@@ -34,73 +34,28 @@
 #include "llfloaterlandmark.h"
 
 #include "llagent.h"
-#include "llviewerimagelist.h"
 #include "llcheckboxctrl.h"
-#include "llcombobox.h"
-#include "llbutton.h"
-#include "lldraghandle.h"
-#include "llfocusmgr.h"
-#include "llviewerimage.h"
 #include "llviewerparcelmgr.h"
 #include "llfolderview.h"
 #include "llinventory.h"
 #include "llinventorymodel.h"
 #include "llinventoryview.h"
-#include "lllineeditor.h"
-#include "llui.h"
 #include "llviewerinventory.h"
 #include "llpermissions.h"
 #include "llsaleinfo.h"
-#include "llassetstorage.h"
-#include "lltextbox.h"
 #include "llparcel.h"
-#include "llresizehandle.h"
-#include "llscrollcontainer.h"
-#include "lltoolmgr.h"
-#include "lltoolpipette.h"
-
-#include "lltool.h"
-#include "llviewerwindow.h"
-#include "llviewerobject.h"
+
+#include "llviewerwindow.h"		// alertXml
 #include "llviewercontrol.h"
-#include "llglheaders.h"
 #include "lluictrlfactory.h"
 
-#include "roles_constants.h"
-
-
-
-static const S32 CLOSE_BTN_WIDTH = 100;
-const S32 PIPETTE_BTN_WIDTH = 32;
-static const S32 HPAD = 4;
-static const S32 VPAD = 4;
-static const S32 LINE = 16;
-static const S32 SMALL_BTN_WIDTH = 64;
-static const S32 TEX_PICKER_MIN_WIDTH = 
-	(HPAD +
-	CLOSE_BTN_WIDTH +
-	HPAD +
-	CLOSE_BTN_WIDTH +
-	HPAD + 
-	SMALL_BTN_WIDTH +
-	HPAD +
-	SMALL_BTN_WIDTH +
-	HPAD + 
-	30 +
-	RESIZE_HANDLE_WIDTH * 2);
-static const S32 CLEAR_BTN_WIDTH = 50;
-static const S32 TEX_PICKER_MIN_HEIGHT = 290;
-static const S32 FOOTER_HEIGHT = 100;
-static const S32 BORDER_PAD = HPAD;
-static const S32 TEXTURE_INVENTORY_PADDING = 30;
+#include "roles_constants.h"	// GP_LAND_ALLOW_LANDMARK
+
+
 static const F32 CONTEXT_CONE_IN_ALPHA = 0.0f;
 static const F32 CONTEXT_CONE_OUT_ALPHA = 1.f;
 static const F32 CONTEXT_FADE_TIME = 0.08f;
 
-//static const char CURRENT_IMAGE_NAME[] = "Current Landmark";
-//static const char WHITE_IMAGE_NAME[] = "Blank Landmark";
-//static const char NO_IMAGE_NAME[] = "None";
-
 
 LLFloaterLandmark::LLFloaterLandmark(const LLSD& data)
 	:
@@ -167,6 +122,7 @@ LLFloaterLandmark::LLFloaterLandmark(const LLSD& data)
 LLFloaterLandmark::~LLFloaterLandmark()
 {
 	delete mSavedFolderState;
+	mSavedFolderState = NULL;
 }
 
 void LLFloaterLandmark::setActive( BOOL active )					
diff --git a/indra/newview/llfloaterlandmark.h b/indra/newview/llfloaterlandmark.h
index cf71138..27139a7 100644
--- a/indra/newview/llfloaterlandmark.h
+++ b/indra/newview/llfloaterlandmark.h
@@ -32,9 +32,7 @@
 #ifndef LL_LLFLOATERLANDMARK_H
 #define LL_LLFLOATERLANDMARK_H
 
-#include "llcoord.h"
 #include "llfloater.h"
-#include "llstring.h"
 #include "lluictrl.h"
 #include "llpermissionsflags.h"
 
diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp
index b4bcdb7..4be8145 100644
--- a/indra/newview/llfloaterpostcard.cpp
+++ b/indra/newview/llfloaterpostcard.cpp
@@ -63,6 +63,8 @@
 
 #include "llassetuploadresponders.h"
 
+#include <boost/regex.hpp>  //boost.regex lib
+
 ///----------------------------------------------------------------------------
 /// Local function declarations, constants, enums, and typedefs
 ///----------------------------------------------------------------------------
@@ -180,7 +182,7 @@ void LLFloaterPostcard::draw()
 			rect.mBottom = (S32)((F32)rect.mTop - ((F32)rect.getWidth() / ratio));
 		}
 		{
-			LLGLSNoTexture gls_no_texture;
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			gl_rect_2d(rect, LLColor4(0.f, 0.f, 0.f, 1.f));
 			rect.stretch(-1);
 		}
@@ -242,14 +244,16 @@ void LLFloaterPostcard::onClickSend(void* data)
 
 		std::string from(self->childGetValue("from_form").asString());
 		std::string to(self->childGetValue("to_form").asString());
-
-		if (to.empty() || to.find('@') == std::string::npos)
+		
+		boost::regex emailFormat("[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}");
+		
+		if (to.empty() || !boost::regex_match(to, emailFormat))
 		{
 			gViewerWindow->alertXml("PromptRecipientEmail");
 			return;
 		}
 
-		if (from.empty() || from.find('@') == std::string::npos)
+		if (from.empty() || !boost::regex_match(from, emailFormat))
 		{
 			gViewerWindow->alertXml("PromptSelfEmail");
 			return;
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 82d8cc9..b907aed 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -424,8 +424,6 @@ void LLFloaterPreference::onClickAbout(void*)
 // static 
 void LLFloaterPreference::onBtnOK( void* userdata )
 {
-	LLPanelLogin::refreshLocation( false );
-
 	LLFloaterPreference *fp =(LLFloaterPreference *)userdata;
 	// commit any outstanding text entry
 	if (fp->hasFocus())
@@ -453,6 +451,8 @@ void LLFloaterPreference::onBtnOK( void* userdata )
 		// Show beep, pop up dialog, etc.
 		llinfos << "Can't close preferences!" << llendl;
 	}
+
+	LLPanelLogin::refreshLocation( false );
 }
 
 
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 954bf9f..afa0785 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -151,7 +151,8 @@ public:
 	void resetThumbnailImage() { mThumbnailImage = NULL ; }
 	void drawPreviewRect(S32 offset_x, S32 offset_y) ;
 
-	static void onIdle( void* snapshot_preview );
+	// Returns TRUE when snapshot generated, FALSE otherwise.
+	static BOOL onIdle( void* snapshot_preview );
 
 private:
 	LLColor4					mColor;
@@ -203,6 +204,8 @@ LLSnapshotLivePreview::LLSnapshotLivePreview (const LLRect& rect) :
 	mCurImageIndex(0),
 	mPreviewImage(NULL),
 	mThumbnailImage(NULL) ,
+	mThumbnailWidth(0),
+	mThumbnailHeight(0),
 	mPreviewImageEncoded(NULL),
 	mFormattedImage(NULL),
 	mShineCountdown(0),
@@ -342,14 +345,11 @@ void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail
 		mSnapshotDelayTimer.start();
 		mSnapshotDelayTimer.setTimerExpirySec(delay);
 	}
-	else if(new_thumbnail)
+	if(new_thumbnail)
 	{
 		mThumbnailUpToDate = FALSE ;
 	}
-	else
-	{
-		setThumbnailImageSize() ;
-	}
+	setThumbnailImageSize();
 }
 
 void LLSnapshotLivePreview::setSnapshotQuality(S32 quality)
@@ -417,14 +417,14 @@ void LLSnapshotLivePreview::draw()
 
 		LLColor4 image_color(1.f, 1.f, 1.f, 1.f);
 		gGL.color4fv(image_color.mV);
-		LLViewerImage::bindTexture(mViewerImage[mCurImageIndex]);
+		gGL.getTexUnit(0)->bind(mViewerImage[mCurImageIndex]);
 		// calculate UV scale
 		F32 uv_width = mImageScaled[mCurImageIndex] ? 1.f : llmin((F32)mWidth[mCurImageIndex] / (F32)mViewerImage[mCurImageIndex]->getWidth(), 1.f);
 		F32 uv_height = mImageScaled[mCurImageIndex] ? 1.f : llmin((F32)mHeight[mCurImageIndex] / (F32)mViewerImage[mCurImageIndex]->getHeight(), 1.f);
 		glPushMatrix();
 		{
 			glTranslatef((F32)rect.mLeft, (F32)rect.mBottom, 0.f);
-			gGL.begin(LLVertexBuffer::QUADS);
+			gGL.begin(LLRender::QUADS);
 			{
 				gGL.texCoord2f(uv_width, uv_height);
 				gGL.vertex2i(rect.getWidth(), rect.getHeight() );
@@ -486,8 +486,8 @@ void LLSnapshotLivePreview::draw()
 				S32 y1 = 0;
 				S32 y2 = gViewerWindow->getWindowHeight();
 
-				LLGLSNoTexture no_texture;
-				gGL.begin(LLVertexBuffer::QUADS);
+				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+				gGL.begin(LLRender::QUADS);
 				{
 					gGL.color4f(1.f, 1.f, 1.f, 0.f);
 					gGL.vertex2i(x1, y1);
@@ -515,10 +515,10 @@ void LLSnapshotLivePreview::draw()
 
 	// draw framing rectangle
 	{
-		LLGLSNoTexture no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gGL.color4f(1.f, 1.f, 1.f, 1.f);
 		LLRect outline_rect = mImageRect[mCurImageIndex];
-		gGL.begin(LLVertexBuffer::QUADS);
+		gGL.begin(LLRender::QUADS);
 		{
 			gGL.vertex2i(outline_rect.mLeft - BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH);
 			gGL.vertex2i(outline_rect.mRight + BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH);
@@ -553,7 +553,7 @@ void LLSnapshotLivePreview::draw()
 			F32 alpha = clamp_rescale(fall_interp, 0.f, 1.f, 0.8f, 0.4f);
 			LLColor4 image_color(1.f, 1.f, 1.f, alpha);
 			gGL.color4fv(image_color.mV);
-			LLViewerImage::bindTexture(mViewerImage[old_image_index]);
+			gGL.getTexUnit(0)->bind(mViewerImage[old_image_index]);
 			// calculate UV scale
 			// *FIX get this to work with old image
 			BOOL rescale = !mImageScaled[old_image_index] && mViewerImage[mCurImageIndex].notNull();
@@ -564,7 +564,7 @@ void LLSnapshotLivePreview::draw()
 				LLRect& rect = mImageRect[old_image_index];
 				glTranslatef((F32)rect.mLeft, (F32)rect.mBottom - llround(getRect().getHeight() * 2.f * (fall_interp * fall_interp)), 0.f);
 				glRotatef(-45.f * fall_interp, 0.f, 0.f, 1.f);
-				gGL.begin(LLVertexBuffer::QUADS);
+				gGL.begin(LLRender::QUADS);
 				{
 					gGL.texCoord2f(uv_width, uv_height);
 					gGL.vertex2i(rect.getWidth(), rect.getHeight() );
@@ -719,8 +719,11 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update)
 	mThumbnailUpdateLock = FALSE ;		
 }
 
+
+// Called often. Checks whether it's time to grab a new snapshot and if so, does it.
+// Returns TRUE if new snapshot generated, FALSE otherwise.
 //static 
-void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
+BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
 {
 	LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview;	
 
@@ -733,7 +736,10 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
 		previewp->mCameraRot = new_camera_rot;
 		// request a new snapshot whenever the camera moves, with a time delay
 		BOOL autosnap = gSavedSettings.getBOOL("AutoSnapshot");
-		previewp->updateSnapshot(autosnap, FALSE, autosnap ? AUTO_SNAPSHOT_TIME_DELAY : 0.f);
+		previewp->updateSnapshot(
+			autosnap, // whether a new snapshot is needed or merely invalidate the existing one
+			FALSE, // or if 1st arg is false, whether to produce a new thumbnail image.
+			autosnap ? AUTO_SNAPSHOT_TIME_DELAY : 0.f); // shutter delay if 1st arg is true.
 	}
 
 	// see if it's time yet to snap the shot and bomb out otherwise.
@@ -742,7 +748,7 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
 		&& !LLToolCamera::getInstance()->hasMouseCapture(); // don't take snapshots while ALT-zoom active
 	if ( ! previewp->mSnapshotActive)
 	{
-		return;
+		return FALSE;
 	}
 
 	// time to produce a snapshot
@@ -819,6 +825,7 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
 			}
 			if (previewp->mFormattedImage->encode(previewp->mPreviewImage, 0))
 			{
+				previewp->mDataSize = previewp->mFormattedImage->getDataSize();
 				// special case BMP to copy instead of decode otherwise decode will crash.
 				if(format == LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP)
 				{
@@ -826,7 +833,6 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
 				}
 				else
 				{
-					previewp->mDataSize = previewp->mFormattedImage->getDataSize();
 					previewp->mFormattedImage->decode(previewp->mPreviewImageEncoded, 0);
 				}
 			}
@@ -855,7 +861,7 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
 
 			previewp->mViewerImage[previewp->mCurImageIndex] = new LLImageGL(scaled, FALSE);
 			previewp->mViewerImage[previewp->mCurImageIndex]->setMipFilterNearest(previewp->getSnapshotType() != SNAPSHOT_TEXTURE);
-			LLViewerImage::bindTexture(previewp->mViewerImage[previewp->mCurImageIndex]);
+			gGL.getTexUnit(0)->bind(previewp->mViewerImage[previewp->mCurImageIndex]);
 			previewp->mViewerImage[previewp->mCurImageIndex]->setClamp(TRUE, TRUE);
 
 			previewp->mSnapshotUpToDate = TRUE;
@@ -875,6 +881,8 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
 	{
 		previewp->generateThumbnailImage() ;
 	}
+
+	return TRUE;
 }
 
 void LLSnapshotLivePreview::setSize(S32 w, S32 h)
@@ -952,7 +960,7 @@ void LLSnapshotLivePreview::saveTexture()
 		llwarns << "Error encoding snapshot" << llendl;
 	}
 
-	LLViewerStats::getInstance()->incStat(LLViewerStats::ST_SNAPSHOT_COUNT );	
+	LLViewerStats::getInstance()->incStat(LLViewerStats::ST_SNAPSHOT_COUNT );
 }
 
 BOOL LLSnapshotLivePreview::saveLocal()
@@ -996,7 +1004,8 @@ public:
 	static void onClickKeepOpenCheck(LLUICtrl *ctrl, void* data);
 	static void onClickKeepAspectCheck(LLUICtrl *ctrl, void* data);
 	static void onCommitQuality(LLUICtrl* ctrl, void* data);
-	static void onCommitResolution(LLUICtrl* ctrl, void* data);
+	static void onCommitResolution(LLUICtrl* ctrl, void* data) { updateResolution(ctrl, data); }
+	static void updateResolution(LLUICtrl* ctrl, void* data, BOOL do_update = TRUE);
 	static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data);
 	static void onCommitLayerTypes(LLUICtrl* ctrl, void*data);
 	static void onCommitSnapshotType(LLUICtrl* ctrl, void* data);
@@ -1093,11 +1102,8 @@ LLViewerWindow::ESnapshotType LLFloaterSnapshot::Impl::getLayerType(LLFloaterSna
 void LLFloaterSnapshot::Impl::setResolution(LLFloaterSnapshot* floater, const std::string& comboname)
 {
 	LLComboBox* combo = floater->getChild<LLComboBox>(comboname);
-	if (combo)
-	{
 		combo->setVisible(TRUE);
-		onCommitResolution(combo, floater);
-	}
+	updateResolution(combo, floater, FALSE); // to sync spinners with combo
 }
 
 //static 
@@ -1107,22 +1113,18 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
 
 	S32 delta_height = gSavedSettings.getBOOL("AdvanceSnapshot") ? 0 : floaterp->getUIWinHeightShort() - floaterp->getUIWinHeightLong() ;
 
-	LLComboBox* combo;
 	if(!gSavedSettings.getBOOL("AdvanceSnapshot")) //set to original window resolution
 	{
-		previewp->mKeepAspectRatio = TRUE ;
+		previewp->mKeepAspectRatio = TRUE;
 
-		combo = floaterp->getChild<LLComboBox>("postcard_size_combo");
-		combo->setCurrentByIndex(0) ;
-		gSavedSettings.setS32("SnapshotPostcardLastResolution", 0) ;
+		floaterp->getChild<LLComboBox>("postcard_size_combo")->setCurrentByIndex(0);
+		gSavedSettings.setS32("SnapshotPostcardLastResolution", 0);
 
-		combo = floaterp->getChild<LLComboBox>("texture_size_combo");
-		combo->setCurrentByIndex(0) ;
-		gSavedSettings.setS32("SnapshotTextureLastResolution", 0) ;
+		floaterp->getChild<LLComboBox>("texture_size_combo")->setCurrentByIndex(0);
+		gSavedSettings.setS32("SnapshotTextureLastResolution", 0);
 
-		combo = floaterp->getChild<LLComboBox>("local_size_combo");
-		combo->setCurrentByIndex(0) ;
-		gSavedSettings.setS32("SnapshotLocalLastResolution", 0) ;
+		floaterp->getChild<LLComboBox>("local_size_combo")->setCurrentByIndex(0);
+		gSavedSettings.setS32("SnapshotLocalLastResolution", 0);
 
 		LLSnapshotLivePreview* previewp = getPreviewView(floaterp);
 		previewp->setSize(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight());
@@ -1187,7 +1189,11 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
 	}
 }
 
-
+// This is the main function that keeps all the GUI controls in sync with the saved settings.
+// It should be called anytime a setting is changed that could affect the controls.
+// No other methods should be changing any of the controls directly except for helpers called by this method.
+// The basic pattern for programmatically changing the GUI settings is to first set the
+// appropriate saved settings and then call this method to sync the GUI with them.
 // static
 void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
 {
@@ -1201,15 +1207,10 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
 	floater->childSetVisible("texture_size_combo", FALSE);
 	floater->childSetVisible("local_size_combo", FALSE);
 
-	LLComboBox* combo;
-	combo = floater->getChild<LLComboBox>("postcard_size_combo");
-	if (combo) combo->selectNthItem(gSavedSettings.getS32("SnapshotPostcardLastResolution"));
-	combo = floater->getChild<LLComboBox>("texture_size_combo");
-	if (combo) combo->selectNthItem(gSavedSettings.getS32("SnapshotTextureLastResolution"));
-	combo = floater->getChild<LLComboBox>("local_size_combo");
-	if (combo) combo->selectNthItem(gSavedSettings.getS32("SnapshotLocalLastResolution"));
-	combo = floater->getChild<LLComboBox>("local_format_combo");
-	if (combo) combo->selectNthItem(gSavedSettings.getS32("SnapshotFormat"));
+	floater->getChild<LLComboBox>("postcard_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotPostcardLastResolution"));
+	floater->getChild<LLComboBox>("texture_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotTextureLastResolution"));
+	floater->getChild<LLComboBox>("local_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotLocalLastResolution"));
+	floater->getChild<LLComboBox>("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat"));
 
 	floater->childSetVisible("upload_btn",			shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE);
 	floater->childSetVisible("send_btn",			shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD);
@@ -1240,6 +1241,23 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
 	floater->childSetVisible("auto_snapshot_check",		is_advance);
 	floater->childSetVisible("image_quality_slider",	is_advance && show_slider);
 
+	LLSnapshotLivePreview* previewp = getPreviewView(floater);
+	BOOL got_bytes = previewp && previewp->getDataSize() > 0;
+	BOOL got_snap = previewp->getSnapshotUpToDate();
+
+	floater->childSetEnabled("send_btn",   shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD && got_bytes && got_snap && previewp->getDataSize() <= MAX_POSTCARD_DATASIZE);
+	floater->childSetEnabled("upload_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE  && got_bytes && got_snap);
+	floater->childSetEnabled("save_btn",   shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL    && got_bytes && got_snap);
+
+	LLLocale locale(LLLocale::USER_LOCALE);
+	std::string bytes_string;
+	LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 );
+	floater->childSetTextArg("file_size_label", "[SIZE]", got_snap ? bytes_string : got_bytes ? floater->getString("unknown") : std::string("???"));
+	floater->childSetColor("file_size_label", 
+		shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD 
+		&& got_bytes
+		&& previewp->getDataSize() > MAX_POSTCARD_DATASIZE ? LLColor4::red : gColors.getColor( "LabelTextColor" ));
+
 	switch(shot_type)
 	{
 	  case LLSnapshotLivePreview::SNAPSHOT_POSTCARD:
@@ -1270,7 +1288,6 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
 
 	updateResolutionTextEntry(floater);
 
-	LLSnapshotLivePreview* previewp = getPreviewView(floater);
 	if (previewp)
 	{
 		previewp->setSnapshotType(shot_type);
@@ -1389,6 +1406,7 @@ void LLFloaterSnapshot::Impl::onClickAutoSnap(LLUICtrl *ctrl, void* data)
 	if (view)
 	{
 		checkAutoSnapshot(getPreviewView(view));
+		updateControls(view);
 	}
 }
 
@@ -1401,9 +1419,12 @@ void LLFloaterSnapshot::Impl::onClickMore(void* data)
 	{
 		view->translate( 0, view->getUIWinHeightShort() - view->getUIWinHeightLong() );
 		view->reshape(view->getRect().getWidth(), view->getUIWinHeightLong());
-
 		updateControls(view) ;
 		updateLayout(view) ;
+		if(getPreviewView(view))
+		{
+			getPreviewView(view)->setThumbnailImageSize() ;
+	}
 	}
 }
 void LLFloaterSnapshot::Impl::onClickLess(void* data)
@@ -1415,10 +1436,8 @@ void LLFloaterSnapshot::Impl::onClickLess(void* data)
 	{
 		view->translate( 0, view->getUIWinHeightLong() - view->getUIWinHeightShort() );
 		view->reshape(view->getRect().getWidth(), view->getUIWinHeightShort());
-
 		updateControls(view) ;
 		updateLayout(view) ;
-
 		if(getPreviewView(view))
 		{
 			getPreviewView(view)->setThumbnailImageSize() ;
@@ -1436,6 +1455,7 @@ void LLFloaterSnapshot::Impl::onClickUICheck(LLUICtrl *ctrl, void* data)
 	if (view)
 	{
 		checkAutoSnapshot(getPreviewView(view), TRUE);
+		updateControls(view);
 	}
 }
 
@@ -1449,6 +1469,7 @@ void LLFloaterSnapshot::Impl::onClickHUDCheck(LLUICtrl *ctrl, void* data)
 	if (view)
 	{
 		checkAutoSnapshot(getPreviewView(view), TRUE);
+		updateControls(view);
 	}
 }
 
@@ -1482,6 +1503,7 @@ void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data)
 			}
 
 			previewp->setSize(w, h) ;
+			previewp->updateSnapshot(FALSE, TRUE);
 			checkAutoSnapshot(previewp, TRUE);
 		}
 	}
@@ -1531,7 +1553,7 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde
 	}
 #endif
 	
-	if(!index) //current window size
+	if(0 == index) //current window size
 	{
 		sAspectRatioCheckOff = TRUE ;
 		view->childSetEnabled("keep_aspect_check", FALSE) ;
@@ -1568,8 +1590,27 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde
 	return ;
 }
 
+static std::string lastSnapshotWidthName()
+{
+	switch(gSavedSettings.getS32("LastSnapshotType"))
+	{
+	case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: return "LastSnapshotToEmailWidth";
+	case LLSnapshotLivePreview::SNAPSHOT_TEXTURE:  return "LastSnapshotToInventoryWidth";
+	default:                                       return "LastSnapshotToDiskWidth";
+	}
+}
+static std::string lastSnapshotHeightName()
+{
+	switch(gSavedSettings.getS32("LastSnapshotType"))
+	{
+	case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: return "LastSnapshotToEmailHeight";
+	case LLSnapshotLivePreview::SNAPSHOT_TEXTURE:  return "LastSnapshotToInventoryHeight";
+	default:                                       return "LastSnapshotToDiskHeight";
+	}
+}
+
 // static
-void LLFloaterSnapshot::Impl::onCommitResolution(LLUICtrl* ctrl, void* data)
+void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL do_update)
 {
 	LLComboBox* combobox = (LLComboBox*)ctrl;
 	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
@@ -1580,13 +1621,9 @@ void LLFloaterSnapshot::Impl::onCommitResolution(LLUICtrl* ctrl, void* data)
 	}
 
 	// save off all selected resolution values
-	LLComboBox* combo;
-	combo = view->getChild<LLComboBox>("postcard_size_combo");
-	gSavedSettings.setS32("SnapshotPostcardLastResolution", combo->getCurrentIndex());
-	combo = view->getChild<LLComboBox>("texture_size_combo");
-	gSavedSettings.setS32("SnapshotTextureLastResolution", combo->getCurrentIndex());
-	combo = view->getChild<LLComboBox>("local_size_combo");
-	gSavedSettings.setS32("SnapshotLocalLastResolution", combo->getCurrentIndex());
+	gSavedSettings.setS32("SnapshotPostcardLastResolution", view->getChild<LLComboBox>("postcard_size_combo")->getCurrentIndex());
+	gSavedSettings.setS32("SnapshotTextureLastResolution",  view->getChild<LLComboBox>("texture_size_combo")->getCurrentIndex());
+	gSavedSettings.setS32("SnapshotLocalLastResolution",    view->getChild<LLComboBox>("local_size_combo")->getCurrentIndex());
 
 	std::string sdstring = combobox->getSelectedValue();
 	LLSD sdres;
@@ -1601,15 +1638,17 @@ void LLFloaterSnapshot::Impl::onCommitResolution(LLUICtrl* ctrl, void* data)
 	{
 		if (width == 0 || height == 0)
 		{
+			// take resolution from current window size
 			previewp->setSize(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight());
 		}
 		else if (width == -1 || height == -1)
 		{
 			// load last custom value
-			previewp->setSize(gSavedSettings.getS32("LastSnapshotWidth"), gSavedSettings.getS32("LastSnapshotHeight"));
+			previewp->setSize(gSavedSettings.getS32(lastSnapshotWidthName()), gSavedSettings.getS32(lastSnapshotHeightName()));
 		}
 		else
 		{
+			// use the resolution from the selected pre-canned drop-down choice
 			previewp->setSize(width, height);
 		}
 
@@ -1623,10 +1662,18 @@ void LLFloaterSnapshot::Impl::onCommitResolution(LLUICtrl* ctrl, void* data)
 		}
 		previewp->setSize(width, height);
 
+		if(view->childGetValue("snapshot_width").asInteger() != width || view->childGetValue("snapshot_height").asInteger() != height)
+		{
 		view->childSetValue("snapshot_width", width);
 		view->childSetValue("snapshot_height", height);
 		// hide old preview as the aspect ratio could be wrong
 		checkAutoSnapshot(previewp, FALSE);
+			getPreviewView(view)->updateSnapshot(FALSE, TRUE);
+			if(do_update)
+			{
+				updateControls(view);
+	}
+		}
 	}
 }
 
@@ -1675,17 +1722,28 @@ void LLFloaterSnapshot::Impl::onCommitSnapshotFormat(LLUICtrl* ctrl, void* data)
 
 
 
-
+// Sets the named size combo to "custom" mode.
 // static
 void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshot* floater, const std::string& comboname)
 {
 	LLComboBox* combo = floater->getChild<LLComboBox>(comboname);
-	if (combo)
-	{
-		combo->setCurrentByIndex(combo->getItemCount() - 1);
 
-		checkAspectRatio(floater, -1);//combo->getCurrentIndex()) ;
+	combo->setCurrentByIndex(combo->getItemCount() - 1); // "custom" is always the last index
+
+	if(comboname == "postcard_size_combo") 
+	{
+		gSavedSettings.setS32("SnapshotPostcardLastResolution", combo->getCurrentIndex());
+	}
+	else if(comboname == "texture_size_combo") 
+	{
+		gSavedSettings.setS32("SnapshotTextureLastResolution", combo->getCurrentIndex());
 	}
+	else if(comboname == "local_size_combo") 
+	{
+		gSavedSettings.setS32("SnapshotLocalLastResolution", combo->getCurrentIndex());
+	}
+
+	checkAspectRatio(floater, -1); // -1 means custom
 }
 
 
@@ -1711,8 +1769,8 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3
 
 		//round to nearest power of 2 based on the direction of movement
 		// i.e. higher power of two if increasing texture resolution
-		if(gSavedSettings.getS32("LastSnapshotWidth") < width ||
-			gSavedSettings.getS32("LastSnapshotHeight") < height)
+		if(gSavedSettings.getS32("LastSnapshotToInventoryWidth") < width ||
+			gSavedSettings.getS32("LastSnapshotToInventoryHeight") < height)
 		{
 			// Up arrow pressed
 			width = get_next_power_two(width, MAX_TEXTURE_SIZE) ;
@@ -1772,20 +1830,10 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3
 //static
 void LLFloaterSnapshot::Impl::resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height)
 {
-	LLSpinCtrl *sctrl = view->getChild<LLSpinCtrl>("snapshot_width") ;
-	if(sctrl)
-	{
-		sctrl->forceSetValue(width) ;
-	}
-
-	sctrl = view->getChild<LLSpinCtrl>("snapshot_height") ;
-	if(sctrl)
-	{
-		sctrl->forceSetValue(height) ;
-	}
-
-	gSavedSettings.setS32("LastSnapshotWidth", width);
-	gSavedSettings.setS32("LastSnapshotHeight", height);
+	view->getChild<LLSpinCtrl>("snapshot_width")->forceSetValue(width);
+	view->getChild<LLSpinCtrl>("snapshot_height")->forceSetValue(height);
+	gSavedSettings.setS32(lastSnapshotWidthName(), width);
+	gSavedSettings.setS32(lastSnapshotHeightName(), height);
 }
 
 //static
@@ -1839,15 +1887,17 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat
 
 				previewp->setSize(w,h);
 				checkAutoSnapshot(previewp, FALSE);
+				previewp->updateSnapshot(FALSE, TRUE);
 				comboSetCustom(view, "postcard_size_combo");
 				comboSetCustom(view, "texture_size_combo");
 				comboSetCustom(view, "local_size_combo");
 			}
 		}
 
-		gSavedSettings.setS32("LastSnapshotWidth", w);
-		gSavedSettings.setS32("LastSnapshotHeight", h);
+		gSavedSettings.setS32(lastSnapshotWidthName(), w);
+		gSavedSettings.setS32(lastSnapshotHeightName(), h);
 
+		updateControls(view);
 	}
 }
 
@@ -1883,6 +1933,7 @@ LLFloaterSnapshot::~LLFloaterSnapshot()
 	delete &impl;
 }
 
+
 BOOL LLFloaterSnapshot::postBuild()
 {
 	childSetCommitCallback("snapshot_type_radio", Impl::onCommitSnapshotType, this);
@@ -1890,11 +1941,6 @@ BOOL LLFloaterSnapshot::postBuild()
 	
 	childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this);
 
-	childSetValue("auto_snapshot_check", gSavedSettings.getBOOL("AutoSnapshot"));
-	childSetCommitCallback("auto_snapshot_check", Impl::onClickAutoSnap, this);
-
-	//childSetValue("advance_snapshot_check", gSavedSettings.getBOOL("AdvanceSnapshot"));
-	//childSetCommitCallback("advance_snapshot_check", Impl::onClickAdvanceSnap, this);
 	childSetAction("more_btn", Impl::onClickMore, this);
 	childSetAction("less_btn", Impl::onClickLess, this);
 
@@ -1907,10 +1953,10 @@ BOOL LLFloaterSnapshot::postBuild()
 	childSetValue("image_quality_slider", gSavedSettings.getS32("SnapshotQuality"));
 
 	childSetCommitCallback("snapshot_width", Impl::onCommitCustomResolution, this);
-
 	childSetCommitCallback("snapshot_height", Impl::onCommitCustomResolution, this);
 
 	childSetCommitCallback("ui_check", Impl::onClickUICheck, this);
+	childSetValue("ui_check", gSavedSettings.getBOOL("RenderUIInSnapshot"));
 
 	childSetCommitCallback("hud_check", Impl::onClickHUDCheck, this);
 	childSetValue("hud_check", gSavedSettings.getBOOL("RenderHUDInSnapshot"));
@@ -1925,12 +1971,15 @@ BOOL LLFloaterSnapshot::postBuild()
 	childSetValue("layer_types", "colors");
 	childSetEnabled("layer_types", FALSE);
 
-	childSetValue("snapshot_width", gSavedSettings.getS32("LastSnapshotWidth"));
-	childSetValue("snapshot_height", gSavedSettings.getS32("LastSnapshotHeight"));
+	childSetValue("snapshot_width", gSavedSettings.getS32(lastSnapshotWidthName()));
+	childSetValue("snapshot_height", gSavedSettings.getS32(lastSnapshotHeightName()));
 
 	childSetValue("freeze_frame_check", gSavedSettings.getBOOL("UseFreezeFrame"));
 	childSetCommitCallback("freeze_frame_check", Impl::onCommitFreezeFrame, this);
 
+	childSetValue("auto_snapshot_check", gSavedSettings.getBOOL("AutoSnapshot"));
+	childSetCommitCallback("auto_snapshot_check", Impl::onClickAutoSnap, this);
+
 	childSetCommitCallback("postcard_size_combo", Impl::onCommitResolution, this);
 	childSetCommitCallback("texture_size_combo", Impl::onCommitResolution, this);
 	childSetCommitCallback("local_size_combo", Impl::onCommitResolution, this);
@@ -1960,53 +2009,6 @@ void LLFloaterSnapshot::draw()
 		return;
 	}
 
-	if(!isMinimized())
-	{
-		if (previewp && previewp->getDataSize() > 0)
-		{
-			LLLocale locale(LLLocale::USER_LOCALE);
-
-			std::string bytes_string;
-			if (previewp->getSnapshotType() == LLSnapshotLivePreview::SNAPSHOT_POSTCARD && 
-				previewp->getDataSize() > MAX_POSTCARD_DATASIZE)
-			{
-				childSetColor("file_size_label", LLColor4::red);
-				childSetEnabled("send_btn", FALSE);
-			}
-			else
-			{
-				childSetColor("file_size_label", gColors.getColor( "LabelTextColor" ));
-				childSetEnabled("send_btn", previewp->getSnapshotUpToDate());
-			}
-			
-			if (previewp->getSnapshotUpToDate())
-			{
-				std::string bytes_string;
-				LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 );
-				childSetTextArg("file_size_label", "[SIZE]", bytes_string);
-			}
-			else
-			{
-				childSetTextArg("file_size_label", "[SIZE]", getString("unknown"));
-				childSetColor("file_size_label", gColors.getColor( "LabelTextColor" ));
-			}
-			childSetEnabled("upload_btn", previewp->getSnapshotUpToDate());
-			childSetEnabled("save_btn", previewp->getSnapshotUpToDate());
-
-		}
-		else
-		{
-			childSetTextArg("file_size_label", "[SIZE]", std::string("???"));
-			childSetEnabled("upload_btn", FALSE);
-			childSetEnabled("send_btn", FALSE);
-			childSetEnabled("save_btn", FALSE);
-		}
-
-		BOOL ui_in_snapshot = gSavedSettings.getBOOL("RenderUIInSnapshot");
-		childSetValue("ui_check", ui_in_snapshot);
-		childSetToolTip("ui_check", std::string("If selected shows the UI in the snapshot"));
-	}
-
 	LLFloater::draw();
 
 	if (previewp)
@@ -2071,10 +2073,15 @@ void LLFloaterSnapshot::hide(void*)
 //static 
 void LLFloaterSnapshot::update()
 {
+	BOOL changed = FALSE;
 	for (std::set<LLSnapshotLivePreview*>::iterator iter = LLSnapshotLivePreview::sList.begin();
 		 iter != LLSnapshotLivePreview::sList.end(); ++iter)
 	{
-		LLSnapshotLivePreview::onIdle(*iter);
+		changed |= LLSnapshotLivePreview::onIdle(*iter);
+	}
+	if(changed)
+	{
+		sInstance->impl.updateControls(sInstance);
 	}
 }
 
diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index ada5c68..96492e8 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -180,7 +180,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
 		msg->getF32Fast(_PREHASH_ReportData, _PREHASH_Score, score, block);
 		msg->getStringFast(_PREHASH_ReportData, _PREHASH_TaskName, name_buf, block);
 		msg->getStringFast(_PREHASH_ReportData, _PREHASH_OwnerName, owner_buf, block);
-		if(msg->getNumberOfBlocks("DataExtended"))
+		if(msg->has("DataExtended"))
 		{
 			have_extended_data = true;
 			msg->getU32("DataExtended", "TimeStamp", time_stamp, block);
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 8cefd5b..932addb 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -821,7 +821,7 @@ void LLFolderViewItem::draw()
 	// mShowSingleSelection is FALSE
 	if( mIsSelected )
 	{
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		LLColor4 bg_color = sHighlightBgColor;
 		//const S32 TRAILING_PAD = 5;  // It just looks better with this.
 		if (!mIsCurSelection)
@@ -876,7 +876,7 @@ void LLFolderViewItem::draw()
 	}
 	if (mDragAndDropTarget)
 	{
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gl_rect_2d(
 			0, 
 			getRect().getHeight(), 
diff --git a/indra/newview/llframestatview.cpp b/indra/newview/llframestatview.cpp
index 752c6c4..a7d08cf 100644
--- a/indra/newview/llframestatview.cpp
+++ b/indra/newview/llframestatview.cpp
@@ -98,7 +98,7 @@ void LLFrameStatView::draw()
 	S32 j;
 	LLStat *statp;
 
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	statp = mStats[0];
 	if (!statp)
@@ -159,7 +159,7 @@ void LLFrameStatView::draw()
 	for (i = 0; i < mNumStats; i++)
 	{
 		// Draw the color key.
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gl_rect_2d(left, top - 2, left + 10, top - 12, mColors[i]);
 
 		left = left + 15;
@@ -203,7 +203,7 @@ void LLFrameStatView::draw()
 	bottom = bottom - 4;
 	for (tick_value = 0; tick_value <= 100; tick_value += 20)
 	{
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		left = 10 + llfloor(tick_value*(total_width/100.f));
 		right = left + 1;
 		gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 1.f, 1.f, 0.2f));
@@ -253,7 +253,7 @@ void LLFrameStatView::draw()
 		bottom = top - graph_height - 4;
 		for (tick_value = 0; tick_value <= 100; tick_value += 20)
 		{
-			LLGLSNoTexture gls_no_texture;
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			left = 10 + llfloor(tick_value*(total_width/100.f));
 			right = left + 1;
 			gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 1.f, 1.f, 0.25f));
@@ -278,7 +278,7 @@ void LLFrameStatView::draw()
 		bottom = top - graph_height - 4;
 		for (tick_value = 0; tick_value <= mTotalTime; tick_value += mLabelSpacing)
 		{
-			LLGLSNoTexture gls_no_texture;
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			left = 10 + llfloor(tick_value*time_scale);
 			right = left + 1;
 			gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 1.f, 1.f, 0.25f));
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index 45f674d..c5a626f 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -142,7 +142,7 @@ void LLAgent::renderAutoPilotTarget()
 		gGL.pushMatrix();
 
 		// not textured
-		LLGLSNoTexture no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 		// lovely green
 		glColor4f(0.f, 1.f, 1.f, 1.f);
@@ -355,10 +355,11 @@ void LLCompass::draw()
 
 	if (mBkgndTexture)
 	{
-		mBkgndTexture->bind();
+		gGL.getTexUnit(0)->bind(mBkgndTexture.get());
+
 		gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f);
 		
-		gGL.begin(LLVertexBuffer::QUADS);
+		gGL.begin(LLRender::QUADS);
 		
 		gGL.texCoord2f(1.f, 1.f);
 		gGL.vertex2i(width, height);
@@ -381,10 +382,10 @@ void LLCompass::draw()
 	
 	if (mTexture)
 	{
-		mTexture->bind();
+		gGL.getTexUnit(0)->bind(mTexture.get());
 		gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f);
 		
-		gGL.begin(LLVertexBuffer::QUADS);
+		gGL.begin(LLRender::QUADS);
 		
 		gGL.texCoord2f(1.f, 1.f);
 		gGL.vertex2i(width, height);
@@ -426,9 +427,9 @@ void LLHorizontalCompass::draw()
 		F32 left = center - COMPASS_RANGE;
 		F32 right = center + COMPASS_RANGE;
 
-		mTexture->bind();
+		gGL.getTexUnit(0)->bind(mTexture.get());
 		gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f );
-		gGL.begin( LLVertexBuffer::QUADS );
+		gGL.begin( LLRender::QUADS );
 
 		gGL.texCoord2f(right, 1.f);
 		gGL.vertex2i(width, height);
@@ -447,7 +448,7 @@ void LLHorizontalCompass::draw()
 
 	// Draw the focus line
 	{
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gGL.color4fv( mFocusColor.mV );
 		gl_line_2d( half_width, 0, half_width, height );
 	}
@@ -465,7 +466,7 @@ void LLWind::renderVectors()
 
 	F32 region_width_meters = LLWorld::getInstance()->getRegionWidthInMeters();
 
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	gGL.pushMatrix();
 	LLVector3 origin_agent;
 	origin_agent = gAgent.getPosAgentFromGlobal(mOriginGlobal);
@@ -479,11 +480,11 @@ void LLWind::renderVectors()
 			gGL.pushMatrix();
 			gGL.translatef((F32)i * region_width_meters/mSize, (F32)j * region_width_meters/mSize, 0.0);
 			gGL.color3f(0,1,0);
-			gGL.begin(LLVertexBuffer::POINTS);
+			gGL.begin(LLRender::POINTS);
 				gGL.vertex3f(0,0,0);
 			gGL.end();
 			gGL.color3f(1,0,0);
-			gGL.begin(LLVertexBuffer::LINES);
+			gGL.begin(LLRender::LINES);
 				gGL.vertex3f(x * 0.1f, y * 0.1f ,0.f);
 				gGL.vertex3f(x, y, 0.f);
 			gGL.end();
@@ -501,7 +502,7 @@ void LLViewerParcelMgr::renderRect(const LLVector3d &west_south_bottom_global,
 								   const LLVector3d &east_north_top_global )
 {
 	LLGLSUIDefault gls_ui;
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	LLGLDepthTest gls_depth(GL_TRUE);
 
 	LLVector3 west_south_bottom_agent = gAgent.getPosAgentFromGlobal(west_south_bottom_global);
@@ -532,7 +533,7 @@ void LLViewerParcelMgr::renderRect(const LLVector3d &west_south_bottom_global,
 	gGL.color4f(1.f, 1.f, 0.f, 1.f);
 
 	// Cheat and give this the same pick-name as land
-	gGL.begin(LLVertexBuffer::LINES);
+	gGL.begin(LLRender::LINES);
 
 	gGL.vertex3f(west, north, nw_bottom);
 	gGL.vertex3f(west, north, nw_top);
@@ -549,7 +550,7 @@ void LLViewerParcelMgr::renderRect(const LLVector3d &west_south_bottom_global,
 	gGL.end();
 
 	gGL.color4f(1.f, 1.f, 0.f, 0.2f);
-	gGL.begin(LLVertexBuffer::QUADS);
+	gGL.begin(LLRender::QUADS);
 
 	gGL.vertex3f(west, north, nw_bottom);
 	gGL.vertex3f(west, north, nw_top);
@@ -609,14 +610,14 @@ void LLViewerParcelMgr::renderParcel(LLParcel* parcel )
 		F32 ne_top = ne_bottom + POST_HEIGHT;
 		F32 nw_top = nw_bottom + POST_HEIGHT;
 
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		LLGLDepthTest gls_depth(GL_TRUE);
 
 		LLUI::setLineWidth(2.f);
 		gGL.color4f(0.f, 1.f, 1.f, 1.f);
 
 		// Cheat and give this the same pick-name as land
-		gGL.begin(LLVertexBuffer::LINES);
+		gGL.begin(LLRender::LINES);
 
 		gGL.vertex3f(west, north, nw_bottom);
 		gGL.vertex3f(west, north, nw_top);
@@ -633,7 +634,7 @@ void LLViewerParcelMgr::renderParcel(LLParcel* parcel )
 		gGL.end();
 
 		gGL.color4f(0.f, 1.f, 1.f, 0.2f);
-		gGL.begin(LLVertexBuffer::QUADS);
+		gGL.begin(LLRender::QUADS);
 
 		gGL.vertex3f(west, north, nw_bottom);
 		gGL.vertex3f(west, north, nw_top);
@@ -759,7 +760,7 @@ void LLViewerParcelMgr::renderHighlightSegments(const U8* segments, LLViewerRegi
 	bool has_segments = false;
 
 	LLGLSUIDefault gls_ui;
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	LLGLDepthTest gls_depth(GL_TRUE);
 
 	gGL.color4f(1.f, 1.f, 0.f, 0.2f);
@@ -786,7 +787,7 @@ void LLViewerParcelMgr::renderHighlightSegments(const U8* segments, LLViewerRegi
 				if (!has_segments)
 				{
 					has_segments = true;
-					gGL.begin(LLVertexBuffer::QUADS);
+					gGL.begin(LLRender::QUADS);
 				}
 				renderOneSegment(x1, y1, x2, y2, PARCEL_POST_HEIGHT, SOUTH_MASK, regionp);
 			}
@@ -802,7 +803,7 @@ void LLViewerParcelMgr::renderHighlightSegments(const U8* segments, LLViewerRegi
 				if (!has_segments)
 				{
 					has_segments = true;
-					gGL.begin(LLVertexBuffer::QUADS);
+					gGL.begin(LLRender::QUADS);
 				}
 				renderOneSegment(x1, y1, x2, y2, PARCEL_POST_HEIGHT, WEST_MASK, regionp);
 			}
@@ -850,14 +851,14 @@ void LLViewerParcelMgr::renderCollisionSegments(U8* segments, BOOL use_pass, LLV
 	
 	if (use_pass && (mCollisionBanned == BA_NOT_ON_LIST))
 	{
-		LLViewerImage::bindTexture(mPassImage);
+		gGL.getTexUnit(0)->bind(mPassImage);
 	}
 	else
 	{
-		LLViewerImage::bindTexture(mBlockedImage);
+		gGL.getTexUnit(0)->bind(mBlockedImage);
 	}
 
-	gGL.begin(LLVertexBuffer::QUADS);
+	gGL.begin(LLRender::QUADS);
 
 	for (y = 0; y < STRIDE; y++)
 	{
@@ -1011,10 +1012,10 @@ void LLViewerObjectList::renderObjectBeacons()
 	LLGLSUIDefault gls_ui;
 
 	{
-		LLGLSNoTexture gls_ui_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 		S32 last_line_width = -1;
-		// gGL.begin(LLVertexBuffer::LINES); // Always happens in (line_width != last_line_width)
+		// gGL.begin(LLRender::LINES); // Always happens in (line_width != last_line_width)
 		
 		for (S32 i = 0; i < mDebugBeacons.count(); i++)
 		{
@@ -1031,7 +1032,7 @@ void LLViewerObjectList::renderObjectBeacons()
 				}
 				glLineWidth( (F32)line_width );
 				last_line_width = line_width;
-				gGL.begin(LLVertexBuffer::LINES);
+				gGL.begin(LLRender::LINES);
 			}
 
 			const LLVector3 &thisline = debug_beacon.mPositionAgent;
@@ -1049,11 +1050,11 @@ void LLViewerObjectList::renderObjectBeacons()
 	}
 
 	{
-		LLGLSNoTexture gls_ui_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		LLGLDepthTest gls_depth(GL_TRUE);
 		
 		S32 last_line_width = -1;
-		// gGL.begin(LLVertexBuffer::LINES); // Always happens in (line_width != last_line_width)
+		// gGL.begin(LLRender::LINES); // Always happens in (line_width != last_line_width)
 		
 		for (S32 i = 0; i < mDebugBeacons.count(); i++)
 		{
@@ -1069,7 +1070,7 @@ void LLViewerObjectList::renderObjectBeacons()
 				}
 				glLineWidth( (F32)line_width );
 				last_line_width = line_width;
-				gGL.begin(LLVertexBuffer::LINES);
+				gGL.begin(LLRender::LINES);
 			}
 
 			const LLVector3 &thisline = debug_beacon.mPositionAgent;
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 30b7cbd..35d408b 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -52,6 +52,7 @@
 #include "llfloaterdirectory.h"
 #include "llfloatergroupinfo.h"
 #include "lluictrlfactory.h"
+#include <boost/regex.hpp>
 
 
 const U32 MAX_CACHED_GROUPS = 10;
@@ -791,6 +792,20 @@ LLGroupMgrGroupData* LLGroupMgr::getGroupData(const LLUUID& id)
 	return NULL;
 }
 
+// Helper function for LLGroupMgr::processGroupMembersReply
+// This reformats date strings from MM/DD/YYYY to YYYY/MM/DD ( e.g. 1/27/2008 -> 2008/1/27 )
+// so that the sorter can sort by year before month before day.
+static void formatDateString(std::string &date_string)
+{
+	using namespace boost;
+	cmatch result;
+	const regex expression("([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})");
+	if (regex_match(date_string.c_str(), result, expression))
+	{
+		date_string = result[3]+"/"+result[1]+"/"+result[2];
+	}
+}
+
 // static
 void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
 {
@@ -840,6 +855,8 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
 
 			if (member_id.notNull())
 			{
+				formatDateString(online_status); // reformat for sorting, e.g. 12/25/2008 -> 2008/12/25
+				
 				//llinfos << "Member " << member_id << " has powers " << std::hex << agent_powers << std::dec << llendl;
 				LLGroupMemberData* newdata = new LLGroupMemberData(member_id, 
 																	contribution, 
diff --git a/indra/newview/llhomelocationresponder.cpp b/indra/newview/llhomelocationresponder.cpp
new file mode 100644
index 0000000..9b69310
--- /dev/null
+++ b/indra/newview/llhomelocationresponder.cpp
@@ -0,0 +1,108 @@
+/** 
+ * @file llhomelocationresponder.cpp
+ * @author Meadhbh Hamrick
+ * @brief Processes responses to the HomeLocation CapReq
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ * 
+ * Copyright (c) 2008, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+/* File Inclusions */
+#include "llviewerprecompiledheaders.h"
+
+#include "llhomelocationresponder.h"
+#include "llsdutil.h"
+#include "llagent.h"
+#include "llviewerregion.h"
+
+void LLHomeLocationResponder::result( const LLSD& content )
+{
+  LLVector3 agent_pos;
+  bool      error = true;
+		
+  do {
+	
+    // was the call to /agent/<agent-id>/home-location successful?
+    // If not, we keep error set to true
+    if( ! content.has("success") )
+    {
+      break;
+    }
+		
+    if( 0 != strncmp("true", content["success"].asString().c_str(), 4 ) )
+    {
+      break;
+    }
+		
+    // did the simulator return a "justified" home location?
+    // If no, we keep error set to true
+    if( ! content.has( "HomeLocation" ) )
+    {
+      break;
+    }
+		
+    if( ! content["HomeLocation"].has("LocationPos") )
+    {
+      break;
+    }
+		
+    if( ! content["HomeLocation"]["LocationPos"].has("X") )
+    {
+      break;
+    }
+
+    agent_pos.mV[VX] = content["HomeLocation"]["LocationPos"]["X"].asInteger();
+		
+    if( ! content["HomeLocation"]["LocationPos"].has("Y") )
+    {
+      break;
+    }
+
+    agent_pos.mV[VY] = content["HomeLocation"]["LocationPos"]["Y"].asInteger();
+		
+    if( ! content["HomeLocation"]["LocationPos"].has("Z") )
+    {
+      break;
+    }
+
+    agent_pos.mV[VZ] = content["HomeLocation"]["LocationPos"]["Z"].asInteger();
+		
+    error = false;
+  } while( 0 );
+	
+  if( ! error )
+  {
+    llinfos << "setting home position" << llendl;
+		
+    LLViewerRegion *viewer_region = gAgent.getRegion();
+    gAgent.setHomePosRegion( viewer_region->getHandle(), agent_pos );
+  }
+}
+
+void LLHomeLocationResponder::error( const LLSD& content )
+{
+  llinfos << "received error(" << ll_pretty_print_sd( content ) << ")" << llendl;
+}
diff --git a/indra/newview/llhomelocationresponder.h b/indra/newview/llhomelocationresponder.h
new file mode 100644
index 0000000..08291b8
--- /dev/null
+++ b/indra/newview/llhomelocationresponder.h
@@ -0,0 +1,47 @@
+/** 
+ * @file llhomelocationresponder.h
+ * @author Meadhbh Hamrick
+ * @brief Processes responses to the HomeLocation CapReq
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ * 
+ * Copyright (c) 2008, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+ 
+ /* Macro Definitions */
+#ifndef LL_LLHOMELOCATIONRESPONDER_H
+#define LL_LLHOMELOCATIONRESPONDER_H
+
+/* File Inclusions */
+#include "llhttpclient.h"
+
+/* Typedef, Enum, Class, Struct, etc. */
+class LLHomeLocationResponder : public LLHTTPClient::Responder
+{
+	virtual void result( const LLSD& content );
+	virtual void error( const LLSD& content );
+};
+
+#endif
diff --git a/indra/newview/llhudeffectbeam.cpp b/indra/newview/llhudeffectbeam.cpp
index d6c38d3..2b5fd79 100644
--- a/indra/newview/llhudeffectbeam.cpp
+++ b/indra/newview/llhudeffectbeam.cpp
@@ -251,7 +251,7 @@ void LLHUDEffectBeam::render()
 	}
 
 	LLGLSPipelineAlpha gls_pipeline_alpha;
-	LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 
 	// Interpolate the global fade alpha
diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp
index b5f6ec7..5f0bb90 100644
--- a/indra/newview/llhudeffectlookat.cpp
+++ b/indra/newview/llhudeffectlookat.cpp
@@ -499,14 +499,14 @@ void LLHUDEffectLookAt::render()
 {
 	if (sDebugLookAt && mSourceObject.notNull())
 	{
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 		LLVector3 target = mTargetPos + ((LLVOAvatar*)(LLViewerObject*)mSourceObject)->mHeadp->getWorldPosition();
 		glMatrixMode(GL_MODELVIEW);
 		gGL.pushMatrix();
 		gGL.translatef(target.mV[VX], target.mV[VY], target.mV[VZ]);
 		glScalef(0.3f, 0.3f, 0.3f);
-		gGL.begin(LLVertexBuffer::LINES);
+		gGL.begin(LLRender::LINES);
 		{
 			LLColor3 color = (*mAttentions)[mTargetType].mColor;
 			gGL.color3f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE]);
diff --git a/indra/newview/llhudeffectpointat.cpp b/indra/newview/llhudeffectpointat.cpp
index 7ab03f2..2396e1a 100644
--- a/indra/newview/llhudeffectpointat.cpp
+++ b/indra/newview/llhudeffectpointat.cpp
@@ -328,13 +328,13 @@ void LLHUDEffectPointAt::render()
 	update();
 	if (sDebugPointAt && mTargetType != POINTAT_TARGET_NONE)
 	{
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 		LLVector3 target = mTargetPos + mSourceObject->getRenderPosition();
 		gGL.pushMatrix();
 		gGL.translatef(target.mV[VX], target.mV[VY], target.mV[VZ]);
 		glScalef(0.3f, 0.3f, 0.3f);
-		gGL.begin(LLVertexBuffer::LINES);
+		gGL.begin(LLRender::LINES);
 		{
 			gGL.color3f(1.f, 0.f, 0.f);
 			gGL.vertex3f(-1.f, 0.f, 0.f);
diff --git a/indra/newview/llhudicon.cpp b/indra/newview/llhudicon.cpp
index 85cc996..5d5c6a1 100644
--- a/indra/newview/llhudicon.cpp
+++ b/indra/newview/llhudicon.cpp
@@ -86,7 +86,7 @@ void LLHUDIcon::renderIcon(BOOL for_select)
 	LLGLDepthTest gls_depth(GL_TRUE);
 	if (for_select)
 	{
-		LLViewerImage::unbindTexture(0);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	}
 	
 	if (mHidden)
@@ -163,10 +163,10 @@ void LLHUDIcon::renderIcon(BOOL for_select)
 		LLColor4 icon_color = LLColor4::white;
 		icon_color.mV[VALPHA] = alpha_factor;
 		gGL.color4fv(icon_color.mV);
-		LLViewerImage::bindTexture(mImagep);
+		gGL.getTexUnit(0)->bind(mImagep.get());
 	}
 
-	gGL.begin(LLVertexBuffer::QUADS);
+	gGL.begin(LLRender::QUADS);
 	{
 		gGL.texCoord2f(0.f, 1.f);
 		gGL.vertex3fv(upper_left.mV);
diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp
index c45c284..c5e5419 100644
--- a/indra/newview/llhudtext.cpp
+++ b/indra/newview/llhudtext.cpp
@@ -120,6 +120,111 @@ LLHUDText::~LLHUDText()
 }
 
 
+BOOL LLHUDText::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, LLVector3& intersection, BOOL debug_render)
+{
+	if (!mVisible || mHidden)
+	{
+		return FALSE;
+	}
+
+	// don't pick text that isn't bound to a viewerobject or isn't in a bubble
+	if (!mSourceObject || mSourceObject->mDrawable.isNull() || !mUseBubble)
+	{
+		return FALSE;
+	}
+	
+	F32 alpha_factor = 1.f;
+	LLColor4 text_color = mColor;
+	if (mDoFade)
+	{
+		if (mLastDistance > mFadeDistance)
+		{
+			alpha_factor = llmax(0.f, 1.f - (mLastDistance - mFadeDistance)/mFadeRange);
+			text_color.mV[3] = text_color.mV[3]*alpha_factor;
+		}
+	}
+	if (text_color.mV[3] < 0.01f)
+	{
+		return FALSE;
+	}
+
+	mOffsetY = lltrunc(mHeight * ((mVertAlignment == ALIGN_VERT_CENTER) ? 0.5f : 1.f));
+
+	// scale screen size of borders down
+	//RN: for now, text on hud objects is never occluded
+
+	LLVector3 x_pixel_vec;
+	LLVector3 y_pixel_vec;
+	
+	if (mOnHUDAttachment)
+	{
+		x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWindowWidth();
+		y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWindowHeight();
+	}
+	else
+	{
+		LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec);
+	}
+
+	LLVector3 width_vec = mWidth * x_pixel_vec;
+	LLVector3 height_vec = mHeight * y_pixel_vec;
+	
+	LLCoordGL screen_pos;
+	LLViewerCamera::getInstance()->projectPosAgentToScreen(mPositionAgent, screen_pos, FALSE);
+
+	LLVector2 screen_offset;
+	screen_offset = updateScreenPos(mPositionOffset);
+	
+	LLVector3 render_position = mPositionAgent  
+			+ (x_pixel_vec * screen_offset.mV[VX])
+			+ (y_pixel_vec * screen_offset.mV[VY]);
+
+
+	if (mUseBubble)
+	{
+		LLVector3 bg_pos = render_position
+			+ (F32)mOffsetY * y_pixel_vec
+			- (width_vec / 2.f)
+			- (height_vec);
+		//LLUI::translate(bg_pos.mV[VX], bg_pos.mV[VY], bg_pos.mV[VZ]);
+
+		LLVector3 v[] = 
+		{
+			bg_pos,
+			bg_pos + width_vec,
+			bg_pos + width_vec + height_vec,
+			bg_pos + height_vec,
+		};
+
+		if (debug_render)
+		{
+			gGL.begin(LLRender::LINE_STRIP);
+			gGL.vertex3fv(v[0].mV);
+			gGL.vertex3fv(v[1].mV);
+			gGL.vertex3fv(v[2].mV);
+			gGL.vertex3fv(v[3].mV);
+			gGL.vertex3fv(v[0].mV);
+			gGL.vertex3fv(v[2].mV);
+			gGL.end();
+		}
+
+		LLVector3 dir = end-start;
+		F32 t = 0.f;
+
+		if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, NULL, NULL, &t, FALSE) ||
+			LLTriangleRayIntersect(v[2], v[3], v[0], start, dir, NULL, NULL, &t, FALSE) )
+		{
+			if (t <= 1.f)
+			{
+				intersection = start + dir*t;
+				return TRUE;
+			}
+		}
+	}
+
+	return FALSE;
+}
+
 void LLHUDText::render()
 {
 	if (!mOnHUDAttachment && sDisplayText)
@@ -152,7 +257,15 @@ void LLHUDText::renderText(BOOL for_select)
 		return;
 	}
 	
-	LLGLState gls_tex(GL_TEXTURE_2D, for_select ? FALSE : TRUE);
+	if (for_select)
+	{
+		gGL.getTexUnit(0)->disable();
+	}
+	else
+	{
+		gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
+	}
+
 	LLGLState gls_blend(GL_BLEND, for_select ? FALSE : TRUE);
 	LLGLState gls_alpha(GL_ALPHA_TEST, for_select ? FALSE : TRUE);
 	
@@ -261,7 +374,7 @@ void LLHUDText::renderText(BOOL for_select)
 
 			if (for_select)
 			{
-				LLGLSNoTexture no_texture_state;
+				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 				S32 name = mSourceObject->mGLName;
 				LLColor4U coloru((U8)(name >> 16), (U8)(name >> 8), (U8)name);
 				gGL.color4ubv(coloru.mV);
@@ -271,7 +384,7 @@ void LLHUDText::renderText(BOOL for_select)
 			}
 			else
 			{
-				LLViewerImage::bindTexture(imagep->getImage());
+				gGL.getTexUnit(0)->bind(imagep->getImage());
 				
 				gGL.color4fv(bg_color.mV);
 				gl_segmented_rect_3d_tex(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, height_vec);
@@ -309,7 +422,7 @@ void LLHUDText::renderText(BOOL for_select)
 				}
 				LLUI::popMatrix();
 
-				LLImageGL::unbindTexture(0);
+				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 				LLGLDepthTest gls_depth(mZCompare ? GL_TRUE : GL_FALSE, GL_FALSE);
 				
 				LLVector3 box_center_offset;
@@ -317,7 +430,7 @@ void LLHUDText::renderText(BOOL for_select)
 				LLUI::translate(box_center_offset.mV[VX], box_center_offset.mV[VY], box_center_offset.mV[VZ]);
 				gGL.color4fv(bg_color.mV);
 				LLUI::setLineWidth(2.0);
-				gGL.begin(LLVertexBuffer::LINES);
+				gGL.begin(LLRender::LINES);
 				{
 					if (outside_width)
 					{
@@ -444,6 +557,10 @@ void LLHUDText::renderText(BOOL for_select)
 	}
 	/// Reset the default color to white.  The renderer expects this to be the default. 
 	glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+	if (for_select)
+	{
+		gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
+	}
 }
 
 void LLHUDText::setStringUTF8(const std::string &wtext)
diff --git a/indra/newview/llhudtext.h b/indra/newview/llhudtext.h
index 5719a19..6403622 100644
--- a/indra/newview/llhudtext.h
+++ b/indra/newview/llhudtext.h
@@ -123,6 +123,8 @@ public:
 	void setOnHUDAttachment(BOOL on_hud) { mOnHUDAttachment = on_hud; }
 	void shift(const LLVector3& offset);
 
+	BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, LLVector3& intersection, BOOL debug_render = FALSE);
+
 	static void shiftAll(const LLVector3& offset);
 	static void renderAllHUD();
 	static void addPickable(std::set<LLViewerObject*> &pick_list);
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index b1e3017..c3392ce 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -73,7 +73,6 @@ F32  LLInventoryModel::sMinTimeBetweenFetches = 0.3f;
 F32  LLInventoryModel::sMaxTimeBetweenFetches = 10.f;
 BOOL LLInventoryModel::sTimelyFetchPending = FALSE;
 LLFrameTimer LLInventoryModel::sFetchTimer;
-LLInventoryModel::cat_map_t LLInventoryModel::sBulkFetchMap;
 S16 LLInventoryModel::sBulkFetchCount = 0;
 
 // RN: for some reason, using std::queue in the header file confuses the compiler which things it's an xmlrpc_queue
@@ -85,7 +84,7 @@ static std::deque<LLUUID> sFetchQueue;
 
 //BOOL decompress_file(const char* src_filename, const char* dst_filename);
 const F32 MAX_TIME_FOR_SINGLE_FETCH = 10.f;
-const S32 MAX_FETCH_RETRIES = 5;
+const S32 MAX_FETCH_RETRIES = 10;
 const char CACHE_FORMAT_STRING[] = "%s.inv"; 
 const char* NEW_CATEGORY_NAME = "New Folder";
 const char* NEW_CATEGORY_NAMES[LLAssetType::AT_COUNT] =
@@ -990,13 +989,24 @@ BOOL LLInventoryModel::containsObserver(LLInventoryObserver* observer)
 // Call this method when it's time to update everyone on a new state,
 // by default, the inventory model will not update observers
 // automatically.
-void LLInventoryModel::notifyObservers()
+// The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328]
+void LLInventoryModel::notifyObservers(const std::string service_name)
 {
 	for (observer_list_t::iterator iter = mObservers.begin();
 		 iter != mObservers.end(); )
 	{
 		LLInventoryObserver* observer = *iter;
-		observer->changed(mModifyMask);
+		
+		if (service_name.empty())
+		{
+			observer->changed(mModifyMask);
+		}
+		else
+		{
+			observer->mMessageName = service_name;
+			observer->changed(mModifyMask);
+		}
+
 		// safe way to incrament since changed may delete entries! (@!##%@!@&*!)
 		iter = mObservers.upper_bound(observer); 
 	}
@@ -1038,6 +1048,79 @@ void LLInventoryModel::mock(const LLUUID& root_id)
 }
 */
 
+//If we get back a normal response, handle it here
+void  LLInventoryModel::fetchInventoryResponder::result(const LLSD& content)
+{	
+	start_new_inventory_observer();
+
+	/*LLUUID agent_id;
+	agent_id = content["agent_id"].asUUID();
+	if(agent_id != gAgent.getID())
+	{
+		llwarns << "Got a inventory update for the wrong agent: " << agent_id
+				<< llendl;
+		return;
+	}*/
+	item_array_t items;
+	update_map_t update;
+	S32 count = content["items"].size();
+	bool all_one_folder = true;
+	LLUUID folder_id;
+	// Does this loop ever execute more than once? -Gigs
+	for(S32 i = 0; i < count; ++i)
+	{
+		LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
+		titem->unpackMessage(content["items"][i]);
+		
+		lldebugs << "LLInventoryModel::messageUpdateCore() item id:"
+				 << titem->getUUID() << llendl;
+		items.push_back(titem);
+		// examine update for changes.
+		LLViewerInventoryItem* itemp = gInventory.getItem(titem->getUUID());
+		if(itemp)
+		{
+			if(titem->getParentUUID() == itemp->getParentUUID())
+			{
+				update[titem->getParentUUID()];
+			}
+			else
+			{
+				++update[titem->getParentUUID()];
+				--update[itemp->getParentUUID()];
+			}
+		}
+		else
+		{
+			++update[titem->getParentUUID()];
+		}
+		if (folder_id.isNull())
+		{
+			folder_id = titem->getParentUUID();
+		}
+		else
+		{
+			all_one_folder = false;
+		}
+	}
+
+	U32 changes = 0x0;
+	//as above, this loop never seems to loop more than once per call
+	for (item_array_t::iterator it = items.begin(); it != items.end(); ++it)
+	{
+		changes |= gInventory.updateItem(*it);
+	}
+	gInventory.notifyObservers("fetchinventory");
+	gViewerWindow->getWindow()->decBusyCount();
+}
+
+//If we get back an error (not found, etc...), handle it here
+void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::string& reason)
+{
+	llinfos << "fetchInventory::error "
+		<< status << ": " << reason << llendl;
+	gInventory.notifyObservers("fetchinventory");
+}
+
 void LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id)
 {
 	LLViewerInventoryCategory* cat = getCategory(folder_id);
@@ -1065,21 +1148,31 @@ void LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id)
 }
 
 //Initialize statics.
-LLAlertDialog* LLInventoryModel::fetchDescendentsResponder::sRetryDialog=NULL;
-LLSD LLInventoryModel::fetchDescendentsResponder::sRetrySD;
-
 bool LLInventoryModel::isBulkFetchProcessingComplete()
 {
 	return ( (sFetchQueue.empty() 
-			&& sBulkFetchMap.empty() 
-			&& sBulkFetchCount==0)  ?  TRUE : FALSE ) ;
+			&& sBulkFetchCount<=0)  ?  TRUE : FALSE ) ;
 }
 
+class fetchDescendentsResponder: public LLHTTPClient::Responder
+{
+	public:
+		fetchDescendentsResponder(const LLSD& request_sd) : mRequestSD(request_sd) {};
+		//fetchDescendentsResponder() {};
+		void result(const LLSD& content);
+		void error(U32 status, const std::string& reason);
+	public:
+		typedef std::vector<LLViewerInventoryCategory*> folder_ref_t;
+	protected:
+		LLSD mRequestSD;
+};
+
 //If we get back a normal response, handle it here
-void  LLInventoryModel::fetchDescendentsResponder::result(const LLSD& content)
-{	
+void  fetchDescendentsResponder::result(const LLSD& content)
+{
 	if (content.has("folders"))	
 	{
+
 		for(LLSD::array_const_iterator folder_it = content["folders"].beginArray();
 			folder_it != content["folders"].endArray();
 			++folder_it)
@@ -1087,19 +1180,54 @@ void  LLInventoryModel::fetchDescendentsResponder::result(const LLSD& content)
 			LLSD folder_sd = *folder_it;
 			
 
-			LLUUID agent_id = folder_sd["agent-id"];
+			//LLUUID agent_id = folder_sd["agent_id"];
 
-			if(agent_id != gAgent.getID())	//This should never happen.
-			{
-				llwarns << "Got a UpdateInventoryItem for the wrong agent."
-						<< llendl;
-				break;
-			}
-			LLUUID parent_id = folder_sd["folder-id"];
-			LLUUID owner_id = folder_sd["owner-id"];
+			//if(agent_id != gAgent.getID())	//This should never happen.
+			//{
+			//	llwarns << "Got a UpdateInventoryItem for the wrong agent."
+			//			<< llendl;
+			//	break;
+			//}
+
+			LLUUID parent_id = folder_sd["folder_id"];
+			LLUUID owner_id = folder_sd["owner_id"];
 			S32    version  = (S32)folder_sd["version"].asInteger();
 			S32    descendents = (S32)folder_sd["descendents"].asInteger();
 			LLPointer<LLViewerInventoryCategory> tcategory = new LLViewerInventoryCategory(owner_id);
+
+            if (parent_id.isNull())
+            {
+			    LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
+			    for(LLSD::array_const_iterator item_it = folder_sd["items"].beginArray();
+				    item_it != folder_sd["items"].endArray();
+				    ++item_it)
+			    {	
+                    LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
+                    if (lost_uuid.notNull())
+                    {
+				        LLSD item = *item_it;
+				        titem->unpackMessage(item);
+				
+                        LLInventoryModel::update_list_t update;
+                        LLInventoryModel::LLCategoryUpdate new_folder(lost_uuid, 1);
+                        update.push_back(new_folder);
+                        gInventory.accountForUpdate(update);
+
+                        titem->setParent(lost_uuid);
+                        titem->updateParentOnServer(FALSE);
+                        gInventory.updateItem(titem);
+                        gInventory.notifyObservers("fetchDescendents");
+                        
+                    }
+                }
+            }
+
+	        LLViewerInventoryCategory* pcat = gInventory.getCategory(parent_id);
+			if (!pcat)
+			{
+				continue;
+			}
+
 			for(LLSD::array_const_iterator category_it = folder_sd["categories"].beginArray();
 				category_it != folder_sd["categories"].endArray();
 				++category_it)
@@ -1107,7 +1235,7 @@ void  LLInventoryModel::fetchDescendentsResponder::result(const LLSD& content)
 				LLSD category = *category_it;
 				tcategory->fromLLSD(category); 
 							
-				if (sFullFetchStarted)
+				if (LLInventoryModel::sFullFetchStarted)
 				{
 					sFetchQueue.push_back(tcategory->getUUID());
 				}
@@ -1139,37 +1267,37 @@ void  LLInventoryModel::fetchDescendentsResponder::result(const LLSD& content)
 		}
 	}
 		
-	if (content.has("bad-folders"))
+	if (content.has("bad_folders"))
 	{
-		for(LLSD::array_const_iterator folder_it = content["bad-folders"].beginArray();
-			folder_it != content["bad-folders"].endArray();
+		for(LLSD::array_const_iterator folder_it = content["bad_folders"].beginArray();
+			folder_it != content["bad_folders"].endArray();
 			++folder_it)
 		{	
 			LLSD folder_sd = *folder_it;
 			
 			//These folders failed on the dataserver.  We probably don't want to retry them.
-			llinfos << "Folder " << folder_sd["folder-id"].asString() 
+			llinfos << "Folder " << folder_sd["folder_id"].asString() 
 					<< "Error: " << folder_sd["error"].asString() << llendl;
 		}
 	}
 
 	LLInventoryModel::incrBulkFetch(-1);
 	
-	if (isBulkFetchProcessingComplete())
+	if (LLInventoryModel::isBulkFetchProcessingComplete())
 	{
 		llinfos << "Inventory fetch completed" << llendl;
-		if (sFullFetchStarted)
+		if (LLInventoryModel::sFullFetchStarted)
 		{
-			sAllFoldersFetched = TRUE;
+			LLInventoryModel::sAllFoldersFetched = TRUE;
 		}
-		stopBackgroundFetch();
+		LLInventoryModel::stopBackgroundFetch();
 	}
 	
-	gInventory.notifyObservers();
+	gInventory.notifyObservers("fetchDescendents");
 }
 
 //If we get back an error (not found, etc...), handle it here
-void LLInventoryModel::fetchDescendentsResponder::error(U32 status, const std::string& reason)
+void fetchDescendentsResponder::error(U32 status, const std::string& reason)
 {
 	llinfos << "fetchDescendentsResponder::error "
 		<< status << ": " << reason << llendl;
@@ -1183,61 +1311,22 @@ void LLInventoryModel::fetchDescendentsResponder::error(U32 status, const std::s
 			++folder_it)
 		{	
 			LLSD folder_sd = *folder_it;
-			sRetrySD["folders"].append(folder_sd);
-		}
-		sMinTimeBetweenFetches = 10.0f; //Add 10 seconds for every time out in this sequence.
-		
-		if (!sRetryDialog)			//The dialog isn't up.  Prompt the resident.
-		{
-			sRetryDialog = gViewerWindow->alertXml("RetryFetchInventoryDescendents", onClickRetry, this);
+			LLUUID folder_id = folder_sd["folder_id"];
+			sFetchQueue.push_front(folder_id);
 		}
 	}
 	else
 	{
-		if (isBulkFetchProcessingComplete())
+		if (LLInventoryModel::isBulkFetchProcessingComplete())
 		{
-			if (sFullFetchStarted)
+			if (LLInventoryModel::sFullFetchStarted)
 			{
-				sAllFoldersFetched = TRUE;
+				LLInventoryModel::sAllFoldersFetched = TRUE;
 			}
-			stopBackgroundFetch();
+			LLInventoryModel::stopBackgroundFetch();
 		}
 	}
-	gInventory.notifyObservers();
-}
-
-void LLInventoryModel::fetchDescendentsResponder::onClickRetry(S32 option, void* userdata)
-{
-	if (option == 0)
-	{
-		std::string url;
-
-		LLViewerRegion * agent_region = gAgent.getRegion();
-		if (agent_region)
-		{
-			url = agent_region->getCapability("FetchInventoryDescendents");
-		}
-
-		if (!url.empty()) //Capability found.  Build up LLSD and use it.
-		{
-			LLSD body = sRetrySD;
-			LLInventoryModel::incrBulkFetch(1);
-			LLHTTPClient::post(url, body, new LLInventoryModel::fetchDescendentsResponder(body),300);
-		}
-	}
-	else
-	{
-		if (isBulkFetchProcessingComplete())
-		{
-			if (sFullFetchStarted)
-			{
-				sAllFoldersFetched = TRUE;
-			}
-			stopBackgroundFetch();
-		}
-	}
-	sRetryDialog=NULL;
-	sRetrySD.clear();
+	gInventory.notifyObservers("fetchDescendents");
 }
 
 //static   Bundle up a bunch of requests to send all at once.
@@ -1250,7 +1339,7 @@ void LLInventoryModel::bulkFetch(std::string url)
 
 	S16 max_concurrent_fetches=8;
 	F32 new_min_time = 0.5f;			//HACK!  Clean this up when old code goes away entirely.
-	if (sMinTimeBetweenFetches <= new_min_time) sMinTimeBetweenFetches=new_min_time;  //HACK!  See above.
+	if (sMinTimeBetweenFetches < new_min_time) sMinTimeBetweenFetches=new_min_time;  //HACK!  See above.
 	
 	if(gDisconnected 
 	|| sBulkFetchCount > max_concurrent_fetches
@@ -1259,88 +1348,84 @@ void LLInventoryModel::bulkFetch(std::string url)
 		return; // just bail if we are disconnected.
 	}	
 
-	//HACK.  This is inelegant.  We're shuffling a dequeue to a map to get rid of 
-	//redundant requests.  When we get rid of the old code entirely, we can change
-	//the dequeue to a map.  In the new model, there is no benefit to queue order.
 	U32 folder_count=0;
-	U32 max_batch_size=10;
-	while( !(sFetchQueue.empty() ) )
-	{
-		LLViewerInventoryCategory* cat = gInventory.getCategory(sFetchQueue.front());
-		
-		if (cat)
-		{
-			if ( !gInventory.isCategoryComplete(cat->getUUID()) )	//grab this folder.
-			{
-				sBulkFetchMap[(cat->getUUID())] = cat;
-			}
-			else if (sFullFetchStarted)
-			{	//Already have this folder but append child folders to list.
-				// add all children to queue
-				parent_cat_map_t::iterator cat_it = gInventory.mParentChildCategoryTree.find(cat->getUUID());
-				if (cat_it != gInventory.mParentChildCategoryTree.end())
-				{
-					cat_array_t* child_categories = cat_it->second;
-
-					for (S32 child_num = 0; child_num < child_categories->count(); child_num++)
-					{
-						sFetchQueue.push_back(child_categories->get(child_num)->getUUID());
-					}
-				}
+	U32 max_batch_size=5;
+
+	U32 sort_order = gSavedSettings.getU32("InventorySortOrder") & 0x1;
+
+	LLSD body;
+	LLSD body_lib;
+	while( !(sFetchQueue.empty() ) && (folder_count < max_batch_size) )
+	{
+        if (sFetchQueue.front().isNull()) //DEV-17797
+        {
+			LLSD folder_sd;
+			folder_sd["folder_id"]		= LLUUID::null.asString();
+			folder_sd["owner_id"]		= gAgent.getID();
+			folder_sd["sort_order"]		= (LLSD::Integer)sort_order;
+			folder_sd["fetch_folders"]	= (LLSD::Boolean)FALSE;
+			folder_sd["fetch_items"]	= (LLSD::Boolean)TRUE;
+			body["folders"].append(folder_sd);
+            folder_count++;
+        }
+        else
+        {
+				
 
-			}
-		}
+		    LLViewerInventoryCategory* cat = gInventory.getCategory(sFetchQueue.front());
+		
+		    if (cat)
+		    {
+			    if ( LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())
+			    {
+				    LLSD folder_sd;
+				    folder_sd["folder_id"]		= cat->getUUID();
+				    folder_sd["owner_id"]		= cat->getOwnerID();
+				    folder_sd["sort_order"]		= (LLSD::Integer)sort_order;
+				    folder_sd["fetch_folders"]	= TRUE; //(LLSD::Boolean)sFullFetchStarted;
+				    folder_sd["fetch_items"]	= (LLSD::Boolean)TRUE;
+				    
+				    if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID())
+					    body_lib["folders"].append(folder_sd);
+				    else
+					    body["folders"].append(folder_sd);
+				    folder_count++;
+			    }
+			    if (sFullFetchStarted)
+			    {	//Already have this folder but append child folders to list.
+				    // add all children to queue
+				    parent_cat_map_t::iterator cat_it = gInventory.mParentChildCategoryTree.find(cat->getUUID());
+				    if (cat_it != gInventory.mParentChildCategoryTree.end())
+				    {
+					    cat_array_t* child_categories = cat_it->second;
+    
+					    for (S32 child_num = 0; child_num < child_categories->count(); child_num++)
+					    {
+						    sFetchQueue.push_back(child_categories->get(child_num)->getUUID());
+					    }
+				    }
+    
+			    }
+		    }
+        }
 		sFetchQueue.pop_front();
 	}
 		
-
-	if (!sBulkFetchMap.empty())	//There's stuff to fetch.
-	{
-		U32 sort_order = gSavedSettings.getU32("InventorySortOrder") & 0x1;
-
-		LLSD body;
-		
-		cat_map_t::iterator iter=sBulkFetchMap.begin();
-		while( iter!=sBulkFetchMap.end() && (folder_count < max_batch_size) )
-		{
-			LLViewerInventoryCategory* cat = iter->second;
-			
-			if (cat && !gInventory.isCategoryComplete(cat->getUUID()) ) 	//Category exists
-			{
-				BOOL fetchItems=TRUE;
-				if ( sFullFetchStarted 
-					&& gInventory.isCategoryComplete(cat->getUUID()) )
-				{
-					fetchItems=FALSE;
-				}
-				
-				LLSD folder_sd;
-				folder_sd["folder-id"]		= cat->getUUID();
-				folder_sd["owner-id"]		= cat->getOwnerID();
-				folder_sd["sort-order"]		= (LLSD::Integer)sort_order;
-				folder_sd["fetch-folders"]	= (LLSD::Boolean)sFullFetchStarted;
-				folder_sd["fetch-items"]	= (LLSD::Boolean)fetchItems;
-				body["folders"].append(folder_sd);
-
-				folder_count++;
-			}
-			sBulkFetchMap.erase(iter);
-			iter=sBulkFetchMap.begin();
-		}
-	
-		if (iter == sBulkFetchMap.end()) sBulkFetchMap.clear();
-		
 		if (folder_count > 0)
 		{
 			sBulkFetchCount++;
-			
-			LLHTTPClient::post(url, body, new LLInventoryModel::fetchDescendentsResponder(body));
+			if (body["folders"].size())
+			{
+				LLHTTPClient::post(url, body, new fetchDescendentsResponder(body),300.0);
+			}
+			if (body_lib["folders"].size())
+			{
+				std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents");
+				LLHTTPClient::post(url_lib, body_lib, new fetchDescendentsResponder(body_lib),300.0);
+			}
 			sFetchTimer.reset();
 		}
-		
-	}	
-	
-	if (isBulkFetchProcessingComplete())
+	else if (isBulkFetchProcessingComplete())
 	{
 		if (sFullFetchStarted)
 		{
@@ -1391,6 +1476,14 @@ void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id)
 }
 
 //static
+void LLInventoryModel::findLostItems()
+{
+	sBackgroundFetchActive = TRUE;
+    sFetchQueue.push_back(LLUUID::null);
+    gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL);
+}
+
+//static
 void LLInventoryModel::stopBackgroundFetch()
 {
 	if (sBackgroundFetchActive)
@@ -1409,14 +1502,7 @@ void LLInventoryModel::backgroundFetch(void*)
 	if (sBackgroundFetchActive)
 	{
 		//If we'll be using the capability, we'll be sending batches and the background thing isn't as important.
-		std::string url;
-
-		LLViewerRegion * agent_region = gAgent.getRegion();
-		if (agent_region)
-		{
-			url = agent_region->getCapability("FetchInventoryDescendents");
-		}
-
+		std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents");   
 		if (!url.empty()) 
 		{
 			bulkFetch(url);
@@ -3373,12 +3459,72 @@ bool LLInventoryFetchObserver::isEverythingComplete() const
 	return mIncomplete.empty();
 }
 
+void fetch_items_from_llsd(const LLSD& items_llsd)
+{
+	if (!items_llsd.size()) return;
+	LLSD body;
+	body[0]["cap_name"] = "FetchInventory";
+	body[1]["cap_name"] = "FetchLib";
+	for (S32 i=0; i<items_llsd.size();i++)
+	{
+		if (items_llsd[i]["owner_id"].asString() == gAgent.getID().asString())
+		{
+			body[0]["items"].append(items_llsd[i]);
+			continue;
+		}
+		if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString())
+		{
+			body[1]["items"].append(items_llsd[i]);
+			continue;
+		}
+	}
+		
+	for (S32 i=0; i<body.size(); i++)
+	{
+		if (0 >= body[i].size()) continue;
+		std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString());
+
+		if (!url.empty())
+		{
+			body[i]["agent_id"]	= gAgent.getID();
+			LLHTTPClient::post(url, body[i], new LLInventoryModel::fetchInventoryResponder(body[i]));
+			break;
+		}
+
+		LLMessageSystem* msg = gMessageSystem;
+		BOOL start_new_message = TRUE;
+		for (S32 j=0; j<body[i]["items"].size(); j++)
+		{
+			LLSD item_entry = body[i]["items"][j];
+			if(start_new_message)
+			{
+				start_new_message = FALSE;
+				msg->newMessageFast(_PREHASH_FetchInventory);
+				msg->nextBlockFast(_PREHASH_AgentData);
+				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+			}
+			msg->nextBlockFast(_PREHASH_InventoryData);
+			msg->addUUIDFast(_PREHASH_OwnerID, item_entry["owner_id"].asUUID());
+			msg->addUUIDFast(_PREHASH_ItemID, item_entry["item_id"].asUUID());
+			if(msg->isSendFull(NULL))
+			{
+				start_new_message = TRUE;
+				gAgent.sendReliableMessage();
+			}
+		}
+		if(!start_new_message)
+		{
+			gAgent.sendReliableMessage();
+		}
+	}
+}
+
 void LLInventoryFetchObserver::fetchItems(
 	const LLInventoryFetchObserver::item_ref_t& ids)
 {
-	LLMessageSystem* msg = gMessageSystem;
-	BOOL start_new_message = TRUE;
 	LLUUID owner_id;
+	LLSD items_llsd;
 	for(item_ref_t::const_iterator it = ids.begin(); it < ids.end(); ++it)
 	{
 		LLViewerInventoryItem* item = gInventory.getItem(*it);
@@ -3400,31 +3546,18 @@ void LLInventoryFetchObserver::fetchItems(
 			// assume it's agent inventory.
 			owner_id = gAgent.getID();
 		}
-
+		
 		// It's incomplete, so put it on the incomplete container, and
 		// pack this on the message.
 		mIncomplete.push_back(*it);
-		if(start_new_message)
-		{
-			start_new_message = FALSE;
-			msg->newMessageFast(_PREHASH_FetchInventory);
-			msg->nextBlockFast(_PREHASH_AgentData);
-			msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-			msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-		}
-		msg->nextBlockFast(_PREHASH_InventoryData);
-		msg->addUUIDFast(_PREHASH_OwnerID, owner_id);
-		msg->addUUIDFast(_PREHASH_ItemID, (*it));
-		if(msg->isSendFull(NULL))
-		{
-			start_new_message = TRUE;
-			gAgent.sendReliableMessage();
-		}
-	}
-	if(!start_new_message)
-	{
-		gAgent.sendReliableMessage();
+		
+		// Prepare the data to fetch
+		LLSD item_entry;
+		item_entry["owner_id"] = owner_id;
+		item_entry["item_id"] = (*it);
+		items_llsd.append(item_entry);
 	}
+	fetch_items_from_llsd(items_llsd);
 }
 
 // virtual
@@ -3579,9 +3712,8 @@ void LLInventoryFetchComboObserver::fetch(
 	// descendent of an incomplete folder because the item will show
 	// up in an inventory descendents message soon enough so we do not
 	// have to fetch it individually.
+	LLSD items_llsd;
 	LLUUID owner_id;
-	LLMessageSystem* msg = gMessageSystem;
-	bool start_new_message = true;
 	for(item_ref_t::const_iterator iit = item_ids.begin(); iit != item_ids.end(); ++iit)
 	{
 		LLViewerInventoryItem* item = gInventory.getItem(*iit);
@@ -3604,33 +3736,17 @@ void LLInventoryFetchComboObserver::fetch(
 		}
 		if(std::find(mIncompleteFolders.begin(), mIncompleteFolders.end(), item->getParentUUID()) == mIncompleteFolders.end())
 		{
-			lldebugs << "fetching item " << *iit << llendl;
-			if(start_new_message)
-			{
-				start_new_message = false;
-				msg->newMessageFast(_PREHASH_FetchInventory);
-				msg->nextBlockFast(_PREHASH_AgentData);
-				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-			}
-			msg->nextBlockFast(_PREHASH_InventoryData);
-			msg->addUUIDFast(_PREHASH_OwnerID, owner_id);
-			msg->addUUIDFast(_PREHASH_ItemID, (*iit));
-			if(msg->isSendFullFast(_PREHASH_InventoryData))
-			{
-				start_new_message = true;
-				gAgent.sendReliableMessage();
-			}
+			LLSD item_entry;
+			item_entry["owner_id"] = owner_id;
+			item_entry["item_id"] = (*iit);
+			items_llsd.append(item_entry);
 		}
 		else
 		{
 			lldebugs << "not worrying about " << *iit << llendl;
 		}
 	}
-	if(!start_new_message)
-	{
-		gAgent.sendReliableMessage();
-	}
+	fetch_items_from_llsd(items_llsd);
 }
 
 void LLInventoryExistenceObserver::watchItem(const LLUUID& id)
@@ -3676,7 +3792,17 @@ void LLInventoryAddedObserver::changed(U32 mask)
 	// the network, figure out which item was updated.
 	// Code from Gigs Taggert, sin allowed by JC.
 	LLMessageSystem* msg = gMessageSystem;
-	std::string msg_name = msg->getMessageName();
+
+	std::string msg_name;
+	if (mMessageName.empty())
+	{
+		msg_name = msg->getMessageName();
+	}
+	else
+	{
+		msg_name = mMessageName;
+	}
+
 	if (msg_name.empty())
 	{
 		return;
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index 8017410..d2be761 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -69,6 +69,7 @@ public:
 	};
 	virtual ~LLInventoryObserver() {};
 	virtual void changed(U32 mask) = 0;
+	std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328]
 };
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -110,20 +111,17 @@ public:
 	LLInventoryModel();
 	~LLInventoryModel();
 
-	class fetchDescendentsResponder: public LLHTTPClient::Responder
+	class fetchInventoryResponder: public LLHTTPClient::Responder
 	{
-		public:
-			fetchDescendentsResponder(const LLSD& request_sd) : mRequestSD(request_sd) {};
-			void result(const LLSD& content);			
-			void error(U32 status, const std::string& reason);
-			static void onClickRetry(S32 option, void* userdata);
-			static void appendRetryList(LLSD retry_sd);
-		public:
-			typedef std::vector<LLViewerInventoryCategory*> folder_ref_t;
-		protected:
-			LLSD mRequestSD;
-			static LLSD sRetrySD;
-			static LLAlertDialog		*sRetryDialog;
+	public:
+		fetchInventoryResponder(const LLSD& request_sd) : mRequestSD(request_sd) {};
+		void result(const LLSD& content);			
+		void error(U32 status, const std::string& reason);
+
+	public:
+		typedef std::vector<LLViewerInventoryCategory*> folder_ref_t;
+	protected:
+		LLSD mRequestSD;
 	};
 
 	//
@@ -268,7 +266,8 @@ public:
 	// Call this method when it's time to update everyone on a new
 	// state, by default, the inventory model will not update
 	// observers automatically.
-	void notifyObservers();
+	// The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328]
+	void notifyObservers(const std::string service_name="");
 
 	// This allows outsiders to tell the inventory if something has
 	// been changed 'under the hood', but outside the control of the
@@ -370,7 +369,7 @@ public:
 	// start and stop background breadth-first fetching of inventory contents
 	// this gets triggered when performing a filter-search
 	static void startBackgroundFetch(const LLUUID& cat_id = LLUUID::null); // start fetch process
-	static void stopBackgroundFetch(); // stop fetch process
+    static void findLostItems();
 	static BOOL backgroundFetchActive();
 	static bool isEverythingFetched();
 	static void backgroundFetch(void*); // background fetch idle function
@@ -419,7 +418,6 @@ protected:
 	static void processInventoryDescendents(LLMessageSystem* msg, void**);
 	static void processMoveInventoryItem(LLMessageSystem* msg, void**);
 	static void processFetchInventoryReply(LLMessageSystem* msg, void**);
-	static bool isBulkFetchProcessingComplete();
 	
 	bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting);
 
@@ -460,11 +458,8 @@ protected:
 	observer_list_t mObservers;
 
 	// completing the fetch once per session should be sufficient
-	static cat_map_t sBulkFetchMap;
 	static BOOL sBackgroundFetchActive;
 	static BOOL sTimelyFetchPending;
-	static BOOL sAllFoldersFetched; 
-	static BOOL sFullFetchStarted;
 	static S32  sNumFetchRetries;
 	static LLFrameTimer sFetchTimer;
 	static F32 sMinTimeBetweenFetches;
@@ -477,6 +472,11 @@ protected:
 public:
 	// *NOTE: DEBUG functionality
 	void dumpInventory();
+	static bool isBulkFetchProcessingComplete();
+	static void stopBackgroundFetch(); // stop fetch process
+
+	static BOOL sFullFetchStarted;
+	static BOOL sAllFoldersFetched; 
 };
 
 // a special inventory model for the agent
diff --git a/indra/newview/llinventoryview.cpp b/indra/newview/llinventoryview.cpp
index f9dd70d..418578e 100644
--- a/indra/newview/llinventoryview.cpp
+++ b/indra/newview/llinventoryview.cpp
@@ -1329,6 +1329,16 @@ LLView* LLInventoryPanel::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac
 	return panel;
 }
 
+void LLInventoryPanel::draw()
+{
+	// select the desired item (in case it wasn't loaded when the selection was requested)
+	if (mSelectThisID.notNull())
+	{
+		setSelection(mSelectThisID, false);
+	}
+	LLPanel::draw();
+}
+
 void LLInventoryPanel::setFilterTypes(U32 filter_types)
 {
 	mFolders->getFilter()->setFilterTypes(filter_types);
@@ -1701,15 +1711,21 @@ void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_foc
 	LLFolderViewItem* itemp = mFolders->getItemByID(obj_id);
 	if(itemp && itemp->getListener())
 	{
-		itemp->getListener()->arrangeAndSet(itemp,
-											  TRUE,
-											  take_keyboard_focus);
+		itemp->getListener()->arrangeAndSet(itemp, TRUE, take_keyboard_focus);
+		mSelectThisID.setNull();
+		return;
+	}
+	else
+	{
+		// save the desired item to be selected later (if/when ready)
+		mSelectThisID = obj_id;
 	}
 }
 
 void LLInventoryPanel::clearSelection()
 {
 	mFolders->clearSelection();
+	mSelectThisID.setNull();
 }
 
 void LLInventoryPanel::createNewItem(const std::string& name,
diff --git a/indra/newview/llinventoryview.h b/indra/newview/llinventoryview.h
index a37d370..1cf8b8f 100644
--- a/indra/newview/llinventoryview.h
+++ b/indra/newview/llinventoryview.h
@@ -86,6 +86,7 @@ public:
 	static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory);
 
 	// LLView methods
+	void draw();
 	BOOL handleHover(S32 x, S32 y, MASK mask);
 	BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
 								   EDragAndDropType cargo_type,
@@ -150,7 +151,8 @@ protected:
 	LLFolderView*				mFolders;
 	LLScrollableContainerView*	mScroller;
 	BOOL 						mAllowMultiSelect;
-	const std::string				mSortOrderSetting;
+	const std::string			mSortOrderSetting;
+	LLUUID						mSelectThisID; // if non null, select this item
 };
 
 class LLInventoryView;
diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp
index 773c57e..ff54569 100644
--- a/indra/newview/lljoystickbutton.cpp
+++ b/indra/newview/lljoystickbutton.cpp
@@ -651,11 +651,11 @@ void LLJoystickCameraRotate::drawRotatedImage( const LLImageGL* image, S32 rotat
 		{ 1.f, 0.f }
 	};
 
-	image->bind();
+	gGL.getTexUnit(0)->bind(image);
 
 	gGL.color4fv(UI_VERTEX_COLOR.mV);
 	
-	gGL.begin(LLVertexBuffer::QUADS);
+	gGL.begin(LLRender::QUADS);
 	{
 		gGL.texCoord2fv( uv[ (rotations + 0) % 4]);
 		gGL.vertex2i(width, height );
diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp
index 89f13fe..87e7a13 100644
--- a/indra/newview/llmanip.cpp
+++ b/indra/newview/llmanip.cpp
@@ -388,13 +388,13 @@ void LLManip::renderGuidelines(BOOL draw_x, BOOL draw_y, BOOL draw_z)
 
 		const F32 LINE_ALPHA = 0.33f;
 
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		LLUI::setLineWidth(1.5f);
 
 		if (draw_x)
 		{
 			gGL.color4f(1.f, 0.f, 0.f, LINE_ALPHA);
-			gGL.begin(LLVertexBuffer::LINES);
+			gGL.begin(LLRender::LINES);
 			gGL.vertex3f( -region_size, 0.f, 0.f );
 			gGL.vertex3f(  region_size, 0.f, 0.f );
 			gGL.end();
@@ -403,7 +403,7 @@ void LLManip::renderGuidelines(BOOL draw_x, BOOL draw_y, BOOL draw_z)
 		if (draw_y)
 		{
 			gGL.color4f(0.f, 1.f, 0.f, LINE_ALPHA);
-			gGL.begin(LLVertexBuffer::LINES);
+			gGL.begin(LLRender::LINES);
 			gGL.vertex3f( 0.f, -region_size, 0.f );
 			gGL.vertex3f( 0.f,  region_size, 0.f );
 			gGL.end();
@@ -412,7 +412,7 @@ void LLManip::renderGuidelines(BOOL draw_x, BOOL draw_y, BOOL draw_z)
 		if (draw_z)
 		{
 			gGL.color4f(0.f, 0.f, 1.f, LINE_ALPHA);
-			gGL.begin(LLVertexBuffer::LINES);
+			gGL.begin(LLRender::LINES);
 			gGL.vertex3f( 0.f, 0.f, -region_size );
 			gGL.vertex3f( 0.f, 0.f,  region_size );
 			gGL.end();
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index 11b5e8c..ade07b4 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -115,7 +115,7 @@ void LLManipRotate::handleSelect()
 void LLManipRotate::render()
 {
 	LLGLSUIDefault gls_ui;
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	LLGLDepthTest gls_depth(GL_TRUE);
 	LLGLEnable gl_blend(GL_BLEND);
 	LLGLEnable gls_alpha_test(GL_ALPHA_TEST);
@@ -838,7 +838,7 @@ void LLManipRotate::renderSnapGuides()
 				LLVector3 outer_point;
 				LLVector3 text_point;
 				LLQuaternion rot(deg * DEG_TO_RAD, constraint_axis);
-				gGL.begin(LLVertexBuffer::LINES);
+				gGL.begin(LLRender::LINES);
 				{
 					inner_point = (projected_snap_axis * mRadiusMeters * SNAP_GUIDE_INNER_RADIUS * rot) + center;
 					F32 tick_length = 0.f;
@@ -1017,7 +1017,7 @@ void LLManipRotate::renderSnapGuides()
 				object_axis = object_axis * SNAP_GUIDE_INNER_RADIUS * mRadiusMeters + center;
 				LLVector3 line_start = center;
 
-				gGL.begin(LLVertexBuffer::LINES);
+				gGL.begin(LLRender::LINES);
 				{
 					gGL.vertex3fv(line_start.mV);
 					gGL.vertex3fv(object_axis.mV);
@@ -1025,7 +1025,7 @@ void LLManipRotate::renderSnapGuides()
 				gGL.end();
 
 				// draw snap guide arrow
-				gGL.begin(LLVertexBuffer::TRIANGLES);
+				gGL.begin(LLRender::TRIANGLES);
 				{
 					LLVector3 arrow_dir;
 					LLVector3 arrow_span = (object_axis - line_start) % getConstraintAxis();
@@ -1045,7 +1045,7 @@ void LLManipRotate::renderSnapGuides()
 
 				{
 					LLGLDepthTest gls_depth(GL_TRUE);
-					gGL.begin(LLVertexBuffer::LINES);
+					gGL.begin(LLRender::LINES);
 					{
 						gGL.vertex3fv(line_start.mV);
 						gGL.vertex3fv(object_axis.mV);
@@ -1053,7 +1053,7 @@ void LLManipRotate::renderSnapGuides()
 					gGL.end();
 
 					// draw snap guide arrow
-					gGL.begin(LLVertexBuffer::TRIANGLES);
+					gGL.begin(LLRender::TRIANGLES);
 					{
 						LLVector3 arrow_dir;
 						LLVector3 arrow_span = (object_axis - line_start) % getConstraintAxis();
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index 0fa5fa5..5c9c889 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -197,7 +197,7 @@ LLManipScale::~LLManipScale()
 void LLManipScale::render()
 {
 	LLGLSUIDefault gls_ui;
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	LLGLDepthTest gls_depth(GL_TRUE);
 	LLGLEnable gl_blend(GL_BLEND);
 	LLGLEnable gls_alpha_test(GL_ALPHA_TEST);
@@ -590,7 +590,7 @@ void LLManipScale::renderFaces( const LLBBox& bbox )
 	{
 		gGL.color4fv( default_normal_color.mV );
 		LLGLDepthTest gls_depth(GL_FALSE);
-		gGL.begin(LLVertexBuffer::QUADS); 
+		gGL.begin(LLRender::QUADS); 
 		{
 			// Face 0
 			gGL.vertex3f(min.mV[VX], max.mV[VY], max.mV[VZ]);
@@ -751,7 +751,7 @@ void LLManipScale::renderCorners( const LLBBox& bbox )
 
 void LLManipScale::renderBoxHandle( F32 x, F32 y, F32 z )
 {
-	LLImageGL::unbindTexture(0);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	LLGLDepthTest gls_depth(GL_FALSE);
 
 	glPushMatrix();
@@ -1528,7 +1528,7 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
 	{
 		LLColor4 tick_color = setupSnapGuideRenderPass(pass);
 
-		gGL.begin(LLVertexBuffer::LINES);
+		gGL.begin(LLRender::LINES);
 		LLVector3 line_mid = mScaleCenter + (mScaleSnapValue * mScaleDir) + (mSnapGuideDir1 * mSnapRegimeOffset);
 		LLVector3 line_start = line_mid - (mScaleDir * (llmin(mScaleSnapValue, mSnapGuideLength * 0.5f)));
 		LLVector3 line_end = line_mid + (mScaleDir * llmin(max_point_on_scale_line - mScaleSnapValue, mSnapGuideLength * 0.5f));
@@ -1579,7 +1579,7 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
 		if (mInSnapRegime)
 		{
 			// draw snap guide line
-			gGL.begin(LLVertexBuffer::LINES);
+			gGL.begin(LLRender::LINES);
 			LLVector3 snap_line_center = mScaleCenter + (mScaleSnapValue * mScaleDir);
 
 			LLVector3 snap_line_start = snap_line_center + (mSnapGuideDir1 * mSnapRegimeOffset);
@@ -1593,7 +1593,7 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
 			gGL.end();
 
 			// draw snap guide arrow
-			gGL.begin(LLVertexBuffer::TRIANGLES);
+			gGL.begin(LLRender::TRIANGLES);
 			{
 				//gGLSNoCullFaces.set();
 				gGL.color4f(1.f, 1.f, 1.f, grid_alpha);
@@ -1628,7 +1628,7 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
 			start_tick = -(llmin(ticks_from_scale_center_1, num_ticks_per_side1));
 			stop_tick = llmin(max_ticks1, num_ticks_per_side1);
 
-			gGL.begin(LLVertexBuffer::LINES);
+			gGL.begin(LLRender::LINES);
 			// draw first row of ticks
 			for (S32 i = start_tick; i <= stop_tick; i++)
 			{
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index 2278453..30fa745 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -134,7 +134,7 @@ void LLManipTranslate::restoreGL()
 
 	GLuint* d = new GLuint[rez*rez];
 	glGenTextures(1, &sGridTex);
-	glBindTexture(GL_TEXTURE_2D, sGridTex);
+	gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, sGridTex);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 
@@ -1052,7 +1052,7 @@ void LLManipTranslate::renderSnapGuides()
 	F32 max_subdivisions = sGridMaxSubdivisionLevel;//(F32)gSavedSettings.getS32("GridSubdivision");
 	F32 line_alpha = gSavedSettings.getF32("GridOpacity");
 
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	LLGLDepthTest gls_depth(GL_TRUE);
 	LLGLDisable gls_cull(GL_CULL_FACE);
 	LLVector3 translate_axis;
@@ -1223,7 +1223,7 @@ void LLManipTranslate::renderSnapGuides()
 		{
 			LLColor4 line_color = setupSnapGuideRenderPass(pass);
 
-			gGL.begin(LLVertexBuffer::LINES);
+			gGL.begin(LLRender::LINES);
 			{
 				LLVector3 line_start = selection_center + (mSnapOffsetMeters * mSnapOffsetAxis) + (translate_axis * (guide_size_meters * 0.5f + offset_nearest_grid_unit));
 				LLVector3 line_end = selection_center + (mSnapOffsetMeters * mSnapOffsetAxis) - (translate_axis * (guide_size_meters * 0.5f + offset_nearest_grid_unit));
@@ -1299,7 +1299,7 @@ void LLManipTranslate::renderSnapGuides()
 				LLVector3 line_start = selection_center - mSnapOffsetAxis * mSnapOffsetMeters;
 				LLVector3 line_end = selection_center + mSnapOffsetAxis * mSnapOffsetMeters;
 
-				gGL.begin(LLVertexBuffer::LINES);
+				gGL.begin(LLRender::LINES);
 				{
 					gGL.color4f(line_color.mV[VX], line_color.mV[VY], line_color.mV[VZ], line_color.mV[VW]);
 
@@ -1309,7 +1309,7 @@ void LLManipTranslate::renderSnapGuides()
 				gGL.end();
 
 				// draw snap guide arrow
-				gGL.begin(LLVertexBuffer::TRIANGLES);
+				gGL.begin(LLRender::TRIANGLES);
 				{
 					gGL.color4f(line_color.mV[VX], line_color.mV[VY], line_color.mV[VZ], line_color.mV[VW]);
 
@@ -1463,7 +1463,7 @@ void LLManipTranslate::renderSnapGuides()
 			break;
 		}
 
-		LLImageGL::unbindTexture(0);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		highlightIntersection(normal, selection_center, grid_rotation, inner_color);
 
 		gGL.pushMatrix();
@@ -1503,7 +1503,7 @@ void LLManipTranslate::renderSnapGuides()
 				LLGLDisable stencil(GL_STENCIL_TEST);
 				{
 					LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GREATER);
-					glBindTexture(GL_TEXTURE_2D, sGridTex);
+					gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, sGridTex);
 					gGL.flush();
 					gGL.blendFunc(LLRender::BF_ZERO, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
 					renderGrid(u,v,tiles,0.9f, 0.9f, 0.9f,a*0.15f);
@@ -1514,11 +1514,11 @@ void LLManipTranslate::renderSnapGuides()
 				{
 					LLGLDisable alpha_test(GL_ALPHA_TEST);
 					//draw black overlay
-					LLImageGL::unbindTexture(0);
+					gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 					renderGrid(u,v,tiles,0.0f, 0.0f, 0.0f,a*0.16f);
 
 					//draw grid top
-					glBindTexture(GL_TEXTURE_2D, sGridTex);
+					gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, sGridTex);
 					renderGrid(u,v,tiles,1,1,1,a);
 
 					gGL.popMatrix();
@@ -1564,7 +1564,7 @@ void LLManipTranslate::renderGrid(F32 x, F32 y, F32 size, F32 r, F32 g, F32 b, F
 
 	for (F32 xx = -size-d; xx < size+d; xx += d)
 	{
-		gGL.begin(LLVertexBuffer::TRIANGLE_STRIP);
+		gGL.begin(LLRender::TRIANGLE_STRIP);
 		for (F32 yy = -size-d; yy < size+d; yy += d)
 		{
 			float dx, dy, da;
@@ -1620,7 +1620,7 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,
 		LLGLDepthTest depth (GL_TRUE, GL_FALSE, GL_ALWAYS);
 		glStencilFunc(GL_ALWAYS, 0, stencil_mask);
 		gGL.setColorMask(false, false);
-		LLImageGL::unbindTexture(0);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		glColor4f(1,1,1,1);
 
 		//setup clip plane
@@ -1686,7 +1686,7 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,
 
 	//draw volume/plane intersections
 	{
-		LLImageGL::unbindTexture(0);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		LLGLDepthTest depth(GL_FALSE);
 		LLGLEnable stencil(GL_STENCIL_TEST);
 		glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
@@ -1834,7 +1834,7 @@ void LLManipTranslate::renderTranslationHandles()
 		relative_camera_dir.normVec();
 
 		{
-			LLGLSNoTexture gls_ui_no_texture;
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			LLGLDisable cull_face(GL_CULL_FACE);
 
 			LLColor4 color1;
@@ -1877,7 +1877,7 @@ void LLManipTranslate::renderTranslationHandles()
 					color1.setVec(0.f, 1.f, 0.f, 0.6f);
 					color2.setVec(0.f, 0.f, 1.f, 0.6f);
 				}
-				gGL.begin(LLVertexBuffer::TRIANGLES);
+				gGL.begin(LLRender::TRIANGLES);
 				{
 					gGL.color4fv(color1.mV);
 					gGL.vertex3f(0.f, mPlaneManipOffsetMeters * (-PLANE_TICK_SIZE * 0.25f), mPlaneManipOffsetMeters * (-PLANE_TICK_SIZE * 0.25f));
@@ -1892,7 +1892,7 @@ void LLManipTranslate::renderTranslationHandles()
 				gGL.end();
 
 				LLUI::setLineWidth(3.0f);
-				gGL.begin(LLVertexBuffer::LINES);
+				gGL.begin(LLRender::LINES);
 				{
 					gGL.color4f(0.f, 0.f, 0.f, 0.3f);
 					gGL.vertex3f(0.f, mPlaneManipOffsetMeters * -PLANE_TICK_SIZE * 0.25f,  mPlaneManipOffsetMeters * -PLANE_TICK_SIZE * 0.25f);
@@ -1932,7 +1932,7 @@ void LLManipTranslate::renderTranslationHandles()
 					color2.setVec(1.f, 0.f, 0.f, 0.6f);
 				}
 
-				gGL.begin(LLVertexBuffer::TRIANGLES);
+				gGL.begin(LLRender::TRIANGLES);
 				{
 					gGL.color4fv(color1.mV);
 					gGL.vertex3f(mPlaneManipOffsetMeters * (PLANE_TICK_SIZE * 0.25f), 0.f, mPlaneManipOffsetMeters * (PLANE_TICK_SIZE * 0.25f));
@@ -1947,7 +1947,7 @@ void LLManipTranslate::renderTranslationHandles()
 				gGL.end();
 
 				LLUI::setLineWidth(3.0f);
-				gGL.begin(LLVertexBuffer::LINES);
+				gGL.begin(LLRender::LINES);
 				{
 					gGL.color4f(0.f, 0.f, 0.f, 0.3f);
 					gGL.vertex3f(mPlaneManipOffsetMeters * -PLANE_TICK_SIZE * 0.25f,  0.f, mPlaneManipOffsetMeters * -PLANE_TICK_SIZE * 0.25f);
@@ -2011,7 +2011,7 @@ void LLManipTranslate::renderTranslationHandles()
 						color2.setVec(0.f, 0.8f, 0.f, 0.6f);
 					}
 				
-					gGL.begin(LLVertexBuffer::TRIANGLES);
+					gGL.begin(LLRender::TRIANGLES);
 					{
 						gGL.color4fv(color1.mV);
 						gGL.vertex3fv(v0.mV);
@@ -2026,7 +2026,7 @@ void LLManipTranslate::renderTranslationHandles()
 					gGL.end();
 
 					LLUI::setLineWidth(3.0f);
-					gGL.begin(LLVertexBuffer::LINES);
+					gGL.begin(LLRender::LINES);
 					{
 						gGL.color4f(0.f, 0.f, 0.f, 0.3f);
 						LLVector3 v12 = (v1 + v2) * .5f;
@@ -2052,7 +2052,7 @@ void LLManipTranslate::renderTranslationHandles()
 			}
 		}
 		{
-			LLGLSNoTexture gls_ui_no_texture;
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 			// Since we draw handles with depth testing off, we need to draw them in the 
 			// proper depth order.
@@ -2126,7 +2126,7 @@ void LLManipTranslate::renderTranslationHandles()
 
 void LLManipTranslate::renderArrow(S32 which_arrow, S32 selected_arrow, F32 box_size, F32 arrow_size, F32 handle_size, BOOL reverse_direction)
 {
-	LLGLSNoTexture gls_ui_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	LLGLEnable gls_blend(GL_BLEND);
 	LLGLEnable gls_color_material(GL_COLOR_MATERIAL);
 
@@ -2160,7 +2160,7 @@ void LLManipTranslate::renderArrow(S32 which_arrow, S32 selected_arrow, F32 box_
 
 		{
 			LLUI::setLineWidth(2.0f);
-			gGL.begin(LLVertexBuffer::LINES);
+			gGL.begin(LLRender::LINES);
 				vec.mV[index] = box_size;
 				gGL.vertex3f(vec.mV[0], vec.mV[1], vec.mV[2]);
 
diff --git a/indra/newview/llmapresponders.cpp b/indra/newview/llmapresponders.cpp
index d16bc78..898ac58 100644
--- a/indra/newview/llmapresponders.cpp
+++ b/indra/newview/llmapresponders.cpp
@@ -66,7 +66,7 @@ void LLMapLayerResponder::result(const LLSD& result)
 		new_layer.LayerDefined = TRUE;
 		new_layer.LayerImageID = layer_data["ImageID"];
 		new_layer.LayerImage = gImageList.getImage(new_layer.LayerImageID, MIPMAP_TRUE, FALSE);
-		new_layer.LayerImage->bindTexture(0);
+		gGL.getTexUnit(0)->bind(new_layer.LayerImage.get());
 		new_layer.LayerImage->setClamp(TRUE, TRUE);
 		
 		new_layer.LayerExtents.mLeft = layer_data["Left"];
@@ -163,7 +163,7 @@ void LLMapLayerResponder::result(const LLSD& result)
 				siminfo->mWaterHeight = (F32) water_height;
 				siminfo->mMapImageID[agent_flags] = image_id;
 				siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE);
-				siminfo->mCurrentImage->bindTexture(0);
+				gGL.getTexUnit(0)->bind(siminfo->mCurrentImage.get());
 				siminfo->mCurrentImage->setClamp(TRUE, TRUE);
 			
 				if (siminfo->mMapImageID[2].notNull())
diff --git a/indra/newview/llmemoryview.cpp b/indra/newview/llmemoryview.cpp
index c814e2b..89001d4 100644
--- a/indra/newview/llmemoryview.cpp
+++ b/indra/newview/llmemoryview.cpp
@@ -146,7 +146,7 @@ void LLMemoryView::draw()
 	S32 height = getRect().getHeight();
 	
 	LLGLSUIDefault gls_ui;
-	LLGLSNoTexture gls_no_tex;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	gl_rect_2d(0, height, width, 0, LLColor4(0.f, 0.f, 0.f, 0.25f));
 	
 #if MEM_TRACK_TYPE
diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp
index 0cdfe83..fe42608 100644
--- a/indra/newview/llmutelist.cpp
+++ b/indra/newview/llmutelist.cpp
@@ -97,6 +97,26 @@ const char AGENT_SUFFIX[] = " (resident)";
 const char OBJECT_SUFFIX[] = " (object)";
 const char GROUP_SUFFIX[] = " (group)";
 
+
+LLMute::LLMute(const LLUUID& id, const std::string& name, EType type, U32 flags)
+  : mID(id),
+	mName(name),
+	mType(type),
+	mFlags(flags)
+{
+	// muting is done by root objects only - try to find this objects root
+	LLViewerObject *objectp = gObjectList.findObject(mID);
+	if ((objectp) && (!objectp->isAvatar()))
+	{
+		LLViewerObject *parentp = (LLViewerObject *)objectp->getParent();
+		if (parentp)
+		{
+			mID = parentp->getID();
+		}
+	}
+}
+
+
 std::string LLMute::getDisplayName() const
 {
 	std::string name_with_suffix = mName;
@@ -216,17 +236,24 @@ void LLMuteList::loadUserVolumes()
 //-----------------------------------------------------------------------------
 LLMuteList::~LLMuteList()
 {
-	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "volume_settings.xml");
-	LLSD settings_llsd;
-
-	for(user_volume_map_t::iterator iter = mUserVolumeSettings.begin(); iter != mUserVolumeSettings.end(); ++iter)
+	// If we quit from the login screen we will not have an SL account
+	// name.  Don't try to save, otherwise we'll dump a file in
+	// C:\Program Files\SecondLife\  JC
+	std::string user_dir = gDirUtilp->getLindenUserDir();
+	if (!user_dir.empty())
 	{
-		settings_llsd[iter->first.asString()] = iter->second;
-	}
+		std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "volume_settings.xml");
+		LLSD settings_llsd;
 
-	llofstream file;
-	file.open(filename);
-	LLSDSerialize::toPrettyXML(settings_llsd, file);
+		for(user_volume_map_t::iterator iter = mUserVolumeSettings.begin(); iter != mUserVolumeSettings.end(); ++iter)
+		{
+			settings_llsd[iter->first.asString()] = iter->second;
+		}
+
+		llofstream file;
+		file.open(filename);
+		LLSDSerialize::toPrettyXML(settings_llsd, file);
+	}
 }
 
 BOOL LLMuteList::isLinden(const std::string& name) const
diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h
index 400f13e..af9c498 100644
--- a/indra/newview/llmutelist.h
+++ b/indra/newview/llmutelist.h
@@ -60,8 +60,7 @@ public:
 		flagAll				= 0x0000000F		// Mask of all currently defined flags
 	};
 	
-	LLMute(const LLUUID& id, const std::string& name = std::string(), EType type = BY_NAME, U32 flags = 0) 
-	: mID(id), mName(name), mType(type),mFlags(flags) { }
+	LLMute(const LLUUID& id, const std::string& name = std::string(), EType type = BY_NAME, U32 flags = 0);
 
 	// Returns name + suffix based on type
 	// For example:  "James Tester (resident)"
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index b277998..36b6863 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -226,7 +226,7 @@ void LLNetMap::draw()
 		LLGLEnable scissor(GL_SCISSOR_TEST);
 		
 		{
-			LLGLSNoTexture no_texture;
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			LLLocalClipRect clip(getLocalRect());
 
 			glMatrixMode(GL_MODELVIEW);
@@ -286,8 +286,8 @@ void LLNetMap::draw()
 
 
 			// Draw using texture.
-			LLViewerImage::bindTexture(regionp->getLand().getSTexture());
-			gGL.begin(LLVertexBuffer::QUADS);
+			gGL.getTexUnit(0)->bind(regionp->getLand().getSTexture());
+			gGL.begin(LLRender::QUADS);
 				gGL.texCoord2f(0.f, 1.f);
 				gGL.vertex2f(left, top);
 				gGL.texCoord2f(0.f, 0.f);
@@ -303,8 +303,8 @@ void LLNetMap::draw()
 			{
 				if (regionp->getLand().getWaterTexture())
 				{
-					LLViewerImage::bindTexture(regionp->getLand().getWaterTexture());
-					gGL.begin(LLVertexBuffer::QUADS);
+					gGL.getTexUnit(0)->bind(regionp->getLand().getWaterTexture());
+					gGL.begin(LLRender::QUADS);
 						gGL.texCoord2f(0.f, 1.f);
 						gGL.vertex2f(left, top);
 						gGL.texCoord2f(0.f, 0.f);
@@ -350,11 +350,11 @@ void LLNetMap::draw()
 		map_center_agent.mV[VX] *= gMiniMapScale/region_width;
 		map_center_agent.mV[VY] *= gMiniMapScale/region_width;
 
-		LLViewerImage::bindTexture(mObjectImagep);
+		gGL.getTexUnit(0)->bind(mObjectImagep);
 		F32 image_half_width = 0.5f*mObjectMapPixels;
 		F32 image_half_height = 0.5f*mObjectMapPixels;
 
-		gGL.begin(LLVertexBuffer::QUADS);
+		gGL.begin(LLRender::QUADS);
 			gGL.texCoord2f(0.f, 1.f);
 			gGL.vertex2f(map_center_agent.mV[VX] - image_half_width, image_half_height + map_center_agent.mV[VY]);
 			gGL.texCoord2f(0.f, 0.f);
@@ -457,13 +457,13 @@ void LLNetMap::draw()
 		F32 ctr_y = (F32)center_sw_bottom;
 
 
-		LLGLSNoTexture no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 		if( LLNetMap::sRotateMap )
 		{
 			gGL.color4fv(gFrustumMapColor.mV);
 
-			gGL.begin( LLVertexBuffer::TRIANGLES  );
+			gGL.begin( LLRender::TRIANGLES  );
 				gGL.vertex2f( ctr_x, ctr_y );
 				gGL.vertex2f( ctr_x - half_width_pixels, ctr_y + far_clip_pixels );
 				gGL.vertex2f( ctr_x + half_width_pixels, ctr_y + far_clip_pixels );
@@ -477,7 +477,7 @@ void LLNetMap::draw()
 			gGL.pushMatrix();
 				gGL.translatef( ctr_x, ctr_y, 0 );
 				glRotatef( atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] ) * RAD_TO_DEG, 0.f, 0.f, -1.f);
-				gGL.begin( LLVertexBuffer::TRIANGLES  );
+				gGL.begin( LLRender::TRIANGLES  );
 					gGL.vertex2f( 0, 0 );
 					gGL.vertex2f( -half_width_pixels, far_clip_pixels );
 					gGL.vertex2f(  half_width_pixels, far_clip_pixels );
@@ -642,7 +642,11 @@ void LLNetMap::renderScaledPointGlobal( const LLVector3d& pos, const LLColor4U &
 	LLVector3 local_pos;
 	local_pos.setVec( pos - mObjectImageCenterGlobal );
 
-	S32 diameter_pixels = llround(2 * radius_meters * mObjectMapTPM);
+	// DEV-17370 - megaprims of size > 4096 cause lag.  (go figger.)
+	const F32 MAX_RADIUS = 256.0f;
+	F32 radius_clamped = llmin(radius_meters, MAX_RADIUS);
+	
+	S32 diameter_pixels = llround(2 * radius_clamped * mObjectMapTPM);
 	renderPoint( local_pos, color, diameter_pixels );
 }
 
diff --git a/indra/newview/llnotify.cpp b/indra/newview/llnotify.cpp
index f703736..9c1f7a0 100644
--- a/indra/newview/llnotify.cpp
+++ b/indra/newview/llnotify.cpp
@@ -509,7 +509,7 @@ void LLNotifyBox::drawBackground() const
 	LLUIImagePtr imagep = LLUI::getUIImage("rounded_square.tga");
 	if (imagep)
 	{
-		LLViewerImage::bindTexture(imagep->getImage());
+		gGL.getTexUnit(0)->bind(imagep->getImage());
 		// set proper background color depending on whether notify box is a caution or not
 		LLColor4 color = mIsCaution? gColors.getColor("NotifyCautionBoxColor") : gColors.getColor("NotifyBoxColor");
 		if(gFocusMgr.childHasKeyboardFocus( this ))
diff --git a/indra/newview/llpaneldisplay.cpp b/indra/newview/llpaneldisplay.cpp
index 3e60745..26e6fda 100644
--- a/indra/newview/llpaneldisplay.cpp
+++ b/indra/newview/llpaneldisplay.cpp
@@ -753,6 +753,8 @@ void LLPanelDisplay::onApplyResolution(LLUICtrl* src, void* user_data)
 
 void LLPanelDisplay::applyResolution()
 {
+
+	gGL.flush();
 	char aspect_ratio_text[ASPECT_RATIO_STR_LEN];		/*Flawfinder: ignore*/
 	if (mCtrlAspectRatio->getCurrentIndex() == -1)
 	{
@@ -787,75 +789,15 @@ void LLPanelDisplay::applyResolution()
 	{
 		mAspectRatio = (F32)mCtrlAspectRatio->getValue().asReal();
 	}
-
+	
 	// presumably, user entered a non-numeric value if aspect_ratio == 0.f
 	if (mAspectRatio != 0.f)
 	{
 		mAspectRatio = llclamp(mAspectRatio, 0.2f, 5.f);
 		gSavedSettings.setF32("FullScreenAspectRatio", mAspectRatio);
-		if (gSavedSettings.getBOOL("FullScreenAutoDetectAspectRatio"))
-		{
-			gViewerWindow->getWindow()->setNativeAspectRatio(0.f);
-		}
-		else
-		{
-			gViewerWindow->getWindow()->setNativeAspectRatio(mAspectRatio);
-		}
 	}
-	gViewerWindow->reshape(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight());
-
-	// Screen resolution
-	S32 num_resolutions;
-	LLWindow::LLWindowResolution* supported_resolutions = gViewerWindow->getWindow()->getSupportedResolutions(num_resolutions);
-
-	// switching to windowed
-	BOOL fullscreen = !mCtrlWindowed->get();
-
-	// check if resolution has changed
-	BOOL targetFullscreen;
-	S32 targetWidth;
-	S32 targetHeight;
 	
-	gViewerWindow->getTargetWindow(targetFullscreen, targetWidth, targetHeight);
-
-	if ((fullscreen != targetFullscreen) ||
-		(fullscreen &&
-		 (supported_resolutions[mCtrlFullScreen->getCurrentIndex()].mWidth != targetWidth ||
-		  supported_resolutions[mCtrlFullScreen->getCurrentIndex()].mHeight != targetHeight)
-		 ))
-	{
-		// change fullscreen resolution or switch in/out of windowed mode
-		BOOL result;
-
-		BOOL logged_in = (LLStartUp::getStartupState() >= STATE_STARTED);
-		if (fullscreen)
-		{
-			result = gViewerWindow->changeDisplaySettings(TRUE, 
-				LLCoordScreen(	supported_resolutions[mCtrlFullScreen->getCurrentIndex()].mWidth, 
-								supported_resolutions[mCtrlFullScreen->getCurrentIndex()].mHeight), 
-				gSavedSettings.getBOOL("DisableVerticalSync"),
-				logged_in);
-		}
-		else
-		{
-			result = gViewerWindow->changeDisplaySettings(FALSE, 
-				LLCoordScreen(gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight")), 
-				TRUE,
-				logged_in);
-		}
-		if (!result)
-		{
-
-			// GL is non-existent at this point, so we can't continue.
-			llerrs << "LLPanelDisplay::apply() failed" << llendl;
-		}
-	}
-
-	// force aspect ratio
-	if (fullscreen)
-	{
-		LLViewerCamera::getInstance()->setAspect( gViewerWindow->getDisplayAspectRatio() );
-	}
+	gViewerWindow->requestResolutionUpdate(!mCtrlWindowed->get(), mCtrlFullScreen->getCurrentIndex());
 
 	send_agent_update(TRUE);
 
diff --git a/indra/newview/llpanelgeneral.cpp b/indra/newview/llpanelgeneral.cpp
index 256f02a..43b0f4c 100644
--- a/indra/newview/llpanelgeneral.cpp
+++ b/indra/newview/llpanelgeneral.cpp
@@ -31,75 +31,15 @@
 
 #include "llviewerprecompiledheaders.h"
 
+//file include
 #include "llpanelgeneral.h"
 
-// linden library includes
-#include "llerror.h"
-#include "llrect.h"
-#include "llfontgl.h"
-#include "message.h"
-#include "lluictrlfactory.h"
-
 // project includes
-#include "llagent.h"
-#include "llviewerwindow.h"
 #include "llcolorswatch.h"
 #include "llcombobox.h"
-#include "llconsole.h"
-#include "lllineeditor.h"
-#include "llpanellogin.h"
-#include "llnetmap.h"
-#include "llresmgr.h"
-#include "llspinctrl.h"
-#include "lltextbox.h"
-#include "llui.h"
+#include "lluictrlfactory.h"
 #include "llurlsimstring.h"
 #include "llviewercontrol.h"
-#include "llurlsimstring.h"
-
-#include "llcheckboxctrl.h"
-#include "llradiogroup.h"
-//
-// Imported globals
-//
-
-void set_crash_behavior(LLUICtrl* ctrl, void* data);
-void set_start_location(LLUICtrl* ctrl, void* data);
-
-
-//
-// Globals
-//
-
-//
-// Static functions
-//
-static void set_render_name_fade_out(LLUICtrl* ctrl, void* data)
-{
-	LLComboBox* combo = (LLComboBox*)ctrl;
-	if (!combo) return;
-	gSavedSettings.setS32("RenderName", combo->getCurrentIndex() );
-}
-
-void set_crash_behavior(LLUICtrl* ctrl, void* data)
-{
-	gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, ((LLComboBox*) ctrl)->getCurrentIndex());
-}
-
-void set_language(LLUICtrl* ctrl, void* data)
-{
-    gSavedSettings.setString("Language", ctrl->getValue().asString());
-}
-
-void LLPanelGeneral::set_start_location(LLUICtrl* ctrl, void* data)
-{
-    LLURLSimString::setString(ctrl->getValue().asString());
-}
-
-void LLPanelGeneral::set_specific_start_location(LLLineEditor* line_editor, void* data)
-{
-    LLURLSimString::setString(line_editor->getValue().asString());
-}
 
 LLPanelGeneral::LLPanelGeneral()
 {
@@ -108,50 +48,33 @@ LLPanelGeneral::LLPanelGeneral()
 
 BOOL LLPanelGeneral::postBuild()
 {
-	childSetCommitCallback("fade_out_combobox", set_render_name_fade_out);
-
-	std::string region_name_prompt = getString("region_name_prompt");
-
-
-	// location combobox
-	LLComboBox* combo = getChild<LLComboBox>( "location_combobox");
-	if (combo)
-	{
-		if (!LLURLSimString::sInstance.mSimString.empty())
-		{
-			combo->setTextEntry(LLURLSimString::sInstance.mSimString);
-		}
-	
-		BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation");
-		if (!LLURLSimString::sInstance.mSimString.empty())
-		{
-			combo->add( LLURLSimString::sInstance.mSimString );
-			combo->setCurrentByIndex( 2 );
-		}
-		else
-		{
-			combo->add( region_name_prompt );
-			combo->setCurrentByIndex( login_last ? 1 : 0 );
-		}
-		combo->setCommitCallback( &set_start_location );
-		combo->setTextEntryCallback( &set_specific_start_location );
-	}
-	
-	// Show location on login screen
-	childSetCommitCallback("show_location_checkbox", &LLPanelGeneral::clickShowStartLocation);
-
-	combo = getChild<LLComboBox>( "crash_behavior_combobox");
-	if (combo)
-	{
-		combo->setCurrentByIndex( gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) );
-		combo->setCommitCallback( &set_crash_behavior );
-	}
+	LLComboBox* fade_out_combobox = getChild<LLComboBox>("fade_out_combobox");
+	fade_out_combobox->setCurrentByIndex(gSavedSettings.getS32("RenderName"));
+
+	childSetValue("default_start_location", gSavedSettings.getBOOL("LoginLastLocation") ? "MyLastLocation" : "MyHome");
+	childSetValue("show_location_checkbox", gSavedSettings.getBOOL("ShowStartLocation"));
+	childSetValue("show_all_title_checkbox", gSavedSettings.getBOOL("RenderHideGroupTitleAll"));
+	childSetValue("language_is_public", gSavedSettings.getBOOL("LanguageIsPublic"));
+
+	childSetValue("show_my_name_checkbox", gSavedSettings.getBOOL("RenderNameHideSelf"));
+	childSetValue("small_avatar_names_checkbox", gSavedSettings.getBOOL("SmallAvatarNames"));
+	childSetValue("show_my_title_checkbox", gSavedSettings.getBOOL("RenderHideGroupTitle"));
+	childSetValue("afk_timeout_spinner", gSavedSettings.getF32("AFKTimeout"));
+	childSetValue("rotate_mini_map_checkbox", gSavedSettings.getBOOL("MiniMapRotate"));
+	childSetValue("notify_money_change_checkbox", gSavedSettings.getBOOL("NotifyMoneyChange"));
+	childSetValue("use_system_color_picker_checkbox", gSavedSettings.getBOOL("UseDefaultColorPicker"));
+	childSetValue("show_search_panel", gSavedSettings.getBOOL("ShowSearchBar"));
+
+	getChild<LLColorSwatchCtrl>("effect_color_swatch")->set(gSavedSettings.getColor4("EffectColor"));
+
+	childSetValue("ui_scale_slider", gSavedSettings.getF32("UIScaleFactor"));
+	childSetValue("ui_auto_scale", gSavedSettings.getBOOL("UIAutoScale"));
+
+	LLComboBox* crash_behavior_combobox = getChild<LLComboBox>("crash_behavior_combobox");
+	crash_behavior_combobox->setCurrentByIndex(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING));
 	
-	childSetCommitCallback("language_combobox", set_language );
 	childSetValue("language_combobox", 	gSavedSettings.getString("Language"));
 
-	refresh();
-
 	return TRUE;
 }
 
@@ -160,83 +83,34 @@ LLPanelGeneral::~LLPanelGeneral()
 	// Children all cleaned up by default view destructor.
 }
 
-void LLPanelGeneral::refresh()
-{
-	LLPanel::refresh();
-	BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation");
-	LLComboBox* combo = getChild<LLComboBox>( "location_combobox");
-	if (combo)
-	{
-		if (!LLURLSimString::sInstance.mSimString.empty())
-		{
-			combo->setCurrentByIndex( 2 );
-		}
-		else
-		{
-			combo->setCurrentByIndex( login_last ? 1 : 0 );
-		}
-		//save current settings in case cancel is clicked
-		mLoginLocation = combo->getValue().asString();
-	}
-	
-	mOldCrashBehavior = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
-	combo = getChild<LLComboBox>( "crash_behavior_combobox");
-	if (combo)
-	{
-		combo->setCurrentByIndex( mOldCrashBehavior );
-	}
-	
-	mRenderName = gSavedSettings.getS32("RenderName");
-	combo = getChild<LLComboBox>("fade_out_combobox");
-	if (combo)
-	{
-		combo->setCurrentByIndex( mRenderName );
-	}
-
-	mRenderNameHideSelf = gSavedSettings.getBOOL("RenderNameHideSelf");
-	mSmallAvatarNames = gSavedSettings.getBOOL("SmallAvatarNames");
-	mRenderHideGroupTitle = gSavedSettings.getBOOL("RenderHideGroupTitle");
-	mChatOnlineNotification = gSavedSettings.getBOOL("ChatOnlineNotification");
-	mAFKTimeout = gSavedSettings.getF32("AFKTimeout");
-	mMiniMapRotate = gSavedSettings.getBOOL("MiniMapRotate");
-	mNotifyMoney = gSavedSettings.getBOOL("NotifyMoneyChange");
-	mUseDefaultColor = gSavedSettings.getBOOL("UseDefaultColorPicker");
-	mEffectColor = gSavedSettings.getColor4("EffectColor");
-	mShowSearch = gSavedSettings.getBOOL("ShowSearchBar");
-
-	mUIScaleFactor = gSavedSettings.getF32("UIScaleFactor");
-	mUIAutoScale = gSavedSettings.getBOOL("UIAutoScale");
-
-	mLanguage = gSavedSettings.getString("Language");
-}
-
 void LLPanelGeneral::apply()
 {
-}
-
-void LLPanelGeneral::cancel()
-{
-	gSavedSettings.setS32("RenderName", mRenderName);
-	gSavedSettings.setBOOL("RenderNameHideSelf", mRenderNameHideSelf );
-	gSavedSettings.setBOOL("SmallAvatarNames", mSmallAvatarNames );
-	gSavedSettings.setBOOL("RenderHideGroupTitle", mRenderHideGroupTitle );
-	gSavedSettings.setBOOL("ChatOnlineNotification", mChatOnlineNotification );
-	gSavedSettings.setF32("AFKTimeout", mAFKTimeout );
-	gSavedSettings.setBOOL("MiniMapRotate", mMiniMapRotate );
-	gSavedSettings.setBOOL("NotifyMoneyChange", mNotifyMoney );
-	gSavedSettings.setBOOL("UseDefaultColorPicker", mUseDefaultColor );
-	gSavedSettings.setBOOL("ShowSearchBar", mShowSearch);
-	gSavedSettings.setColor4("EffectColor", mEffectColor );
-	gSavedSettings.setF32("UIScaleFactor", mUIScaleFactor);
-	gSavedSettings.setBOOL("UIAutoScale", mUIAutoScale);
-	gSavedSettings.setString("Language", mLanguage);
+	LLComboBox* fade_out_combobox = getChild<LLComboBox>("fade_out_combobox");
+	gSavedSettings.setS32("RenderName", fade_out_combobox->getCurrentIndex());
 	
-	LLURLSimString::setString(mLoginLocation);
-
-	gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, mOldCrashBehavior);
+	gSavedSettings.setBOOL("LoginLastLocation", childGetValue("default_start_location").asString() == "MyLastLocation");
+	gSavedSettings.setBOOL("ShowStartLocation", childGetValue("show_location_checkbox"));
+	gSavedSettings.setBOOL("RenderHideGroupTitleAll", childGetValue("show_all_title_checkbox"));
+	gSavedSettings.setBOOL("LanguageIsPublic", childGetValue("language_is_public"));
+	gSavedSettings.setBOOL("RenderNameHideSelf", childGetValue("show_my_name_checkbox"));
+	gSavedSettings.setBOOL("SmallAvatarNames", childGetValue("small_avatar_names_checkbox"));
+	gSavedSettings.setBOOL("RenderHideGroupTitle", childGetValue("show_my_title_checkbox"));
+	gSavedSettings.setF32("AFKTimeout", childGetValue("afk_timeout_spinner").asReal());
+	gSavedSettings.setBOOL("MiniMapRotate", childGetValue("rotate_mini_map_checkbox"));
+	gSavedSettings.setBOOL("NotifyMoneyChange", childGetValue("notify_money_change_checkbox"));
+	gSavedSettings.setBOOL("UseDefaultColorPicker", childGetValue("use_system_color_picker_checkbox"));
+	gSavedSettings.setBOOL("ShowSearchBar", childGetValue("show_search_panel"));
+	gSavedSettings.setColor4("EffectColor", childGetValue("effect_color_swatch"));
+	gSavedSettings.setF32("UIScaleFactor", childGetValue("ui_scale_slider").asReal());
+	gSavedSettings.setBOOL("UIAutoScale", childGetValue("ui_auto_scale"));
+	gSavedSettings.setString("Language", childGetValue("language_combobox"));
+
+	LLURLSimString::setString(childGetValue("location_combobox"));
+
+	LLComboBox* crash_behavior_combobox = getChild<LLComboBox>("crash_behavior_combobox");
+	gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, crash_behavior_combobox->getCurrentIndex());
 }
 
-void LLPanelGeneral::clickShowStartLocation(LLUICtrl*, void* user_data)
+void LLPanelGeneral::cancel()
 {
-	LLPanelLogin::refreshLocation( false ); // in case LLPanelLogin is visible
 }
diff --git a/indra/newview/llpanelgeneral.h b/indra/newview/llpanelgeneral.h
index a7b526d..5492a52 100644
--- a/indra/newview/llpanelgeneral.h
+++ b/indra/newview/llpanelgeneral.h
@@ -35,45 +35,16 @@
 
 #include "llpanel.h"
 
-class LLCheckBoxCtrl;
-class LLRadioGroup;
-class LLColorSwatchCtrl;
-class LLSpinCtrl;
-class LLTextBox;
-class LLComboBox;
-
 class LLPanelGeneral : public LLPanel
 {
 public:
 	LLPanelGeneral();
-	virtual ~LLPanelGeneral();
+	/*virtual*/ ~LLPanelGeneral();
+
+	BOOL postBuild();
 
-	virtual BOOL postBuild();
-	void refresh();
 	void apply();
 	void cancel();
-
-	static void clickShowStartLocation(LLUICtrl*, void* user_data);
-	static void set_start_location(LLUICtrl* ctrl, void* data);
-	static void set_specific_start_location(LLLineEditor* line_editor, void* data);
-
-protected:
-	S32 mRenderName;
-	BOOL mRenderNameHideSelf;
-	BOOL mSmallAvatarNames;
-	BOOL mRenderHideGroupTitle;
-	BOOL mChatOnlineNotification;
-	BOOL mShowSearch;
-	F32 mAFKTimeout;
-	BOOL mNotifyMoney;
-	BOOL mUseDefaultColor;
-	LLColor4 mEffectColor;
-	F32 mUIScaleFactor;
-	BOOL mUIAutoScale;
-	BOOL mMiniMapRotate;
-	S32 mOldCrashBehavior;
-	std::string mLoginLocation;
-	std::string mLanguage;
 };
 
 #endif
diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp
index b8c9e69..6eb44e1 100644
--- a/indra/newview/llpanelgrouplandmoney.cpp
+++ b/indra/newview/llpanelgrouplandmoney.cpp
@@ -705,12 +705,13 @@ BOOL LLPanelGroupLandMoney::postBuild()
 	textp = getChild<LLTextEditor>("group_money_planning_text", true);
 	panelp = getChild<LLPanel>("group_money_planning_tab", true);
 
-	if ( !can_view )
+	if ( 1 ) //!can_view
 	{
 		textp->setText(mImplementationp->mCantViewAccountsText);
 	}
 	else
 	{
+		//Temporally disabled for DEV-11287.
 		mImplementationp->mMoneyPlanningTabEHp = 
 			new LLGroupMoneyPlanningTabEventHandler(textp,
 													tabcp,
diff --git a/indra/newview/llpanelinput.cpp b/indra/newview/llpanelinput.cpp
index 7034b1c..026dd71 100644
--- a/indra/newview/llpanelinput.cpp
+++ b/indra/newview/llpanelinput.cpp
@@ -30,46 +30,10 @@
  */
 
 #include "llviewerprecompiledheaders.h"
-
 #include "llpanelinput.h"
-
-// linden library includes
-#include "llerror.h"
-#include "llrect.h"
-#include "llfontgl.h"
-#include "message.h"
 #include "lluictrlfactory.h"
-
-// project includes
-#include "llviewerwindow.h"
-#include "llcheckboxctrl.h"
-#include "llfloaterjoystick.h"
-#include "llradiogroup.h"
-#include "llresmgr.h"
-#include "llspinctrl.h"
-#include "llslider.h"
-#include "llsliderctrl.h"
-#include "lltextbox.h"
-#include "llui.h"
-#include "llappviewer.h"
 #include "llviewercontrol.h"
-
-//Ventrella
-#include "llagent.h"
-//end Ventrella
-
-
-//
-// Imported globals
-//
-
-//
-// Globals
-//
-
-//
-// Static functions
-//
+#include "llfloaterjoystick.h"
 
 
 LLPanelInput::LLPanelInput() 
@@ -79,50 +43,41 @@ LLPanelInput::LLPanelInput()
 
 BOOL LLPanelInput::postBuild()
 {
-	childSetAction("joystic_setup_button", onClickJoystickSetup, (void*)this);
-	
-	refresh();
+	childSetAction("joystick_setup_button", onClickJoystickSetup, (void*)this);
+
+	childSetValue("mouse_sensitivity", gSavedSettings.getF32("MouseSensitivity"));
+	childSetValue("automatic_fly", gSavedSettings.getBOOL("AutomaticFly"));
+	childSetValue("invert_mouse", gSavedSettings.getBOOL("InvertMouse"));
+	childSetValue("edit_camera_movement", gSavedSettings.getBOOL("EditCameraMovement"));
+	childSetValue("appearance_camera_movement", gSavedSettings.getBOOL("AppearanceCameraMovement"));
+	childSetValue("dynamic_camera_strength", gSavedSettings.getF32("DynamicCameraStrength"));
+	childSetValue("zoom_time", gSavedSettings.getF32("ZoomTime"));
+	childSetValue("camera_position_smoothing", gSavedSettings.getF32("CameraPositionSmoothing"));
+	childSetValue("first_person_avatar_visible", gSavedSettings.getBOOL("FirstPersonAvatarVisible"));
 
 	return TRUE;
 }
 
-
 LLPanelInput::~LLPanelInput()
 {
 	// Children all cleaned up by default view destructor.
 }
 
-void LLPanelInput::refresh()
-{
-	LLPanel::refresh();
-
-	mMouseSensitivityVal = gSavedSettings.getF32("MouseSensitivity");
-	mAutomaticFly =gSavedSettings.getBOOL("AutomaticFly");
-	mInvertMouse = gSavedSettings.getBOOL("InvertMouse");
-	mEditCameraMovement = gSavedSettings.getBOOL("EditCameraMovement");
-	mAppearanceCameraMovement = gSavedSettings.getBOOL("AppearanceCameraMovement");
-	mDynamicCameraStrengthVal = gSavedSettings.getF32("DynamicCameraStrength");
-	mNumpadControlVal = gSavedSettings.getS32("NumpadControl");
-	
-	// First Person Visibility
-	mFirstPersonAvatarVisible = gSavedSettings.getBOOL("FirstPersonAvatarVisible");
-}
-
 void LLPanelInput::apply()
 {
-
+	gSavedSettings.setF32("MouseSensitivity", childGetValue("mouse_sensitivity").asReal());
+	gSavedSettings.setBOOL("AutomaticFly", childGetValue("automatic_fly"));
+	gSavedSettings.setBOOL("InvertMouse", childGetValue("invert_mouse"));
+	gSavedSettings.setBOOL("EditCameraMovement", childGetValue("edit_camera_movement"));
+	gSavedSettings.setBOOL("AppearanceCameraMovement", childGetValue("appearance_camera_movement"));
+	gSavedSettings.setF32("DynamicCameraStrength", childGetValue("dynamic_camera_strength").asReal());
+	gSavedSettings.setF32("ZoomTime", childGetValue("zoom_time").asReal());
+	gSavedSettings.setF32("CameraPositionSmoothing", childGetValue("camera_position_smoothing").asReal());
+	gSavedSettings.setBOOL("FirstPersonAvatarVisible", childGetValue("first_person_avatar_visible"));
 }
 
 void LLPanelInput::cancel()
 {
-	gSavedSettings.setF32("MouseSensitivity", mMouseSensitivityVal);
-	gSavedSettings.setBOOL("AutomaticFly", mAutomaticFly);
-	gSavedSettings.setBOOL("InvertMouse", mInvertMouse);
-	gSavedSettings.setBOOL("EditCameraMovement", mEditCameraMovement);
-	gSavedSettings.setBOOL("AppearanceCameraMovement", mAppearanceCameraMovement);
-	gSavedSettings.setF32("DynamicCameraStrength", mDynamicCameraStrengthVal);
-	gSavedSettings.setS32("NumpadControl", mNumpadControlVal);
-	gSavedSettings.setBOOL("FirstPersonAvatarVisible", mFirstPersonAvatarVisible);
 }
 
 //static
diff --git a/indra/newview/llpanelinput.h b/indra/newview/llpanelinput.h
index e73e0ed..2f99f99 100644
--- a/indra/newview/llpanelinput.h
+++ b/indra/newview/llpanelinput.h
@@ -34,11 +34,6 @@
 
 #include "llpanel.h"
 
-class LLCheckBoxCtrl;
-class LLSlider;
-class LLSliderCtrl;
-class LLSpinCtrl;
-
 class LLPanelInput : public LLPanel
 {
 public:
@@ -46,23 +41,11 @@ public:
 	virtual ~LLPanelInput();
 
 	virtual BOOL postBuild();
-	virtual void refresh();
 	void apply();
 	void cancel();
 
 private:
 	static void onClickJoystickSetup(void* user_data);
-
-protected:
-	F32 mMouseSensitivityVal;
-	BOOL mAutomaticFly;
-	BOOL mInvertMouse;
-	BOOL mEditCameraMovement;
-	BOOL mAppearanceCameraMovement;
-	BOOL mFirstPersonAvatarVisible;
-	F32 mDynamicCameraStrengthVal;
-	S32 mNumpadControlVal;
-
 };
 
 #endif
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index ffee058..c1c8949 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -63,7 +63,6 @@
 #include "llviewernetwork.h"
 #include "llviewerwindow.h"			// to link into child list
 #include "llnotify.h"
-#include "llappviewer.h"					// for gHideLinks
 #include "llurlsimstring.h"
 #include "lluictrlfactory.h"
 #include "llhttpclient.h"
@@ -202,6 +201,26 @@ void LLLoginHandler::parse(const LLSD& queryMap)
 	{
 		grid_choice = GRID_INFO_ARUNA;
 	}
+	else if (queryMap["grid"].asString() == "bharati")
+	{
+		grid_choice = GRID_INFO_BHARATI;
+	}
+	else if (queryMap["grid"].asString() == "chandra")
+	{
+		grid_choice = GRID_INFO_CHANDRA;
+	}
+	else if (queryMap["grid"].asString() == "danu")
+	{
+		grid_choice = GRID_INFO_DANU;
+	}
+	else if (queryMap["grid"].asString() == "parvati")
+	{
+		grid_choice = GRID_INFO_PARVATI;
+	}
+	else if (queryMap["grid"].asString() == "skanda")
+	{
+		grid_choice = GRID_INFO_SKANDA;
+	}
 
 	if(grid_choice != GRID_INFO_NONE)
 	{
@@ -321,6 +340,11 @@ namespace {
 	boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0;
 };
 
+void set_start_location(LLUICtrl* ctrl, void* data)
+{
+    LLURLSimString::setString(ctrl->getValue().asString());
+}
+
 //---------------------------------------------------------------------------
 // Public methods
 //---------------------------------------------------------------------------
@@ -407,7 +431,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 		combo->setCurrentByIndex( 0 );
 	}
 
-	combo->setCommitCallback( &LLPanelGeneral::set_start_location );
+	combo->setCommitCallback( &set_start_location );
 
 	LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
 	server_choice_combo->setCommitCallback(onSelectServer);
@@ -1066,15 +1090,8 @@ void LLPanelLogin::onClickConnect(void *)
 		}
 		else
 		{
-			if (gHideLinks)
-			{
-				gViewerWindow->alertXml("MustHaveAccountToLogInNoLinks");
-			}
-			else
-			{
-				gViewerWindow->alertXml("MustHaveAccountToLogIn",
-										LLPanelLogin::newAccountAlertCallback);
-			}
+			gViewerWindow->alertXml("MustHaveAccountToLogIn",
+									LLPanelLogin::newAccountAlertCallback);
 		}
 	}
 }
diff --git a/indra/newview/llpanelmsgs.cpp b/indra/newview/llpanelmsgs.cpp
index cc3579e..4d2ff54 100644
--- a/indra/newview/llpanelmsgs.cpp
+++ b/indra/newview/llpanelmsgs.cpp
@@ -39,17 +39,6 @@
 #include "lluictrlfactory.h"
 #include "llfirstuse.h"
 
-class LLPopupData
-{
-public:
-	LLPopupData() : mShowNewInventory(FALSE), mAutoAcceptNewInventory(FALSE) { }
-
-	BOOL mShowNewInventory;
-	BOOL mAutoAcceptNewInventory;
-};
-
-LLPopupData sPopupData;
-
 //-----------------------------------------------------------------------------
 LLPanelMsgs::LLPanelMsgs() : 
 	LLPanel(std::string("Messages Panel")),
@@ -75,8 +64,9 @@ BOOL LLPanelMsgs::postBuild()
 	childSetAction("skip_dialogs_btn", onClickSkipDialogs, this);
 	buildLists();
 
-	sPopupData.mAutoAcceptNewInventory = gSavedSettings.getBOOL("AutoAcceptNewInventory");
-	sPopupData.mShowNewInventory = gSavedSettings.getBOOL("ShowNewInventory");
+	childSetValue("accept_new_inventory", gSavedSettings.getBOOL("AutoAcceptNewInventory"));
+	childSetValue("show_new_inventory", gSavedSettings.getBOOL("ShowNewInventory"));
+	childSetValue("show_in_inventory", gSavedSettings.getBOOL("ShowInInventory"));
 
 	return TRUE;
 }
@@ -159,13 +149,13 @@ void LLPanelMsgs::draw()
 
 void LLPanelMsgs::apply()
 {
+	gSavedSettings.setBOOL("AutoAcceptNewInventory", childGetValue("accept_new_inventory"));
+	gSavedSettings.setBOOL("ShowNewInventory", childGetValue("show_new_inventory"));
+	gSavedSettings.setBOOL("ShowInInventory", childGetValue("show_in_inventory"));
 }
 
-
 void LLPanelMsgs::cancel()
 {
-	gSavedSettings.setBOOL("ShowNewInventory", sPopupData.mShowNewInventory);
-	gSavedSettings.setBOOL("AutoAcceptNewInventory", sPopupData.mAutoAcceptNewInventory);
 }
 
 void LLPanelMsgs::resetAllIgnored()
diff --git a/indra/newview/llpanelnetwork.cpp b/indra/newview/llpanelnetwork.cpp
index e324c3b..f13f63a 100644
--- a/indra/newview/llpanelnetwork.cpp
+++ b/indra/newview/llpanelnetwork.cpp
@@ -31,29 +31,14 @@
 
 #include "llviewerprecompiledheaders.h"
 
-// file include
+//file include
 #include "llpanelnetwork.h"
 
-// linden library includes
-#include "llerror.h"
-#include "llrect.h"
-#include "llstring.h"
-
 // project includes
-#include "llbutton.h"
+#include "llcheckboxctrl.h"
 #include "lldirpicker.h"
-#include "llui.h"
 #include "lluictrlfactory.h"
-#include "llresmgr.h"
-#include "llsliderctrl.h"
-#include "llspinctrl.h"
-#include "llcheckboxctrl.h"
-#include "lltextbox.h"
-#include "llviewerregion.h"
-#include "llviewerthrottle.h"
-#include "llworld.h"
 #include "llviewercontrol.h"
-#include "lluictrlfactory.h"
 #include "llviewerwindow.h"
 
 LLPanelNetwork::LLPanelNetwork()
@@ -70,12 +55,13 @@ BOOL LLPanelNetwork::postBuild()
 	childSetAction("set_cache", onClickSetCache, this);
 	childSetAction("reset_cache", onClickResetCache, this);
 	
-	childSetEnabled("connection_port", 
-			gSavedSettings.getBOOL("ConnectionPortEnabled"));
+	childSetEnabled("connection_port", gSavedSettings.getBOOL("ConnectionPortEnabled"));
 	childSetCommitCallback("connection_port_enabled", onCommitPort, this);
 
-
-	refresh();
+	childSetValue("cache_size", (F32)gSavedSettings.getU32("CacheSize"));
+	childSetValue("max_bandwidth", gSavedSettings.getF32("ThrottleBandwidthKBPS"));
+	childSetValue("connection_port_enabled", gSavedSettings.getBOOL("ConnectionPortEnabled"));
+	childSetValue("connection_port", (F32)gSavedSettings.getU32("ConnectionPort"));
 
 	return TRUE;
 }
@@ -88,24 +74,14 @@ LLPanelNetwork::~LLPanelNetwork()
 
 void LLPanelNetwork::apply()
 {
-}
-
-void LLPanelNetwork::refresh()
-{
-	LLPanel::refresh();
-
-	mCacheSetting = gSavedSettings.getU32("CacheSize");
-	mBandwidthBPS = gSavedSettings.getF32("ThrottleBandwidthKBPS")*1024;
-	mConnectionPortEnabled = gSavedSettings.getBOOL("ConnectionPortEnabled");
-	mConnectionPort = gSavedSettings.getU32("ConnectionPort");
+	gSavedSettings.setU32("CacheSize", childGetValue("cache_size").asInteger());
+	gSavedSettings.setF32("ThrottleBandwidthKBPS", childGetValue("max_bandwidth").asReal());
+	gSavedSettings.setBOOL("ConnectionPortEnabled", childGetValue("connection_port_enabled"));
+	gSavedSettings.setU32("ConnectionPort", childGetValue("connection_port").asInteger());
 }
 
 void LLPanelNetwork::cancel()
 {
-	gSavedSettings.setU32("CacheSize", mCacheSetting);
-	gSavedSettings.setF32("ThrottleBandwidthKBPS", mBandwidthBPS/1024);
-	gSavedSettings.setBOOL("ConnectionPortEnabled", mConnectionPortEnabled);
-	gSavedSettings.setU32("ConnectionPort", mConnectionPort);
 }
 
 // static
diff --git a/indra/newview/llpanelnetwork.h b/indra/newview/llpanelnetwork.h
index 9848461..e4b11d9 100644
--- a/indra/newview/llpanelnetwork.h
+++ b/indra/newview/llpanelnetwork.h
@@ -33,37 +33,23 @@
 #define LL_LLPANELNETWORK_H
 
 #include "llpanel.h"
-#include "llviewerthrottle.h"
-
-class LLSliderCtrl;
-class LLCheckBoxCtrl;
-class LLLineEditor;
-class LLTextBox;
-class LLRadioGroup;
-class LLButton;
 
 class LLPanelNetwork : public LLPanel
 {
 public:
 	LLPanelNetwork();
-	virtual ~LLPanelNetwork();
+	~LLPanelNetwork();
+
+	BOOL postBuild();
 
-	virtual BOOL postBuild();
-	virtual void refresh();
-	virtual void apply();	// Apply the changed values.
-	virtual void cancel();	// Cancel the changed values.
+	void apply();
+	void cancel();
 
 private:
 	static void onClickClearCache(void*);
 	static void onClickSetCache(void*);
 	static void onClickResetCache(void*);
 	static void onCommitPort(LLUICtrl* ctrl, void*);
-
-private:
-	U32 mCacheSetting;
-	F32 mBandwidthBPS;
-	BOOL mConnectionPortEnabled;
-	U32 mConnectionPort;
 };
 
 #endif
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 9022c14..1f386bf 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -365,6 +365,17 @@ void LLPanelObject::getState( )
 	BOOL enable_scale	= objectp->permMove() && objectp->permModify();
 	BOOL enable_rotate	= objectp->permMove() && ( (objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts"));
 
+	S32 selected_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
+	BOOL single_volume = (LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ))
+						 && (selected_count == 1);
+
+	if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() > 1)
+	{
+		enable_move = FALSE;
+		enable_scale = FALSE;
+		enable_rotate = FALSE;
+	}
+
 	LLVector3 vec;
 	if (enable_move)
 	{
@@ -438,9 +449,6 @@ void LLPanelObject::getState( )
 	// BUG? Check for all objects being editable?
 	S32 roots_selected = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount();
 	BOOL editable = root_objectp->permModify();
-	S32 selected_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
-	BOOL single_volume = (LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ))
-						 && (selected_count == 1);
 
 	// Select Single Message
 	childSetVisible("select_single", FALSE);
diff --git a/indra/newview/llpanelweb.cpp b/indra/newview/llpanelweb.cpp
index 13ed9bf..101decd 100644
--- a/indra/newview/llpanelweb.cpp
+++ b/indra/newview/llpanelweb.cpp
@@ -34,22 +34,12 @@
 // file include
 #include "llpanelweb.h"
 
-// linden library includes
-#include "llerror.h"
-#include "llrect.h"
-#include "llstring.h"
-
 // project includes
-#include "llbutton.h"
 #include "llcheckboxctrl.h"
-#include "lllineeditor.h"
-#include "llui.h"
+#include "llmediamanager.h"
 #include "lluictrlfactory.h"
 #include "llviewercontrol.h"
-#include "lluictrlfactory.h"
 #include "llviewerwindow.h"
-#include "llmediamanager.h"
-
 
 // helper functions for getting/freeing the web browser media
 // if creating/destroying these is too slow, we'll need to create
@@ -97,23 +87,21 @@ LLPanelWeb::LLPanelWeb()
 
 BOOL LLPanelWeb::postBuild()
 {
-	childSetAction( "clear_cache", onClickClearCache, this );
-	childSetAction( "clear_cookies", onClickClearCookies, this );
-	childSetCommitCallback("use_external_browser", onSelectBrowser, this );
-//	childSetEnabled( "connection_port", gSavedSettings.getBOOL( "CookiesEnabled" ) );
-	childSetCommitCallback( "cookies_enabled", onCommitCookies, this );
-	childSetCommitCallback( "web_proxy_editor", onCommitWebProxyAddress, this);
-	childSetCommitCallback( "web_proxy_port", onCommitWebProxyPort, this);
-	
-	childSetEnabled("web_proxy_editor", 
-			gSavedSettings.getBOOL("BrowserProxyEnabled"));
-	childSetEnabled("web_proxy_port", 
-			gSavedSettings.getBOOL("BrowserProxyEnabled"));
-	childSetEnabled("proxy_text_label", 
-			gSavedSettings.getBOOL("BrowserProxyEnabled"));
+	childSetAction("clear_cache", onClickClearCache, this);
 	childSetCommitCallback("web_proxy_enabled", onCommitWebProxyEnabled, this);
 
-	refresh();
+	std::string value = gSavedSettings.getBOOL("UseExternalBrowser") ? "external" : "internal";
+	childSetValue("use_external_browser", value);
+
+	childSetValue("cookies_enabled", gSavedSettings.getBOOL("CookiesEnabled"));
+
+	childSetValue("web_proxy_enabled", gSavedSettings.getBOOL("BrowserProxyEnabled"));
+	childSetValue("web_proxy_editor", gSavedSettings.getString("BrowserProxyAddress"));
+	childSetValue("web_proxy_port", gSavedSettings.getS32("BrowserProxyPort"));
+
+	childSetEnabled("proxy_text_label", gSavedSettings.getBOOL("BrowserProxyEnabled"));
+	childSetEnabled("web_proxy_editor", gSavedSettings.getBOOL("BrowserProxyEnabled"));
+	childSetEnabled("web_proxy_port", gSavedSettings.getBOOL("BrowserProxyEnabled"));
 
 	return TRUE;
 }
@@ -127,50 +115,29 @@ LLPanelWeb::~LLPanelWeb()
 
 void LLPanelWeb::apply()
 {
-}
-
-void LLPanelWeb::refresh()
-{
-	LLPanel::refresh();
+	gSavedSettings.setBOOL("CookiesEnabled", childGetValue("cookies_enabled"));
+	gSavedSettings.setBOOL("BrowserProxyEnabled", childGetValue("web_proxy_enabled"));
+	gSavedSettings.setString("BrowserProxyAddress", childGetValue("web_proxy_editor"));
+	gSavedSettings.setS32("BrowserProxyPort", childGetValue("web_proxy_port"));
 
-	mCookiesEnabled = gSavedSettings.getBOOL("CookiesEnabled");
-	mWebProxyEnabled = gSavedSettings.getBOOL("BrowserProxyEnabled");
-	mWebProxyAddress = gSavedSettings.getString("BrowserProxyAddress");
-	mWebProxyPort =  gSavedSettings.getS32("BrowserProxyPort");
+	bool value = childGetValue("use_external_browser").asString() == "external" ? true : false;
+	gSavedSettings.setBOOL("UseExternalBrowser", value);
 	
-	LLLineEditor* web_proxy_editor = getChild<LLLineEditor>("web_proxy_editor");
-	if (web_proxy_editor)
-	{
-		web_proxy_editor->setText( gSavedSettings.getString("BrowserProxyAddress") );
-	}
-	mExternalBrowser = gSavedSettings.getBOOL("UseExternalBrowser");
-
-	childSetValue("use_external_browser", mExternalBrowser ? "external" : "internal");
-
 	LLMediaBase *media_source = get_web_media();
 	if (media_source)
-		media_source->enableCookies(mCookiesEnabled);
-	free_web_media(media_source);
+	{
+		media_source->enableCookies(childGetValue("cookies_enabled"));
 
+		bool proxy_enable = childGetValue("web_proxy_enabled");
+		std::string proxy_address = childGetValue("web_proxy_editor");
+		int proxy_port = childGetValue("web_proxy_port");
+		media_source->enableProxy(proxy_enable, proxy_address, proxy_port);
+	}
+	free_web_media(media_source);
 }
 
 void LLPanelWeb::cancel()
 {
-	
-	gSavedSettings.setBOOL( "CookiesEnabled", mCookiesEnabled );
-	gSavedSettings.setBOOL( "BrowserProxyEnabled", mWebProxyEnabled );
-	gSavedSettings.setString( "BrowserProxyAddress", mWebProxyAddress );
-	gSavedSettings.setS32( "BrowserProxyPort", mWebProxyPort );
-
-	gSavedSettings.setBOOL("UseExternalBrowser", mExternalBrowser);
-	LLMediaBase *media_source = get_web_media();
-	if (media_source)
-	{
-		media_source->enableCookies(mCookiesEnabled);
-		media_source->enableProxy( mWebProxyEnabled, mWebProxyAddress, mWebProxyPort );
-	}
-	free_web_media(media_source);
-
 }
 
 // static
@@ -192,94 +159,15 @@ void LLPanelWeb::callback_clear_browser_cache(S32 option, void* userdata)
 }
 
 // static
-void LLPanelWeb::onClickClearCookies(void*)
-{
-	gViewerWindow->alertXml("ConfirmClearCookies", callback_clear_cookies, 0);
-}
-
-//static
-void LLPanelWeb::callback_clear_cookies(S32 option, void* userdata)
-{
-	if ( option == 0 ) // YES
-	{
-		LLMediaBase *media_source = get_web_media();
-		if (media_source)
-			media_source->clearCookies();
-		free_web_media(media_source);
-	}
-}
-
-// static
-void LLPanelWeb::onCommitCookies(LLUICtrl* ctrl, void* data)
-{
-  LLPanelWeb* self = (LLPanelWeb*)data;
-  LLCheckBoxCtrl* check = (LLCheckBoxCtrl*)ctrl;
-
-  if (!self || !check) return;
-
-  LLMediaBase *media_source = get_web_media();
-  if (media_source)
-	  media_source->enableCookies(check->get());
-  free_web_media(media_source);
-}
-// static
 void LLPanelWeb::onCommitWebProxyEnabled(LLUICtrl* ctrl, void* data)
 {
 	LLPanelWeb* self = (LLPanelWeb*)data;
 	LLCheckBoxCtrl* check = (LLCheckBoxCtrl*)ctrl;
 
 	if (!self || !check) return;
-	self->childSetEnabled("web_proxy_editor", 
-				check->get());
-	self->childSetEnabled("web_proxy_port", 
-				check->get());
-	self->childSetEnabled("proxy_text_label", 
-				check->get());
-		
-	LLMediaBase *media_source = get_web_media();
-	if (media_source)
-	{
-		media_source->enableProxy( gSavedSettings.getBOOL("BrowserProxyEnabled"), 
-			gSavedSettings.getString("BrowserProxyAddress"), 
-			gSavedSettings.getS32("BrowserProxyPort") );
-	}
-	free_web_media(media_source);
-
-}
-
-void LLPanelWeb::onCommitWebProxyAddress(LLUICtrl *ctrl, void *userdata)
-{
-  LLLineEditor* web_proxy = (LLLineEditor*)ctrl;
-
-  if (web_proxy)
-  {
-	  gSavedSettings.setString("BrowserProxyAddress", web_proxy->getText());
-  }	
-  LLMediaBase *media_source = get_web_media();
-  if (media_source)
-  {
-	  media_source->enableProxy( gSavedSettings.getBOOL("BrowserProxyEnabled"), 
-		  gSavedSettings.getString("BrowserProxyAddress"), 
-		  gSavedSettings.getS32("BrowserProxyPort") );
-  }
-  free_web_media(media_source);
-}
+	self->childSetEnabled("web_proxy_editor", check->get());
+	self->childSetEnabled("web_proxy_port", check->get());
+	self->childSetEnabled("proxy_text_label", check->get());
 
-void LLPanelWeb::onCommitWebProxyPort(LLUICtrl *ctrl, void *userdata)
-{
-	LLMediaBase *media_source = get_web_media();
-	if (media_source)
-	{
-		media_source->enableProxy( gSavedSettings.getBOOL("BrowserProxyEnabled"), 
-			gSavedSettings.getString("BrowserProxyAddress"), 
-			gSavedSettings.getS32("BrowserProxyPort") );
-	}
-	free_web_media(media_source);
-}
 
-// static 
-void LLPanelWeb::onSelectBrowser(LLUICtrl* ctrl, void* data)
-{
-	// "external" or "internal"
-	gSavedSettings.setBOOL("UseExternalBrowser", ctrl->getValue().asString() == "external");
 }
diff --git a/indra/newview/llpanelweb.h b/indra/newview/llpanelweb.h
index 34d7b3d..fc8cf28 100644
--- a/indra/newview/llpanelweb.h
+++ b/indra/newview/llpanelweb.h
@@ -33,39 +33,22 @@
 #define LL_LLPANELWEB_H
 
 #include "llpanel.h"
-#include "llviewerthrottle.h"
-
-class LLCheckBoxCtrl;
-class LLButton;
 
 class LLPanelWeb : public LLPanel
 {
 public:
 	LLPanelWeb();
-	virtual ~LLPanelWeb();
+	~LLPanelWeb();
+
+	BOOL postBuild();
 
-	virtual BOOL postBuild();
-	virtual void refresh();
-	virtual void apply();	// Apply the changed values.
-	virtual void cancel();	// Cancel the changed values.
+	void apply();
+	void cancel();
 
 private:
-	static void onClickClearCache(void*);
-	static void onClickClearCookies(void*);
+	static void onClickClearCache(void* data);
 	static void callback_clear_browser_cache(S32 option, void* userdata);
-	static void callback_clear_cookies(S32 option, void* userdata);
-	static void onCommitCookies(LLUICtrl* ctrl, void* data);
 	static void onCommitWebProxyEnabled(LLUICtrl* ctrl, void* data);
-	static void onCommitWebProxyAddress(LLUICtrl *ctrl, void *userdata);
-	static void onCommitWebProxyPort(LLUICtrl *ctrl, void *userdata);
-	static void onSelectBrowser(LLUICtrl* ctrl, void* data);
-
-private:
-	BOOL mCookiesEnabled;
-	BOOL mWebProxyEnabled;
-	std::string mWebProxyAddress;
-	S32 mWebProxyPort;
-	BOOL mExternalBrowser;
 };
 
 #endif
diff --git a/indra/newview/llpolymesh.h b/indra/newview/llpolymesh.h
index 7f4f087..671bf03 100644
--- a/indra/newview/llpolymesh.h
+++ b/indra/newview/llpolymesh.h
@@ -150,7 +150,7 @@ public:
 class LLJointRenderData
 {
 public:
-	LLJointRenderData(const LLMatrix4* world_matrix, LLSkinJoint* skin_joint) : mWorldMatrix(world_matrix), mSkinJoint(skin_joint){}
+	LLJointRenderData(const LLMatrix4* world_matrix, LLSkinJoint* skin_joint) : mWorldMatrix(world_matrix), mSkinJoint(skin_joint) {}
 	~LLJointRenderData(){}
 
 	const LLMatrix4*		mWorldMatrix;
diff --git a/indra/newview/llprefschat.cpp b/indra/newview/llprefschat.cpp
index e045e61..139a365 100644
--- a/indra/newview/llprefschat.cpp
+++ b/indra/newview/llprefschat.cpp
@@ -36,6 +36,8 @@
 #include "lltexteditor.h"
 #include "llviewercontrol.h"
 #include "lluictrlfactory.h"
+#include "llcolorswatch.h"
+#include "llradiogroup.h"
 #include "llstylemap.h"
 
 class LLPrefsChatImpl : public LLPanel
@@ -43,8 +45,6 @@ class LLPrefsChatImpl : public LLPanel
 public:
 	LLPrefsChatImpl();
 	/*virtual*/ ~LLPrefsChatImpl(){};
-	
-	virtual void refresh();
 
 	void apply();
 	void cancel();
@@ -79,12 +79,30 @@ LLPrefsChatImpl::LLPrefsChatImpl()
 {
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_preferences_chat.xml");
 
-	refresh();
-}
+	getChild<LLRadioGroup>("chat_font_size")->setSelectedIndex(gSavedSettings.getS32("ChatFontSize"));
+	childSetValue("fade_chat_time", gSavedSettings.getF32("ChatPersistTime"));
+	childSetValue("max_chat_count", gSavedSettings.getS32("ConsoleMaxLines"));
+
+	getChild<LLColorSwatchCtrl>("system")->set(gSavedSettings.getColor4("SystemChatColor"));
+	getChild<LLColorSwatchCtrl>("user")->set(gSavedSettings.getColor4("UserChatColor"));
+	getChild<LLColorSwatchCtrl>("agent")->set(gSavedSettings.getColor4("AgentChatColor"));
+	getChild<LLColorSwatchCtrl>("im")->set(gSavedSettings.getColor4("IMChatColor"));
+	getChild<LLColorSwatchCtrl>("script_error")->set(gSavedSettings.getColor4("ScriptErrorColor"));
+	getChild<LLColorSwatchCtrl>("objects")->set(gSavedSettings.getColor4("ObjectChatColor"));
+	getChild<LLColorSwatchCtrl>("owner")->set(gSavedSettings.getColor4("llOwnerSayChatColor"));
+	getChild<LLColorSwatchCtrl>("background")->set(gSavedSettings.getColor4("BackgroundChatColor"));
+	getChild<LLColorSwatchCtrl>("links")->set(gSavedSettings.getColor4("HTMLLinkColor"));
+
+	childSetValue("arrow_keys_move_avatar_check", gSavedSettings.getBOOL("ArrowKeysMoveAvatar"));
+	childSetValue("show_timestamps_check", gSavedSettings.getBOOL("ChatShowTimestamps"));
+	childSetValue("script_errors_as_chat", gSavedSettings.getBOOL("ScriptErrorsAsChat"));
  
-void LLPrefsChatImpl::refresh()
-{
-	LLPanel::refresh();
+	childSetValue("bubble_text_chat", gSavedSettings.getBOOL("UseChatBubbles"));
+	childSetValue("chat_full_width_check", gSavedSettings.getBOOL("ChatFullWidth"));
+	childSetValue("close_chat_on_return_check", gSavedSettings.getBOOL("CloseChatOnReturn"));
+	childSetValue("play_typing_animation", gSavedSettings.getBOOL("PlayTypingAnim"));
+	childSetValue("console_opacity", gSavedSettings.getF32("ConsoleBackgroundOpacity"));
+	childSetValue("bubble_chat_opacity", gSavedSettings.getF32("ChatBubbleOpacity"));
 
 	//set values
 	mChatSize = gSavedSettings.getS32("ChatFontSize");
@@ -137,7 +155,32 @@ void LLPrefsChatImpl::cancel()
 
 void LLPrefsChatImpl::apply()
 {
-		
+	gSavedSettings.setS32("ChatFontSize", getChild<LLRadioGroup>("chat_font_size")->getSelectedIndex());
+	gSavedSettings.setF32("ChatPersistTime", childGetValue("fade_chat_time").asReal());
+	gSavedSettings.setS32("ConsoleMaxLines", childGetValue("max_chat_count"));
+
+	gSavedSettings.setColor4("SystemChatColor", childGetValue("system"));
+	gSavedSettings.setColor4("UserChatColor", childGetValue("user"));
+	gSavedSettings.setColor4("AgentChatColor", childGetValue("agent"));
+	gSavedSettings.setColor4("IMChatColor", childGetValue("im"));
+	gSavedSettings.setColor4("ScriptErrorColor", childGetValue("script_error"));
+	gSavedSettings.setColor4("ObjectChatColor", childGetValue("objects"));
+	gSavedSettings.setColor4("llOwnerSayChatColor", childGetValue("owner"));
+	gSavedSettings.setColor4("BackgroundChatColor", childGetValue("background"));
+
+	gSavedSettings.setColor4("HTMLLinkColor", childGetValue("links"));
+	LLTextEditor::setLinkColor(childGetValue("links"));
+
+	gSavedSettings.setBOOL("ArrowKeysMoveAvatar", childGetValue("arrow_keys_move_avatar_check"));
+	gSavedSettings.setBOOL("ChatShowTimestamps", childGetValue("show_timestamps_check"));
+	gSavedSettings.setBOOL("ScriptErrorsAsChat", childGetValue("script_errors_as_chat"));
+	gSavedSettings.setBOOL("UseChatBubbles", childGetValue("bubble_text_chat"));
+	gSavedSettings.setBOOL("ChatFullWidth", childGetValue("chat_full_width_check"));
+	gSavedSettings.setBOOL("CloseChatOnReturn", childGetValue("close_chat_on_return_check"));
+	gSavedSettings.setBOOL("PlayTypingAnim", childGetValue("play_typing_animation"));
+
+	gSavedSettings.setF32("ConsoleBackgroundOpacity", childGetValue("console_opacity").asReal());
+	gSavedSettings.setF32("ChatBubbleOpacity", childGetValue("bubble_chat_opacity").asReal());
 }
 
 //---------------------------------------------------------------------------
@@ -154,7 +197,6 @@ LLPrefsChat::~LLPrefsChat()
 void LLPrefsChat::apply()
 {
 	impl.apply();
-	LLTextEditor::setLinkColor( gSavedSettings.getColor4("HTMLLinkColor") );
 	LLStyleMap::instance().update();
 }
 
diff --git a/indra/newview/llprefsim.cpp b/indra/newview/llprefsim.cpp
index 5333df8..6673a4e 100644
--- a/indra/newview/llprefsim.cpp
+++ b/indra/newview/llprefsim.cpp
@@ -55,34 +55,18 @@ public:
 	/*virtual*/ BOOL postBuild();
 
 	void apply();
-	void refresh();
 	void cancel();
-	void setPersonalInfo(
-		const std::string& visibility,
-		bool im_via_email,
-		const std::string& email);
+	void setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email);
 	void enableHistory();
+
 	static void onClickLogPath(void* user_data);
-	static void onCommitLogging( LLUICtrl* ctrl, void* user_data);
+	static void onCommitLogging(LLUICtrl* ctrl, void* user_data);
 
 protected:
-	BOOL mIMInChatHistory;
-	BOOL mLogInstantMessages;
-	BOOL mLogChat;
-	BOOL mLogShowHistory;
-	BOOL mShowTimestamps;
-	BOOL mIMLogTimestamp;
-	BOOL mLogChatTimestamp;
-	BOOL mLogIMChat;
-	BOOL mLogTimestampDate;
-
-	std::string mIMBusyResponse;
-	std::string mLogPath;
-
+ 
 	bool mGotPersonalInfo;
 	bool mOriginalIMViaEmail;
 
-	// online status info
 	bool mOriginalHideOnlineStatus;
 	std::string mDirectoryVisibility;
 };
@@ -94,34 +78,8 @@ LLPrefsIMImpl::LLPrefsIMImpl()
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_preferences_im.xml");
 }
 
-void LLPrefsIMImpl::refresh()
-{
-	mIMInChatHistory   = gSavedSettings.getBOOL("IMInChatHistory");
-	mShowTimestamps    = gSavedSettings.getBOOL("IMShowTimestamps");
-	mIMBusyResponse    = gSavedPerAccountSettings.getString("BusyModeResponse");
-	mLogPath           = gSavedPerAccountSettings.getString("InstantMessageLogPath");
-	mLogInstantMessages= gSavedPerAccountSettings.getBOOL("LogInstantMessages");
-	mLogChat           = gSavedPerAccountSettings.getBOOL("LogChat");
-	mLogShowHistory    = gSavedPerAccountSettings.getBOOL("LogShowHistory");
-	mIMLogTimestamp	   = gSavedPerAccountSettings.getBOOL("IMLogTimestamp");
-	mLogChatTimestamp  = gSavedPerAccountSettings.getBOOL("LogChatTimestamp");
-	mLogIMChat         = gSavedPerAccountSettings.getBOOL("LogChatIM");
-	mLogTimestampDate  = gSavedPerAccountSettings.getBOOL("LogTimestampDate");
-}
-
 void LLPrefsIMImpl::cancel()
 {
-	gSavedSettings.setBOOL("IMInChatHistory", mIMInChatHistory);
-	gSavedSettings.setBOOL("IMShowTimestamps", mShowTimestamps);
-	gSavedPerAccountSettings.setString("BusyModeResponse", mIMBusyResponse);
-	gSavedPerAccountSettings.setString("InstantMessageLogPath",mLogPath);
-	gSavedPerAccountSettings.setBOOL("LogInstantMessages",mLogInstantMessages);
-	gSavedPerAccountSettings.setBOOL("LogChat",mLogChat);
-	gSavedPerAccountSettings.setBOOL("LogShowHistory",mLogShowHistory);
-	gSavedPerAccountSettings.setBOOL("IMLogTimestamp",mIMLogTimestamp);
-	gSavedPerAccountSettings.setBOOL("LogChatTimestamp",mLogChatTimestamp);
-	gSavedPerAccountSettings.setBOOL("LogChatIM",mLogIMChat);
-	gSavedPerAccountSettings.setBOOL("LogTimestampDate",mLogTimestampDate);
 }
 
 BOOL LLPrefsIMImpl::postBuild()
@@ -133,12 +91,13 @@ BOOL LLPrefsIMImpl::postBuild()
 		return FALSE;
 	}
 
-	mGotPersonalInfo = false;
-	mOriginalIMViaEmail = false;
-	mOriginalHideOnlineStatus = true;
 	childSetLabelArg("send_im_to_email", "[EMAIL]", getString("log_in_to_change"));
 
 	// Don't enable this until we get personal data
+	childDisable("include_im_in_chat_history");
+	childDisable("show_timestamps_check");
+	childDisable("friends_online_notify_checkbox");
+	
 	childDisable("online_visibility");
 	childDisable("send_im_to_email");
 	childDisable("log_instant_messages");
@@ -152,17 +111,20 @@ BOOL LLPrefsIMImpl::postBuild()
 	childDisable("log_date_timestamp");
 
 	childSetText("busy_response", getString("log_in_to_change"));
-	
-	refresh(); 
-
-	childSetText("log_path_string", mLogPath);
-	childSetValue("log_instant_messages", mLogInstantMessages); 
-	childSetValue("log_chat", mLogChat); 
-	childSetValue("log_show_history", mLogShowHistory);
-	childSetValue("log_instant_messages_timestamp", mIMLogTimestamp);
-	childSetValue("log_chat_timestamp", mLogChatTimestamp);
-	childSetValue("log_chat_IM", mLogIMChat);
-	childSetValue("log_date_timestamp",mLogTimestampDate);
+
+	childSetValue("include_im_in_chat_history", gSavedSettings.getBOOL("IMInChatHistory"));
+	childSetValue("show_timestamps_check", gSavedSettings.getBOOL("IMShowTimestamps"));
+	childSetValue("friends_online_notify_checkbox", gSavedSettings.getBOOL("ChatOnlineNotification"));
+
+	childSetText("log_path_string", gSavedPerAccountSettings.getString("InstantMessageLogPath"));
+	childSetValue("log_instant_messages", gSavedPerAccountSettings.getBOOL("LogInstantMessages")); 
+	childSetValue("log_chat", gSavedPerAccountSettings.getBOOL("LogChat")); 
+	childSetValue("log_show_history", gSavedPerAccountSettings.getBOOL("LogShowHistory"));
+	childSetValue("log_instant_messages_timestamp", gSavedPerAccountSettings.getBOOL("IMLogTimestamp"));
+	childSetValue("log_chat_timestamp", gSavedPerAccountSettings.getBOOL("LogChatTimestamp"));
+	childSetValue("log_chat_IM", gSavedPerAccountSettings.getBOOL("LogChatIM"));
+	childSetValue("log_date_timestamp", gSavedPerAccountSettings.getBOOL("LogTimestampDate"));
+
 	childSetAction("log_path_button", onClickLogPath, this);
 	childSetCommitCallback("log_chat",onCommitLogging,this);
 	childSetCommitCallback("log_instant_messages",onCommitLogging,this);
@@ -199,6 +161,10 @@ void LLPrefsIMImpl::apply()
 
 		gSavedPerAccountSettings.setString("BusyModeResponse", std::string(wstring_to_utf8str(busy_response)));
 
+		gSavedSettings.setBOOL("IMInChatHistory", childGetValue("include_im_in_chat_history").asBoolean());
+		gSavedSettings.setBOOL("IMShowTimestamps", childGetValue("show_timestamps_check").asBoolean());
+		gSavedSettings.setBOOL("ChatOnlineNotification", childGetValue("friends_online_notify_checkbox").asBoolean());
+		
 		gSavedPerAccountSettings.setString("InstantMessageLogPath", childGetText("log_path_string"));
 		gSavedPerAccountSettings.setBOOL("LogInstantMessages",childGetValue("log_instant_messages").asBoolean());
 		gSavedPerAccountSettings.setBOOL("LogChat",childGetValue("log_chat").asBoolean());
@@ -245,14 +211,12 @@ void LLPrefsIMImpl::apply()
 	}
 }
 
-void LLPrefsIMImpl::setPersonalInfo(
-	const std::string& visibility,
-	bool im_via_email,
-	const std::string& email)
+void LLPrefsIMImpl::setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email)
 {
 	mGotPersonalInfo = true;
 	mOriginalIMViaEmail = im_via_email;
 	mDirectoryVisibility = visibility;
+	
 	if(visibility == VISIBILITY_DEFAULT)
 	{
 		mOriginalHideOnlineStatus = false;
@@ -267,6 +231,11 @@ void LLPrefsIMImpl::setPersonalInfo(
 	{
 		mOriginalHideOnlineStatus = true;
 	}
+
+	childEnable("include_im_in_chat_history");
+	childEnable("show_timestamps_check");
+	childEnable("friends_online_notify_checkbox");
+
 	childSetValue("online_visibility", mOriginalHideOnlineStatus); 	 
 	childSetLabelArg("online_visibility", "[DIR_VIS]", mDirectoryVisibility);
 	childEnable("send_im_to_email");
@@ -308,7 +277,7 @@ void LLPrefsIMImpl::onClickLogPath(void* user_data)
 	std::string proposed_name(self->childGetText("log_path_string"));	 
 	
 	LLDirPicker& picker = LLDirPicker::instance();
-	if (! picker.getDir(&proposed_name ) )
+	if (!picker.getDir(&proposed_name ) )
 	{
 		return; //Canceled!
 	}
diff --git a/indra/newview/llprefsvoice.cpp b/indra/newview/llprefsvoice.cpp
index 6661f08..1421c3e 100644
--- a/indra/newview/llprefsvoice.cpp
+++ b/indra/newview/llprefsvoice.cpp
@@ -35,245 +35,164 @@
 #include "llprefsvoice.h"
 
 #include "llcheckboxctrl.h"
-#include "llcombobox.h"
-
+#include "llfloatervoicedevicesettings.h"
+#include "llfocusmgr.h"
+#include "llkeyboard.h"
+#include "llmodaldialog.h"
 #include "llviewercontrol.h"
 #include "lluictrlfactory.h"
 
-#include "llmodaldialog.h"
-#include "llkeyboard.h"
-#include "llfocusmgr.h"
-#include "llfloatervoicedevicesettings.h"
-
-#include "llappviewer.h"
-
-#include "llvoiceclient.h"
 
-class LLVoiceHotkeySelectDialog : public LLModalDialog
+class LLVoiceSetKeyDialog : public LLModalDialog
 {
-private:
-	LLPrefsVoiceLogic	*mParent;
-	LLFloater			*mOldFrontmost;
-
 public:
-	LLVoiceHotkeySelectDialog( LLPrefsVoiceLogic *parent )
-		: LLModalDialog( LLStringUtil::null, 240, 100 ),
-		  mParent( parent )
-	{
-		mOldFrontmost = gFloaterView->getFrontmost();
-
-		LLUICtrlFactory::getInstance()->buildFloater(this, "floater_select_key.xml");
-		
-		childSetAction("Cancel", LLVoiceHotkeySelectDialog::onCancel, this );
-		childSetFocus("Cancel");
-	}
-
-	/*virtual*/ void setFocus( BOOL b )
-	{
-		LLFloater::setFocus(b);
-
-		// This forces keyboard processing to happen at the raw key level instead of going through handleUnicodeChar.
-		if (b)
-		{
-			gFocusMgr.setKeystrokesOnly(TRUE);
-		}
-	}
-
-	static void onCancel( void* userdata );
+	LLVoiceSetKeyDialog(LLPrefsVoice* parent);
+	~LLVoiceSetKeyDialog();
 
 	BOOL handleKeyHere(KEY key, MASK mask);
 
-};
-
-LLPrefsVoiceLogic::LLPrefsVoiceLogic(LLPanel* panelp) : 
-	mPanel(panelp)
-{
-	init();
-}
- 
-void LLPrefsVoiceLogic::init()
-{
-	mEnableVoice = gSavedSettings.getBOOL("EnableVoiceChat");
-
-	mVoiceCallsFriendsOnly = gSavedSettings.getBOOL("VoiceCallsFriendsOnly");
-	mModifier = gSavedSettings.getString("PushToTalkButton");
-	mPushToTalkToggle = gSavedSettings.getBOOL("PushToTalkToggle");
-	mEarLocation = gSavedSettings.getS32("VoiceEarLocation");
-
-	LLUICtrl* ear_location = mPanel->getChild<LLUICtrl>("ear_location");
-	mCtrlEarLocation = ear_location->getSelectionInterface();
-	if (mCtrlEarLocation)
-	{
-		mCtrlEarLocation->selectByValue(LLSD(gSavedSettings.getS32("VoiceEarLocation")));
-	}
-	mPanel->childSetCommitCallback("ear_location", onEarLocationCommit, this );
-
-	mPanel->childSetAction("set_voice_hotkey_button", onClickSetKey, this);
-	mPanel->childSetAction("set_voice_middlemouse_button", onClickSetMiddleMouse, this);
-
-	refresh();
-	mEatNextSetKeyClick = FALSE;
-}
+	static void onCancel(void* user_data);
 
-void LLPrefsVoiceLogic::refresh()
-{
-    BOOL voiceDisabled = gSavedSettings.getBOOL("CmdLineDisableVoice");
-	mPanel->childSetVisible("voice_unavailable", voiceDisabled);
-	mPanel->childSetVisible("enable_voice_check", !voiceDisabled);
-	mPanel->childSetEnabled("enable_voice_check", !voiceDisabled);
-	
-	bool enable = !voiceDisabled && gSavedSettings.getBOOL("EnableVoiceChat");
-	
-	mPanel->childSetEnabled("friends_only_check", enable);
-	mPanel->childSetEnabled("push_to_talk_check", enable);
-	mPanel->childSetEnabled("push_to_talk_label", enable);
-	mPanel->childSetEnabled("voice_call_friends_only_check", enable);
-	mPanel->childSetEnabled("push_to_talk_toggle_check", enable);
-	mPanel->childSetEnabled("ear_location", enable);
-	mPanel->childSetEnabled("set_voice_hotkey_button", enable);
-	mPanel->childSetEnabled("set_voice_middlemouse_button", enable);
-}
+private:
+	LLPrefsVoice* mParent;
+};
 
-void LLPrefsVoiceLogic::cancel()
+LLVoiceSetKeyDialog::LLVoiceSetKeyDialog(LLPrefsVoice* parent)
+	: LLModalDialog(LLStringUtil::null, 240, 100), mParent(parent)
 {
-	gSavedSettings.setBOOL("EnableVoiceChat", mEnableVoice);
-	gSavedSettings.setBOOL("VoiceCallsFriendsOnly", mVoiceCallsFriendsOnly);
-	gSavedSettings.setString("PushToTalkButton", mModifier);
-	gSavedSettings.setBOOL("PushToTalkToggle", mPushToTalkToggle );
-	gSavedSettings.setS32("VoiceEarLocation", mEarLocation);
-}
+	LLUICtrlFactory::getInstance()->buildFloater(this, "floater_select_key.xml");
+	childSetAction("Cancel", onCancel, this);
+	childSetFocus("Cancel");
 
-void LLPrefsVoiceLogic::apply()
-{
+	gFocusMgr.setKeystrokesOnly(TRUE);
 }
 
-//static 
-void LLPrefsVoiceLogic::onEarLocationCommit(LLUICtrl* ctrl, void* user_data)
+LLVoiceSetKeyDialog::~LLVoiceSetKeyDialog()
 {
-	LLCtrlSelectionInterface* interfacep = ctrl->getSelectionInterface();
-	if (interfacep)
-	{
-		gSavedSettings.setS32("VoiceEarLocation", interfacep->getSelectedValue().asInteger());
-	}
 }
 
-// static
-void LLPrefsVoiceLogic::onClickSetKey(void* user_data)
+BOOL LLVoiceSetKeyDialog::handleKeyHere(KEY key, MASK mask)
 {
-	LLPrefsVoiceLogic* self=(LLPrefsVoiceLogic*)user_data;	
-	if(self->mEatNextSetKeyClick)
+	BOOL result = TRUE;
+	
+	if(key == 'Q' && mask == MASK_CONTROL)
 	{
-		self->mEatNextSetKeyClick = false;
+		result = FALSE;
 	}
 	else
 	{
-		LLVoiceHotkeySelectDialog* dialog = new LLVoiceHotkeySelectDialog( self );
-		dialog->startModal();
-		// dialog will delete itself
+		mParent->setKey(key);
 	}
-}
 
+	close();
+	return result;
+}
 
-// static
-void LLPrefsVoiceLogic::onClickSetMiddleMouse(void* user_data)
+//static
+void LLVoiceSetKeyDialog::onCancel(void* user_data)
 {
-//	LLPrefsVoiceLogic* self=(LLPrefsVoiceLogic*)user_data;
-	
-	gSavedSettings.setString("PushToTalkButton", "MiddleMouse");
+	LLVoiceSetKeyDialog* self = (LLVoiceSetKeyDialog*)user_data;
+	self->close();
 }
 
-void LLPrefsVoiceLogic::setKey(KEY key, MASK mask)
-{
-	std::string keystring = LLKeyboard::stringFromKey(key);
-	gSavedSettings.setString("PushToTalkButton", keystring);
-	
-	if(key == ' ')
-	{
-		// This will cause the select dialog to immediately reopen.
-		// Eat the next click event.
-		mEatNextSetKeyClick = TRUE;
-	}
+//--------------------------------------------------------------------
+//LLPrefsVoice
+LLPrefsVoice::LLPrefsVoice()
+	:	LLPanel(std::string("Voice Chat Panel"))
+{ 
+	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_preferences_voice.xml");
 }
 
-void LLVoiceHotkeySelectDialog::onCancel( void* userdata )
+LLPrefsVoice::~LLPrefsVoice()
 {
-	LLVoiceHotkeySelectDialog* self = (LLVoiceHotkeySelectDialog*) userdata;
-	self->close(); // destroys this object
-	self->mOldFrontmost->setFrontmost(TRUE);
 }
 
-BOOL LLVoiceHotkeySelectDialog::handleKeyHere(KEY key, MASK mask)
+BOOL LLPrefsVoice::postBuild()
 {
-	BOOL result = TRUE;
-	
-	// Suck up all keystokes except CTRL-Q.
-	BOOL is_quit = ('Q' == key) && (MASK_CONTROL == mask);
-	if(is_quit)
-	{
-		result = FALSE;
-	}
-	else
-	{
-		mParent->setKey(key, mask);
-	}
+	childSetCommitCallback("enable_voice_check", onCommitEnableVoiceChat, this);
+	childSetAction("set_voice_hotkey_button", onClickSetKey, this);
+	childSetAction("set_voice_middlemouse_button", onClickSetMiddleMouse, this);
+	childSetAction("device_settings_btn", onClickVoiceDeviceSettings, NULL);
 
-	close(); // destroys this object
-	mOldFrontmost->setFrontmost(TRUE);
-	
-	return result;
-}
+	BOOL voice_disabled = gSavedSettings.getBOOL("CmdLineDisableVoice");
+	childSetVisible("voice_unavailable", voice_disabled);
+	childSetVisible("enable_voice_check", !voice_disabled);
+	childSetEnabled("enable_voice_check", !voice_disabled);
 
-//---------------------------------------------------------------------------
+	bool enable = !voice_disabled && gSavedSettings.getBOOL("EnableVoiceChat");
+	childSetValue("enable_voice_check", enable);
+	onCommitEnableVoiceChat(getChild<LLCheckBoxCtrl>("enable_voice_check"), this);
 
+	childSetValue("modifier_combo", gSavedSettings.getString("PushToTalkButton"));
+	childSetValue("voice_call_friends_only_check", gSavedSettings.getBOOL("VoiceCallsFriendsOnly"));
+	childSetValue("push_to_talk_toggle_check", gSavedSettings.getBOOL("PushToTalkToggle"));
+	childSetValue("ear_location", gSavedSettings.getS32("VoiceEarLocation"));
 
-LLPrefsVoice::LLPrefsVoice()
-	:	LLPanel(std::string("Voice Chat Panel"))
-{ 
-	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_preferences_voice.xml");
-	mLogic = new LLPrefsVoiceLogic(this);
-	childSetAction("device_settings_btn", onClickVoiceDeviceSettingsBtn, this);
+	return TRUE;
+}
 
-	// create floater immediately and keep it hidden
-	// since it stores preference state for audio devices
-	mVoiceDeviceSettings = LLFloaterVoiceDeviceSettings::getInstance();
+void LLPrefsVoice::apply()
+{
+	gSavedSettings.setBOOL("EnableVoiceChat", childGetValue("enable_voice_check"));
+
+	gSavedSettings.setString("PushToTalkButton", childGetValue("modifier_combo"));
+	gSavedSettings.setBOOL("VoiceCallsFriendsOnly", childGetValue("voice_call_friends_only_check"));
+	gSavedSettings.setBOOL("PushToTalkToggle", childGetValue("push_to_talk_toggle_check"));
+	gSavedSettings.setS32("VoiceEarLocation", childGetValue("ear_location"));
 }
 
-LLPrefsVoice::~LLPrefsVoice()
+void LLPrefsVoice::cancel()
+{
+}
+
+void LLPrefsVoice::setKey(KEY key)
 {
-	delete mLogic;
+	childSetValue("modifier_combo", LLKeyboard::stringFromKey(key));
 }
 
-void LLPrefsVoice::draw()
+//static
+void LLPrefsVoice::onCommitEnableVoiceChat(LLUICtrl* ctrl, void* user_data)
 {
-	bool enable = !gSavedSettings.getBOOL("CmdLineDisableVoice")
-                  && gSavedSettings.getBOOL("EnableVoiceChat");
-	childSetEnabled("device_settings_btn", enable);
+	LLPrefsVoice* self = (LLPrefsVoice*)user_data;
+	LLCheckBoxCtrl* enable_voice_chat = (LLCheckBoxCtrl*)ctrl;
+
+	bool enable = enable_voice_chat->getValue();
 
-	mLogic->refresh();
-	mVoiceDeviceSettings->refresh();
-	LLPanel::draw();
+	self->childSetEnabled("modifier_combo", enable);
+	self->childSetEnabled("friends_only_check", enable);
+	self->childSetEnabled("push_to_talk_label", enable);
+	self->childSetEnabled("voice_call_friends_only_check", enable);
+	self->childSetEnabled("push_to_talk_toggle_check", enable);
+	self->childSetEnabled("ear_location", enable);
+	self->childSetEnabled("set_voice_hotkey_button", enable);
+	self->childSetEnabled("set_voice_middlemouse_button", enable);
+	self->childSetEnabled("device_settings_btn", enable);
 }
 
-void LLPrefsVoice::apply()
+//static
+void LLPrefsVoice::onClickSetKey(void* user_data)
 {
-	mLogic->apply();
-	mVoiceDeviceSettings->apply();
+	LLPrefsVoice* self = (LLPrefsVoice*)user_data;
+	LLVoiceSetKeyDialog* dialog = new LLVoiceSetKeyDialog(self);
+	dialog->startModal();
 }
 
-void LLPrefsVoice::cancel()
+//static
+void LLPrefsVoice::onClickSetMiddleMouse(void* user_data)
 {
-	mLogic->cancel();
-	mVoiceDeviceSettings->cancel();
+	LLPrefsVoice* self = (LLPrefsVoice*)user_data;
+	self->childSetValue("modifier_combo", "MiddleMouse");
 }
 
-//static 
-void LLPrefsVoice::onClickVoiceDeviceSettingsBtn(void* user_data)
+//static
+void LLPrefsVoice::onClickVoiceDeviceSettings(void* user_data)
 {
-	LLPrefsVoice* prefs = (LLPrefsVoice*)user_data;
-	prefs->mVoiceDeviceSettings->open();
-	LLFloater* parent_floater = gFloaterView->getParentFloater(prefs);
-	if (parent_floater)
+	LLPrefsVoice* voice_prefs = (LLPrefsVoice*)user_data;
+	LLFloaterVoiceDeviceSettings* device_settings_floater = LLFloaterVoiceDeviceSettings::showInstance();
+	LLFloater* parent_floater = gFloaterView->getParentFloater(voice_prefs);
+	if(parent_floater)
 	{
-		parent_floater->addDependentFloater(prefs->mVoiceDeviceSettings, FALSE);
+		parent_floater->addDependentFloater(device_settings_floater, FALSE);
 	}
 }
+
diff --git a/indra/newview/llprefsvoice.h b/indra/newview/llprefsvoice.h
index 836108d..a7cba73 100644
--- a/indra/newview/llprefsvoice.h
+++ b/indra/newview/llprefsvoice.h
@@ -34,55 +34,24 @@
 
 #include "llpanel.h"
 
-class LLFloaterVoiceDeviceSettings;
-
-class LLPrefsVoiceLogic
-{
-public:
-	LLPrefsVoiceLogic(LLPanel* panelp);
-	virtual ~LLPrefsVoiceLogic(){};
-	
-	virtual void init();
-
-	void apply();
-	void cancel();
-	void refresh();
-	
-	void setKey(KEY key, MASK mask);
-
-protected:
-
-	static void onClickSetKey(void* user_data);
-	static void onClickSetMiddleMouse(void* user_data);
-	static void onEarLocationCommit(LLUICtrl* ctrl, void* user_data);
-
-	BOOL mEnableVoice;
-	BOOL mVoiceCallsFriendsOnly;
-	std::string mModifier;
-	BOOL mPushToTalkToggle;
-	S32  mEarLocation;
-	LLCtrlSelectionInterface	*mCtrlEarLocation;
-	
-	BOOL mEatNextSetKeyClick;
-
-	LLPanel* mPanel;
-};
-
 class LLPrefsVoice : public LLPanel
 {
 public:
 	LLPrefsVoice();
 	~LLPrefsVoice();
 
-	/*virtual*/ void draw();
+	BOOL postBuild();
+
 	void apply();
 	void cancel();
 
-protected:
-	static void onClickVoiceDeviceSettingsBtn(void* user_data);
+	void setKey(KEY key);
 
-	LLPrefsVoiceLogic* mLogic;
-	LLFloaterVoiceDeviceSettings* mVoiceDeviceSettings;
+private:
+	static void onCommitEnableVoiceChat(LLUICtrl* ctrl, void* user_data);
+	static void onClickSetKey(void* user_data);
+	static void onClickSetMiddleMouse(void* user_data);
+	static void onClickVoiceDeviceSettings(void* user_data);
 };
 
 #endif // LLPREFSVOICE_H
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 52fca27..2b87128 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -101,7 +101,7 @@ const std::string HELLO_LSL =
 	"        llSay(0, \"Touched.\");\n"
 	"    }\n"
 	"}\n";
-const std::string HELP_LSL = "lsl_guide.html";
+const std::string HELP_LSL_URL = "http://wiki.secondlife.com/wiki/LSL_Portal";
 
 const std::string DEFAULT_SCRIPT_NAME = "New Script"; // *TODO:Translate?
 const std::string DEFAULT_SCRIPT_DESC = "(No Description)"; // *TODO:Translate?
@@ -294,7 +294,7 @@ LLScriptEdCore::LLScriptEdCore(
 	const std::string& name,
 	const LLRect& rect,
 	const std::string& sample,
-	const std::string& help,
+	const std::string& help_url,
 	const LLHandle<LLFloater>& floater_handle,
 	void (*load_callback)(void*),
 	void (*save_callback)(void*, BOOL),
@@ -304,7 +304,7 @@ LLScriptEdCore::LLScriptEdCore(
 	:
 	LLPanel( std::string("name"), rect ),
 	mSampleText(sample),
-	mHelpFile ( help ),
+	mHelpURL(help_url),
 	mEditor( NULL ),
 	mLoadCallback( load_callback ),
 	mSaveCallback( save_callback ),
@@ -547,7 +547,6 @@ void LLScriptEdCore::setHelpPage(const std::string& help_string)
 	if (!history_combo) return;
 
 	LLUIString url_string = gSavedSettings.getString("LSLHelpURL");
-	url_string.setArg("[APP_DIRECTORY]", gDirUtilp->getWorkingDir());
 	url_string.setArg("[LSL_STRING]", help_string);
 
 	addHelpItemToHistory(help_string);
@@ -556,6 +555,7 @@ void LLScriptEdCore::setHelpPage(const std::string& help_string)
 
 }
 
+
 void LLScriptEdCore::addHelpItemToHistory(const std::string& help_string)
 {
 	if (help_string.empty()) return;
@@ -647,7 +647,7 @@ void LLScriptEdCore::onHelpWebDialog(S32 option, void* userdata)
 	switch(option)
 	{
 	case 0:
-		load_url_local_file(corep->mHelpFile);
+		LLWeb::loadURL(corep->mHelpURL);
 		break;
 	default:
 		break;
@@ -773,7 +773,6 @@ void LLScriptEdCore::onHelpComboCommit(LLUICtrl* ctrl, void* userdata)
 
 		LLWebBrowserCtrl* web_browser = live_help_floater->getChild<LLWebBrowserCtrl>("lsl_guide_html");
 		LLUIString url_string = gSavedSettings.getString("LSLHelpURL");
-		url_string.setArg("[APP_DIRECTORY]", gDirUtilp->getWorkingDir());
 		url_string.setArg("[LSL_STRING]", help_string);
 		web_browser->navigateTo(url_string);
 	}
@@ -1072,7 +1071,7 @@ void* LLPreviewLSL::createScriptEdPanel(void* userdata)
 	self->mScriptEd =  new LLScriptEdCore("script panel",
 								   LLRect(),
 								   HELLO_LSL,
-								   HELP_LSL,
+								   HELP_LSL_URL,
 								   self->getHandle(),
 								   LLPreviewLSL::onLoad,
 								   LLPreviewLSL::onSave,
@@ -1590,7 +1589,7 @@ void* LLLiveLSLEditor::createScriptEdPanel(void* userdata)
 	self->mScriptEd =  new LLScriptEdCore("script ed panel",
 								   LLRect(),
 								   HELLO_LSL,
-								   HELP_LSL,
+								   HELP_LSL_URL,
 								   self->getHandle(),
 								   &LLLiveLSLEditor::onLoad,
 								   &LLLiveLSLEditor::onSave,
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index 977b9ce..58de041 100644
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -65,7 +65,7 @@ public:
 		const std::string& name,
 		const LLRect& rect,
 		const std::string& sample,
-		const std::string& help,
+		const std::string& help_url,
 		const LLHandle<LLFloater>& floater_handle,
 		void (*load_callback)(void* userdata),
 		void (*save_callback)(void* userdata, BOOL close_after_save),
@@ -132,7 +132,7 @@ protected:
 
 private:
 	std::string		mSampleText;
-	std::string		mHelpFile;
+	std::string		mHelpURL;
 	LLTextEditor*	mEditor;
 	void			(*mLoadCallback)(void* userdata);
 	void			(*mSaveCallback)(void* userdata, BOOL close_after_save);
diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp
index 9ba6fd5..6b79bfb 100644
--- a/indra/newview/llpreviewsound.cpp
+++ b/indra/newview/llpreviewsound.cpp
@@ -106,7 +106,6 @@ void LLPreviewSound::auditionSound( void *userdata )
 	if(item && gAudiop)
 	{
 		LLVector3d lpos_global = gAgent.getPositionGlobal();
-		F32 volume = gSavedSettings.getBOOL("MuteSounds") ? 0.f : SOUND_GAIN * gSavedSettings.getF32("AudioLevelSFX");
-		gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), volume, lpos_global);
+		gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_UI, lpos_global);
 	}
 }
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 0a204dc..47a2cbc 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -200,7 +200,7 @@ void LLPreviewTexture::draw()
 	if (!isMinimized())
 	{
 		LLGLSUIDefault gls_ui;
-		LLGLSNoTexture gls_notex;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		
 		const LLRect& border = mClientRect;
 		LLRect interior = mClientRect;
@@ -299,20 +299,20 @@ BOOL LLPreviewTexture::canSaveAs() const
 // virtual
 void LLPreviewTexture::saveAs()
 {
-	if( !mLoadingFullImage )
+	if( mLoadingFullImage ) return;
+
+	LLFilePicker& file_picker = LLFilePicker::instance();
+	if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_TGA, LLDir::getScrubbedFileName(getItem()->getName())) )
 	{
-		LLFilePicker& file_picker = LLFilePicker::instance();
-		if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_TGA ) )
-		{
-			// User canceled save.
-			return;
-		}
-		mSaveFileName = file_picker.getFirstFile();
-		mLoadingFullImage = TRUE;
-		getWindow()->incBusyCount();
-		mImage->setLoadedCallback( LLPreviewTexture::onFileLoadedForSave, 
-								   0, TRUE, FALSE, new LLUUID( mItemUUID ) );
+		// User canceled or we failed to acquire save file.
+		return;
 	}
+	// remember the user-approved/edited file name.
+	mSaveFileName = file_picker.getFirstFile();
+	mLoadingFullImage = TRUE;
+	getWindow()->incBusyCount();
+	mImage->setLoadedCallback( LLPreviewTexture::onFileLoadedForSave, 
+								0, TRUE, FALSE, new LLUUID( mItemUUID ) );
 }
 
 
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index 123c583..4354254 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -208,7 +208,7 @@ void LLProgressView::draw()
 	if (gStartImageGL)
 	{
 		LLGLSUIDefault gls_ui;
-		LLViewerImage::bindTexture(gStartImageGL);
+		gGL.getTexUnit(0)->bind(gStartImageGL);
 		gGL.color4f(1.f, 1.f, 1.f, mFadeTimer.getStarted() ? clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, FADE_IN_TIME, 1.f, 0.f) : 1.f);
 		F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight;
 		F32 view_aspect = (F32)width / (F32)height;
@@ -224,11 +224,11 @@ void LLProgressView::draw()
 			glScalef(1.f, view_aspect / image_aspect, 1.f);
 		}
 		gl_rect_2d_simple_tex( getRect().getWidth(), getRect().getHeight() );
-		gStartImageGL->unbindTexture(0, GL_TEXTURE_2D);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	}
 	else
 	{
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gGL.color4f(0.f, 0.f, 0.f, 1.f);
 		gl_rect_2d(getRect());
 	}
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 2e4983c..e3b57b8 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -4828,7 +4828,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
 		return;
 	}
 
-	LLViewerImage::bindTexture(mSilhouetteImagep);
+	gGL.getTexUnit(0)->bind(mSilhouetteImagep.get());
 	LLGLSPipelineSelection gls_select;
 	gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f);
 	LLGLEnable blend(GL_BLEND);
@@ -4936,7 +4936,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
 		stop_glerror();
 	}
 
-	mSilhouetteImagep->unbindTexture(0, GL_TEXTURE_2D);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
 }
 
@@ -5313,7 +5313,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
 
 			LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GEQUAL);
 			gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
-			gGL.begin(LLVertexBuffer::LINES);
+			gGL.begin(LLRender::LINES);
 			{
 				S32 i = 0;
 				for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++)
@@ -5334,7 +5334,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
 
 		gGL.flush();
 		gGL.setSceneBlendType(LLRender::BT_ALPHA);
-		gGL.begin(LLVertexBuffer::TRIANGLES);
+		gGL.begin(LLRender::TRIANGLES);
 		{
 			S32 i = 0;
 			for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++)
@@ -5940,9 +5940,9 @@ S32 LLObjectSelection::getRootObjectCount()
 	return count;
 }
 
-bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func, bool firstonly)
+bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func)
 {
-	bool result = firstonly ? false : true;
+	bool result = true;
 	for (iterator iter = begin(); iter != end(); )
 	{
 		iterator nextiter = iter++;
@@ -5950,10 +5950,7 @@ bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func, bool first
 		if (!object)
 			continue;
 		bool r = func->apply(object);
-		if (firstonly && r)
-			return true;
-		else
-			result = result && r;
+		result = result && r;
 	}
 	return result;
 }
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index d85ba04..a59b1c8 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -316,7 +316,7 @@ public:
 	// If firstonly is FALSE, returns the AND of all apply() calls.
 	// Else returns TRUE immediately if any apply() call succeeds (i.e. OR with early exit)
 	bool applyToRootObjects(LLSelectedObjectFunctor* func, bool firstonly = false);
-	bool applyToObjects(LLSelectedObjectFunctor* func, bool firstonly = false);
+	bool applyToObjects(LLSelectedObjectFunctor* func);
 	bool applyToTEs(LLSelectedTEFunctor* func, bool firstonly = false);
 	bool applyToRootNodes(LLSelectedNodeFunctor* func, bool firstonly = false);
 	bool applyToNodes(LLSelectedNodeFunctor* func, bool firstonly = false);
diff --git a/indra/newview/llsky.cpp b/indra/newview/llsky.cpp
index 8265d9d..18029a7 100644
--- a/indra/newview/llsky.cpp
+++ b/indra/newview/llsky.cpp
@@ -284,16 +284,16 @@ LLColor4U LLSky::getFadeColor() const
 
 void LLSky::init(const LLVector3 &sun_direction)
 {
-	mVOWLSkyp = static_cast<LLVOWLSky*>(gObjectList.createObjectViewer(LLViewerObject::LL_VO_WL_SKY, gAgent.getRegion()));
+	mVOWLSkyp = static_cast<LLVOWLSky*>(gObjectList.createObjectViewer(LLViewerObject::LL_VO_WL_SKY, NULL));
 	mVOWLSkyp->initSunDirection(sun_direction, LLVector3::zero);
 	gPipeline.addObject(mVOWLSkyp.get());
 
-	mVOSkyp = (LLVOSky *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_SKY, gAgent.getRegion());
+	mVOSkyp = (LLVOSky *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_SKY, NULL);
 	mVOSkyp->initSunDirection(sun_direction, LLVector3());
 	gPipeline.addObject((LLViewerObject *)mVOSkyp);
 
 
-	mVOGroundp = (LLVOGround*)gObjectList.createObjectViewer(LLViewerObject::LL_VO_GROUND, gAgent.getRegion());
+	mVOGroundp = (LLVOGround*)gObjectList.createObjectViewer(LLViewerObject::LL_VO_GROUND, NULL);
 	LLVOGround *groundp = mVOGroundp;
 	gPipeline.addObject((LLViewerObject *)groundp);
 
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 9f5d115..6247686 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -46,6 +46,7 @@
 #include "pipeline.h"
 #include "llrender.h"
 #include "lloctree.h"
+#include "llvoavatar.h"
 
 const F32 SG_OCCLUSION_FUDGE = 1.01f;
 #define SG_DISCARD_TOLERANCE 0.01f
@@ -1624,7 +1625,7 @@ public:
 
 void drawBox(const LLVector3& c, const LLVector3& r)
 {
-	gGL.begin(LLVertexBuffer::TRIANGLE_STRIP);
+	gGL.begin(LLRender::TRIANGLE_STRIP);
 	//left front
 	gGL.vertex3fv((c+r.scaledVec(LLVector3(-1,1,-1))).mV);
 	gGL.vertex3fv((c+r.scaledVec(LLVector3(-1,1,1))).mV);
@@ -1643,7 +1644,7 @@ void drawBox(const LLVector3& c, const LLVector3& r)
 	gGL.end();
 	
 	//bottom
-	gGL.begin(LLVertexBuffer::TRIANGLE_STRIP);
+	gGL.begin(LLRender::TRIANGLE_STRIP);
 	gGL.vertex3fv((c+r.scaledVec(LLVector3(1,1,-1))).mV);
 	gGL.vertex3fv((c+r.scaledVec(LLVector3(1,-1,-1))).mV);
 	gGL.vertex3fv((c+r.scaledVec(LLVector3(-1,1,-1))).mV);
@@ -1651,7 +1652,7 @@ void drawBox(const LLVector3& c, const LLVector3& r)
 	gGL.end();
 
 	//top
-	gGL.begin(LLVertexBuffer::TRIANGLE_STRIP);
+	gGL.begin(LLRender::TRIANGLE_STRIP);
 	gGL.vertex3fv((c+r.scaledVec(LLVector3(1,1,1))).mV);
 	gGL.vertex3fv((c+r.scaledVec(LLVector3(-1,1,1))).mV);
 	gGL.vertex3fv((c+r.scaledVec(LLVector3(1,-1,1))).mV);
@@ -1666,7 +1667,7 @@ void drawBoxOutline(const LLVector3& pos, const LLVector3& size)
 	LLVector3 v3 = size.scaledVec(LLVector3(-1,-1,1));
 	LLVector3 v4 = size.scaledVec(LLVector3( 1,-1,1));
 
-	gGL.begin(LLVertexBuffer::LINES); 
+	gGL.begin(LLRender::LINES); 
 	
 	//top
 	gGL.vertex3fv((pos+v1).mV);
@@ -1814,7 +1815,7 @@ void pushVerts(LLDrawInfo* params, U32 mask)
 {
 	LLRenderPass::applyModelMatrix(*params);
 	params->mVertexBuffer->setBuffer(mask);
-	params->mVertexBuffer->drawRange(params->mParticle ? LLVertexBuffer::POINTS : LLVertexBuffer::TRIANGLES,
+	params->mVertexBuffer->drawRange(params->mParticle ? LLRender::POINTS : LLRender::TRIANGLES,
 								params->mStart, params->mEnd, params->mCount, params->mOffset);
 }
 
@@ -1843,7 +1844,7 @@ void pushVerts(LLFace* face, U32 mask)
 		U16 end = start + face->getGeomCount()-1;
 		U32 count = face->getIndicesCount();
 		U16 offset = face->getIndicesStart();
-		buffer->drawRange(LLVertexBuffer::TRIANGLES, start, end, count, offset);
+		buffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
 	}
 
 }
@@ -1853,7 +1854,7 @@ void pushBufferVerts(LLVertexBuffer* buffer, U32 mask)
 	if (buffer)
 	{
 		buffer->setBuffer(mask);
-		buffer->drawRange(LLVertexBuffer::TRIANGLES, 0, buffer->getRequestedVerts()-1, buffer->getRequestedIndices(), 0);
+		buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getRequestedVerts()-1, buffer->getRequestedIndices(), 0);
 	}
 }
 
@@ -1902,7 +1903,7 @@ void pushVertsColorCoded(LLSpatialGroup* group, U32 mask)
 			LLRenderPass::applyModelMatrix(*params);
 			glColor4f(colors[col].mV[0], colors[col].mV[1], colors[col].mV[2], 0.5f);
 			params->mVertexBuffer->setBuffer(mask);
-			params->mVertexBuffer->drawRange(params->mParticle ? LLVertexBuffer::POINTS : LLVertexBuffer::TRIANGLES,
+			params->mVertexBuffer->drawRange(params->mParticle ? LLRender::POINTS : LLRender::TRIANGLES,
 				params->mStart, params->mEnd, params->mCount, params->mOffset);
 			col = (col+1)%col_count;
 		}
@@ -1972,7 +1973,7 @@ void renderOctree(LLSpatialGroup* group)
 						face->mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX);
 						//drawBox((face->mExtents[0] + face->mExtents[1])*0.5f,
 						//		(face->mExtents[1]-face->mExtents[0])*0.5f);
-						face->mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, face->getIndicesCount(), face->getIndicesStart());
+						face->mVertexBuffer->draw(LLRender::TRIANGLES, face->getIndicesCount(), face->getIndicesStart());
 					}
 				}
 
@@ -2103,6 +2104,7 @@ void renderBoundingBox(LLDrawable* drawable)
 					gGL.color4f(0.5f,0.5f,0.5f,1.0f);
 					break;
 			case LLViewerObject::LL_VO_PART_GROUP:
+			case LLViewerObject::LL_VO_HUD_PART_GROUP:
 					gGL.color4f(0,0,1,1);
 					break;
 			case LLViewerObject::LL_VO_WATER:
@@ -2222,7 +2224,7 @@ void renderPoints(LLDrawable* drawablep)
 	LLGLDepthTest depth(GL_FALSE, GL_FALSE);
 	if (drawablep->getNumFaces())
 	{
-		gGL.begin(LLVertexBuffer::POINTS);
+		gGL.begin(LLRender::POINTS);
 		gGL.color3f(1,1,1);
 		LLVector3 center(drawablep->getPositionGroup());
 		for (S32 i = 0; i < drawablep->getNumFaces(); i++)
@@ -2298,9 +2300,17 @@ void renderRaycast(LLDrawable* drawablep)
 		LLGLEnable blend(GL_BLEND);
 		gGL.color4f(0,1,1,0.5f);
 
-		for (S32 i = 0; i < drawablep->getNumFaces(); i++)
+		if (drawablep->getVOVolume() && gDebugRaycastFaceHit != -1)
 		{
-			pushVerts(drawablep->getFace(i), LLVertexBuffer::MAP_VERTEX);
+			glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+			pushVerts(drawablep->getFace(gDebugRaycastFaceHit), LLVertexBuffer::MAP_VERTEX);
+			glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+		}
+		else if (drawablep->isAvatar())
+		{
+			LLGLDepthTest depth(GL_FALSE);
+			LLVOAvatar* av = (LLVOAvatar*) drawablep->getVObj().get();
+			av->renderCollisionVolumes();
 		}
 
 		// draw intersection point
@@ -2468,7 +2478,7 @@ void LLSpatialPartition::renderDebug()
 	LLGLDisable cullface(GL_CULL_FACE);
 	LLGLEnable blend(GL_BLEND);
 	gGL.setSceneBlendType(LLRender::BT_ALPHA);
-	LLImageGL::unbindTexture(0);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	gPipeline.disableLights();
 
 	LLSpatialBridge* bridge = asBridge();
@@ -2508,8 +2518,9 @@ public:
 	LLVector3 *mNormal;
 	LLVector3 *mBinormal;
 	LLDrawable* mHit;
-	
-	LLOctreeIntersect(LLVector3 start, LLVector3 end,
+	BOOL mPickTransparent;
+
+	LLOctreeIntersect(LLVector3 start, LLVector3 end, BOOL pick_transparent,
 					  S32* face_hit, LLVector3* intersection, LLVector2* tex_coord, LLVector3* normal, LLVector3* binormal)
 		: mStart(start),
 		  mEnd(end),
@@ -2518,14 +2529,15 @@ public:
 		  mTexCoord(tex_coord),
 		  mNormal(normal),
 		  mBinormal(binormal),
-		  mHit(NULL)
+		  mHit(NULL),
+		  mPickTransparent(pick_transparent)
 	{
 	}
 	
 	virtual void visit(const LLSpatialGroup::OctreeNode* branch) 
 	{	
 		for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i)
-	{
+		{
 			check(*i);
 		}
 	}
@@ -2570,25 +2582,35 @@ public:
 
 	virtual bool check(LLDrawable* drawable)
 	{	
+		LLVector3 local_start = mStart;
+		LLVector3 local_end = mEnd;
+
+		if (!gPipeline.hasRenderType(drawable->getRenderType()) || !drawable->isVisible())
+		{
+			return false;
+		}
+
 		if (drawable->isSpatialBridge())
 		{
 			LLSpatialPartition *part = drawable->asPartition();
-
-			check(part->mOctree);
-	}
-
+			LLSpatialBridge* bridge = part->asBridge();
+			if (bridge && gPipeline.hasRenderType(bridge->mDrawableType))
+			{
+				check(part->mOctree);
+			}
+		}
 		else
-	{
-		LLViewerObject* vobj = drawable->getVObj();
+		{
+			LLViewerObject* vobj = drawable->getVObj();
 
 			if (vobj)
 			{
 				LLVector3 intersection;
-				if (vobj->lineSegmentIntersect(mStart, mEnd, -1, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal))
+				if (vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal))
 				{
 					mEnd = intersection;  // shorten ray so we only find CLOSER hits
 					if (mIntersection)
-		{
+					{
 						*mIntersection = intersection;
 					}
 					
@@ -2596,12 +2618,13 @@ public:
 				}
 			}
 		}
-		
+				
 		return false;
 	}
 };
 
 LLDrawable* LLSpatialPartition::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
+													 BOOL pick_transparent,													
 													 S32* face_hit,                   // return the face hit
 													 LLVector3* intersection,         // return the intersection point
 													 LLVector2* tex_coord,            // return the texture coordinates of the intersection point
@@ -2610,7 +2633,7 @@ LLDrawable* LLSpatialPartition::lineSegmentIntersect(const LLVector3& start, con
 	)
 
 {
-	LLOctreeIntersect intersect(start, end, face_hit, intersection, tex_coord, normal, bi_normal);
+	LLOctreeIntersect intersect(start, end, pick_transparent, face_hit, intersection, tex_coord, normal, bi_normal);
 	LLDrawable* drawable = intersect.check(mOctree);
 
 	return drawable;
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index bd09da2..f42d55b 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -301,6 +301,7 @@ public:
 	BOOL remove(LLDrawable *drawablep, LLSpatialGroup *curp);
 	
 	LLDrawable* lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
+									 BOOL pick_transparent, 
 									 S32* face_hit,                          // return the face hit
 									 LLVector3* intersection = NULL,         // return the intersection point
 									 LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point
@@ -482,6 +483,12 @@ protected:
 	U32 mRenderPass;
 };
 
+class LLHUDParticlePartition : public LLParticlePartition
+{
+public:
+	LLHUDParticlePartition();
+};
+
 //spatial partition for grass (implemented in LLVOGrass.cpp)
 class LLGrassPartition : public LLParticlePartition
 {
diff --git a/indra/newview/llsprite.cpp b/indra/newview/llsprite.cpp
index 7da1d48..0032ee8 100644
--- a/indra/newview/llsprite.cpp
+++ b/indra/newview/llsprite.cpp
@@ -126,8 +126,8 @@ void LLSprite::updateFace(LLFace &face)
 			LLVector3 camera_vec = mPosition - sCameraPosition;
 			mScaledRight = camera_vec % LLVector3(0.f, 0.f, 1.f);
 			mScaledUp = -(camera_vec % mScaledRight);
-			mScaledUp.normVec();
-			mScaledRight.normVec();
+			mScaledUp.normalize();
+			mScaledRight.normalize();
 			mScaledUp *= mHeightDiv2;
 			mScaledRight *= mWidthDiv2;
 
@@ -156,7 +156,7 @@ void LLSprite::updateFace(LLFace &face)
 		else
 		{
 			x_axis = sNormal % LLVector3(0.f, -1.f, 0.f);
-			x_axis.normVec();
+			x_axis.normalize();
 
 			y_axis = sNormal % x_axis;
 		}
diff --git a/indra/newview/llsprite.h b/indra/newview/llsprite.h
index 7170cb2..e721bef 100644
--- a/indra/newview/llsprite.h
+++ b/indra/newview/llsprite.h
@@ -73,7 +73,7 @@ public:
 	void setColor(const LLColor4 &color);
 	void setColor(const F32 r, const F32 g, const F32 b, const F32 a);
 	void setAlpha(const F32 alpha)					{ mColor.mV[VALPHA] = alpha; }
-	void setNormal(const LLVector3 &normal)		{ sNormal = normal; sNormal.normVec();}
+	void setNormal(const LLVector3 &normal)		{ sNormal = normal; sNormal.normalize();}
 
 	F32 getAlpha();
 
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 0978fbb..2ce111f 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -89,6 +89,7 @@
 #include "llfeaturemanager.h"
 #include "llfirstuse.h"
 #include "llfloateractivespeakers.h"
+#include "llfloaterbeacons.h"
 #include "llfloatercamera.h"
 #include "llfloaterchat.h"
 #include "llfloatergesture.h"
@@ -244,6 +245,7 @@ void callback_choose_gender(S32 option, void* userdata);
 void init_start_screen(S32 location_id);
 void release_start_screen();
 void reset_login();
+void apply_udp_blacklist(const std::string& csv);
 
 void callback_cache_name(const LLUUID& id, const std::string& firstname, const std::string& lastname, BOOL is_group, void* data)
 {
@@ -750,6 +752,12 @@ bool idle_startup()
 		gLoginMenuBarView->setVisible( TRUE );
 		gLoginMenuBarView->setEnabled( TRUE );
 
+		// DEV-16927.  The following code removes errant keystrokes that happen while the window is being 
+		// first made visible.
+#ifdef _WIN32
+		MSG msg;
+		while( PeekMessage( &msg, /*All hWnds owned by this thread */ NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE ) );
+#endif
 		timeout.reset();
 		return FALSE;
 	}
@@ -842,6 +850,20 @@ bool idle_startup()
 		LLFile::mkdir(gDirUtilp->getChatLogsDir());
 		LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir());
 
+		//good as place as any to create user windlight directories
+		std::string user_windlight_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight", ""));
+		LLFile::mkdir(user_windlight_path_name.c_str());		
+
+		std::string user_windlight_skies_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
+		LLFile::mkdir(user_windlight_skies_path_name.c_str());
+
+		std::string user_windlight_water_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
+		LLFile::mkdir(user_windlight_water_path_name.c_str());
+
+		std::string user_windlight_days_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/days", ""));
+		LLFile::mkdir(user_windlight_days_path_name.c_str());
+
+
 		if (show_connect_box)
 		{
 			if ( LLPanelLogin::isGridComboDirty() )
@@ -1094,6 +1116,7 @@ bool idle_startup()
 		LL_DEBUGS("AppInit") << "STATE_LOGIN_PROCESS_RESPONSE" << LL_ENDL;
 		std::ostringstream emsg;
 		bool quit = false;
+		bool update = false;
 		std::string login_response;
 		std::string reason_response;
 		std::string message_response;
@@ -1137,11 +1160,7 @@ bool idle_startup()
 				reason_response = LLUserAuth::getInstance()->getResponse("reason");
 				message_response = LLUserAuth::getInstance()->getResponse("message");
 
-				if (gHideLinks && reason_response == "disabled")
-				{
-					emsg << gDisabledMessage;
-				}
-				else if (!message_response.empty())
+				if (!message_response.empty())
 				{
 					// XUI: fix translation for strings returned during login
 					// We need a generic table for translations
@@ -1199,16 +1218,7 @@ bool idle_startup()
 				if(reason_response == "update")
 				{
 					auth_message = LLUserAuth::getInstance()->getResponse("message");
-					if (show_connect_box)
-					{
-						update_app(TRUE, auth_message);
-						LLStartUp::setStartupState( STATE_UPDATE_CHECK );
-						return false;
-					}
-					else
-					{
-						quit = true;
-					}
+					update = true;
 				}
 				if(reason_response == "optional")
 				{
@@ -1246,6 +1256,21 @@ bool idle_startup()
 			break;
 		}
 
+		if (update || gSavedSettings.getBOOL("ForceMandatoryUpdate"))
+		{
+			gSavedSettings.setBOOL("ForceMandatoryUpdate", FALSE);
+			if (show_connect_box)
+			{
+				update_app(TRUE, auth_message);
+				LLStartUp::setStartupState( STATE_UPDATE_CHECK );
+				return false;
+			}
+			else
+			{
+				quit = true;
+			}
+		}
+
 		// Version update and we're not showing the dialog
 		if(quit)
 		{
@@ -1256,8 +1281,14 @@ bool idle_startup()
 
 		if(successful_login)
 		{
-			// unpack login data needed by the application
 			std::string text;
+			text = LLUserAuth::getInstance()->getResponse("udp_blacklist");
+			if(!text.empty())
+			{
+				apply_udp_blacklist(text);
+			}
+
+			// unpack login data needed by the application
 			text = LLUserAuth::getInstance()->getResponse("agent_id");
 			if(!text.empty()) gAgentID.set(text);
 			gDebugInfo["AgentID"] = text;
@@ -1630,6 +1661,11 @@ bool idle_startup()
 			LLFloaterActiveSpeakers::showInstance();
 		}
 
+		if (gSavedSettings.getBOOL("BeaconAlwaysOn"))
+		{
+			LLFloaterBeacons::showInstance();
+		}
+
 		if (!gNoRender)
 		{
 			// Move the progress view in front of the UI
@@ -2251,6 +2287,9 @@ bool idle_startup()
 			}
 		}
 
+        //DEV-17797.  get null folder.  Any items found here moved to Lost and Found
+        LLInventoryModel::findLostItems();
+
 		LLStartUp::setStartupState( STATE_PRECACHE );
 		timeout.reset();
 		return FALSE;
@@ -2428,7 +2467,7 @@ bool idle_startup()
 		gDebugView->mFastTimerView->setVisible(TRUE);
 #endif
 
-		LLAppViewer::instance()->initMainloopTimeout("Mainloop Init");
+		LLAppViewer::instance()->handleLoginComplete();
 
 		return TRUE;
 	}
@@ -2744,7 +2783,6 @@ void update_app(BOOL mandatory, const std::string& auth_msg)
 
 void update_dialog_callback(S32 option, void *userdata)
 {
-	std::string update_exe_path;
 	bool mandatory = userdata != NULL;
 
 #if !LL_RELEASE_FOR_DOWNLOAD
@@ -2787,29 +2825,41 @@ void update_dialog_callback(S32 option, void *userdata)
 	// *TODO constantize this guy
 	LLURI update_url = LLURI::buildHTTP("secondlife.com", 80, "update.php", query_map);
 	
+	if(LLAppViewer::sUpdaterInfo)
+	{
+		delete LLAppViewer::sUpdaterInfo ;
+	}
+	LLAppViewer::sUpdaterInfo = new LLAppViewer::LLUpdaterInfo() ;
+	
 #if LL_WINDOWS
-	update_exe_path = gDirUtilp->getTempFilename();
-	if (update_exe_path.empty())
+	LLAppViewer::sUpdaterInfo->mUpdateExePath = gDirUtilp->getTempFilename();
+	if (LLAppViewer::sUpdaterInfo->mUpdateExePath.empty())
 	{
+		delete LLAppViewer::sUpdaterInfo ;
+		LLAppViewer::sUpdaterInfo = NULL ;
+
 		// We're hosed, bail
 		LL_WARNS("AppInit") << "LLDir::getTempFilename() failed" << LL_ENDL;
 		LLAppViewer::instance()->forceQuit();
 		return;
 	}
 
-	update_exe_path += ".exe";
+	LLAppViewer::sUpdaterInfo->mUpdateExePath += ".exe";
 
 	std::string updater_source = gDirUtilp->getAppRODataDir();
 	updater_source += gDirUtilp->getDirDelimiter();
 	updater_source += "updater.exe";
 
 	LL_DEBUGS("AppInit") << "Calling CopyFile source: " << updater_source
-			<< " dest: " << update_exe_path
+			<< " dest: " << LLAppViewer::sUpdaterInfo->mUpdateExePath
 			<< LL_ENDL;
 
 
-	if (!CopyFileA(updater_source.c_str(), update_exe_path.c_str(), FALSE))
+	if (!CopyFileA(updater_source.c_str(), LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str(), FALSE))
 	{
+		delete LLAppViewer::sUpdaterInfo ;
+		LLAppViewer::sUpdaterInfo = NULL ;
+
 		LL_WARNS("AppInit") << "Unable to copy the updater!" << LL_ENDL;
 		LLAppViewer::instance()->forceQuit();
 		return;
@@ -2822,41 +2872,13 @@ void update_dialog_callback(S32 option, void *userdata)
 		gSavedSettings.setString( "NextLoginLocation", LLURLSimString::sInstance.mSimString ); 
 	};
 
-	std::ostringstream params;
-	params << "-url \"" << update_url.asString() << "\"";
-	if (gHideLinks)
-	{
-		// Figure out the program name.
-		const std::string& data_dir = gDirUtilp->getAppRODataDir();
-		// Roll back from the end, stopping at the first '\'
-		const char* program_name = data_dir.c_str() + data_dir.size();		/* Flawfinder: ignore */
-		while ( (data_dir != --program_name) &&
-				*(program_name) != '\\');
-		
-		if ( *(program_name) == '\\')
-		{
-			// We found a '\'.
-			program_name++;
-		}
-		else
-		{
-			// Oops.
-			program_name = "SecondLife";
-		}
+	LLAppViewer::sUpdaterInfo->mParams << "-url \"" << update_url.asString() << "\"";
 
-		params << " -silent -name \"" << LLAppViewer::instance()->getSecondLifeTitle() << "\"";
-		params << " -program \"" << program_name << "\"";
-	}
-
-	LL_DEBUGS("AppInit") << "Calling updater: " << update_exe_path << " " << params.str() << LL_ENDL;
+	LL_DEBUGS("AppInit") << "Calling updater: " << LLAppViewer::sUpdaterInfo->mUpdateExePath << " " << LLAppViewer::sUpdaterInfo->mParams.str() << LL_ENDL;
 
 	//Explicitly remove the marker file, otherwise we pass the lock onto the child process and things get weird.
 	LLAppViewer::instance()->removeMarkerFile(); // In case updater fails
 	
-	// Use spawn() to run asynchronously
-	int retval = _spawnl(_P_NOWAIT, update_exe_path.c_str(), update_exe_path.c_str(), params.str().c_str(), NULL);
-	LL_DEBUGS("AppInit") << "Spawn returned " << retval << LL_ENDL;
-
 #elif LL_DARWIN
 	// if a sim name was passed in via command line parameter (typically through a SLURL)
 	if ( LLURLSimString::sInstance.mSimString.length() )
@@ -2865,18 +2887,15 @@ void update_dialog_callback(S32 option, void *userdata)
 		gSavedSettings.setString( "NextLoginLocation", LLURLSimString::sInstance.mSimString ); 
 	};
 	
-	update_exe_path = "'";
-	update_exe_path += gDirUtilp->getAppRODataDir();
-	update_exe_path += "/mac-updater.app/Contents/MacOS/mac-updater' -url \"";
-	update_exe_path += update_url.asString();
-	update_exe_path += "\" -name \"";
-	update_exe_path += LLAppViewer::instance()->getSecondLifeTitle();
-	update_exe_path += "\" &";
-
-	LL_DEBUGS("AppInit") << "Calling updater: " << update_exe_path << LL_ENDL;
-	
-	// Run the auto-updater.
-	system(update_exe_path.c_str());		/* Flawfinder: ignore */
+	LLAppViewer::sUpdaterInfo->mUpdateExePath = "'";
+	LLAppViewer::sUpdaterInfo->mUpdateExePath += gDirUtilp->getAppRODataDir();
+	LLAppViewer::sUpdaterInfo->mUpdateExePath += "/mac-updater.app/Contents/MacOS/mac-updater' -url \"";
+	LLAppViewer::sUpdaterInfo->mUpdateExePath += update_url.asString();
+	LLAppViewer::sUpdaterInfo->mUpdateExePath += "\" -name \"";
+	LLAppViewer::sUpdaterInfo->mUpdateExePath += LLAppViewer::instance()->getSecondLifeTitle();
+	LLAppViewer::sUpdaterInfo->mUpdateExePath += "\" &";
+
+	LL_DEBUGS("AppInit") << "Calling updater: " << LLAppViewer::sUpdaterInfo->mUpdateExePath << LL_ENDL;
 	
 #elif LL_LINUX
 	OSMessageBox("Automatic updating is not yet implemented for Linux.\n"
@@ -3533,7 +3552,7 @@ void init_stat_view()
 	stat_barp->mDisplayBar = FALSE;
 	stat_barp->mDisplayMean = FALSE;
 
-	stat_barp = sim_time_viewp->addStat("Sim Time (Physics)", &(LLViewerStats::getInstance()->mSimSimPhysicsMsec));
+	stat_barp = sim_time_viewp->addStat("Physics Time", &(LLViewerStats::getInstance()->mSimSimPhysicsMsec));
 	stat_barp->setUnitLabel("ms");
 	stat_barp->mPrecision = 1;
 	stat_barp->mMinBar = 0.f;
@@ -3544,45 +3563,7 @@ void init_stat_view()
 	stat_barp->mDisplayBar = FALSE;
 	stat_barp->mDisplayMean = FALSE;
 
-	LLStatView *physics_time_viewp;
-	physics_time_viewp = new LLStatView("physics perf view", "Physics Details (ms)", "", rect);
-	sim_time_viewp->addChildAtEnd(physics_time_viewp);
-	{
-		stat_barp = physics_time_viewp->addStat("Physics Step", &(LLViewerStats::getInstance()->mSimSimPhysicsStepMsec));
-		stat_barp->setUnitLabel("ms");
-		stat_barp->mPrecision = 1;
-		stat_barp->mMinBar = 0.f;
-		stat_barp->mMaxBar = 40.f;
-		stat_barp->mTickSpacing = 10.f;
-		stat_barp->mLabelSpacing = 20.f;
-		stat_barp->mPerSec = FALSE;
-		stat_barp->mDisplayBar = FALSE;
-		stat_barp->mDisplayMean = FALSE;
-
-		stat_barp = physics_time_viewp->addStat("Update Shapes", &(LLViewerStats::getInstance()->mSimSimPhysicsShapeUpdateMsec));
-		stat_barp->setUnitLabel("ms");
-		stat_barp->mPrecision = 1;
-		stat_barp->mMinBar = 0.f;
-		stat_barp->mMaxBar = 40.f;
-		stat_barp->mTickSpacing = 10.f;
-		stat_barp->mLabelSpacing = 20.f;
-		stat_barp->mPerSec = FALSE;
-		stat_barp->mDisplayBar = FALSE;
-		stat_barp->mDisplayMean = FALSE;
-
-		stat_barp = physics_time_viewp->addStat("Other", &(LLViewerStats::getInstance()->mSimSimPhysicsOtherMsec));
-		stat_barp->setUnitLabel("ms");
-		stat_barp->mPrecision = 1;
-		stat_barp->mMinBar = 0.f;
-		stat_barp->mMaxBar = 40.f;
-		stat_barp->mTickSpacing = 10.f;
-		stat_barp->mLabelSpacing = 20.f;
-		stat_barp->mPerSec = FALSE;
-		stat_barp->mDisplayBar = FALSE;
-		stat_barp->mDisplayMean = FALSE;
-	}
-
-	stat_barp = sim_time_viewp->addStat("Sim Time (Other)", &(LLViewerStats::getInstance()->mSimSimOtherMsec));
+	stat_barp = sim_time_viewp->addStat("Simulation Time", &(LLViewerStats::getInstance()->mSimSimOtherMsec));
 	stat_barp->setUnitLabel("ms");
 	stat_barp->mPrecision = 1;
 	stat_barp->mMinBar = 0.f;
@@ -3626,6 +3607,79 @@ void init_stat_view()
 	stat_barp->mDisplayBar = FALSE;
 	stat_barp->mDisplayMean = FALSE;
 
+	stat_barp = sim_time_viewp->addStat("Spare Time", &(LLViewerStats::getInstance()->mSimSpareMsec));
+	stat_barp->setUnitLabel("ms");
+	stat_barp->mPrecision = 1;
+	stat_barp->mMinBar = 0.f;
+	stat_barp->mMaxBar = 40.f;
+	stat_barp->mTickSpacing = 10.f;
+	stat_barp->mLabelSpacing = 20.f;
+	stat_barp->mPerSec = FALSE;
+	stat_barp->mDisplayBar = FALSE;
+	stat_barp->mDisplayMean = FALSE;
+
+	
+	// 2nd level time blocks under 'Details' second
+	LLStatView *detailed_time_viewp;
+	detailed_time_viewp = new LLStatView("sim perf view", "Time Details (ms)", "", rect);
+	sim_time_viewp->addChildAtEnd(detailed_time_viewp);
+	{
+		stat_barp = detailed_time_viewp->addStat("  Physics Step", &(LLViewerStats::getInstance()->mSimSimPhysicsStepMsec));
+		stat_barp->setUnitLabel("ms");
+		stat_barp->mPrecision = 1;
+		stat_barp->mMinBar = 0.f;
+		stat_barp->mMaxBar = 40.f;
+		stat_barp->mTickSpacing = 10.f;
+		stat_barp->mLabelSpacing = 20.f;
+		stat_barp->mPerSec = FALSE;
+		stat_barp->mDisplayBar = FALSE;
+		stat_barp->mDisplayMean = FALSE;
+
+		stat_barp = detailed_time_viewp->addStat("  Update Physics Shapes", &(LLViewerStats::getInstance()->mSimSimPhysicsShapeUpdateMsec));
+		stat_barp->setUnitLabel("ms");
+		stat_barp->mPrecision = 1;
+		stat_barp->mMinBar = 0.f;
+		stat_barp->mMaxBar = 40.f;
+		stat_barp->mTickSpacing = 10.f;
+		stat_barp->mLabelSpacing = 20.f;
+		stat_barp->mPerSec = FALSE;
+		stat_barp->mDisplayBar = FALSE;
+		stat_barp->mDisplayMean = FALSE;
+
+		stat_barp = detailed_time_viewp->addStat("  Physics Other", &(LLViewerStats::getInstance()->mSimSimPhysicsOtherMsec));
+		stat_barp->setUnitLabel("ms");
+		stat_barp->mPrecision = 1;
+		stat_barp->mMinBar = 0.f;
+		stat_barp->mMaxBar = 40.f;
+		stat_barp->mTickSpacing = 10.f;
+		stat_barp->mLabelSpacing = 20.f;
+		stat_barp->mPerSec = FALSE;
+		stat_barp->mDisplayBar = FALSE;
+		stat_barp->mDisplayMean = FALSE;
+
+		stat_barp = detailed_time_viewp->addStat("  Sleep Time", &(LLViewerStats::getInstance()->mSimSleepMsec));
+		stat_barp->setUnitLabel("ms");
+		stat_barp->mPrecision = 1;
+		stat_barp->mMinBar = 0.f;
+		stat_barp->mMaxBar = 40.f;
+		stat_barp->mTickSpacing = 10.f;
+		stat_barp->mLabelSpacing = 20.f;
+		stat_barp->mPerSec = FALSE;
+		stat_barp->mDisplayBar = FALSE;
+		stat_barp->mDisplayMean = FALSE;
+
+		stat_barp = detailed_time_viewp->addStat("  Pump IO", &(LLViewerStats::getInstance()->mSimPumpIOMsec));
+		stat_barp->setUnitLabel("ms");
+		stat_barp->mPrecision = 1;
+		stat_barp->mMinBar = 0.f;
+		stat_barp->mMaxBar = 40.f;
+		stat_barp->mTickSpacing = 10.f;
+		stat_barp->mLabelSpacing = 20.f;
+		stat_barp->mPerSec = FALSE;
+		stat_barp->mDisplayBar = FALSE;
+		stat_barp->mDisplayMean = FALSE;
+	}
+
 	LLRect r = gDebugView->mFloaterStatsp->getRect();
 
 	// Reshape based on the parameters we set.
@@ -3887,3 +3941,28 @@ void login_alert_done(S32 option, void* user_data)
 	LLPanelLogin::giveFocus();
 }
 
+
+void apply_udp_blacklist(const std::string& csv)
+{
+
+	std::string::size_type start = 0;
+	std::string::size_type comma = 0;
+	do 
+	{
+		comma = csv.find(",", start);
+		if (comma == std::string::npos)
+		{
+			comma = csv.length();
+		}
+		std::string item(csv, start, comma-start);
+
+		lldebugs << "udp_blacklist " << item << llendl;
+		gMessageSystem->banUdpMessage(item);
+		
+		start = comma + 1;
+
+	}
+	while(comma < csv.length());
+	
+}
+
diff --git a/indra/newview/llstatbar.cpp b/indra/newview/llstatbar.cpp
index 19a9442..d88e89f 100644
--- a/indra/newview/llstatbar.cpp
+++ b/indra/newview/llstatbar.cpp
@@ -166,7 +166,7 @@ void LLStatBar::draw()
 		bottom = bar_top - bar_height - tick_height/2;
 
 		LLGLSUIDefault gls_ui;
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		for (tick_value = mMinBar; tick_value <= mMaxBar; tick_value += mTickSpacing)
 		{
 			left = llfloor((tick_value - mMinBar)*value_scale);
diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp
index 017517c..b046f97 100644
--- a/indra/newview/llsurface.cpp
+++ b/indra/newview/llsurface.cpp
@@ -33,6 +33,8 @@
 
 #include "llsurface.h"
 
+#include "llrender.h"
+
 #include "llviewerimagelist.h"
 #include "llpatchvertexarray.h"
 #include "patch_dct.h"
@@ -249,7 +251,7 @@ void LLSurface::createSTexture()
 
 		mSTexturep = new LLViewerImage(raw, FALSE);
 		mSTexturep->dontDiscard();
-		mSTexturep->bind();
+		gGL.getTexUnit(0)->bind(mSTexturep.get());
 		mSTexturep->setClamp(TRUE, TRUE);
 		gImageList.addImage(mSTexturep);
 	}
@@ -274,7 +276,7 @@ void LLSurface::createWaterTexture()
 		}
 		mWaterTexturep = new LLViewerImage(raw, FALSE);
 		mWaterTexturep->dontDiscard();
-		mWaterTexturep->bind();
+		gGL.getTexUnit(0)->bind(mWaterTexturep.get());
 		mWaterTexturep->setClamp(TRUE, TRUE);
 		gImageList.addImage(mWaterTexturep);
 	}
diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp
index e331146..a687344 100644
--- a/indra/newview/lltexlayer.cpp
+++ b/indra/newview/lltexlayer.cpp
@@ -60,8 +60,6 @@
 // SJB: We really always want to use the GL cache;
 // let GL page textures in and out of video RAM instead of trying to do so by hand.
 
-LLGradientPaletteList gGradientPaletteList;
-
 // static
 S32 LLTexLayerSetBuffer::sGLByteCount = 0;
 S32 LLTexLayerSetBuffer::sGLBumpByteCount = 0;
@@ -96,7 +94,6 @@ LLTexLayerSetBuffer::LLTexLayerSetBuffer( LLTexLayerSet* owner, S32 width, S32 h
 	mNeedsUpload( FALSE ),
 	mUploadPending( FALSE ), // Not used for any logic here, just to sync sending of updates
 	mTexLayerSet( owner ),
-	mInitialized( FALSE ),
 	mBumpTexName(0)
 {
 	LLTexLayerSetBuffer::sGLByteCount += getSize();
@@ -106,11 +103,10 @@ LLTexLayerSetBuffer::LLTexLayerSetBuffer( LLTexLayerSet* owner, S32 width, S32 h
 		LLGLSUIDefault gls_ui;
 		glGenTextures(1, (GLuint*) &mBumpTexName);
 
-		LLImageGL::bindExternalTexture(mBumpTexName, 0, GL_TEXTURE_2D); 
+		gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mBumpTexName);
 		stop_glerror();
 
-		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+		gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
 
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
@@ -118,7 +114,7 @@ LLTexLayerSetBuffer::LLTexLayerSetBuffer( LLTexLayerSet* owner, S32 width, S32 h
 		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
 		stop_glerror();
 
-		LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 		LLImageGL::sGlobalTextureMemory += mWidth * mHeight * 4;
 		LLTexLayerSetBuffer::sGLBumpByteCount += mWidth * mHeight * 4;
@@ -259,7 +255,7 @@ BOOL LLTexLayerSetBuffer::render()
 			LLGLSUIDefault gls_ui;
 
 			// read back into texture (this is done externally for the color data)
-			LLImageGL::bindExternalTexture( mBumpTexName, 0, GL_TEXTURE_2D ); 
+			gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mBumpTexName);
 			stop_glerror();
 
 			glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, mOrigin.mX, mOrigin.mY, mWidth, mHeight);
@@ -299,12 +295,17 @@ BOOL LLTexLayerSetBuffer::render()
 	gGL.setSceneBlendType(LLRender::BT_ALPHA);
 
 	// we have valid texture data now
-	mInitialized = TRUE;
+	mTexture->setInitialized(true);
 	mNeedsUpdate = FALSE;
 
 	return success;
 }
 
+bool LLTexLayerSetBuffer::isInitialized(void) const
+{
+	return mTexture->isInitialized();
+}
+
 BOOL LLTexLayerSetBuffer::updateImmediate()
 {
 	mNeedsUpdate = TRUE;
@@ -551,24 +552,12 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, void* user
 	delete baked_upload_data;
 }
 
-
-void LLTexLayerSetBuffer::bindTexture()
-{
-	if( mInitialized )
-	{
-		LLDynamicTexture::bindTexture();
-	}
-	else
-	{
-		gImageList.getImage(IMG_DEFAULT)->bind();
-	}
-}
-
 void LLTexLayerSetBuffer::bindBumpTexture( U32 stage )
 {
 	if( mBumpTexName ) 
 	{
-		LLImageGL::bindExternalTexture(mBumpTexName, stage, GL_TEXTURE_2D); 
+		gGL.getTexUnit(stage)->bindManual(LLTexUnit::TT_TEXTURE, mBumpTexName);
+		gGL.getTexUnit(0)->activate();
 	
 		if( mLastBindTime != LLImageGL::sLastFrameTime )
 		{
@@ -578,7 +567,8 @@ void LLTexLayerSetBuffer::bindBumpTexture( U32 stage )
 	}
 	else
 	{
-		LLImageGL::unbindTexture(stage, GL_TEXTURE_2D);
+		gGL.getTexUnit(stage)->unbind(LLTexUnit::TT_TEXTURE);
+		gGL.getTexUnit(0)->activate();
 	}
 }
 
@@ -786,7 +776,7 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
 			if( image_gl )
 			{
 				LLGLSUIDefault gls_ui;
-				image_gl->bind();
+				gGL.getTexUnit(0)->bind(image_gl);
 				gl_rect_2d_simple_tex( width, height );
 			}
 			else
@@ -794,7 +784,7 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
 				success = FALSE;
 			}
 		}
-		LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 		gGL.flush();
 		gGL.setColorMask(true, true);
@@ -804,7 +794,8 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
 	if( getInfo()->mClearAlpha )
 	{
 		// Set the alpha channel to one (clean up after previous blending)
-		LLGLSNoTextureNoAlphaTest gls_no_alpha;
+		LLGLDisable no_alpha(GL_ALPHA_TEST);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gGL.color4f( 0.f, 0.f, 0.f, 1.f );
 		gGL.flush();
 		gGL.setColorMask(false, true);
@@ -838,7 +829,8 @@ BOOL LLTexLayerSet::renderBump( S32 x, S32 y, S32 width, S32 height )
 	}
 
 	// Set the alpha channel to one (clean up after previous blending)
-	LLGLSNoTextureNoAlphaTest gls_no_texture_no_alpha;
+	LLGLDisable no_alpha(GL_ALPHA_TEST);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	gGL.color4f( 0.f, 0.f, 0.f, 1.f );
 	gGL.setColorMask(false, true);
 
@@ -1358,13 +1350,13 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height )
 					BOOL old_clamps = image_gl->getClampS();
 					BOOL old_clampt = image_gl->getClampT();
 					
-					image_gl->bind();
+					gGL.getTexUnit(0)->bind(image_gl);
 					image_gl->setClamp(TRUE, TRUE);
 
 					gl_rect_2d_simple_tex( width, height );
 
 					image_gl->setClamp(old_clamps, old_clampt);
-					image_gl->unbindTexture(0, GL_TEXTURE_2D);
+					gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 				}
 			}
 			else
@@ -1380,9 +1372,9 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height )
 			LLImageGL* image_gl = gTexStaticImageList.getImageGL( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask );
 			if( image_gl )
 			{
-				image_gl->bind();
+				gGL.getTexUnit(0)->bind(image_gl);
 				gl_rect_2d_simple_tex( width, height );
-				image_gl->unbindTexture(0, GL_TEXTURE_2D);
+				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			}
 			else
 			{
@@ -1396,7 +1388,8 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height )
 		getInfo()->mStaticImageFileName.empty() &&
 		color_specified )
 	{
-		LLGLSNoTextureNoAlphaTest gls;
+		LLGLDisable no_alpha(GL_ALPHA_TEST);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gGL.color4fv( net_color.mV);
 		gl_rect_2d_simple( width, height );
 	}
@@ -1518,7 +1511,8 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4
 	// Note: if the first param is a mulitply, multiply against the current buffer's alpha
 	if( !first_param || !first_param->getMultiplyBlend() )
 	{
-		LLGLSNoTextureNoAlphaTest gls_no_texture_no_alpha_test;
+		LLGLDisable no_alpha(GL_ALPHA_TEST);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	
 		// Clear the alpha
 		gGL.flush();
@@ -1555,13 +1549,13 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4
 
 					BOOL old_clamps = image_gl->getClampS();
 					BOOL old_clampt = image_gl->getClampT();					
-					image_gl->bind();
+					gGL.getTexUnit(0)->bind(image_gl);
 					image_gl->setClamp(TRUE, TRUE);
 
 					gl_rect_2d_simple_tex( width, height );
 
 					image_gl->setClamp(old_clamps, old_clampt);
-					image_gl->unbindTexture(0, GL_TEXTURE_2D);
+					gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 				}
 			}
 			else
@@ -1581,9 +1575,9 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4
 					( (image_gl->getComponents() == 1) && getInfo()->mStaticImageIsMask ) )
 				{
 					LLGLSNoAlphaTest gls_no_alpha_test;
-					image_gl->bind();
+					gGL.getTexUnit(0)->bind(image_gl);
 					gl_rect_2d_simple_tex( width, height );
-					image_gl->unbindTexture(0, GL_TEXTURE_2D);
+					gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 				}
 			}
 			else
@@ -1597,7 +1591,8 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4
 	// Note: we're still using gGL.blendFunc( GL_DST_ALPHA, GL_ZERO );
 	if( colorp->mV[VW] != 1.f )
 	{
-		LLGLSNoTextureNoAlphaTest gls_no_texture_no_alpha_test;
+		LLGLDisable no_alpha(GL_ALPHA_TEST);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gGL.color4fv( colorp->mV );
 		gl_rect_2d_simple( width, height );
 	}
@@ -1700,7 +1695,7 @@ BOOL LLTexLayer::renderImageRaw( U8* in_data, S32 in_width, S32 in_height, S32 i
 		glGenTextures(1, &name );
 		stop_glerror();
 
-		LLImageGL::bindExternalTexture( name, 0, GL_TEXTURE_2D ); 
+		gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, name);
 		stop_glerror();
 
 		glTexImage2D(
@@ -1712,12 +1707,11 @@ BOOL LLTexLayer::renderImageRaw( U8* in_data, S32 in_width, S32 in_height, S32 i
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 		
-		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+		gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
 
 		gl_rect_2d_simple_tex( width, height );
 
-		LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 		glDeleteTextures(1, &name );
 		stop_glerror();
@@ -1736,7 +1730,7 @@ BOOL LLTexLayer::renderImageRaw( U8* in_data, S32 in_width, S32 in_height, S32 i
 
 		gl_rect_2d_simple_tex( width, height );
 
-		LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	}
 
 	return TRUE;
@@ -1800,8 +1794,6 @@ BOOL LLTexLayerParamAlphaInfo::parseXml(LLXmlTreeNode* node)
 	static LLStdStringHandle domain_string = LLXmlTree::addAttributeString("domain");
 	param_alpha_node->getFastAttributeF32( domain_string, mDomain );
 
-	gGradientPaletteList.initPalette(mDomain);
-
 	return TRUE;
 }
 
@@ -1996,7 +1988,7 @@ BOOL LLTexLayerParamAlpha::render( S32 x, S32 y, S32 width, S32 height )
 		if(	!mCachedProcessedImageGL ||
 			(mCachedProcessedImageGL->getWidth() != image_tga_width) ||
 			(mCachedProcessedImageGL->getHeight() != image_tga_height) ||
-			(weight_changed && !(gGLManager.mHasPalettedTextures && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_PALETTE))) )
+			(weight_changed ))
 		{
 //			llinfos << "Building Cached Alpha: " << mName << ": (" << mStaticImageRaw->getWidth() << ", " << mStaticImageRaw->getHeight() << ") " << effective_weight << llendl;
 			mCachedEffectiveWeight = effective_weight;
@@ -2008,71 +2000,34 @@ BOOL LLTexLayerParamAlpha::render( S32 x, S32 y, S32 width, S32 height )
 				// We now have something in one of our caches
 				LLTexLayerSet::sHasCaches |= mCachedProcessedImageGL ? TRUE : FALSE;
 
-				if (gGLManager.mHasPalettedTextures && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_PALETTE))
-				{
-					// interpret luminance values as color index table
-					mCachedProcessedImageGL->setExplicitFormat( GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX ); 
-				}
-				else
-				{
-					mCachedProcessedImageGL->setExplicitFormat( GL_ALPHA8, GL_ALPHA );
-				}
+
+				mCachedProcessedImageGL->setExplicitFormat( GL_ALPHA8, GL_ALPHA );
 			}
 
 			// Applies domain and effective weight to data as it is decoded. Also resizes the raw image if needed.
-			if (gGLManager.mHasPalettedTextures && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_PALETTE))
-			{
-				mStaticImageRaw = NULL;
-				mStaticImageRaw = new LLImageRaw;
-				mStaticImageTGA->decode(mStaticImageRaw);
-				mNeedsCreateTexture = TRUE;
-			}
-			else
-			{
-				mStaticImageRaw = NULL;
-				mStaticImageRaw = new LLImageRaw;
-				mStaticImageTGA->decodeAndProcess( mStaticImageRaw, getInfo()->mDomain, effective_weight );
-				mNeedsCreateTexture = TRUE;
-			}
+			mStaticImageRaw = NULL;
+			mStaticImageRaw = new LLImageRaw;
+			mStaticImageTGA->decodeAndProcess( mStaticImageRaw, getInfo()->mDomain, effective_weight );
+			mNeedsCreateTexture = TRUE;
 		}
 
 		if( mCachedProcessedImageGL )
 		{
 			{
-				if (gGLManager.mHasPalettedTextures && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_PALETTE))
-				{
-					if( mNeedsCreateTexture )
-					{
-						mCachedProcessedImageGL->createGLTexture(0, mStaticImageRaw);
-						mNeedsCreateTexture = FALSE;
-						
-						mCachedProcessedImageGL->bind();
-						mCachedProcessedImageGL->setClamp(TRUE, TRUE);
-					}
-
-					LLGLSNoAlphaTest gls_no_alpha_test;
-					mCachedProcessedImageGL->bind();
-					gGradientPaletteList.setHardwarePalette( getInfo()->mDomain, effective_weight );
-					gl_rect_2d_simple_tex( width, height );
-					mCachedProcessedImageGL->unbindTexture(0, GL_TEXTURE_2D);
-				}
-				else
+				// Create the GL texture, and then hang onto it for future use.
+				if( mNeedsCreateTexture )
 				{
-					// Create the GL texture, and then hang onto it for future use.
-					if( mNeedsCreateTexture )
-					{
-						mCachedProcessedImageGL->createGLTexture(0, mStaticImageRaw);
-						mNeedsCreateTexture = FALSE;
-						
-						mCachedProcessedImageGL->bind();
-						mCachedProcessedImageGL->setClamp(TRUE, TRUE);
-					}
-				
-					LLGLSNoAlphaTest gls_no_alpha_test;
-					mCachedProcessedImageGL->bind();
-					gl_rect_2d_simple_tex( width, height );
-					mCachedProcessedImageGL->unbindTexture(0, GL_TEXTURE_2D);
+					mCachedProcessedImageGL->createGLTexture(0, mStaticImageRaw);
+					mNeedsCreateTexture = FALSE;
+					
+					gGL.getTexUnit(0)->bind(mCachedProcessedImageGL);
+					mCachedProcessedImageGL->setClamp(TRUE, TRUE);
 				}
+
+				LLGLSNoAlphaTest gls_no_alpha_test;
+				gGL.getTexUnit(0)->bind(mCachedProcessedImageGL);
+				gl_rect_2d_simple_tex( width, height );
+				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 				stop_glerror();
 			}
 		}
@@ -2086,7 +2041,8 @@ BOOL LLTexLayerParamAlpha::render( S32 x, S32 y, S32 width, S32 height )
 	}
 	else
 	{
-		LLGLSNoTextureNoAlphaTest gls_no_texture_no_alpha_test;
+		LLGLDisable no_alpha(GL_ALPHA_TEST);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gGL.color4f( 0.f, 0.f, 0.f, effective_weight );
 		gl_rect_2d_simple( width, height );
 	}
@@ -2519,7 +2475,7 @@ LLImageGL* LLTexStaticImageList::getImageGL(const std::string& file_name, BOOL i
 			}
 			image_gl->createGLTexture(0, image_raw);
 
-			image_gl->bind();
+			gGL.getTexUnit(0)->bind(image_gl);
 			image_gl->setClamp(TRUE, TRUE);
 
 			mStaticImageListGL [ namekey ] = image_gl;
@@ -2559,68 +2515,3 @@ LLMaskedMorph::LLMaskedMorph( LLPolyMorphTarget *morph_target, BOOL invert ) : m
 	morph_target->addPendingMorphMask();
 }
 
-
-//-----------------------------------------------------------------------------
-// LLGradientPaletteList
-//-----------------------------------------------------------------------------
-
-LLGradientPaletteList::~LLGradientPaletteList()
-{
-	// Note: can't just call deleteAllData() because the data values are arrays.
-	for( palette_map_t::iterator iter = mPaletteMap.begin();
-		 iter != mPaletteMap.end(); iter++ )
-	{
-		U8* data = iter->second;
-		delete []data;
-	}
-}
-
-void LLGradientPaletteList::initPalette(F32 domain)
-{
-	palette_map_t::iterator iter = mPaletteMap.find( domain );
-	if( iter == mPaletteMap.end() )
-	{
-		U8 *palette = new U8[512 * 4];
-		mPaletteMap[domain] = palette;
-		S32 ramp_start = 255 - llfloor(domain * 255.f);
-		S32 ramp_end = 255;
-		F32 ramp_factor = (ramp_end == ramp_start) ? 0.f : (255.f / ((F32)ramp_end - (F32)ramp_start));
-
-		// *TODO: move conditionals outside of loop, since this really
-		// is just a sequential process.
-		for (S32 i = 0; i < 512; i++)
-		{
-			palette[(i * 4) + 1] = 0;
-			palette[(i * 4) + 2] = 0;
-			if (i <= ramp_start)
-			{
-				palette[(i * 4)] = 0;
-				palette[(i * 4) + 3] = 0;
-			}
-			else if (i < ramp_end)
-			{
-				palette[(i * 4)] = llfloor(((F32)i - (F32)ramp_start) * ramp_factor);
-				palette[(i * 4) + 3] = llfloor(((F32)i - (F32)ramp_start) * ramp_factor);
-			}
-			else
-			{
-				palette[(i * 4)] = 255;
-				palette[(i * 4) + 3] = 255;
-			}
-		}
-	}
-}
-
-void LLGradientPaletteList::setHardwarePalette( F32 domain, F32 effective_weight )
-{
-	palette_map_t::iterator iter = mPaletteMap.find( domain );
-	if( iter != mPaletteMap.end() )
-	{
-		U8* palette = iter->second;
-		set_palette( palette + llfloor(effective_weight * (255.f * (1.f - domain))) * 4);
-	}
-	else
-	{
-		llwarns << "LLGradientPaletteList::setHardwarePalette() missing domain " << domain << llendl;
-	}
-}
diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h
index 742b484..bd59c66 100644
--- a/indra/newview/lltexlayer.h
+++ b/indra/newview/lltexlayer.h
@@ -211,9 +211,8 @@ public:
 	virtual void			postRender(BOOL success);
 	virtual BOOL			render();
 	BOOL					updateImmediate();
-	virtual void			bindTexture();
 	void					bindBumpTexture( U32 stage );
-	BOOL					isInitialized()							{ return mInitialized; }  // Initialized here means that we've done at least one render
+	bool					isInitialized(void) const;
 	BOOL					needsRender();
 	void					requestUpdate();
 	void					requestUpload();
@@ -236,7 +235,6 @@ private:
 	BOOL					mUploadPending;
 	LLUUID					mUploadID;		// Identifys the current upload process (null if none).  Used to avoid overlaps (eg, when the user rapidly makes two changes outside of Face Edit)
 	LLTexLayerSet*			mTexLayerSet;
-	BOOL					mInitialized;
 	LLGLuint				mBumpTexName;	// zero if none
 
 	static S32				sGLByteCount;
@@ -529,41 +527,6 @@ public:
 };
 
 
-//-----------------------------------------------------------------------------
-// LLGradientPaletteList
-// A static set of ramp grayscale palettes.  The "effective_weight" is used 
-// to determine the x position of the ramp (offset)
-//
-// "Domain" isn't really the right word.  It refers to the width of the 
-// ramp portion of the function that relates input and output pixel values.
-// A domain of 0 gives a step function.
-// 
-//   |                      /----------------
-//  O|                     / |
-//  u|                    /  |
-//  t|                   /   |
-//  p|------------------/    |
-//  u|                  |    | 
-//  t|<---------------->|<-->|
-//   |  "offset"         "domain"
-//   |
-// --+---Input--------------------------------
-//   |
-//-----------------------------------------------------------------------------
-class LLGradientPaletteList
-{
-public:
-	LLGradientPaletteList() {}
-	~LLGradientPaletteList();
-
-	void		 initPalette(F32 domain);
-	void		 setHardwarePalette(F32 domain, F32 effective_weight);
-	
-private:
-	typedef std::map<F32, U8*> palette_map_t;
-	palette_map_t		mPaletteMap;
-};
-
 // Used by LLTexLayerSetBuffer for a callback.
 class LLBakedUploadData
 {
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 382a4f3..38ca3b7 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -483,9 +483,9 @@ void LLFloaterTexturePicker::draw()
 		LLRect local_rect = getLocalRect();
 		if (gFocusMgr.childHasKeyboardFocus(this) && mOwner->isInVisibleChain() && mContextConeOpacity > 0.001f)
 		{
-			LLGLSNoTexture no_texture;
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			LLGLEnable(GL_CULL_FACE);
-			gGL.begin(LLVertexBuffer::QUADS);
+			gGL.begin(LLRender::QUADS);
 			{
 				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
 				gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop);
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index 49bc968..c5da2cf 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -247,7 +247,7 @@ void LLTextureBar::draw()
 	LLFontGL::sMonospace->renderUTF8(fetch_state_desc[state].desc, 0, title_x2, getRect().getHeight(),
 									 fetch_state_desc[state].color,
 									 LLFontGL::LEFT, LLFontGL::TOP);
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	// Draw the progress bar.
 	S32 bar_width = 100;
@@ -383,9 +383,9 @@ private:
 
 void LLGLTexMemBar::draw()
 {
-	S32 bound_mem = LLViewerImage::sBoundTextureMemory;
+	S32 bound_mem = (LLViewerImage::sBoundTextureMemory >> 20);
  	S32 max_bound_mem = LLViewerImage::sMaxBoundTextureMem;
-	S32 total_mem = LLViewerImage::sTotalTextureMemory;
+	S32 total_mem = (LLViewerImage::sTotalTextureMemory >> 20);
 	S32 max_total_mem = LLViewerImage::sMaxTotalTextureMem;
 	F32 discard_bias = LLViewerImage::sDesiredDiscardBias;
 	S32 line_height = (S32)(LLFontGL::sMonospace->getLineHeight() + .5f);
@@ -396,10 +396,10 @@ void LLGLTexMemBar::draw()
 	
 	std::string text;
 	text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Discard Bias: %.2f",
-					total_mem/(1024*1024),
-					max_total_mem/(1024*1024),
-					bound_mem/(1024*1024),
-					max_bound_mem/(1024*1024),
+					total_mem,
+					max_total_mem,
+					bound_mem,
+					max_bound_mem,
 					discard_bias);
 
 	LLFontGL::sMonospace->renderUTF8(text, 0, 0, line_height*3,
@@ -415,7 +415,7 @@ void LLGLTexMemBar::draw()
 
 	F32 bar_scale = (F32)bar_width / (max_bound_mem * 1.5f);
 	
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	
 	gGL.color4f(0.5f, 0.5f, 0.5f, 0.75f);
 	gl_rect_2d(left, top, right, bottom);
diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp
index cb0d3b1..b807276 100644
--- a/indra/newview/lltool.cpp
+++ b/indra/newview/lltool.cpp
@@ -42,6 +42,7 @@
 #include "lltoolfocus.h"
 #include "llfocusmgr.h"
 #include "llagent.h"
+#include "llviewerjoystick.h"
 
 extern BOOL gDebugClicks;
 
@@ -160,6 +161,11 @@ BOOL LLTool::handleKey(KEY key, MASK mask)
 
 LLTool* LLTool::getOverrideTool(MASK mask)
 {
+	// NOTE: if in flycam mode, ALT-ZOOM camera should be disabled
+	if (LLViewerJoystick::getInstance()->getOverrideCamera())
+	{
+		return NULL;
+	}
 	if (mask & MASK_ALT)
 	{
 		return LLToolCamera::getInstance();
diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp
index 0869cf3..6391789 100644
--- a/indra/newview/lltoolbrush.cpp
+++ b/indra/newview/lltoolbrush.cpp
@@ -491,7 +491,7 @@ void LLToolBrushLand::renderOverlay(LLSurface& land, const LLVector3& pos_region
 									const LLVector3& pos_world)
 {
 	glMatrixMode(GL_MODELVIEW);
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	LLGLDepthTest mDepthTest(GL_TRUE);
 	glPushMatrix();
 	gGL.color4fv(OVERLAY_COLOR.mV);
@@ -503,7 +503,7 @@ void LLToolBrushLand::renderOverlay(LLSurface& land, const LLVector3& pos_region
 	S32 radioAction = gSavedSettings.getS32("RadioLandBrushAction");
 	F32 force = gSavedSettings.getF32("LandBrushForce"); // .1 to 100?
 	
-	gGL.begin(LLVertexBuffer::LINES);
+	gGL.begin(LLRender::LINES);
 	for(S32 di = -half_edge; di <= half_edge; di++)
 	{
 		if((i+di) < 0 || (i+di) >= (S32)land.mGridsPerEdge) continue;
diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp
index 2fbf4ae..9666e66 100644
--- a/indra/newview/lltoolmorph.cpp
+++ b/indra/newview/lltoolmorph.cpp
@@ -240,6 +240,7 @@ BOOL LLVisualParamHint::render()
 	}
 	avatarp->setVisualParamWeight(mVisualParam, mLastParamWeight);
 	gGL.color4f(1,1,1,1);
+	mTexture->setInitialized(true);
 	return TRUE;
 }
 
@@ -251,12 +252,12 @@ void LLVisualParamHint::draw()
 {
 	if (!mIsVisible) return;
 
-	bindTexture();
+	gGL.getTexUnit(0)->bind(getTexture());
 
 	gGL.color4f(1.f, 1.f, 1.f, 1.f);
 
 	LLGLSUIDefault gls_ui;
-	gGL.begin(LLVertexBuffer::QUADS);
+	gGL.begin(LLRender::QUADS);
 	{
 		gGL.texCoord2i(0, 1);
 		gGL.vertex2i(0, mHeight);
@@ -269,7 +270,7 @@ void LLVisualParamHint::draw()
 	}
 	gGL.end();
 
-	LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 }
 
 //-----------------------------------------------------------------------------
diff --git a/indra/newview/lltoolplacer.cpp b/indra/newview/lltoolplacer.cpp
index 30347be..721e59e 100644
--- a/indra/newview/lltoolplacer.cpp
+++ b/indra/newview/lltoolplacer.cpp
@@ -224,8 +224,8 @@ BOOL LLToolPlacer::addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics )
 	// Play creation sound
 	if (gAudiop)
 	{
-		F32 volume = gSavedSettings.getBOOL("MuteUI") ? 0.f : gSavedSettings.getF32("AudioLevelUI");
-		gAudiop->triggerSound( LLUUID(gSavedSettings.getString("UISndObjectCreate")), gAgent.getID(), volume);
+		gAudiop->triggerSound( LLUUID(gSavedSettings.getString("UISndObjectCreate")),
+							   gAgent.getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_UI);
 	}
 
 	gMessageSystem->newMessageFast(_PREHASH_ObjectAdd);
diff --git a/indra/newview/lltoolselectrect.cpp b/indra/newview/lltoolselectrect.cpp
index 26d9756..b7067dc 100644
--- a/indra/newview/lltoolselectrect.cpp
+++ b/indra/newview/lltoolselectrect.cpp
@@ -175,7 +175,7 @@ void LLToolSelectRect::draw()
 		{
 			gGL.color4f(1.f, 1.f, 0.f, 1.f);
 		}
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gl_rect_2d(
 			llmin(mDragStartX, mDragEndX),
 			llmax(mDragStartY, mDragEndY),
diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp
index 8572283..82e6bf2 100644
--- a/indra/newview/lltracker.cpp
+++ b/indra/newview/lltracker.cpp
@@ -445,7 +445,7 @@ void draw_shockwave(F32 center_z, F32 t, S32 steps, LLColor4 color)
 	F32 y = 0.f;
 
 	LLColor4 ccol = LLColor4(1,1,1,(1.f-t)*0.25f);
-	gGL.begin(LLVertexBuffer::TRIANGLE_FAN);
+	gGL.begin(LLRender::TRIANGLE_FAN);
 	gGL.color4fv(ccol.mV);
 	gGL.vertex3f(0.f, 0.f, center_z);
 	// make sure circle is complete
@@ -494,7 +494,8 @@ void LLTracker::renderBeacon(LLVector3d pos_global,
 
 	LLVector3 pos_agent = gAgent.getPosAgentFromGlobal(pos_global);
 
-	LLGLSTracker gls_tracker; // default - TEXTURE + CULL_FACE + LIGHTING + GL_BLEND + GL_ALPHA_TEST
+	LLGLSTracker gls_tracker; // default+ CULL_FACE + LIGHTING + GL_BLEND + GL_ALPHA_TEST
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	LLGLDisable cull_face(GL_CULL_FACE);
 	LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
 	
@@ -535,7 +536,7 @@ void LLTracker::renderBeacon(LLVector3d pos_global,
 			an *= 2.f;
 			an += 1.0f+dr;
 		
-			gGL.begin(LLVertexBuffer::TRIANGLE_STRIP);
+			gGL.begin(LLRender::TRIANGLE_STRIP);
 			gGL.color4fv(col_edge.mV);
 			gGL.vertex3f(-x*a, -y*a, z);
 			gGL.color4fv(col_edge_next.mV);
diff --git a/indra/newview/lluserauth.cpp b/indra/newview/lluserauth.cpp
index a9b00e1..bb6ee16 100644
--- a/indra/newview/lluserauth.cpp
+++ b/indra/newview/lluserauth.cpp
@@ -324,17 +324,29 @@ static void parseOptionInto(
 		while(opt)
 		{
 			key.assign(XMLRPC_GetValueID(opt));
-			//llinfos "option key: " << key << llendl;
+			//llinfos << "option key: " << key << llendl;
 			type = XMLRPC_GetValueTypeEasy(opt);
 			if(xmlrpc_type_string == type)
 			{
 				val.assign(XMLRPC_GetValueString(opt));
+				//llinfos << "string val: " << val << llendl;
 			}
 			else if(xmlrpc_type_int == type)
 			{
 				val = llformat("%d", XMLRPC_GetValueInt(opt));
+				//llinfos << "int val: " << val << llendl;
 			}
-			//llinfos "option val: " << val << llendl;
+			else if(xmlrpc_type_double == type)
+			{
+				val = llformat("%g", XMLRPC_GetValueDouble(opt));
+				//llinfos << "double val: " << val << llendl;
+			}
+			else
+			{	// Can't understand the type
+				val = "???";
+				//llinfos << "unknown value type: " << type << llendl;
+			}
+
 			responses.insert(LLUserAuth::response_t::value_type(key, val));
 			opt = XMLRPC_VectorNext(row);
 		}
diff --git a/indra/newview/llvelocitybar.cpp b/indra/newview/llvelocitybar.cpp
index e8b9a74..3d5784f 100644
--- a/indra/newview/llvelocitybar.cpp
+++ b/indra/newview/llvelocitybar.cpp
@@ -63,7 +63,7 @@ void LLVelocityBar::draw()
 	//  Set bar color 
 	//
 
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	// draw background box
 	// gGL.color4f(0.f, 0.f, 0.f, 0.3f);
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index 122a0bc..23a685a 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -139,6 +139,14 @@ void audio_update_volume(bool force_update)
 		{
 			audio_update_wind(true);
 		}
+
+		// handle secondary gains
+		gAudiop->setSecondaryGain(LLAudioEngine::AUDIO_TYPE_SFX,
+								  gSavedSettings.getBOOL("MuteSounds") ? 0.f : gSavedSettings.getF32("AudioLevelSFX"));
+		gAudiop->setSecondaryGain(LLAudioEngine::AUDIO_TYPE_UI,
+								  gSavedSettings.getBOOL("MuteUI") ? 0.f : gSavedSettings.getF32("AudioLevelUI"));
+		gAudiop->setSecondaryGain(LLAudioEngine::AUDIO_TYPE_AMBIENT,
+								  gSavedSettings.getBOOL("MuteAmbient") ? 0.f : gSavedSettings.getF32("AudioLevelAmbient"));
 	}
 
 	// Streaming Music
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 627609b..4db26a0 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -248,8 +248,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 
 	gViewerWindow->checkSettings();
 	
-	LLAppViewer::instance()->pingMainloopTimeout("Display:Pick");
-	gViewerWindow->performPick();
+	{
+		LLFastTimer ftm(LLFastTimer::FTM_PICK);
+		LLAppViewer::instance()->pingMainloopTimeout("Display:Pick");
+		gViewerWindow->performPick();
+	}
 	
 
 	LLAppViewer::instance()->pingMainloopTimeout("Display:CheckStates");
@@ -373,6 +376,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 			gAgent.setTeleportMessage(
 				LLAgent::sTeleportProgressMessages["arriving"]);
 			gImageList.mForceResetTextureStats = TRUE;
+			gAgent.resetView(TRUE, TRUE);
 			break;
 
 		case LLAgent::TELEPORT_ARRIVING:
@@ -690,7 +694,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 		//	glMatrixMode(GL_MODELVIEW);
 		//	glPushMatrix();
 		//	{
-		//		LLGLSNoTexture gls_no_texture;
+		//		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 		//		glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
 		//		glLoadIdentity();
@@ -997,8 +1001,8 @@ void render_ui()
 
 void renderCoordinateAxes()
 {
-	LLGLSNoTexture gls_no_texture;
-	gGL.begin(LLVertexBuffer::LINES);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+	gGL.begin(LLRender::LINES);
 		gGL.color3f(1.0f, 0.0f, 0.0f);   // i direction = X-Axis = red
 		gGL.vertex3f(0.0f, 0.0f, 0.0f);
 		gGL.vertex3f(2.0f, 0.0f, 0.0f);
@@ -1048,10 +1052,10 @@ void renderCoordinateAxes()
 void draw_axes() 
 {
 	LLGLSUIDefault gls_ui;
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	// A vertical white line at origin
 	LLVector3 v = gAgent.getPositionAgent();
-	gGL.begin(LLVertexBuffer::LINES);
+	gGL.begin(LLRender::LINES);
 		gGL.color3f(1.0f, 1.0f, 1.0f); 
 		gGL.vertex3f(0.0f, 0.0f, 0.0f);
 		gGL.vertex3f(0.0f, 0.0f, 40.0f);
@@ -1194,7 +1198,7 @@ void render_disconnected_background()
 		raw->expandToPowerOfTwo();
 		gDisconnectedImagep->createGLTexture(0, raw);
 		gStartImageGL = gDisconnectedImagep;
-		LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	}
 
 	// Make sure the progress view always fills the entire window.
@@ -1213,10 +1217,10 @@ void render_disconnected_background()
 			const LLVector2& display_scale = gViewerWindow->getDisplayScale();
 			glScalef(display_scale.mV[VX], display_scale.mV[VY], 1.f);
 
-			LLViewerImage::bindTexture(gDisconnectedImagep);
+			gGL.getTexUnit(0)->bind(gDisconnectedImagep);
 			gGL.color4f(1.f, 1.f, 1.f, 1.f);
 			gl_rect_2d_simple_tex(width, height);
-			LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		}
 		glPopMatrix();
 	}
diff --git a/indra/newview/llviewerimage.cpp b/indra/newview/llviewerimage.cpp
index 0b70f51..6ad6ca2 100644
--- a/indra/newview/llviewerimage.cpp
+++ b/indra/newview/llviewerimage.cpp
@@ -149,23 +149,13 @@ F32 texmem_middle_bound_scale = 0.925f;
 //static
 void LLViewerImage::updateClass(const F32 velocity, const F32 angular_velocity)
 {
-	sBoundTextureMemory = LLImageGL::sBoundTextureMemory;
-	sTotalTextureMemory = LLImageGL::sGlobalTextureMemory;
-	sMaxBoundTextureMem = gImageList.getMaxResidentTexMem();
-	
-	sMaxTotalTextureMem = sMaxBoundTextureMem * 2;
-	if (sMaxBoundTextureMem > 64000000)
-	{
-		sMaxTotalTextureMem -= sMaxBoundTextureMem/4;
-	}
-	
-	if ((U32)sMaxTotalTextureMem > gSysMemory.getPhysicalMemoryClamped() - (U32)min_non_tex_system_mem)
-	{
-		sMaxTotalTextureMem = (S32)gSysMemory.getPhysicalMemoryClamped() - min_non_tex_system_mem;
-	}
-	
-	if (sBoundTextureMemory >= sMaxBoundTextureMem ||
-		sTotalTextureMemory >= sMaxTotalTextureMem)
+	sBoundTextureMemory = LLImageGL::sBoundTextureMemory;//in bytes
+	sTotalTextureMemory = LLImageGL::sGlobalTextureMemory;//in bytes
+	sMaxBoundTextureMem = gImageList.getMaxResidentTexMem();//in MB	
+	sMaxTotalTextureMem = gImageList.getMaxTotalTextureMem() ;//in MB
+
+	if ((sBoundTextureMemory >> 20) >= sMaxBoundTextureMem ||
+		(sTotalTextureMemory >> 20) >= sMaxTotalTextureMem)
 	{
 		// If we are using more texture memory than we should,
 		// scale up the desired discard level
@@ -176,8 +166,8 @@ void LLViewerImage::updateClass(const F32 velocity, const F32 angular_velocity)
 		}
 	}
 	else if (sDesiredDiscardBias > 0.0f &&
-			 sBoundTextureMemory < sMaxBoundTextureMem*texmem_lower_bound_scale &&
-			 sTotalTextureMemory < sMaxTotalTextureMem*texmem_lower_bound_scale)
+			 (sBoundTextureMemory >> 20) < sMaxBoundTextureMem*texmem_lower_bound_scale &&
+			 (sTotalTextureMemory >> 20) < sMaxTotalTextureMem*texmem_lower_bound_scale)
 	{
 		// If we are using less texture memory than we should,
 		// scale down the desired discard level
@@ -1210,45 +1200,58 @@ void LLViewerImage::setKnownDrawSize(S32 width, S32 height)
 }
 
 // virtual
-BOOL LLViewerImage::bind(S32 stage) const
+bool LLViewerImage::bindError(S32 stage) const
 {
-	if (stage == -1)
+	if (stage < 0) return false;
+	
+	if (gNoRender)
 	{
-		return TRUE;
+		return false;
 	}
+
+	bool res = true;
 	
-	if (gNoRender)
+	// On failure to bind, what should we set the currently bound texture to?
+	if (mIsMissingAsset && !sMissingAssetImagep.isNull() && (this != (LLImageGL *)sMissingAssetImagep))
 	{
-		return true;
+		res = gGL.getTexUnit(stage)->bind(sMissingAssetImagep.get());
 	}
-	BOOL res = bindTextureInternal(stage);
-	if (res)
+	if (!res && !sDefaultImagep.isNull() && (this != (LLImageGL *)sDefaultImagep))
 	{
-		//llassert_always(mIsMissingAsset == FALSE);
-		
+		// use default if we've got it
+		res = gGL.getTexUnit(stage)->bind(sDefaultImagep.get());
 	}
-	else
+	if (!res && !sNullImagep.isNull() && (this != (LLImageGL *)sNullImagep))
 	{
-		// On failure to bind, what should we set the currently bound texture to?
-		if (mIsMissingAsset && !sMissingAssetImagep.isNull() && (this != (LLImageGL *)sMissingAssetImagep))
-		{
-			res = sMissingAssetImagep->bind( stage );
-		}
-		if (!res && !sDefaultImagep.isNull() && (this != (LLImageGL *)sDefaultImagep))
-		{
-			// use default if we've got it
-			res = sDefaultImagep->bind(stage);
-		}
-		if (!res && !sNullImagep.isNull() && (this != (LLImageGL *)sNullImagep))
-		{
-			res = sNullImagep->bind(stage);
-		}
- 		if (!res)
-		{
-			llwarns << "LLViewerImage::bindTexture failed." << llendl;
-		}
-		stop_glerror();
+		res = gGL.getTexUnit(stage)->bind(sNullImagep.get());
+	}
+	if (!res)
+	{
+		llwarns << "LLViewerImage::bindError failed." << llendl;
 	}
+	stop_glerror();
+	return res;
+}
+
+bool LLViewerImage::bindDefaultImage(S32 stage) const
+{
+	if (stage < 0) return false;
+
+	bool res = true;
+	if (!sDefaultImagep.isNull() && (this != (LLImageGL *)sDefaultImagep))
+	{
+		// use default if we've got it
+		res = gGL.getTexUnit(stage)->bind(sDefaultImagep.get());
+	}
+	if (!res && !sNullImagep.isNull() && (this != (LLImageGL *)sNullImagep))
+	{
+		res = gGL.getTexUnit(stage)->bind(sNullImagep.get());
+	}
+	if (!res)
+	{
+		llwarns << "LLViewerImage::bindError failed." << llendl;
+	}
+	stop_glerror();
 	return res;
 }
 
diff --git a/indra/newview/llviewerimage.h b/indra/newview/llviewerimage.h
index 60d9fb8..523f66a 100644
--- a/indra/newview/llviewerimage.h
+++ b/indra/newview/llviewerimage.h
@@ -86,17 +86,6 @@ public:
 	static LLViewerImage * getImage(const LLUUID &image_id);
 		// lightweight wrapper for gImageList.getImage()
 
-	static BOOL bindTexture(LLImageGL* image, const U32 stage = 0)
-	{
-		if (image)
-		{
-			return image->bind(stage);
-		}
-		else
-		{
-			return sDefaultImagep->bind(stage);
-		}
-	}
 
 	struct Compare
 	{
@@ -189,7 +178,8 @@ public:
 
 	/*virtual*/ void dump();	// debug info to llinfos
 
-	/*virtual*/ BOOL bind(const S32 stage = 0) const;
+	/*virtual*/ bool bindError(const S32 stage = 0) const;
+	/*virtual*/ bool bindDefaultImage(const S32 stage = 0) const;
 	
 	void reinit(BOOL usemipmaps = TRUE);
 
diff --git a/indra/newview/llviewerimagelist.cpp b/indra/newview/llviewerimagelist.cpp
index a79a76a..1e58fce 100644
--- a/indra/newview/llviewerimagelist.cpp
+++ b/indra/newview/llviewerimagelist.cpp
@@ -89,7 +89,8 @@ LLStat LLViewerImageList::sFormattedMemStat(32, TRUE);
 LLViewerImageList::LLViewerImageList() 
 	: mForceResetTextureStats(FALSE),
 	mUpdateStats(FALSE),
-	mMaxResidentTexMem(0)
+	mMaxResidentTexMem(0),
+	mMaxTotalTextureMem(0)
 {
 }
 
@@ -97,6 +98,7 @@ void LLViewerImageList::init()
 {
 	sNumImages = 0;
 	mMaxResidentTexMem = 0;
+	mMaxTotalTextureMem = 0 ;
 	
 	if (gNoRender)
 	{
@@ -918,12 +920,14 @@ LLPointer<LLImageJ2C> LLViewerImageList::convertToUploadFile(LLPointer<LLImageRa
 }
 
 const S32 MIN_VIDEO_RAM = 32;
-const S32 MAX_VIDEO_RAM = 2048;
+const S32 MAX_VIDEO_RAM = 512; // 512MB max for performance reasons.
 	
 // Returns min setting for TextureMemory (in MB)
 S32 LLViewerImageList::getMinVideoRamSetting()
 {
-	return MIN_VIDEO_RAM;
+	S32 system_ram = (S32)(gSysMemory.getPhysicalMemoryClamped() >> 20);
+	//min texture mem sets to 128M if total physical mem is more than 1.5GB
+	return (system_ram > 1500) ? 128 : MIN_VIDEO_RAM;
 }
 
 //static
@@ -956,8 +960,8 @@ S32 LLViewerImageList::getMaxVideoRamSetting(bool get_recommended)
 		max_texmem = llmin(max_texmem, (S32)(system_ram/2));
 	else
 		max_texmem = llmin(max_texmem, (S32)(system_ram));
-	
-	max_texmem = llclamp(max_texmem, MIN_VIDEO_RAM, MAX_VIDEO_RAM);
+		
+	max_texmem = llclamp(max_texmem, getMinVideoRamSetting(), MAX_VIDEO_RAM); 
 	
 	return max_texmem;
 }
@@ -994,7 +998,18 @@ void LLViewerImageList::updateMaxResidentTexMem(S32 mem)
 	
 	S32 vb_mem = mem;
 	S32 fb_mem = llmax(VIDEO_CARD_FRAMEBUFFER_MEM, vb_mem/4);
-	mMaxResidentTexMem = (vb_mem - fb_mem)<<20;
+	mMaxResidentTexMem = (vb_mem - fb_mem) ; //in MB
+	
+	mMaxTotalTextureMem = mMaxResidentTexMem * 2;
+	if (mMaxResidentTexMem > 640)
+	{
+		mMaxTotalTextureMem -= (mMaxResidentTexMem >> 2);
+	}
+	
+	if (mMaxTotalTextureMem > (S32)(gSysMemory.getPhysicalMemoryClamped() >> 20) - 128)
+	{
+		mMaxTotalTextureMem = (gSysMemory.getPhysicalMemoryClamped() >> 20) - 128 ;
+	}
 	
 	llinfos << "Total Video Memory set to: " << vb_mem << " MB" << llendl;
 	llinfos << "Available Texture Memory set to: " << (vb_mem - fb_mem) << " MB" << llendl;
diff --git a/indra/newview/llviewerimagelist.h b/indra/newview/llviewerimagelist.h
index 8aa9913..1f1a122 100644
--- a/indra/newview/llviewerimagelist.h
+++ b/indra/newview/llviewerimagelist.h
@@ -129,6 +129,7 @@ public:
 	void setUpdateStats(BOOL b)			{ mUpdateStats = b; }
 
 	S32	getMaxResidentTexMem() const	{ return mMaxResidentTexMem; }
+	S32 getMaxTotalTextureMem() const   { return mMaxTotalTextureMem;}
 	S32 getNumImages()					{ return mImageList.size(); }
 
 	void updateMaxResidentTexMem(S32 mem);
@@ -170,6 +171,7 @@ private:
 
 	BOOL mUpdateStats;
 	S32	mMaxResidentTexMem;
+	S32 mMaxTotalTextureMem;
 	LLFrameTimer mForceDecodeTimer;
 	
 public:
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 6d9d685..0323bb7 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -196,15 +196,34 @@ void LLViewerInventoryItem::fetchFromServer(void) const
 {
 	if(!mIsComplete)
 	{
-		LLMessageSystem* msg = gMessageSystem;
-		msg->newMessage("FetchInventory");
-		msg->nextBlock("AgentData");
-		msg->addUUID("AgentID", gAgent.getID());
-		msg->addUUID("SessionID", gAgent.getSessionID());
-		msg->nextBlock("InventoryData");
-		msg->addUUID("OwnerID", mPermissions.getOwner());
-		msg->addUUID("ItemID", mUUID);
-		gAgent.sendReliableMessage();
+		std::string url; 
+
+		if( ALEXANDRIA_LINDEN_ID.getString() == mPermissions.getOwner().getString())
+			url = gAgent.getRegion()->getCapability("FetchLib");
+		else	
+			url = gAgent.getRegion()->getCapability("FetchInventory");
+
+		if (!url.empty())
+		{
+			LLSD body;
+			body["agent_id"]	= gAgent.getID();
+			body["items"][0]["owner_id"]	= mPermissions.getOwner();
+			body["items"][0]["item_id"]		= mUUID;
+
+			LLHTTPClient::post(url, body, new LLInventoryModel::fetchInventoryResponder(body));
+		}
+		else
+		{
+			LLMessageSystem* msg = gMessageSystem;
+			msg->newMessage("FetchInventory");
+			msg->nextBlock("AgentData");
+			msg->addUUID("AgentID", gAgent.getID());
+			msg->addUUID("SessionID", gAgent.getSessionID());
+			msg->nextBlock("InventoryData");
+			msg->addUUID("OwnerID", mPermissions.getOwner());
+			msg->addUUID("ItemID", mUUID);
+			gAgent.sendReliableMessage();
+		}
 	}
 	else
 	{
@@ -441,7 +460,7 @@ bool LLViewerInventoryCategory::fetchDescendents()
 		// This comes from LLInventoryFilter from llfolderview.h
 		U32 sort_order = gSavedSettings.getU32("InventorySortOrder") & 0x1;
 
-		std::string url = gAgent.getRegion()->getCapability("FetchInventoryDescendents");
+		std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents");
    
 		if (!url.empty()) //Capability found.  Build up LLSD and use it.
 		{
@@ -449,7 +468,7 @@ bool LLViewerInventoryCategory::fetchDescendents()
 		}
 		else
 		{	//Deprecated, but if we don't have a capability, use the old system.
-			llinfos << "FetchInventoryDescendents capability not found.  Using deprecated UDP message." << llendl;
+			llinfos << "WebFetchInventoryDescendents capability not found.  Using deprecated UDP message." << llendl;
 			LLMessageSystem* msg = gMessageSystem;
 			msg->newMessage("FetchInventoryDescendents");
 			msg->nextBlock("AgentData");
diff --git a/indra/newview/llviewerjoint.cpp b/indra/newview/llviewerjoint.cpp
index 914448e..d0359d6 100644
--- a/indra/newview/llviewerjoint.cpp
+++ b/indra/newview/llviewerjoint.cpp
@@ -149,7 +149,7 @@ void LLViewerJoint::setValid( BOOL valid, BOOL recursive )
 // 	//----------------------------------------------------------------
 // 	if (mComponents & SC_AXES)
 // 	{
-// 		gGL.begin(LLVertexBuffer::LINES);
+// 		gGL.begin(LLRender::LINES);
 // 		gGL.color3f( 1.0f, 0.0f, 0.0f );
 // 		gGL.vertex3f( 0.0f,            0.0f, 0.0f );
 // 		gGL.vertex3f( 0.1f, 0.0f, 0.0f );
@@ -171,7 +171,7 @@ void LLViewerJoint::setValid( BOOL valid, BOOL recursive )
 // 	{
 // 		gGL.color3f( 1.0f, 1.0f, 0.0f );
 
-// 		gGL.begin(LLVertexBuffer::TRIANGLES);
+// 		gGL.begin(LLRender::TRIANGLES);
 
 // 		// joint top half
 // 		glNormal3f(nc, nc, nc);
@@ -362,7 +362,7 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass )
 // 	// render the bone
 // 	gGL.color3f( 0.5f, 0.5f, 0.0f );
 
-// 	gGL.begin(LLVertexBuffer::TRIANGLES);
+// 	gGL.begin(LLRender::TRIANGLES);
 
 // 	gGL.vertex3f( length,     0.0f,       0.0f);
 // 	gGL.vertex3f( 0.0f,       boneSize,  0.0f);
@@ -524,14 +524,69 @@ LLViewerJointCollisionVolume::LLViewerJointCollisionVolume(const std::string &na
 void LLViewerJointCollisionVolume::renderCollision()
 {
 	updateWorldMatrix();
-	glMatrixMode(GL_MODELVIEW);
-	glPushMatrix();
+	
+	gGL.pushMatrix();
 	glMultMatrixf( &mXform.getWorldMatrix().mMatrix[0][0] );
 
-	glColor3f( 0.f, 0.f, 1.f );
-	gSphere.render();
+	gGL.color3f( 0.f, 0.f, 1.f );
+	
+	gGL.begin(LLRender::LINES);
+	
+	LLVector3 v[] = 
+	{
+		LLVector3(1,0,0),
+		LLVector3(-1,0,0),
+		LLVector3(0,1,0),
+		LLVector3(0,-1,0),
+
+		LLVector3(0,0,-1),
+		LLVector3(0,0,1),
+	};
+
+	//sides
+	gGL.vertex3fv(v[0].mV); 
+	gGL.vertex3fv(v[2].mV);
+
+	gGL.vertex3fv(v[0].mV); 
+	gGL.vertex3fv(v[3].mV);
+
+	gGL.vertex3fv(v[1].mV); 
+	gGL.vertex3fv(v[2].mV);
+
+	gGL.vertex3fv(v[1].mV); 
+	gGL.vertex3fv(v[3].mV);
+
+
+	//top
+	gGL.vertex3fv(v[0].mV); 
+	gGL.vertex3fv(v[4].mV);
+
+	gGL.vertex3fv(v[1].mV); 
+	gGL.vertex3fv(v[4].mV);
+
+	gGL.vertex3fv(v[2].mV); 
+	gGL.vertex3fv(v[4].mV);
+
+	gGL.vertex3fv(v[3].mV); 
+	gGL.vertex3fv(v[4].mV);
+
+
+	//bottom
+	gGL.vertex3fv(v[0].mV); 
+	gGL.vertex3fv(v[5].mV);
+
+	gGL.vertex3fv(v[1].mV); 
+	gGL.vertex3fv(v[5].mV);
+
+	gGL.vertex3fv(v[2].mV); 
+	gGL.vertex3fv(v[5].mV);
+
+	gGL.vertex3fv(v[3].mV); 
+	gGL.vertex3fv(v[5].mV);
+
+	gGL.end();
 
-	glPopMatrix();
+	gGL.popMatrix();
 }
 
 LLVector3 LLViewerJointCollisionVolume::getVolumePos(LLVector3 &offset)
diff --git a/indra/newview/llviewerjointattachment.cpp b/indra/newview/llviewerjointattachment.cpp
index 4b58361..42b8d9a 100644
--- a/indra/newview/llviewerjointattachment.cpp
+++ b/indra/newview/llviewerjointattachment.cpp
@@ -91,7 +91,7 @@ U32 LLViewerJointAttachment::drawShape( F32 pixelArea, BOOL first_pass )
 		LLGLDisable cull_face(GL_CULL_FACE);
 		
 		gGL.color4f(1.f, 1.f, 1.f, 1.f);
-		gGL.begin(LLVertexBuffer::QUADS);
+		gGL.begin(LLRender::QUADS);
 		{
 			gGL.vertex3f(-0.1f, 0.1f, 0.f);
 			gGL.vertex3f(-0.1f, -0.1f, 0.f);
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index b590907..5c2002b 100644
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
@@ -537,7 +537,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
 
 	if (mTestImageName)
 	{
-		LLImageGL::bindExternalTexture( mTestImageName, 0, GL_TEXTURE_2D ); 
+		gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mTestImageName);
 
 		if (mIsTransparent)
 		{
@@ -553,12 +553,12 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
 	{
 		if(	mLayerSet->hasComposite() )
 		{
-			mLayerSet->getComposite()->bindTexture();
+			gGL.getTexUnit(0)->bind(mLayerSet->getComposite()->getTexture());
 		}
 		else
 		{
 			llwarns << "Layerset without composite" << llendl;
-			gImageList.getImage(IMG_DEFAULT)->bind();
+			gGL.getTexUnit(0)->bind(gImageList.getImage(IMG_DEFAULT));
 		}
 	}
 	else
@@ -566,13 +566,13 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
 	{
 		if (!mTexture->getClampS() || !mTexture->getClampT())
 		{
-			mTexture->bind();
+			gGL.getTexUnit(0)->bind(mTexture.get());
 			mTexture->overrideClamp (TRUE, TRUE);
 		}
 	}
 	else
 	{
-		gImageList.getImage(IMG_DEFAULT_AVATAR)->bind();
+		gGL.getTexUnit(0)->bind(gImageList.getImage(IMG_DEFAULT_AVATAR));
 	}
 	
 	if (gRenderForSelect)
@@ -584,7 +584,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
 		}
 		else
 		{
-			LLImageGL::unbindTexture(0);
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		}
 	}
 	
@@ -605,14 +605,14 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
 			}
 		}
 		
-		mFace->mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, start, end, count, offset);
+		mFace->mVertexBuffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
 	}
 	else
 	{
 		glPushMatrix();
 		LLMatrix4 jointToWorld = getWorldMatrix();
 		glMultMatrixf((GLfloat*)jointToWorld.mMatrix);
-		mFace->mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, start, end, count, offset);
+		mFace->mVertexBuffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
 		glPopMatrix();
 	}
 	gPipeline.addTrianglesDrawn(count/3);
@@ -626,7 +626,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
 
 	if (mTexture.notNull())
 	{
-		mTexture->bind();
+		gGL.getTexUnit(0)->bind(mTexture.get());
 		mTexture->restoreClamp();
 	}
 
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index e99c838..00639cc 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -552,6 +552,7 @@ void LLViewerMedia::buildMediaManagerData( LLMediaManagerData* init_data )
 // static
 void LLViewerMedia::cleanupClass()
 {
+	stop() ;
 	LLMediaManager::cleanupClass();
 }
 
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index c2a8055..9782d4b 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -85,6 +85,7 @@
 #include "llfloateranimpreview.h"
 #include "llfloateravatarinfo.h"
 #include "llfloateravatartextures.h"
+#include "llfloaterbeacons.h"
 #include "llfloaterbuildoptions.h"
 #include "llfloaterbump.h"
 #include "llfloaterbuy.h"
@@ -323,13 +324,6 @@ void handle_talk_to(void *userdata);
 // Debug menu
 void show_permissions_control(void*);
 void toggle_build_options(void* user_data);
-#if 0 // Unused
-void handle_audio_status_1(void*);
-void handle_audio_status_2(void*);
-void handle_audio_status_3(void*);
-void handle_audio_status_4(void*);
-#endif
-void manage_landmarks(void*);
 void reload_ui(void*);
 void handle_agent_stop_moving(void*);
 void print_packets_lost(void*);
@@ -795,12 +789,6 @@ void init_client_menu(LLMenuGL* menu)
 										&menu_check_control,
 										(void*)"QuietSnapshotsToDisk"));
 
-	menu->append(new LLMenuItemCheckGL( "Compress Snapshots to Disk",
-										&menu_toggle_control,
-										NULL,
-										&menu_check_control,
-										(void*)"CompressSnapshotsToDisk"));
-
 	menu->append(new LLMenuItemCheckGL("Show Mouselook Crosshairs",
 									   &menu_toggle_control,
 									   NULL,
@@ -948,6 +936,7 @@ void init_client_menu(LLMenuGL* menu)
 		sub->append(new LLMenuItemCallGL("Force LLError And Crash", &force_error_llerror));
         sub->append(new LLMenuItemCallGL("Force Bad Memory Access", &force_error_bad_memory_access));
 		sub->append(new LLMenuItemCallGL("Force Infinite Loop", &force_error_infinite_loop));
+		sub->append(new LLMenuItemCallGL("Force Disconnect Viewer", &handle_disconnect_viewer));
 		// *NOTE:Mani this isn't handled yet... sub->append(new LLMenuItemCallGL("Force Software Exception", &force_error_unhandled_exception)); 
 		sub->createJumpKeys();
 		menu->appendMenu(sub);
@@ -1162,10 +1151,6 @@ void init_debug_rendering_menu(LLMenuGL* menu)
 											&LLPipeline::toggleRenderDebugFeature, NULL,
 											&LLPipeline::toggleRenderDebugFeatureControl,
 											(void*)LLPipeline::RENDER_DEBUG_FEATURE_FOG, KEY_F6, MASK_ALT|MASK_CONTROL));
-	sub_menu->append(new LLMenuItemCheckGL("Palletized Textures",
-											&LLPipeline::toggleRenderDebugFeature, NULL,
-											&LLPipeline::toggleRenderDebugFeatureControl,
-											(void*)LLPipeline::RENDER_DEBUG_FEATURE_PALETTE, KEY_F7, MASK_ALT|MASK_CONTROL));
 	sub_menu->append(new LLMenuItemCheckGL("Test FRInfo",
 											&LLPipeline::toggleRenderDebugFeature, NULL,
 											&LLPipeline::toggleRenderDebugFeatureControl,
@@ -1216,9 +1201,6 @@ void init_debug_rendering_menu(LLMenuGL* menu)
 	sub_menu->append(new LLMenuItemCheckGL("Face Area (sqrt(A))",&LLPipeline::toggleRenderDebug, NULL,
 													&LLPipeline::toggleRenderDebugControl,
 													(void*)LLPipeline::RENDER_DEBUG_FACE_AREA));
-	sub_menu->append(new LLMenuItemCheckGL("Pick Render",	&LLPipeline::toggleRenderDebug, NULL,
-													&LLPipeline::toggleRenderDebugControl,
-													(void*)LLPipeline::RENDER_DEBUG_PICKING));
 	sub_menu->append(new LLMenuItemCheckGL("Lights",	&LLPipeline::toggleRenderDebug, NULL,
 													&LLPipeline::toggleRenderDebugControl,
 													(void*)LLPipeline::RENDER_DEBUG_LIGHTS));
@@ -1237,9 +1219,7 @@ void init_debug_rendering_menu(LLMenuGL* menu)
 	sub_menu->append(new LLMenuItemCheckGL("Sculpt",	&LLPipeline::toggleRenderDebug, NULL,
 													&LLPipeline::toggleRenderDebugControl,
 													(void*)LLPipeline::RENDER_DEBUG_SCULPTED));
-	
-	sub_menu->append(new LLMenuItemToggleGL("Show Select Buffer", &gDebugSelect));
-
+		
 	sub_menu->append(new LLMenuItemCallGL("Vectorize Perf Test", &run_vectorize_perf_test));
 
 	sub_menu = new LLMenuGL("Render Tests");
@@ -1757,6 +1737,24 @@ class LLViewCheckJoystickFlycam : public view_listener_t
 	}
 };
 
+class LLViewCommunicate : public view_listener_t
+{
+	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
+	{
+        if (LLFloaterChatterBox::getInstance()->getFloaterCount() == 0)
+		{
+			LLFloaterMyFriends::toggleInstance();
+		}
+		else
+		{
+			LLFloaterChatterBox::toggleInstance();
+		}
+		
+		return true;
+	}
+};
+
+
 void handle_toggle_flycam()
 {
 	LLViewerJoystick::getInstance()->toggleFlycam();
@@ -2225,37 +2223,71 @@ class LLAvatarDebug : public view_listener_t
 	}
 };
 
+struct MenuCallbackData
+{
+	bool ban_enabled;
+	LLUUID avatar_id;
+};
+
 void callback_eject(S32 option, void* data)
 {
-	LLUUID* avatar_id = (LLUUID*) data;
+	MenuCallbackData *callback_data = (MenuCallbackData*)data;
+	if (!callback_data)
+	{
+		return;
+	}
+	if (2 == option)
+	{
+		// Cancle button.
+		return;
+	}
+	LLUUID avatar_id = callback_data->avatar_id;
+	bool ban_enabled = callback_data->ban_enabled;
 
-	if (0 == option || 1 == option)
+	if (0 == option)
 	{
+		// Eject button
 		LLMessageSystem* msg = gMessageSystem;
-		LLViewerObject* avatar = gObjectList.findObject(*avatar_id);
+		LLViewerObject* avatar = gObjectList.findObject(avatar_id);
 
 		if (avatar)
 		{
 			U32 flags = 0x0;
-			if (1 == option)
-			{
-				// eject and add to ban list
-				flags |= 0x1;
-			}
+			msg->newMessage("EjectUser");
+			msg->nextBlock("AgentData");
+			msg->addUUID("AgentID", gAgent.getID() );
+			msg->addUUID("SessionID", gAgent.getSessionID() );
+			msg->nextBlock("Data");
+			msg->addUUID("TargetID", avatar_id );
+			msg->addU32("Flags", flags );
+			msg->sendReliable( avatar->getRegion()->getHost() );
+		}
+	}
+	else if (ban_enabled)
+	{
+		// This is tricky. It is similar to say if it is not an 'Eject' button,
+		// and it is also not an 'Cancle' button, and ban_enabled==ture, 
+		// it should be the 'Eject and Ban' button.
+		LLMessageSystem* msg = gMessageSystem;
+		LLViewerObject* avatar = gObjectList.findObject(avatar_id);
 
+		if (avatar)
+		{
+			U32 flags = 0x1;
 			msg->newMessage("EjectUser");
 			msg->nextBlock("AgentData");
 			msg->addUUID("AgentID", gAgent.getID() );
 			msg->addUUID("SessionID", gAgent.getSessionID() );
 			msg->nextBlock("Data");
-			msg->addUUID("TargetID", *avatar_id );
+			msg->addUUID("TargetID", avatar_id );
 			msg->addU32("Flags", flags );
 			msg->sendReliable( avatar->getRegion()->getHost() );
 		}
 	}
 
-	delete avatar_id;
-	avatar_id = NULL;
+
+	delete callback_data;
+	callback_data = NULL;
 }
 
 class LLAvatarEject : public view_listener_t
@@ -2265,23 +2297,50 @@ class LLAvatarEject : public view_listener_t
 		LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
 		if( avatar )
 		{
-			LLUUID* avatar_id = new LLUUID( avatar->getID() );
+			MenuCallbackData *data = new MenuCallbackData;
+			(*data).avatar_id = avatar->getID();
 			std::string fullname = avatar->getFullname();
 
-			if (!fullname.empty())
+			const LLVector3d& pos = avatar->getPositionGlobal();
+			LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos)->getParcel();
+			
+			if (LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_MANAGE_BANNED))
 			{
-				LLStringUtil::format_map_t args;
-				args["[AVATAR_NAME]"] = fullname;
-				gViewerWindow->alertXml("EjectAvatarFullname",
-							args,
-							callback_eject,
-							(void*)avatar_id);
+				(*data).ban_enabled = true;
+				if (!fullname.empty())
+				{
+					LLStringUtil::format_map_t args;
+					args["[AVATAR_NAME]"] = fullname;
+					gViewerWindow->alertXml("EjectAvatarFullname",
+						args,
+						callback_eject,
+						(void*)data);
+				}
+				else
+				{
+					gViewerWindow->alertXml("EjectAvatar",
+						callback_eject,
+						(void*)data);
+				}
 			}
 			else
 			{
-				gViewerWindow->alertXml("EjectAvatar",
-							callback_eject,
-							(void*)avatar_id);
+				(*data).ban_enabled = false;
+				if (!fullname.empty())
+				{
+					LLStringUtil::format_map_t args;
+					args["[AVATAR_NAME]"] = fullname;
+					gViewerWindow->alertXml("EjectAvatarFullnameNoBan",
+						args,
+						callback_eject,
+						(void*)data);
+				}
+				else
+				{
+					gViewerWindow->alertXml("EjectAvatarNoBan",
+						callback_eject,
+						(void*)data);
+				}
 			}
 		}
 		return true;
@@ -2298,12 +2357,18 @@ class LLAvatarEnableFreezeEject : public view_listener_t
 		if (new_value)
 		{
 			const LLVector3& pos = avatar->getPositionRegion();
+			const LLVector3d& pos_global = avatar->getPositionGlobal();
+			LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel();
 			LLViewerRegion* region = avatar->getRegion();
 			new_value = (region != NULL);
-
+						
 			if (new_value)
 			{
-				new_value = (region->isOwnedSelf(pos) || region->isOwnedGroup(pos));
+				new_value = region->isOwnedSelf(pos);
+				if (!new_value || region->isOwnedGroup(pos))
+				{
+					new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN);
+				}
 			}
 		}
 
@@ -2674,33 +2739,6 @@ void process_grant_godlike_powers(LLMessageSystem* msg, void**)
 	}
 }
 
-void load_url_local_file(const std::string& file_name)
-{
-	if( gAgent.cameraMouselook() )
-	{
-		gAgent.changeCameraToDefault();
-	}
-
-#if LL_DARWIN || LL_LINUX || LL_SOLARIS
-	// MBW -- If the Mac client is in fullscreen mode, it needs to go windowed so the browser will be visible.
-	if(gViewerWindow->mWindow->getFullscreen())
-	{
-		gViewerWindow->toggleFullscreen(TRUE);
-	}
-#endif
-
-	// JC - system() blocks until IE has launched.
-	// spawn() runs asynchronously, but opens a command prompt.
-	// ShellExecute() just opens the damn file with the default
-	// web browser.
-	std::string full_path = "file:///";
-	full_path.append(gDirUtilp->getAppRODataDir());
-	full_path.append(gDirUtilp->getDirDelimiter());
-	full_path.append(file_name);
-
-	LLWeb::loadURL(full_path);
-}
-
 /*
 class LLHaveCallingcard : public LLInventoryCollectFunctor
 {
@@ -2908,63 +2946,16 @@ void show_permissions_control(void*)
 	floaterp->mPermissions->addPermissionsData("foo3", LLUUID::null, 0);
 }
 
-#if 0 // Unused (these just modify AudioInfoPage which is not used anywhere in the code
-void handle_audio_status_1(void*)
-{
-	S32 page = gSavedSettings.getS32("AudioInfoPage");
-	if (1 == page)
-	{
-		page = 0;
-	}
-	else
-	{
-		page = 1;
-	}
-	gSavedSettings.setS32("AudioInfoPage", page);	
-}
-
-void handle_audio_status_2(void*)
-{
-	S32 page = gSavedSettings.getS32("AudioInfoPage");
-	if (2 == page)
-	{
-		page = 0;
-	}
-	else
-	{
-		page = 2;
-	}
-	gSavedSettings.setS32("AudioInfoPage", page);	
-}
-
-void handle_audio_status_3(void*)
-{
-	S32 page = gSavedSettings.getS32("AudioInfoPage");
-	if (3 == page)
-	{
-		page = 0;
-	}
-	else
-	{
-		page = 3;
-	}
-	gSavedSettings.setS32("AudioInfoPage", page);	
-}
 
-void handle_audio_status_4(void*)
+class LLCreateLandmarkCallback : public LLInventoryCallback
 {
-	S32 page = gSavedSettings.getS32("AudioInfoPage");
-	if (4 == page)
-	{
-		page = 0;
-	}
-	else
+public:
+	/*virtual*/ void fire(const LLUUID& inv_item)
 	{
-		page = 4;
+		llinfos << "Created landmark with inventory id " << inv_item
+			<< llendl;
 	}
-	gSavedSettings.setS32("AudioInfoPage", page);	
-}
-#endif
+};
 
 void reload_ui(void *)
 {
@@ -3197,26 +3188,7 @@ void reset_view_final( BOOL proceed, void* )
 		return;
 	}
 
-	gAgent.changeCameraToDefault();
-	
-	if (LLViewerJoystick::getInstance()->getOverrideCamera())
-	{
-		handle_toggle_flycam();
-	}
-
-	// reset avatar mode from eventual residual motion
-	if (LLToolMgr::getInstance()->inBuildMode())
-	{
-		LLViewerJoystick::getInstance()->moveAvatar(true);
-	}
-
-	gAgent.resetView(!gFloaterTools->getVisible());
-	gFloaterTools->close();
-	
-	gViewerWindow->showCursor();
-
-	// Switch back to basic toolset
-	LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
+	gAgent.resetView(TRUE, TRUE);
 }
 
 class LLViewLookAtLastChatter : public view_listener_t
@@ -4881,7 +4853,7 @@ class LLWorldCreateLandmark : public view_listener_t
 							  LLAssetType::AT_LANDMARK,
 							  LLInventoryType::IT_LANDMARK,
 							  NOT_WEARABLE, PERM_ALL, 
-							  NULL);
+							  new LLCreateLandmarkCallback);
 		return true;
 	}
 };
@@ -5301,6 +5273,10 @@ class LLShowFloater : public view_listener_t
 		{
 			LLFloaterActiveSpeakers::toggleInstance(LLSD());
 		}
+		else if (floater_name == "beacons")
+		{
+			LLFloaterBeacons::toggleInstance(LLSD());
+		}
 		return true;
 	}
 };
@@ -5348,6 +5324,10 @@ class LLFloaterVisible : public view_listener_t
 		{
 			new_value = LLFloaterActiveSpeakers::instanceVisible(LLSD());
 		}
+		else if (floater_name == "beacons")
+		{
+			new_value = LLFloaterBeacons::instanceVisible(LLSD());
+		}
 		gMenuHolder->findControl(control_name)->setValue(new_value);
 		return true;
 	}
@@ -5384,37 +5364,6 @@ class LLPromptShowURL : public view_listener_t
 	}
 };
 
-void callback_show_file(S32 option, void* data)
-{
-	std::string* filenamep = (std::string*)data;
-	if (0 == option)
-	{
-		load_url_local_file(*filenamep);
-	}
-	delete filenamep;
-}
-
-class LLPromptShowFile : public view_listener_t
-{
-	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
-	{
-		std::string param = userdata.asString();
-		std::string::size_type offset = param.find(",");
-		if (offset != param.npos)
-		{
-			std::string alert = param.substr(0, offset);
-			std::string file = param.substr(offset+1);
-			std::string* file_copy = new std::string(file);
-			gViewerWindow->alertXml(alert, callback_show_file, file_copy);
-		}
-		else
-		{
-			llinfos << "PromptShowFile invalid parameters! Expecting \"ALERT,FILE\"." << llendl;
-		}
-		return true;
-	}
-};
-
 class LLShowAgentProfile : public view_listener_t
 {
 	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
@@ -6038,10 +5987,10 @@ namespace
 
 void queue_actions(LLFloaterScriptQueue* q, const std::string& noscriptmsg, const std::string& nomodmsg)
 {
-	// Apply until an object fails
 	QueueObjects func(q);
-	const bool firstonly = true;
-	bool fail = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&func, firstonly);
+	LLSelectMgr *mgr = LLSelectMgr::getInstance();
+	LLObjectSelectionHandle selectHandle = mgr->getSelection();
+	bool fail = selectHandle->applyToObjects(&func);
 	if(fail)
 	{
 		if ( !func.scripted )
@@ -6066,61 +6015,67 @@ void queue_actions(LLFloaterScriptQueue* q, const std::string& noscriptmsg, cons
 	}
 }
 
+void handle_compile_queue(std::string to_lang)
+{
+	LLFloaterCompileQueue* queue;
+	if (to_lang == "mono")
+	{
+		queue = LLFloaterCompileQueue::create(TRUE);
+	}
+	else
+	{
+		queue = LLFloaterCompileQueue::create(FALSE);
+	}
+	queue_actions(queue, "CannotRecompileSelectObjectsNoScripts", "CannotRecompileSelectObjectsNoPermission");
+}
+
+void handle_reset_selection(void)
+{
+	LLFloaterResetQueue* queue = LLFloaterResetQueue::create();
+	queue_actions(queue, "CannotResetSelectObjectsNoScripts", "CannotResetSelectObjectsNoPermission");
+}
+
+void handle_set_run_selection(void)
+{
+	LLFloaterRunQueue* queue = LLFloaterRunQueue::create();
+	queue_actions(queue, "CannotSetRunningSelectObjectsNoScripts", "CannotSerRunningSelectObjectsNoPermission");
+}
+
+void handle_set_not_run_selection(void)
+{
+	LLFloaterNotRunQueue* queue = LLFloaterNotRunQueue::create();
+	queue_actions(queue, "CannotSetRunningNotSelectObjectsNoScripts", "CannotSerRunningNotSelectObjectsNoPermission");
+}
+
 class LLToolsSelectedScriptAction : public view_listener_t
 {
 	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
 	{
 		std::string action = userdata.asString();
-		LLFloaterScriptQueue* queue = NULL;
 		if (action == "compile mono")
 		{
-			queue = LLFloaterCompileQueue::create(TRUE);
+			handle_compile_queue("mono");
 		}
 		if (action == "compile lsl")
 		{
-			queue = LLFloaterCompileQueue::create(FALSE);
+			handle_compile_queue("lsl");
 		}
 		else if (action == "reset")
 		{
-			queue = LLFloaterResetQueue::create();
+			handle_reset_selection();
 		}
 		else if (action == "start")
 		{
-			queue = LLFloaterRunQueue::create();
+			handle_set_run_selection();
 		}
 		else if (action == "stop")
 		{
-			queue = LLFloaterNotRunQueue::create();
-		}
-		if (!queue)
-		{
-			return true;
+			handle_set_not_run_selection();
 		}
-
-		queue_actions(queue, "CannotRecompileSelectObjectsNoScripts", "CannotRecompileSelectObjectsNoPermission");
-
 		return true;
 	}
 };
 
-void handle_reset_selection(void*)
-{
-	LLFloaterResetQueue* queue = LLFloaterResetQueue::create();
-	queue_actions(queue, "CannotResetSelectObjectsNoScripts", "CannotResetSelectObjectsNoPermission");
-}
-
-void handle_set_run_selection(void*)
-{
-	LLFloaterRunQueue* queue = LLFloaterRunQueue::create();
-	queue_actions(queue, "CannotSetRunningSelectObjectsNoScripts", "CannotSerRunningSelectObjectsNoPermission");
-}
-
-void handle_set_not_run_selection(void*)
-{
-	LLFloaterNotRunQueue* queue = LLFloaterNotRunQueue::create();
-	queue_actions(queue, "CannotSetRunningNotSelectObjectsNoScripts", "CannotSerRunningNotSelectObjectsNoPermission");
-}
-
 void handle_selected_texture_info(void*)
 {
 	for (LLObjectSelection::valid_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_begin();
@@ -7139,148 +7094,6 @@ class LLViewCheckHighlightTransparent : public view_listener_t
 	}
 };
 
-class LLViewBeaconWidth : public view_listener_t
-{
-	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
-	{
-		std::string width = userdata.asString();
-		if(width == "1")
-		{
-			gSavedSettings.setS32("DebugBeaconLineWidth", 1);
-		}
-		else if(width == "4")
-		{
-			gSavedSettings.setS32("DebugBeaconLineWidth", 4);
-		}
-		else if(width == "16")
-		{
-			gSavedSettings.setS32("DebugBeaconLineWidth", 16);
-		}
-		else if(width == "32")
-		{
-			gSavedSettings.setS32("DebugBeaconLineWidth", 32);
-		}
-
-		return true;
-	}
-};
-
-
-class LLViewToggleBeacon : public view_listener_t
-{
-	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
-	{
-		std::string beacon = userdata.asString();
-		if (beacon == "scriptsbeacon")
-		{
-			LLPipeline::toggleRenderScriptedBeacons(NULL);
-			gSavedSettings.setBOOL( "scriptsbeacon", LLPipeline::getRenderScriptedBeacons(NULL) );
-			// toggle the other one off if it's on
-			if (LLPipeline::getRenderScriptedBeacons(NULL) && LLPipeline::getRenderScriptedTouchBeacons(NULL))
-			{
-				LLPipeline::toggleRenderScriptedTouchBeacons(NULL);
-				gSavedSettings.setBOOL( "scripttouchbeacon", LLPipeline::getRenderScriptedTouchBeacons(NULL) );
-			}
-		}
-		else if (beacon == "physicalbeacon")
-		{
-			LLPipeline::toggleRenderPhysicalBeacons(NULL);
-			gSavedSettings.setBOOL( "physicalbeacon", LLPipeline::getRenderPhysicalBeacons(NULL) );
-		}
-		else if (beacon == "soundsbeacon")
-		{
-			LLPipeline::toggleRenderSoundBeacons(NULL);
-			gSavedSettings.setBOOL( "soundsbeacon", LLPipeline::getRenderSoundBeacons(NULL) );
-		}
-		else if (beacon == "particlesbeacon")
-		{
-			LLPipeline::toggleRenderParticleBeacons(NULL);
-			gSavedSettings.setBOOL( "particlesbeacon", LLPipeline::getRenderParticleBeacons(NULL) );
-		}
-		else if (beacon == "scripttouchbeacon")
-		{
-			LLPipeline::toggleRenderScriptedTouchBeacons(NULL);
-			gSavedSettings.setBOOL( "scripttouchbeacon", LLPipeline::getRenderScriptedTouchBeacons(NULL) );
-			// toggle the other one off if it's on
-			if (LLPipeline::getRenderScriptedBeacons(NULL) && LLPipeline::getRenderScriptedTouchBeacons(NULL))
-			{
-				LLPipeline::toggleRenderScriptedBeacons(NULL);
-				gSavedSettings.setBOOL( "scriptsbeacon", LLPipeline::getRenderScriptedBeacons(NULL) );
-			}
-		}
-		else if (beacon == "renderbeacons")
-		{
-			LLPipeline::toggleRenderBeacons(NULL);
-			gSavedSettings.setBOOL( "renderbeacons", LLPipeline::getRenderBeacons(NULL) );
-			// toggle the other one on if it's not
-			if (!LLPipeline::getRenderBeacons(NULL) && !LLPipeline::getRenderHighlights(NULL))
-			{
-				LLPipeline::toggleRenderHighlights(NULL);
-				gSavedSettings.setBOOL( "renderhighlights", LLPipeline::getRenderHighlights(NULL) );
-			}
-		}
-		else if (beacon == "renderhighlights")
-		{
-			LLPipeline::toggleRenderHighlights(NULL);
-			gSavedSettings.setBOOL( "renderhighlights", LLPipeline::getRenderHighlights(NULL) );
-			// toggle the other one on if it's not
-			if (!LLPipeline::getRenderBeacons(NULL) && !LLPipeline::getRenderHighlights(NULL))
-			{
-				LLPipeline::toggleRenderBeacons(NULL);
-				gSavedSettings.setBOOL( "renderbeacons", LLPipeline::getRenderBeacons(NULL) );
-			}
-		}
-			
-		return true;
-	}
-};
-
-class LLViewCheckBeaconEnabled : public view_listener_t
-{
-	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
-	{
-		std::string beacon = userdata["data"].asString();
-		bool new_value = false;
-		if (beacon == "scriptsbeacon")
-		{
-			new_value = gSavedSettings.getBOOL( "scriptsbeacon");
-			LLPipeline::setRenderScriptedBeacons(new_value);
-		}
-		else if (beacon == "physicalbeacon")
-		{
-			new_value = gSavedSettings.getBOOL( "physicalbeacon");
-			LLPipeline::setRenderPhysicalBeacons(new_value);
-		}
-		else if (beacon == "soundsbeacon")
-		{
-			new_value = gSavedSettings.getBOOL( "soundsbeacon");
-			LLPipeline::setRenderSoundBeacons(new_value);
-		}
-		else if (beacon == "particlesbeacon")
-		{
-			new_value = gSavedSettings.getBOOL( "particlesbeacon");
-			LLPipeline::setRenderParticleBeacons(new_value);
-		}
-		else if (beacon == "scripttouchbeacon")
-		{
-			new_value = gSavedSettings.getBOOL( "scripttouchbeacon");
-			LLPipeline::setRenderScriptedTouchBeacons(new_value);
-		}
-		else if (beacon == "renderbeacons")
-		{
-			new_value = gSavedSettings.getBOOL( "renderbeacons");
-			LLPipeline::setRenderBeacons(new_value);
-		}
-		else if (beacon == "renderhighlights")
-		{
-			new_value = gSavedSettings.getBOOL( "renderhighlights");
-			LLPipeline::setRenderHighlights(new_value);
-		}
-		gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
-		return true;
-	}
-};
-
 class LLViewToggleRenderType : public view_listener_t
 {
 	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
@@ -7622,12 +7435,11 @@ void initialize_menus()
 	addMenu(new LLViewMouselook(), "View.Mouselook");
 	addMenu(new LLViewBuildMode(), "View.BuildMode");
 	addMenu(new LLViewJoystickFlycam(), "View.JoystickFlycam");
+	addMenu(new LLViewCommunicate(), "View.Communicate");
 	addMenu(new LLViewResetView(), "View.ResetView");
 	addMenu(new LLViewLookAtLastChatter(), "View.LookAtLastChatter");
 	addMenu(new LLViewShowHoverTips(), "View.ShowHoverTips");
 	addMenu(new LLViewHighlightTransparent(), "View.HighlightTransparent");
-	addMenu(new LLViewToggleBeacon(), "View.ToggleBeacon");
-	addMenu(new LLViewBeaconWidth(), "View.BeaconWidth");
 	addMenu(new LLViewToggleRenderType(), "View.ToggleRenderType");
 	addMenu(new LLViewShowHUDAttachments(), "View.ShowHUDAttachments");
 	addMenu(new LLViewZoomOut(), "View.ZoomOut");
@@ -7643,7 +7455,6 @@ void initialize_menus()
 	addMenu(new LLViewCheckJoystickFlycam(), "View.CheckJoystickFlycam");
 	addMenu(new LLViewCheckShowHoverTips(), "View.CheckShowHoverTips");
 	addMenu(new LLViewCheckHighlightTransparent(), "View.CheckHighlightTransparent");
-	addMenu(new LLViewCheckBeaconEnabled(), "View.CheckBeaconEnabled");
 	addMenu(new LLViewCheckRenderType(), "View.CheckRenderType");
 	addMenu(new LLViewCheckHUDAttachments(), "View.CheckHUDAttachments");
 
@@ -7777,7 +7588,6 @@ void initialize_menus()
 	// Generic actions
 	addMenu(new LLShowFloater(), "ShowFloater");
 	addMenu(new LLPromptShowURL(), "PromptShowURL");
-	addMenu(new LLPromptShowFile(), "PromptShowFile");
 	addMenu(new LLShowAgentProfile(), "ShowAgentProfile");
 	addMenu(new LLShowAgentGroups(), "ShowAgentGroups");
 	addMenu(new LLToggleControl(), "ToggleControl");
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index e003e90..495e826 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -50,7 +50,6 @@ void cleanup_menus();
 void show_debug_menus(); // checks for if menus should be shown first.
 void show_context_menu( S32 x, S32 y, MASK mask );
 void show_build_mode_context_menu(S32 x, S32 y, MASK mask);
-void load_url_local_file(const std::string& file_name);
 BOOL enable_save_into_inventory(void*);
 void handle_reset_view();
 void handle_cut(void*);
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 5dd760e..d9d8636 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -503,7 +503,7 @@ void handle_compress_image(void*)
 			}
 			else
 			{
-				llinfos << "Compression failed: " << LLImageBase::getLastError() << llendl;
+				llinfos << "Compression failed: " << LLImage::getLastError() << llendl;
 			}
 
 			infile = picker.getNextFile();
@@ -554,9 +554,9 @@ void upload_new_resource(const std::string& src_filename, std::string name,
 												 IMG_CODEC_BMP ))
 		{
 			error_message = llformat( "Problem with file %s:\n\n%s\n",
-					src_filename.c_str(), LLImageBase::getLastError().c_str());
+					 src_filename.c_str(), LLImage::getLastError().c_str());
 			args["[FILE]"] = src_filename;
-			args["[ERROR]"] = LLImageBase::getLastError();
+			args["[ERROR]"] = LLImage::getLastError();
 			upload_error(error_message, "ProblemWithFile", filename, args);
 			return;
 		}
@@ -569,9 +569,9 @@ void upload_new_resource(const std::string& src_filename, std::string name,
 												 IMG_CODEC_TGA ))
 		{
 			error_message = llformat("Problem with file %s:\n\n%s\n",
-					src_filename.c_str(), LLImageBase::getLastError().c_str());
+					src_filename.c_str(), LLImage::getLastError().c_str());
 			args["[FILE]"] = src_filename;
-			args["[ERROR]"] = LLImageBase::getLastError();
+			args["[ERROR]"] = LLImage::getLastError();
 			upload_error(error_message, "ProblemWithFile", filename, args);
 			return;
 		}
@@ -584,9 +584,9 @@ void upload_new_resource(const std::string& src_filename, std::string name,
 												 IMG_CODEC_JPEG ))
 		{
 			error_message = llformat("Problem with file %s:\n\n%s\n",
-					src_filename.c_str(), LLImageBase::getLastError().c_str());
+					src_filename.c_str(), LLImage::getLastError().c_str());
 			args["[FILE]"] = src_filename;
-			args["[ERROR]"] = LLImageBase::getLastError();
+			args["[ERROR]"] = LLImage::getLastError();
 			upload_error(error_message, "ProblemWithFile", filename, args);
 			return;
 		}
@@ -599,9 +599,9 @@ void upload_new_resource(const std::string& src_filename, std::string name,
  												 IMG_CODEC_PNG ))
  		{
  			error_message = llformat("Problem with file %s:\n\n%s\n",
- 					src_filename.c_str(), LLImageBase::getLastError().c_str());
+ 					src_filename.c_str(), LLImage::getLastError().c_str());
  			args["[FILE]"] = src_filename;
- 			args["[ERROR]"] = LLImageBase::getLastError();
+ 			args["[ERROR]"] = LLImage::getLastError();
  			upload_error(error_message, "ProblemWithFile", filename, args);
  			return;
  		}
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 0e39026..30e5e26 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -356,7 +356,7 @@ void process_layer_data(LLMessageSystem *mesgsys, void **user_data)
 // 		size_t nread = fread(buffer, 1, length, fXML);
 // 		if (nread < (size_t) length)
 // 		{
-// 			llwarns << "Short read" << llendl;
+// 			LL_WARNS("Messaging") << "Short read" << LL_ENDL;
 // 		}
 // 		buffer[nread] = '\0';
 // 		fclose(fXML);
@@ -3308,8 +3308,7 @@ void process_sound_trigger(LLMessageSystem *msg, void **)
 		return;
 	}
 
-	F32 volume = gSavedSettings.getBOOL("MuteSounds") ? 0.f : (gain * gSavedSettings.getF32("AudioLevelSFX"));
-	gAudiop->triggerSound(sound_id, owner_id, volume, pos_global);
+	gAudiop->triggerSound(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, pos_global);
 }
 
 void process_preload_sound(LLMessageSystem *msg, void **user_data)
@@ -3506,6 +3505,15 @@ void process_sim_stats(LLMessageSystem *msg, void **user_data)
 		case LL_SIM_STAT_SIMPHYSICSMEMORY:
 			LLViewerStats::getInstance()->mPhysicsMemoryAllocated.addValue(stat_value);
 			break;
+		case LL_SIM_STAT_SIMSPARETIME:
+			LLViewerStats::getInstance()->mSimSpareMsec.addValue(stat_value);
+			break;
+		case LL_SIM_STAT_SIMSLEEPTIME:
+			LLViewerStats::getInstance()->mSimSleepMsec.addValue(stat_value);
+			break;
+		case LL_SIM_STAT_IOPUMPTIME:
+			LLViewerStats::getInstance()->mSimPumpIOMsec.addValue(stat_value);
+			break;
 		default:
 			// Used to be a commented out warning.
  			LL_DEBUGS("Messaging") << "Unknown stat id" << stat_id << LL_ENDL;
@@ -4718,7 +4726,7 @@ void process_teleport_local(LLMessageSystem *msg,void**)
 	gAgent.slamLookAt(look_at);
 
 	// likewise make sure the camera is behind the avatar
-	gAgent.resetView(TRUE);
+	gAgent.resetView(TRUE, TRUE);
 
 	// send camera update to new region
 	gAgent.updateCamera();
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index 13d432a..25bdcb7 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -58,10 +58,22 @@ static LLGridData gGridInfo[GRID_INFO_COUNT] =
 	  "util.aruna.lindenlab.com",
 	  "https://login.aruna.lindenlab.com/cgi-bin/login.cgi",
 	  "http://aruna-secondlife.webdev.lindenlab.com/helpers/" },
+	{ "Bharati",
+	  "util.bharati.lindenlab.com",
+	  "https://login.bharati.lindenlab.com/cgi-bin/login.cgi",
+	  "http://bharati-secondlife.webdev.lindenlab.com/helpers/" },
+	{ "Chandra",
+	  "util.chandra.lindenlab.com",
+	  "https://login.chandra.lindenlab.com/cgi-bin/login.cgi",
+	  "http://chandra-secondlife.webdev.lindenlab.com/helpers/" },
 	{ "Damballah",
 	  "util.damballah.lindenlab.com",
 	  "https://login.damballah.lindenlab.com/cgi-bin/login.cgi",
 	  "http://damballah-secondlife.webdev.lindenlab.com/helpers/" },
+	{ "Danu",
+	  "util.danu.lindenlab.com",
+	  "https://login.danu.lindenlab.com/cgi-bin/login.cgi",
+	  "http://danu-secondlife.webdev.lindenlab.com/helpers/" },
 	{ "Durga",
 	  "util.durga.lindenlab.com",
 	  "https://login.durga.lindenlab.com/cgi-bin/login.cgi",
@@ -82,6 +94,10 @@ static LLGridData gGridInfo[GRID_INFO_COUNT] =
 	  "util.nandi.lindenlab.com",
 	  "https://login.nandi.lindenlab.com/cgi-bin/login.cgi",
 	  "http://nandi-secondlife.webdev.lindenlab.com/helpers/" },
+	{ "Parvati",
+	  "util.parvati.lindenlab.com",
+	  "https://login.parvati.lindenlab.com/cgi-bin/login.cgi",
+	  "http://parvati-secondlife.webdev.lindenlab.com/helpers/" },
 	{ "Radha",
 	  "util.radha.lindenlab.com",
 	  "https://login.radha.lindenlab.com/cgi-bin/login.cgi",
@@ -98,6 +114,10 @@ static LLGridData gGridInfo[GRID_INFO_COUNT] =
 	  "util.shakti.lindenlab.com",
 	  "https://login.shakti.lindenlab.com/cgi-bin/login.cgi",
 	  "http://shakti-secondlife.webdev.lindenlab.com/helpers/" },
+	{ "Skanda",
+	  "util.skanda.lindenlab.com",
+	  "https://login.skanda.lindenlab.com/cgi-bin/login.cgi",
+	  "http://skanda-secondlife.webdev.lindenlab.com/helpers/" },
 	{ "Soma",
 	  "util.soma.lindenlab.com",
 	  "https://login.soma.lindenlab.com/cgi-bin/login.cgi",
diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h
index 53bb0ab..73c3a5d 100644
--- a/indra/newview/llviewernetwork.h
+++ b/indra/newview/llviewernetwork.h
@@ -41,16 +41,21 @@ enum EGridInfo
 	GRID_INFO_ADITI,
 	GRID_INFO_AGNI,
 	GRID_INFO_ARUNA,
+	GRID_INFO_BHARATI,
+	GRID_INFO_CHANDRA,
 	GRID_INFO_DAMBALLAH,
+	GRID_INFO_DANU,
 	GRID_INFO_DURGA,
 	GRID_INFO_GANGA,
 	GRID_INFO_MITRA,
 	GRID_INFO_MOHINI,
 	GRID_INFO_NANDI,
+	GRID_INFO_PARVATI,
 	GRID_INFO_RADHA,
 	GRID_INFO_RAVI,
 	GRID_INFO_SIVA,
 	GRID_INFO_SHAKTI,
+	GRID_INFO_SKANDA,
 	GRID_INFO_SOMA,
 	GRID_INFO_UMA,
 	GRID_INFO_VAAK,
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index c560ced..6dc9af1 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -150,6 +150,8 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco
 	  res = new LLVOGround(id, pcode, regionp); break;
 	case LL_VO_PART_GROUP:
 	  res = new LLVOPartGroup(id, pcode, regionp); break;
+	case LL_VO_HUD_PART_GROUP:
+	  res = new LLVOHUDPartGroup(id, pcode, regionp); break;
 	case LL_VO_WL_SKY:
 	  res = new LLVOWLSky(id, pcode, regionp); break;
 	default:
@@ -159,7 +161,7 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco
 	return res;
 }
 
-LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
+LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, BOOL is_global)
 :	LLPrimitive(),
 	mChildList(),
 	mID(id),
@@ -201,7 +203,10 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
 	mMedia(NULL),
 	mClickAction(0)
 {
-	llassert(mRegionp);
+	if(!is_global)
+	{
+		llassert(mRegionp);
+	}
 
 	LLPrimitive::init_primitive(pcode);
 
@@ -209,7 +214,11 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
 	mLastInterpUpdateSecs = LLFrameTimer::getElapsedSeconds();
 
 	mPositionRegion = LLVector3(0.f, 0.f, 0.f);
-	mPositionAgent = mRegionp->getOriginAgent();
+
+	if(!is_global)
+	{
+		mPositionAgent = mRegionp->getOriginAgent();
+	}
 
 	LLViewerObject::sNumObjects++;
 }
@@ -2763,12 +2772,6 @@ void LLViewerObject::setPixelAreaAndAngle(LLAgent &agent)
 
 BOOL LLViewerObject::updateLOD()
 {
-	// Update volume of looping sounds
-	if (mAudioSourcep && mAudioSourcep->isLoop())
-	{
-		F32 volume = gSavedSettings.getBOOL("MuteSounds") ? 0.f : (mAudioGain * gSavedSettings.getF32("AudioLevelSFX"));
-		mAudioSourcep->setGain(volume);
-	}
 	return FALSE;
 }
 
@@ -3055,28 +3058,38 @@ LLNameValue *LLViewerObject::getNVPair(const std::string& name) const
 
 void LLViewerObject::updatePositionCaches() const
 {
-	if (!isRoot())
-	{
-		mPositionRegion = ((LLViewerObject *)getParent())->getPositionRegion() + getPosition() * getParent()->getRotation();
-		mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
-	}
-	else
+	if(mRegionp)
 	{
-		mPositionRegion = getPosition();
-		mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
+		if (!isRoot())
+		{
+			mPositionRegion = ((LLViewerObject *)getParent())->getPositionRegion() + getPosition() * getParent()->getRotation();
+			mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
+		}
+		else
+		{
+			mPositionRegion = getPosition();
+			mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
+		}
 	}
 }
 
 const LLVector3d LLViewerObject::getPositionGlobal() const
-{
-	LLVector3d position_global = mRegionp->getPosGlobalFromRegion(getPositionRegion());
-
-	if (isAttachment())
+{	
+	if(mRegionp)
 	{
-		position_global = gAgent.getPosGlobalFromAgent(getRenderPosition());
-	}
+		LLVector3d position_global = mRegionp->getPosGlobalFromRegion(getPositionRegion());
 
-	return position_global;
+		if (isAttachment())
+		{
+			position_global = gAgent.getPosGlobalFromAgent(getRenderPosition());
+		}		
+		return position_global;
+	}
+	else
+	{
+		LLVector3d position_global(getPosition());
+		return position_global;
+	}	
 }
 
 const LLVector3 &LLViewerObject::getPositionAgent() const
@@ -3398,6 +3411,7 @@ LLViewerObject* LLViewerObject::getRootEdit() const
 
 BOOL LLViewerObject::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
 										  S32 face,
+										  BOOL pick_transparent,
 										  S32* face_hit,
 										  LLVector3* intersection,
 										  LLVector2* tex_coord,
@@ -3407,6 +3421,20 @@ BOOL LLViewerObject::lineSegmentIntersect(const LLVector3& start, const LLVector
 	return false;
 }
 
+BOOL LLViewerObject::lineSegmentBoundingBox(const LLVector3& start, const LLVector3& end)
+{
+	if (mDrawable.isNull() || mDrawable->isDead())
+	{
+		return FALSE;
+	}
+
+	const LLVector3* ext = mDrawable->getSpatialExtents();
+
+	LLVector3 center = (ext[1]+ext[0])*0.5f;
+	LLVector3 size = (ext[1]-ext[0])*0.5f;
+
+	return LLLineSegmentBoxIntersect(start, end, center, size);
+}
 
 U8 LLViewerObject::getMediaType() const
 {
@@ -4331,8 +4359,7 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow
 	{
 		BOOL queue = flags & LL_SOUND_FLAG_QUEUE;
 		mAudioGain = gain;
-		F32 volume = gSavedSettings.getBOOL("MuteSounds") ? 0.f : gain * gSavedSettings.getF32("AudioLevelSFX");
-		mAudioSourcep->setGain(volume);
+		mAudioSourcep->setGain(gain);
 		mAudioSourcep->setLoop(flags & LL_SOUND_FLAG_LOOP);
 		mAudioSourcep->setSyncMaster(flags & LL_SOUND_FLAG_SYNC_MASTER);
 		mAudioSourcep->setSyncSlave(flags & LL_SOUND_FLAG_SYNC_SLAVE);
@@ -4370,8 +4397,7 @@ void LLViewerObject::adjustAudioGain(const F32 gain)
 	if (mAudioSourcep)
 	{
 		mAudioGain = gain;
-		F32 volume = gSavedSettings.getBOOL("MuteSounds") ? 0.f : mAudioGain * gSavedSettings.getF32("AudioLevelSFX");
-		mAudioSourcep->setGain(volume);
+		mAudioSourcep->setGain(mAudioGain);
 	}
 }
 
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 06d385c..5827dc2 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -132,7 +132,7 @@ public:
 	typedef std::list<LLPointer<LLViewerObject> > child_list_t;
 	typedef const child_list_t const_child_list_t;
 
-	LLViewerObject(const LLUUID &id, const LLPCode type, LLViewerRegion *regionp);
+	LLViewerObject(const LLUUID &id, const LLPCode type, LLViewerRegion *regionp, BOOL is_global = FALSE);
 	MEM_TYPE_NEW(LLMemType::MTYPE_OBJECT);
 
 	virtual void markDead();				// Mark this object as dead, and clean up its references
@@ -248,6 +248,7 @@ public:
 	//returns TRUE if intersection detected and returns information about intersection
 	virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
 									  S32 face = -1,                          // which face to check, -1 = ALL_SIDES
+									  BOOL pick_transparent = FALSE,
 									  S32* face_hit = NULL,                   // which face was hit
 									  LLVector3* intersection = NULL,         // return the intersection point
 									  LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point
@@ -255,6 +256,8 @@ public:
 									  LLVector3* bi_normal = NULL             // return the surface bi-normal at the intersection point
 		);
 	
+	virtual BOOL lineSegmentBoundingBox(const LLVector3& start, const LLVector3& end);
+
 	virtual const LLVector3d getPositionGlobal() const;
 	virtual const LLVector3 &getPositionRegion() const;
 	virtual const LLVector3 getPositionEdit() const;
@@ -507,6 +510,7 @@ public:
 		LL_VO_PART_GROUP =			LL_PCODE_APP | 0x90,
 		LL_VO_TRIANGLE_TORUS =		LL_PCODE_APP | 0xa0,
 		LL_VO_WL_SKY =				LL_PCODE_APP | 0xb0, // should this be moved to 0x40?
+		LL_VO_HUD_PART_GROUP =		LL_PCODE_APP | 0xc0,
 	} EVOType;
 
 	LLUUID			mID;
@@ -705,8 +709,8 @@ public:
 class LLStaticViewerObject : public LLViewerObject
 {
 public:
-	LLStaticViewerObject(const LLUUID& id, const LLPCode type, LLViewerRegion* regionp)
-		: LLViewerObject(id,type,regionp)
+	LLStaticViewerObject(const LLUUID& id, const LLPCode type, LLViewerRegion* regionp, BOOL is_global = FALSE)
+		: LLViewerObject(id,type,regionp, is_global)
 	{ }
 
 	virtual void updateDrawable(BOOL force_damped);
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 163b039..f3d7bd9 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -163,15 +163,20 @@ U64 LLViewerObjectList::getIndex(const U32 local_id,
 
 BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject &object)
 {
-	U32 local_id = object.mLocalID;
-	LLHost region_host = object.getRegion()->getHost();
-	U32 ip = region_host.getAddress();
-	U32 port = region_host.getPort();
-	U64 ipport = (((U64)ip) << 32) | (U64)port;
-	U32 index = sIPAndPortToIndex[ipport];
+	if(object.getRegion())
+	{
+		U32 local_id = object.mLocalID;
+		LLHost region_host = object.getRegion()->getHost();
+		U32 ip = region_host.getAddress();
+		U32 port = region_host.getPort();
+		U64 ipport = (((U64)ip) << 32) | (U64)port;
+		U32 index = sIPAndPortToIndex[ipport];
+
+		U64	indexid = (((U64)index) << 32) | (U64)local_id;
+		return sIndexAndLocalIDToUUID.erase(indexid) > 0 ? TRUE : FALSE;
+	}
 
-	U64	indexid = (((U64)index) << 32) | (U64)local_id;
-	return sIndexAndLocalIDToUUID.erase(indexid) > 0 ? TRUE : FALSE;
+	return FALSE ;
 }
 
 void LLViewerObjectList::setUUIDAndLocal(const LLUUID &id,
@@ -822,8 +827,15 @@ void LLViewerObjectList::removeDrawable(LLDrawable* drawablep)
 
 	for (S32 i = 0; i < drawablep->getNumFaces(); i++)
 	{
-		LLViewerObject* objectp = drawablep->getFace(i)->getViewerObject();
-		mSelectPickList.erase(objectp);
+		LLFace* facep = drawablep->getFace(i) ;
+		if(facep)
+		{
+			   LLViewerObject* objectp = facep->getViewerObject();
+			   if(objectp)
+			   {
+					   mSelectPickList.erase(objectp);
+			   }
+		}
 	}
 }
 
@@ -898,7 +910,7 @@ void LLViewerObjectList::killAllObjects()
 	if (!mMapObjects.empty())
 	{
 		llwarns << "Some objects still on map object list!" << llendl;
-		mActiveObjects.clear();
+		mMapObjects.clear();
 	}
 }
 
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index 956ed03..5f29ea6 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -344,7 +344,7 @@ void LLViewerParcelMedia::processParcelMediaUpdate( LLMessageSystem *msg, void *
 	media_url = media_url_buffer;
 	msg->getU8("DataBlock", "MediaAutoScale", media_auto_scale);
 
-	if (msg->getNumberOfBlocks("DataBlockExtended")) // do we have the extended data?
+	if (msg->has("DataBlockExtended")) // do we have the extended data?
 	{
 		char media_type_buffer[257];
 		msg->getString("DataBlockExtended", "MediaType", 255, media_type_buffer);
diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index b50ddb6..392f8cd 100644
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -72,7 +72,7 @@ LLViewerParcelOverlay::LLViewerParcelOverlay(LLViewerRegion* region, F32 region_
 	mImageRaw = new LLImageRaw(mParcelGridsPerEdge, mParcelGridsPerEdge, OVERLAY_IMG_COMPONENTS);
 	mTexture->createGLTexture(0, mImageRaw);
 	gGL.getTexUnit(0)->activate();
-	mTexture->bind(0);
+	gGL.getTexUnit(0)->bind(mTexture);
 	mTexture->setClamp(TRUE, TRUE);
 	mTexture->setMipFilterNearest(TRUE);
 
@@ -748,7 +748,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines	()
 	LLSurface& land = mRegion->getLand();
 
 	LLGLSUIDefault gls_ui; // called from pipeline
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	LLGLDepthTest mDepthTest(GL_TRUE);
 
 	// Find camera height off the ground (not from zero)
@@ -826,7 +826,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines	()
 			continue;
 		}
 
-		gGL.begin(LLVertexBuffer::TRIANGLE_STRIP);
+		gGL.begin(LLRender::TRIANGLE_STRIP);
 
 		for (j = 0; j < vertex_per_edge; j++)
 		{
@@ -848,7 +848,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines	()
 			colorp  = mColorArray  + BYTES_PER_COLOR   * i;
 			vertexp = mVertexArray + FLOATS_PER_VERTEX * i;
 
-			gGL.begin(LLVertexBuffer::TRIANGLE_STRIP);
+			gGL.begin(LLRender::TRIANGLE_STRIP);
 
 			for (j = 0; j < vertex_per_edge; j++)
 			{
diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp
index d27e0df..95fb307 100644
--- a/indra/newview/llviewerpartsim.cpp
+++ b/indra/newview/llviewerpartsim.cpp
@@ -116,7 +116,8 @@ void LLViewerPart::init(LLPointer<LLViewerPartSource> sourcep, LLViewerImage *im
 //
 
 
-LLViewerPartGroup::LLViewerPartGroup(const LLVector3 &center_agent, const F32 box_side)
+LLViewerPartGroup::LLViewerPartGroup(const LLVector3 &center_agent, const F32 box_side, bool hud)
+ : mHud(hud)
 {
 	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mVOPartGroupp = NULL;
@@ -133,7 +134,14 @@ LLViewerPartGroup::LLViewerPartGroup(const LLVector3 &center_agent, const F32 bo
 	mCenterAgent = center_agent;
 	mBoxRadius = F_SQRT3*box_side*0.5f;
 
+	if (mHud)
+	{
+		mVOPartGroupp = (LLVOPartGroup *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_HUD_PART_GROUP, getRegion());
+	}
+	else
+	{
 	mVOPartGroupp = (LLVOPartGroup *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_PART_GROUP, getRegion());
+	}
 	mVOPartGroupp->setViewerPartGroup(this);
 	mVOPartGroupp->setPositionAgent(getCenterAgent());
 	F32 scale = box_side * 0.5f;
@@ -223,6 +231,12 @@ BOOL LLViewerPartGroup::posInGroup(const LLVector3 &pos, const F32 desired_size)
 BOOL LLViewerPartGroup::addPart(LLViewerPart* part, F32 desired_size)
 {
 	LLMemType mt(LLMemType::MTYPE_PARTICLES);
+
+	if (part->mFlags & LLPartData::LL_PART_HUD && !mHud)
+	{
+		return FALSE;
+	}
+
 	BOOL uniform_part = part->mScale.mV[0] == part->mScale.mV[1] && 
 					!(part->mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK);
 
@@ -530,7 +544,7 @@ LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part)
 		if(!return_group)
 		{
 			llassert_always(part->mPosAgent.isFinite());
-			LLViewerPartGroup *groupp = createViewerPartGroup(part->mPosAgent, desired_size);
+	LLViewerPartGroup *groupp = createViewerPartGroup(part->mPosAgent, desired_size, part->mFlags & LLPartData::LL_PART_HUD);
 			groupp->mUniformParticles = (part->mScale.mV[0] == part->mScale.mV[1] && 
 									!(part->mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK));
 			if (!groupp->addPart(part))
@@ -555,12 +569,12 @@ LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part)
 	return return_group ;
 }
 
-LLViewerPartGroup *LLViewerPartSim::createViewerPartGroup(const LLVector3 &pos_agent, const F32 desired_size)
+LLViewerPartGroup *LLViewerPartSim::createViewerPartGroup(const LLVector3 &pos_agent, const F32 desired_size, bool hud)
 {
 	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	//find a box that has a center position divisible by PART_SIM_BOX_SIDE that encompasses
 	//pos_agent
-	LLViewerPartGroup *groupp = new LLViewerPartGroup(pos_agent, desired_size);
+	LLViewerPartGroup *groupp = new LLViewerPartGroup(pos_agent, desired_size, hud);
 	mViewerPartGroups.push_back(groupp);
 	return groupp;
 }
diff --git a/indra/newview/llviewerpartsim.h b/indra/newview/llviewerpartsim.h
index 0f51240..b6001ee 100644
--- a/indra/newview/llviewerpartsim.h
+++ b/indra/newview/llviewerpartsim.h
@@ -87,7 +87,8 @@ class LLViewerPartGroup
 {
 public:
 	LLViewerPartGroup(const LLVector3 &center,
-					  const F32 box_radius);
+					  const F32 box_radius,
+					  bool hud);
 	virtual ~LLViewerPartGroup();
 
 	void cleanup();
@@ -115,6 +116,7 @@ public:
 	U32 mID;
 
 	F32 mSkippedTime;
+	bool mHud;
 
 protected:
 	LLVector3 mCenterAgent;
@@ -178,7 +180,7 @@ public:
 	U32 mID;
 
 protected:
-	LLViewerPartGroup *createViewerPartGroup(const LLVector3 &pos_agent, const F32 desired_size);
+	LLViewerPartGroup *createViewerPartGroup(const LLVector3 &pos_agent, const F32 desired_size, bool hud);
 	LLViewerPartGroup *put(LLViewerPart* part);
 
 	group_list_t mViewerPartGroups;
diff --git a/indra/newview/llviewerpartsource.cpp b/indra/newview/llviewerpartsource.cpp
index dcef8c2..13da131 100644
--- a/indra/newview/llviewerpartsource.cpp
+++ b/indra/newview/llviewerpartsource.cpp
@@ -33,6 +33,7 @@
 #include "llviewerpartsource.h"
 
 #include "llviewercontrol.h"
+#include "llrender.h"
 
 #include "llagent.h"
 #include "lldrawable.h"
@@ -69,7 +70,7 @@ void LLViewerPartSource::updatePart(LLViewerPart &part, const F32 dt)
 {
 }
 
-void LLViewerPartSource::update(const F32 dt)
+void LLViewerPartSource::update(const F32 dt) 
 {
 	llerrs << "Creating default part source!" << llendl;
 }
@@ -99,7 +100,7 @@ LLViewerPartSourceScript::LLViewerPartSourceScript(LLViewerObject *source_objp)
 	mSourceObjectp = source_objp;
 	mPosAgent = mSourceObjectp->getPositionAgent();
 	mImagep = gImageList.getImageFromFile("pixiesmall.j2c");
-	mImagep->bind();
+	gGL.getTexUnit(0)->bind(mImagep.get());
 	mImagep->setClamp(TRUE, TRUE);
 }
 
@@ -282,6 +283,10 @@ void LLViewerPartSourceScript::update(const F32 dt)
 
 			part->init(this, mImagep, NULL);
 			part->mFlags = mPartSysData.mPartData.mFlags;
+			if (!mSourceObjectp.isNull() && mSourceObjectp->isHUDAttachment())
+			{
+				part->mFlags |= LLPartData::LL_PART_HUD;
+			}
 			part->mMaxAge = mPartSysData.mPartData.mMaxAge;
 			part->mStartColor = mPartSysData.mPartData.mStartColor;
 			part->mEndColor = mPartSysData.mPartData.mEndColor;
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 08dc979..507481a 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -215,6 +215,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
 	mObjectPartition.push_back(new LLGrassPartition());		//PARTITION_GRASS
 	mObjectPartition.push_back(new LLVolumePartition());	//PARTITION_VOLUME
 	mObjectPartition.push_back(new LLBridgePartition());	//PARTITION_BRIDGE
+	mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE
 	mObjectPartition.push_back(NULL);						//PARTITION_NONE
 	
 }
@@ -1028,12 +1029,18 @@ void LLViewerRegion::updateCoarseLocations(LLMessageSystem* msg)
 	msg->getS16Fast(_PREHASH_Index, _PREHASH_You, agent_index);
 	msg->getS16Fast(_PREHASH_Index, _PREHASH_Prey, target_index);
 
+	BOOL has_agent_data = msg->has(_PREHASH_AgentData);
 	S32 count = msg->getNumberOfBlocksFast(_PREHASH_Location);
 	for(S32 i = 0; i < count; i++)
 	{
 		msg->getU8Fast(_PREHASH_Location, _PREHASH_X, x_pos, i);
 		msg->getU8Fast(_PREHASH_Location, _PREHASH_Y, y_pos, i);
 		msg->getU8Fast(_PREHASH_Location, _PREHASH_Z, z_pos, i);
+		LLUUID agent_id = LLUUID::null;
+		if(has_agent_data)
+		{
+			msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id, i);
+		}
 
 		//llinfos << "  object X: " << (S32)x_pos << " Y: " << (S32)y_pos
 		//		<< " Z: " << (S32)(z_pos * 4)
@@ -1059,6 +1066,10 @@ void LLViewerRegion::updateCoarseLocations(LLMessageSystem* msg)
 			pos <<= 8;
 			pos |= z_pos;
 			mMapAvatars.put(pos);
+			if(has_agent_data)
+			{
+				mMapAvatarIDs.put(agent_id);
+			}
 		}
 	}
 }
@@ -1387,8 +1398,12 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
 	capabilityNames.append("DispatchRegionInfo");
 	capabilityNames.append("EstateChangeInfo");
 	capabilityNames.append("EventQueueGet");
-	capabilityNames.append("FetchInventoryDescendents");
+	capabilityNames.append("FetchInventory");
+	capabilityNames.append("WebFetchInventoryDescendents");
+	capabilityNames.append("FetchLib");
+	capabilityNames.append("FetchLibDescendents");
 	capabilityNames.append("GroupProposalBallot");
+	capabilityNames.append("HomeLocation");
 	capabilityNames.append("MapLayer");
 	capabilityNames.append("MapLayerGod");
 	capabilityNames.append("NewFileAgentInventory");
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index d65ad23..097bfcc 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -81,6 +81,7 @@ public:
 		PARTITION_GRASS,
 		PARTITION_VOLUME,
 		PARTITION_BRIDGE,
+		PARTITION_HUD_PARTICLE,
 		PARTITION_NONE,
 		NUM_PARTITIONS
 	} eObjectPartitions;
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index a654120..44f6abe 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -108,7 +108,7 @@ GLint				gAvatarMatrixParam;
 LLViewerShaderMgr::LLViewerShaderMgr() :
 	mVertexShaderLevel(SHADER_COUNT, 0)
 {	
-/// Make sure WL Sky is the first program
+	/// Make sure WL Sky is the first program
 	mShaderList.push_back(&gWLSkyProgram);
 	mShaderList.push_back(&gWLCloudProgram);
 	mShaderList.push_back(&gAvatarProgram);
@@ -139,28 +139,28 @@ LLViewerShaderMgr * LLViewerShaderMgr::instance()
 	if(NULL == sInstance)
 	{
 		sInstance = new LLViewerShaderMgr();
-	}	
-	
-	return static_cast<LLViewerShaderMgr*>(sInstance);
 	}
 
+	return static_cast<LLViewerShaderMgr*>(sInstance);
+}
+
 void LLViewerShaderMgr::initAttribsAndUniforms(void)
-	{
+{
 	if (mReservedAttribs.empty())
-		{
+	{
 		mReservedAttribs.push_back("materialColor");
 		mReservedAttribs.push_back("specularColor");
 		mReservedAttribs.push_back("binormal");
-		
+
 		mAvatarAttribs.reserve(5);
 		mAvatarAttribs.push_back("weight");
 		mAvatarAttribs.push_back("clothing");
 		mAvatarAttribs.push_back("gWindDir");
 		mAvatarAttribs.push_back("gSinWaveParams");
 		mAvatarAttribs.push_back("gGravity");
-			
+
 		mAvatarUniforms.push_back("matrixPalette");
-			
+
 		mReservedUniforms.reserve(24);
 		mReservedUniforms.push_back("diffuseMap");
 		mReservedUniforms.push_back("specularMap");
@@ -186,16 +186,16 @@ void LLViewerShaderMgr::initAttribsAndUniforms(void)
 		mReservedUniforms.push_back("cloud_scale");
 		mReservedUniforms.push_back("gamma");
 		mReservedUniforms.push_back("scene_light_strength");
-			
+
 		mWLUniforms.push_back("camPosLocal");
-			
+
 		mTerrainUniforms.reserve(5);
 		mTerrainUniforms.push_back("detail_0");
 		mTerrainUniforms.push_back("detail_1");
 		mTerrainUniforms.push_back("detail_2");
 		mTerrainUniforms.push_back("detail_3");
 		mTerrainUniforms.push_back("alpha_ramp");
-	
+
 		mGlowUniforms.push_back("glowDelta");
 		mGlowUniforms.push_back("glowStrength");
 
@@ -204,7 +204,7 @@ void LLViewerShaderMgr::initAttribsAndUniforms(void)
 		mGlowExtractUniforms.push_back("lumWeights");
 		mGlowExtractUniforms.push_back("warmthWeights");
 		mGlowExtractUniforms.push_back("warmthAmount");
-	
+
 		mShinyUniforms.push_back("origin");
 
 		mWaterUniforms.reserve(12);
@@ -222,9 +222,9 @@ void LLViewerShaderMgr::initAttribsAndUniforms(void)
 		mWaterUniforms.push_back("kd");
 		mWaterUniforms.push_back("refScale");
 		mWaterUniforms.push_back("waterHeight");
-		}
-	}
-
+	}	
+}
+	
 
 //============================================================================
 // Set Levels
@@ -1087,12 +1087,12 @@ BOOL LLViewerShaderMgr::loadShadersWindLight()
 }
 
 std::string LLViewerShaderMgr::getShaderDirPrefix(void)
-	{
+{
 	return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "shaders/class");
-	}
+}
 
 void LLViewerShaderMgr::updateShaderUniforms(LLGLSLShader * shader)
-			{
+{
 	LLWLParamManager::instance()->updateShaderUniforms(shader);
 	LLWaterParamManager::instance()->updateShaderUniforms(shader);
 }
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index f33ad02..5ae8cdc 100644
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -77,6 +77,9 @@ public:
 	LLStat mSimAgentMsec;
 	LLStat mSimImagesMsec;
 	LLStat mSimScriptMsec;
+	LLStat mSimSpareMsec;
+	LLStat mSimSleepMsec;
+	LLStat mSimPumpIOMsec;
 
 	LLStat mSimMainAgents;
 	LLStat mSimChildAgents;
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 8a55b3f..1dda1ca 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -1402,8 +1402,7 @@ void LLViewerTextEditor::openEmbeddedSound( LLInventoryItem* item )
 	const F32 SOUND_GAIN = 1.0f;
 	if(gAudiop)
 	{
-		F32 volume = gSavedSettings.getBOOL("MuteSounds") ? 0.f : (SOUND_GAIN * gSavedSettings.getF32("AudioLevelSFX"));
-		gAudiop->triggerSound(item->getAssetUUID(), gAgentID, volume, lpos_global);
+		gAudiop->triggerSound(item->getAssetUUID(), gAgentID, SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_UI, lpos_global);
 	}
 	showCopyToInvDialog( item );
 }
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 64c042a..106ad08 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -168,6 +168,7 @@
 #include "llviewerobjectlist.h"
 #include "llviewerparcelmgr.h"
 #include "llviewerregion.h"
+#include "llviewershadermgr.h"
 #include "llviewerstats.h"
 #include "llvoavatar.h"
 #include "llvovolume.h"
@@ -182,7 +183,6 @@
 #include "llviewernetwork.h"
 
 #if LL_WINDOWS
-#include "llwindebug.h"
 #include <tchar.h> // For Unicode conversion methods
 #endif
 
@@ -218,6 +218,7 @@ LLVector3       gDebugRaycastIntersection;
 LLVector2       gDebugRaycastTexCoord;
 LLVector3       gDebugRaycastNormal;
 LLVector3       gDebugRaycastBinormal;
+S32				gDebugRaycastFaceHit;
 
 // HUD display lines in lower right
 BOOL				gDisplayWindInfo = FALSE;
@@ -1102,6 +1103,7 @@ void LLViewerWindow::handleQuit(LLWindow *window)
 void LLViewerWindow::handleResize(LLWindow *window,  S32 width,  S32 height)
 {
 	reshape(width, height);
+	mResDirty = true;
 }
 
 // The top-level window has gained focus (e.g. via ALT-TAB)
@@ -1258,6 +1260,8 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
 
 BOOL LLViewerWindow::handleActivateApp(LLWindow *window, BOOL activating)
 {
+	//if (!activating) gAgent.changeCameraToDefault();
+
 	LLViewerJoystick::getInstance()->setNeedsReset(true);
 	return FALSE;
 }
@@ -1410,7 +1414,11 @@ LLViewerWindow::LLViewerWindow(
 	mHideCursorPermanent( FALSE ),
 	mCursorHidden(FALSE),
 	mIgnoreActivate( FALSE ),
-	mHoverPick()
+	mHoverPick(),
+	mResDirty(false),
+	mStatesDirty(false),
+	mIsFullscreenChecked(false),
+	mCurrResolutionIndex(0)
 {
 	// Default to application directory.
 	LLViewerWindow::sSnapshotBaseName = "Snapshot";
@@ -1426,12 +1434,12 @@ LLViewerWindow::LLViewerWindow(
 		!gNoRender,
 		ignore_pixel_depth,
 		gSavedSettings.getU32("RenderFSAASamples"));
-#if LL_WINDOWS
-	if (!LLWinDebug::checkExceptionHandler())
+
+	if (!LLAppViewer::instance()->restoreErrorTrap())
 	{
-		LL_WARNS("Window") << " Someone took over my exception handler (post createWindow)!" << LL_ENDL;
+		LL_WARNS("Window") << " Someone took over my signal/exception handler (post createWindow)!" << LL_ENDL;
 	}
-#endif
+
 
 	if (NULL == mWindow)
 	{
@@ -1545,7 +1553,7 @@ void LLViewerWindow::initGLDefaults()
 	glPixelStorei(GL_PACK_ALIGNMENT,1);
 	glPixelStorei(GL_UNPACK_ALIGNMENT,1);
 
-	glEnable(GL_TEXTURE_2D);
+	gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
 
 	// lights for objects
 	glShadeModel( GL_SMOOTH );
@@ -3042,8 +3050,9 @@ BOOL LLViewerWindow::handlePerFrameHover()
 
 	if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST))
 	{
-		gDebugRaycastObject = cursorIntersect(-1, -1, 512.f, NULL, -1,
-											  NULL,
+		gDebugRaycastFaceHit = -1;
+		gDebugRaycastObject = cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE,
+											  &gDebugRaycastFaceHit,
 											  &gDebugRaycastIntersection,
 											  &gDebugRaycastTexCoord,
 											  &gDebugRaycastNormal,
@@ -3184,7 +3193,7 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
 		// Render light for editing
 		if (LLSelectMgr::sRenderLightRadius && LLToolMgr::getInstance()->inEdit())
 		{
-			LLImageGL::unbindTexture(0);
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			LLGLEnable gls_blend(GL_BLEND);
 			LLGLEnable gls_cull(GL_CULL_FACE);
 			LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
@@ -3398,7 +3407,7 @@ void LLViewerWindow::schedulePick(LLPickInfo& pick_info)
 	llassert_always(pick_info.mScreenRegion.notNull());
 	mPicks.push_back(pick_info);
 	
-	S32 scaled_x = llround((F32)pick_info.mMousePt.mX * mDisplayScale.mV[VX]);
+	/*S32 scaled_x = llround((F32)pick_info.mMousePt.mX * mDisplayScale.mV[VX]);
 	S32 scaled_y = llround((F32)pick_info.mMousePt.mY * mDisplayScale.mV[VY]);
 
 	// Default to not hitting anything
@@ -3467,7 +3476,7 @@ void LLViewerWindow::schedulePick(LLPickInfo& pick_info)
 
 	setup3DRender();
 	setup2DRender();
-	setupViewport();
+	setupViewport();*/
 
 	// delay further event processing until we receive results of pick
 	mWindow->delayInputProcessing();
@@ -3529,6 +3538,7 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot,  BOOL pick_trans
 LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 depth,
 												LLViewerObject *this_object,
 												S32 this_face,
+												BOOL pick_transparent,
 												S32* face_hit,
 												LLVector3 *intersection,
 												LLVector2 *uv,
@@ -3562,7 +3572,7 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
 	{
 		if (this_object->isHUDAttachment()) // is a HUD object?
 		{
-			if (this_object->lineSegmentIntersect(mouse_hud_start, mouse_hud_end, this_face,
+			if (this_object->lineSegmentIntersect(mouse_hud_start, mouse_hud_end, this_face, pick_transparent,
 												  face_hit, intersection, uv, normal, binormal))
 			{
 				found = this_object;
@@ -3571,7 +3581,7 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
 		
 		else // is a world object
 		{
-			if (this_object->lineSegmentIntersect(mouse_world_start, mouse_world_end, this_face,
+			if (this_object->lineSegmentIntersect(mouse_world_start, mouse_world_end, this_face, pick_transparent,
 												  face_hit, intersection, uv, normal, binormal))
 			{
 				found = this_object;
@@ -3581,13 +3591,13 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
 
 	else // check ALL objects
 			{
-		found = gPipeline.lineSegmentIntersectInHUD(mouse_hud_start, mouse_hud_end,
+		found = gPipeline.lineSegmentIntersectInHUD(mouse_hud_start, mouse_hud_end, pick_transparent,
 													face_hit, intersection, uv, normal, binormal);
 
 		if (!found) // if not found in HUD, look in world:
 
 			{
-			found = gPipeline.lineSegmentIntersectInWorld(mouse_world_start, mouse_world_end,
+			found = gPipeline.lineSegmentIntersectInWorld(mouse_world_start, mouse_world_end, pick_transparent,
 														  face_hit, intersection, uv, normal, binormal);
 			}
 
@@ -3811,13 +3821,8 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image)
 		return FALSE;
 	}
 
-	std::string extension("." + image->getExtension());
-	if (extension.empty())
-	{
-		extension = (gSavedSettings.getBOOL("CompressSnapshotsToDisk")) ? ".j2c" : ".bmp";
-	}
-
 	LLFilePicker::ESaveFilter pick_type;
+	std::string extension("." + image->getExtension());
 	if (extension == ".j2c")
 		pick_type = LLFilePicker::FFSAVE_J2C;
 	else if (extension == ".bmp")
@@ -3835,7 +3840,8 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image)
 	if ( ! isSnapshotLocSet())		
 	{
 		std::string proposed_name( sSnapshotBaseName );
-		proposed_name.append( extension );
+
+		// getSaveFile will append an appropriate extension to the proposed name, based on the ESaveFilter constant passed in.
 
 		// pick a directory in which to save
 		LLFilePicker& picker = LLFilePicker::instance();
@@ -4152,7 +4158,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 					
 					snapshot_width = image_width;
 					snapshot_height = image_height;
-					target.allocate(snapshot_width, snapshot_height, GL_RGBA, TRUE, GL_TEXTURE_RECTANGLE_ARB, TRUE);
+					target.allocate(snapshot_width, snapshot_height, GL_RGBA, TRUE, LLTexUnit::TT_RECT_TEXTURE, TRUE);
 					window_width = snapshot_width;
 					window_height = snapshot_height;
 					scale_factor = 1.f;
@@ -4380,7 +4386,7 @@ void LLViewerWindow::drawMouselookInstructions()
 		llround(font->getLineHeight() + 2 * INSTRUCTIONS_PAD));
 
 	{
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gGL.color4f( 0.9f, 0.9f, 0.9f, 1.0f );
 		gl_rect_2d( instructions_rect );
 	}
@@ -4586,12 +4592,10 @@ void LLViewerWindow::restoreGL(const std::string& progress_message)
 			setProgressString(progress_message);
 		}
 		llinfos << "...Restoring GL done" << llendl;
-#if LL_WINDOWS
-		if(!LLWinDebug::checkExceptionHandler())
+		if(!LLAppViewer::instance()->restoreErrorTrap())
 		{
-			llwarns << " Someone took over my exception handler (post restoreGL)!" << llendl;
+			llwarns << " Someone took over my signal/exception handler (post restoreGL)!" << llendl;
 		}
-#endif
 
 	}
 }
@@ -4647,9 +4651,97 @@ void LLViewerWindow::getTargetWindow(BOOL& fullscreen, S32& width, S32& height)
 	}
 }
 
+bool LLViewerWindow::updateResolution()
+{
+	if (gSavedSettings.getBOOL("FullScreenAutoDetectAspectRatio"))
+	{
+		getWindow()->setNativeAspectRatio(0.f);
+	}
+	else
+	{
+		getWindow()->setNativeAspectRatio(gSavedSettings.getF32("FullScreenAspectRatio"));
+	}
+	
+	reshape(getWindowDisplayWidth(), getWindowDisplayHeight());
+	
+	// Screen resolution
+	S32 num_resolutions;
+	LLWindow::LLWindowResolution* supported_resolutions = getWindow()->getSupportedResolutions(num_resolutions);
+	
+	// check if resolution has changed
+	BOOL targetFullscreen;
+	S32 targetWidth;
+	S32 targetHeight;
+	
+	getTargetWindow(targetFullscreen, targetWidth, targetHeight);
+	
+	if ((mIsFullscreenChecked != (bool) targetFullscreen) ||
+		(mIsFullscreenChecked &&
+		 (supported_resolutions[mCurrResolutionIndex].mWidth != targetWidth ||
+		  supported_resolutions[mCurrResolutionIndex].mHeight != targetHeight)
+		 ))
+	{
+		// change fullscreen resolution or switch in/out of windowed mode
+		BOOL result;
+		
+		BOOL logged_in = (LLStartUp::getStartupState() >= STATE_STARTED);
+		if (mIsFullscreenChecked)
+		{
+			result = changeDisplaySettings(TRUE, 
+											LLCoordScreen(	supported_resolutions[mCurrResolutionIndex].mWidth, 
+															supported_resolutions[mCurrResolutionIndex].mHeight), 
+											gSavedSettings.getBOOL("DisableVerticalSync"),
+											logged_in);
+		}
+		else
+		{
+			result = changeDisplaySettings(FALSE, 
+											LLCoordScreen(gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight")), 
+											TRUE,
+											logged_in);
+		}
+		if (!result)
+		{
+			
+			// GL is non-existent at this point, so we can't continue.
+			llerrs << "LLPanelDisplay::apply() failed" << llendl;
+		}
+	}
+	
+	// force aspect ratio
+	if (mIsFullscreenChecked)
+	{
+		LLViewerCamera::getInstance()->setAspect( getDisplayAspectRatio() );
+	}
+	return true;
+}
+
+void LLViewerWindow::requestResolutionUpdate(bool fullscreen_checked, U32 resolution_index)
+{
+	mResDirty = true;
+	mIsFullscreenChecked = fullscreen_checked;
+	mCurrResolutionIndex = resolution_index;
+}
+
 
 BOOL LLViewerWindow::checkSettings()
 {
+	if (mStatesDirty)
+	{
+		gGL.refreshState();
+		LLViewerShaderMgr::instance()->setShaders();
+		mStatesDirty = false;
+	}
+	
+	// We want to update the resolution AFTER the states getting refreshed not before.
+	if (mResDirty)
+	{
+		updateResolution();
+		mResDirty = false;
+		// This will force a state update the next frame.
+		mStatesDirty = true;
+	}
+		
 	BOOL is_fullscreen = mWindow->getFullscreen();
 	if (is_fullscreen && !mWantFullscreen)
 	{
@@ -4658,6 +4750,7 @@ BOOL LLViewerWindow::checkSettings()
 											gSavedSettings.getS32("WindowHeight")),
 							  TRUE,
 							  mShowFullscreenProgress);
+		mStatesDirty = true;
 		return TRUE;
 	}
 	else if (!is_fullscreen && mWantFullscreen)
@@ -4677,6 +4770,7 @@ BOOL LLViewerWindow::checkSettings()
 
 		LLGLState::checkStates();
 		LLGLState::checkTextureChannels();
+		mStatesDirty = true;
 		return TRUE;
 	}
 	return FALSE;
@@ -5103,25 +5197,34 @@ LLPickInfo::~LLPickInfo()
 
 void LLPickInfo::fetchResults()
 {
+
+	S32 face_hit = -1;
+	LLVector3 intersection, normal, binormal;
+	LLVector2 uv;
+
+	LLViewerObject* hit_object = gViewerWindow->cursorIntersect(-1, -1, 512.f,
+									NULL, -1, mPickTransparent, &face_hit,
+									&intersection, &uv, &normal, &binormal);
+	
 	// read back colors and depth values from buffer
-	glReadPixels(mScreenRegion.mLeft, mScreenRegion.mBottom, mScreenRegion.getWidth(), mScreenRegion.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, mPickBuffer);
-	glReadPixels(mScreenRegion.mLeft, mScreenRegion.mBottom, mScreenRegion.getWidth(), mScreenRegion.getHeight(), GL_DEPTH_COMPONENT, GL_FLOAT, mPickDepthBuffer );
+	//glReadPixels(mScreenRegion.mLeft, mScreenRegion.mBottom, mScreenRegion.getWidth(), mScreenRegion.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, mPickBuffer);
+	//glReadPixels(mScreenRegion.mLeft, mScreenRegion.mBottom, mScreenRegion.getWidth(), mScreenRegion.getHeight(), GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, mPickDepthBuffer );
 
 	// find pick region that is fully onscreen
 	LLCoordGL scaled_pick_point;;
 	scaled_pick_point.mX = llclamp(llround((F32)mMousePt.mX * gViewerWindow->getDisplayScale().mV[VX]), PICK_HALF_WIDTH, gViewerWindow->getWindowDisplayWidth() - PICK_HALF_WIDTH);
 	scaled_pick_point.mY = llclamp(llround((F32)mMousePt.mY * gViewerWindow->getDisplayScale().mV[VY]), PICK_HALF_WIDTH, gViewerWindow->getWindowDisplayHeight() - PICK_HALF_WIDTH);
-	S32 pixel_index = PICK_HALF_WIDTH * PICK_DIAMETER + PICK_HALF_WIDTH;
-	S32 pick_id = (U32)mPickBuffer[(pixel_index * 4) + 0] << 16 | (U32)mPickBuffer[(pixel_index * 4) + 1] << 8 | (U32)mPickBuffer[(pixel_index * 4) + 2];
-	F32 depth = mPickDepthBuffer[pixel_index];
+	//S32 pixel_index = PICK_HALF_WIDTH * PICK_DIAMETER + PICK_HALF_WIDTH;
+	//S32 pick_id = (U32)mPickBuffer[(pixel_index * 4) + 0] << 16 | (U32)mPickBuffer[(pixel_index * 4) + 1] << 8 | (U32)mPickBuffer[(pixel_index * 4) + 2];
+	//F32 depth = mPickDepthBuffer[pixel_index];
 
-	S32 x_offset = mMousePt.mX - llround((F32)scaled_pick_point.mX / gViewerWindow->getDisplayScale().mV[VX]);
-	S32 y_offset = mMousePt.mY - llround((F32)scaled_pick_point.mY / gViewerWindow->getDisplayScale().mV[VY]);
+	//S32 x_offset = mMousePt.mX - llround((F32)scaled_pick_point.mX / gViewerWindow->getDisplayScale().mV[VX]);
+	//S32 y_offset = mMousePt.mY - llround((F32)scaled_pick_point.mY / gViewerWindow->getDisplayScale().mV[VY]);
 
 	mPickPt = mMousePt;
 
 	// we hit nothing, scan surrounding pixels for something useful
-	if (!pick_id)
+	/*if (!pick_id)
 	{
 		S32 closest_distance = 10000;
 		//S32 closest_pick_name = 0;
@@ -5142,25 +5245,21 @@ void LLPickInfo::fetchResults()
 				}
 			}
 		}
-	}
+	}*/
 
-	U32 te_offset = ((U32)pick_id >> 20);
-	pick_id &= 0x000fffff;
 
-	//unproject relative clicked coordinate from window coordinate using GL
-	GLint viewport[4];
-	GLdouble modelview[16];
-	GLdouble projection[16];
-	GLfloat winX, winY;
-	GLdouble posX, posY, posZ;
+	U32 te_offset = face_hit > -1 ? face_hit : 0;
+	//pick_id &= 0x000fffff;
 
-	LLViewerObject* objectp = gObjectList.getSelectedObject(pick_id);
+	//unproject relative clicked coordinate from window coordinate using GL
+	
+	LLViewerObject* objectp = hit_object;
 
-	if (pick_id == (S32)GL_NAME_PARCEL_WALL)
-	{
-		mPickType = PICK_PARCEL_WALL;
-	}
-	else if (objectp)
+	//if (pick_id == (S32)GL_NAME_PARCEL_WALL)
+	//{
+	//	mPickType = PICK_PARCEL_WALL;
+	//}
+	if (objectp)
 	{
 		if( objectp->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH )
 		{
@@ -5186,11 +5285,11 @@ void LLPickInfo::fetchResults()
 			{
 				mPickType = PICK_OBJECT;
 			}
-			mObjectOffset = gAgent.calcFocusOffset(objectp, mPickPt.mX, mPickPt.mY);
+			mObjectOffset = gAgent.calcFocusOffset(objectp, intersection, mPickPt.mX, mPickPt.mY);
 			mObjectID = objectp->mID;
 			mObjectFace = (te_offset == NO_FACE) ? -1 : (S32)te_offset;
 
-			glh::matrix4f newModel((F32*)LLViewerCamera::getInstance()->getModelview().mMatrix);
+			/*glh::matrix4f newModel((F32*)LLViewerCamera::getInstance()->getModelview().mMatrix);
 
 			for(U32 i = 0; i < 16; ++i)
 			{
@@ -5202,9 +5301,9 @@ void LLPickInfo::fetchResults()
 			winX = ((F32)mPickPt.mX) * gViewerWindow->getDisplayScale().mV[VX];
 			winY = ((F32)mPickPt.mY) * gViewerWindow->getDisplayScale().mV[VY];
 
-			gluUnProject( winX, winY, depth, modelview, projection, viewport, &posX, &posY, &posZ);
+			gluUnProject( winX, winY, depth, modelview, projection, viewport, &posX, &posY, &posZ);*/
 
-			mPosGlobal = gAgent.getPosGlobalFromAgent(LLVector3(posX, posY, posZ));
+			mPosGlobal = gAgent.getPosGlobalFromAgent(intersection);
 			
 			if (mWantSurfaceInfo)
 			{
@@ -5212,16 +5311,16 @@ void LLPickInfo::fetchResults()
 			}
 		}
 	}
-	else
-	{
+	//else
+	//{
 		// was this name referring to a hud icon?
-		mHUDIcon = LLHUDIcon::handlePick(pick_id);
-		if (mHUDIcon)
-		{
-			mPickType = PICK_ICON;
-			mPosGlobal = mHUDIcon->getPositionGlobal();
-		}
-	}
+	//	mHUDIcon = LLHUDIcon::handlePick(pick_id);
+	//	if (mHUDIcon)
+	//	{
+	//		mPickType = PICK_ICON;
+	//		mPosGlobal = mHUDIcon->getPositionGlobal();
+	//	}
+	//}
 
 	if (mPickCallback)
 	{
@@ -5236,16 +5335,19 @@ LLPointer<LLViewerObject> LLPickInfo::getObject() const
 
 void LLPickInfo::updateXYCoords()
 {
-	const LLTextureEntry* tep = getObject()->getTE(mObjectFace);
-	LLPointer<LLViewerImage> imagep = gImageList.getImage(tep->getID());
-	if(mUVCoords.mV[VX] >= 0.f && mUVCoords.mV[VY] >= 0.f && imagep.notNull())
+	if (mObjectFace > -1)
 	{
-		LLCoordGL coords;
-		
-		coords.mX = llround(mUVCoords.mV[VX] * (F32)imagep->getWidth());
-		coords.mY = llround(mUVCoords.mV[VY] * (F32)imagep->getHeight());
+		const LLTextureEntry* tep = getObject()->getTE(mObjectFace);
+		LLPointer<LLViewerImage> imagep = gImageList.getImage(tep->getID());
+		if(mUVCoords.mV[VX] >= 0.f && mUVCoords.mV[VY] >= 0.f && imagep.notNull())
+		{
+			LLCoordGL coords;
+			
+			coords.mX = llround(mUVCoords.mV[VX] * (F32)imagep->getWidth());
+			coords.mY = llround(mUVCoords.mV[VY] * (F32)imagep->getHeight());
 
-		gViewerWindow->getWindow()->convertCoords(coords, &mXYCoords);
+			gViewerWindow->getWindow()->convertCoords(coords, &mXYCoords);
+		}
 	}
 }
 
@@ -5256,7 +5358,7 @@ void LLPickInfo::drawPickBuffer() const
 		gGL.pushMatrix();
 		LLGLDisable no_blend(GL_BLEND);
 		LLGLDisable no_alpha_test(GL_ALPHA_TEST);
-		LLGLSNoTexture no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		glPixelZoom(10.f, 10.f);
 		LLVector2 display_scale = gViewerWindow->getDisplayScale();
 		glRasterPos2f(((F32)mMousePt.mX * display_scale.mV[VX] + 10.f), 
@@ -5308,7 +5410,7 @@ void LLPickInfo::getSurfaceInfo()
 	if (objectp)
 	{
 		if (gViewerWindow->cursorIntersect(llround((F32)mMousePt.mX), llround((F32)mMousePt.mY), 1024.f,
-										   objectp, -1,
+										   objectp, -1, mPickTransparent,
 										   &mObjectFace,
 										   &mIntersection,
 										   &mSTCoords,
@@ -5317,7 +5419,7 @@ void LLPickInfo::getSurfaceInfo()
 		{
 			// if we succeeded with the intersect above, compute the texture coordinates:
 
-			if (objectp->mDrawable.notNull())
+			if (objectp->mDrawable.notNull() && mObjectFace > -1)
 			{
 				LLFace* facep = objectp->mDrawable->getFace(mObjectFace);
 
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 21df0d5..28fcb3e 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -313,6 +313,7 @@ public:
 	LLViewerObject* cursorIntersect(S32 mouse_x = -1, S32 mouse_y = -1, F32 depth = 512.f,
 									LLViewerObject *this_object = NULL,
 									S32 this_face = -1,
+									BOOL pick_transparent = FALSE,
 									S32* face_hit = NULL,
 									LLVector3 *intersection = NULL,
 									LLVector2 *uv = NULL,
@@ -340,6 +341,8 @@ public:
 	void			toggleFullscreen(BOOL show_progress);
 
 	// handle shutting down GL and bringing it back up
+	bool			updateResolution(void);
+	void			requestResolutionUpdate(bool fullscreen_checked, U32 resolution_index);
 	BOOL			checkSettings();
 	void			restartDisplay(BOOL show_progress_bar);
 	BOOL			changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, BOOL disable_vsync, BOOL show_progress_bar);
@@ -421,6 +424,11 @@ protected:
 	std::string		mInitAlert;			// Window / GL initialization requires an alert
 	
 	class LLDebugText* mDebugText; // Internal class for debug text
+	
+	bool			mResDirty;
+	bool			mStatesDirty;
+	bool			mIsFullscreenChecked; // Did the user check the fullscreen checkbox in the display settings
+	U32			mCurrResolutionIndex;
 
 protected:
 	static std::string sSnapshotBaseName;
@@ -473,6 +481,7 @@ extern LLVector3        gDebugRaycastIntersection;
 extern LLVector2        gDebugRaycastTexCoord;
 extern LLVector3        gDebugRaycastNormal;
 extern LLVector3        gDebugRaycastBinormal;
+extern S32				gDebugRaycastFaceHit;
 
 extern S32 CHAT_BAR_HEIGHT; 
 
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index e480eb3..c3ad4f9 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -244,6 +244,11 @@ static F32 calc_bouncy_animation(F32 x)
 	return -(cosf(x * F_PI * 2.5f - F_PI_BY_TWO))*(0.4f + x * -0.1f) + x * 1.3f;
 }
 
+BOOL LLLineSegmentCapsuleIntersect(const LLVector3& start, const LLVector3& end, const LLVector3& p1, const LLVector3& p2, const F32& radius, LLVector3& result)
+{
+	return FALSE;
+}
+
 //-----------------------------------------------------------------------------
 // Static Data
 //-----------------------------------------------------------------------------
@@ -753,7 +758,7 @@ LLVOAvatar::LLVOAvatar(
 	mRippleTimeLast = 0.f;
 
 	mShadowImagep = gImageList.getImageFromFile("foot_shadow.j2c");
-	mShadowImagep->bind();
+	gGL.getTexUnit(0)->bind(mShadowImagep.get());
 	mShadowImagep->setClamp(TRUE, TRUE);
 	
 	mInAir = FALSE;
@@ -1131,7 +1136,7 @@ void LLVOAvatar::dumpBakedStatus()
 		}
 
 
-		F64 dist_to_camera = (inst->getPositionGlobal() - camera_pos_global).magVec();
+		F64 dist_to_camera = (inst->getPositionGlobal() - camera_pos_global).length();
 		llcont << " " << dist_to_camera << "m ";
 
 		llcont << " " << inst->mPixelArea << " pixels";
@@ -1569,6 +1574,96 @@ void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax)
 	newMax += buffer;
 }
 
+//-----------------------------------------------------------------------------
+// renderCollisionVolumes()
+//-----------------------------------------------------------------------------
+void LLVOAvatar::renderCollisionVolumes()
+{
+	for (S32 i = 0; i < mNumCollisionVolumes; i++)
+	{
+		mCollisionVolumes[i].renderCollision();
+	}
+
+	if (mNameText.notNull())
+	{
+		LLVector3 unused;
+		mNameText->lineSegmentIntersect(LLVector3(0,0,0), LLVector3(0,0,1), unused, TRUE);
+	}
+}
+
+BOOL LLVOAvatar::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
+									  S32 face,
+									  BOOL pick_transparent,
+									  S32* face_hit,
+									  LLVector3* intersection,
+									  LLVector2* tex_coord,
+									  LLVector3* normal,
+									  LLVector3* bi_normal
+		)
+{
+
+	if (mIsSelf && !gAgent.needsRenderAvatar())
+	{
+		return FALSE;
+	}
+
+	if (lineSegmentBoundingBox(start, end))
+	{
+		for (S32 i = 0; i < mNumCollisionVolumes; ++i)
+		{
+			mCollisionVolumes[i].updateWorldMatrix();
+
+			glh::matrix4f mat((F32*) mCollisionVolumes[i].getXform()->getWorldMatrix().mMatrix);
+			glh::matrix4f inverse = mat.inverse();
+			glh::matrix4f norm_mat = inverse.transpose();
+
+			glh::vec3f p1(start.mV);
+			glh::vec3f p2(end.mV);
+
+			inverse.mult_matrix_vec(p1);
+			inverse.mult_matrix_vec(p2);
+
+			LLVector3 position;
+			LLVector3 norm;
+
+			if (linesegment_sphere(LLVector3(p1.v), LLVector3(p2.v), LLVector3(0,0,0), 1.f, position, norm))
+			{
+				glh::vec3f res_pos(position.mV);
+				mat.mult_matrix_vec(res_pos);
+				
+				norm.normalize();
+				glh::vec3f res_norm(norm.mV);
+				norm_mat.mult_matrix_dir(res_norm);
+
+				if (intersection)
+				{
+					*intersection = LLVector3(res_pos.v);
+				}
+
+				if (normal)
+				{
+					*normal = LLVector3(res_norm.v);
+				}
+
+				return TRUE;
+			}
+		}
+	}
+	
+	LLVector3 position;
+	if (mNameText.notNull() && mNameText->lineSegmentIntersect(start, end, position))
+	{
+		if (intersection)
+		{
+			*intersection = position;
+		}
+
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
 
 //-----------------------------------------------------------------------------
 // parseSkeletonFile()
@@ -2737,8 +2832,8 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
 			else
 			{
 				getSpatialExtents(ext[0], ext[1]);
-				if ((ext[1]-mImpostorExtents[1]).magVec() > 0.05f ||
-					(ext[0]-mImpostorExtents[0]).magVec() > 0.05f)
+				if ((ext[1]-mImpostorExtents[1]).length() > 0.05f ||
+					(ext[0]-mImpostorExtents[0]).length() > 0.05f)
 				{
 					mNeedsImpostorUpdate = TRUE;
 				}
@@ -2905,7 +3000,7 @@ void LLVOAvatar::idleUpdateWindEffect()
 		F32 time_delta = mRippleTimer.getElapsedTimeF32() - mRippleTimeLast;
 		mRippleTimeLast = mRippleTimer.getElapsedTimeF32();
 		LLVector3 velocity = getVelocity();
-		F32 speed = velocity.magVec();
+		F32 speed = velocity.length();
 		//RN: velocity varies too much frame to frame for this to work
 		mRippleAccel.clearVec();//lerp(mRippleAccel, (velocity - mLastVel) * time_delta, LLCriticalDamp::getInterpolant(0.02f));
 		mLastVel = velocity;
@@ -2924,7 +3019,7 @@ void LLVOAvatar::idleUpdateWindEffect()
 		}
 
 		wind.mV[VZ] += hover_strength;
-		wind.normVec();
+		wind.normalize();
 
 		wind.mV[VW] = llmin(0.025f + (speed * 0.015f) + hover_strength, 0.5f);
 		F32 interp;
@@ -3047,10 +3142,10 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
 				LLVector3 pixel_up_vec;
 				LLViewerCamera::getInstance()->getPixelVectors(root_pos_last, pixel_up_vec, pixel_right_vec);
 				LLVector3 camera_to_av = root_pos_last - LLViewerCamera::getInstance()->getOrigin();
-				camera_to_av.normVec();
+				camera_to_av.normalize();
 				LLVector3 local_camera_at = camera_to_av * ~root_rot;
 				LLVector3 local_camera_up = camera_to_av % LLViewerCamera::getInstance()->getLeftAxis();
-				local_camera_up.normVec();
+				local_camera_up.normalize();
 				local_camera_up = local_camera_up * ~root_rot;
 			
 				local_camera_up.scaleVec(mBodySize * 0.5f);
@@ -3509,7 +3604,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 
 	LLVector3 xyVel = getVelocity();
 	xyVel.mV[VZ] = 0.0f;
-	speed = xyVel.magVec();
+	speed = xyVel.length();
 
 	BOOL throttle = TRUE;
 
@@ -3594,14 +3689,14 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 			if (mIsSelf)
 			{
 				primDir = agent.getAtAxis() - projected_vec(agent.getAtAxis(), agent.getReferenceUpVector());
-				primDir.normVec();
+				primDir.normalize();
 			}
 			else
 			{
 				primDir = getRotation().getMatrix3().getFwdRow();
 			}
 			LLVector3 velDir = getVelocity();
-			velDir.normVec();
+			velDir.normalize();
 			if ( mSignaledAnimations.find(ANIM_AGENT_WALK) != mSignaledAnimations.end())
 			{
 				F32 vpD = velDir * primDir;
@@ -3623,13 +3718,13 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 					LLVector3 at_axis = LLViewerCamera::getInstance()->getAtAxis();
 					LLVector3 up_vector = gAgent.getReferenceUpVector();
 					at_axis -= up_vector * (at_axis * up_vector);
-					at_axis.normVec();
+					at_axis.normalize();
 					
 					F32 dot = fwdDir * at_axis;
 					if (dot < 0.f)
 					{
 						fwdDir -= 2.f * at_axis * dot;
-						fwdDir.normVec();
+						fwdDir.normalize();
 					}
 				}
 				
@@ -3697,7 +3792,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 
 			// Now compute the full world space rotation for the whole body (wQv)
 			LLVector3 leftDir = upDir % fwdDir;
-			leftDir.normVec();
+			leftDir.normalize();
 			fwdDir = leftDir % upDir;
 			LLQuaternion wQv( fwdDir, leftDir, upDir );
 
@@ -3828,10 +3923,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 //							AUDIO_STEP_LO_SPEED, AUDIO_STEP_HI_SPEED,
 //							AUDIO_STEP_LO_GAIN, AUDIO_STEP_HI_GAIN );
 
-			F32 ambient_volume = gSavedSettings.getF32("AudioLevelAmbient");
-			F32 gain = gSavedSettings.getBOOL("MuteAmbient") 
-				? 0.f 
-				: (.50f * ambient_volume * ambient_volume);
+			const F32 STEP_VOLUME = 0.5f;
 			LLUUID& step_sound_id = getStepSound();
 
 			LLVector3d foot_pos_global = gAgent.getPosGlobalFromAgent(foot_pos_agent);
@@ -3839,7 +3931,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 			if (LLViewerParcelMgr::getInstance()->canHearSound(foot_pos_global)
 				&& !LLMuteList::getInstance()->isMuted(getID(), LLMute::flagObjectSounds))
 			{
-				gAudiop->triggerSound(step_sound_id, getID(), gain, foot_pos_global);
+				gAudiop->triggerSound(step_sound_id, getID(), STEP_VOLUME, LLAudioEngine::AUDIO_TYPE_AMBIENT, foot_pos_global);
 			}
 		}
 	}
@@ -4141,7 +4233,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
 		LLVector3 collide_point = slaved_pos;
 		collide_point.mV[VZ] -= foot_plane_normal.mV[VZ] * (dist_from_plane + COLLISION_TOLERANCE - FOOT_COLLIDE_FUDGE);
 
-		gGL.begin(LLVertexBuffer::LINES);
+		gGL.begin(LLRender::LINES);
 		{
 			F32 SQUARE_SIZE = 0.2f;
 			gGL.color4f(1.f, 0.f, 0.f, 1.f);
@@ -4288,7 +4380,7 @@ U32 LLVOAvatar::renderFootShadows()
 	LLGLDepthTest test(GL_TRUE, GL_FALSE);
 	//render foot shadows
 	LLGLEnable blend(GL_BLEND);
-	mShadowImagep->bind();
+	gGL.getTexUnit(0)->bind(mShadowImagep.get());
 	glColor4fv(mShadow0Facep->getRenderColor().mV);
 	mShadow0Facep->renderIndexed(foot_mask);
 	glColor4fv(mShadow1Facep->getRenderColor().mV);
@@ -4306,7 +4398,7 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color)
 
 	LLVector3 pos(getRenderPosition()+mImpostorOffset);
 	LLVector3 at = (pos - LLViewerCamera::getInstance()->getOrigin());
-	at.normVec();
+	at.normalize();
 	LLVector3 left = LLViewerCamera::getInstance()->getUpAxis() % at;
 	LLVector3 up = at%left;
 
@@ -4334,8 +4426,8 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color)
 	color.mV[3] = (U8) (alpha*255);
 	
 	gGL.color4ubv(color.mV);
-	mImpostor.bindTexture();
-	gGL.begin(LLVertexBuffer::QUADS);
+	gGL.getTexUnit(0)->bind(&mImpostor);
+	gGL.begin(LLRender::QUADS);
 	gGL.texCoord2f(0,0);
 	gGL.vertex3fv((pos+left-up).mV);
 	gGL.texCoord2f(1,0);
@@ -4350,17 +4442,6 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color)
 	return 6;
 }
 
-//-----------------------------------------------------------------------------
-// renderCollisionVolumes()
-//-----------------------------------------------------------------------------
-void LLVOAvatar::renderCollisionVolumes()
-{
-	for (S32 i = 0; i < mNumCollisionVolumes; i++)
-	{
-		mCollisionVolumes[i].renderCollision();
-	}
-}
-
 //------------------------------------------------------------------------
 // LLVOAvatar::updateTextures()
 //------------------------------------------------------------------------
@@ -4395,23 +4476,23 @@ void LLVOAvatar::updateTextures(LLAgent &agent)
 	{
 		if( head_baked && ! mHeadBakedLoaded )
 		{
-			getTEImage( TEX_HEAD_BAKED )->bind();
+			gGL.getTexUnit(0)->bind(getTEImage( TEX_HEAD_BAKED ));
 		}
 		if( upper_baked && ! mUpperBakedLoaded )
 		{
-			getTEImage( TEX_UPPER_BAKED )->bind();
+			gGL.getTexUnit(0)->bind(getTEImage( TEX_UPPER_BAKED ));
 		}
 		if( lower_baked && ! mLowerBakedLoaded )
 		{
-			getTEImage( TEX_LOWER_BAKED )->bind();
+			gGL.getTexUnit(0)->bind(getTEImage( TEX_LOWER_BAKED ));
 		}
 		if( eyes_baked && ! mEyesBakedLoaded )
 		{
-			getTEImage( TEX_EYES_BAKED )->bind();
+			gGL.getTexUnit(0)->bind(getTEImage( TEX_EYES_BAKED ));
 		}
 		if( skirt_baked && ! mSkirtBakedLoaded )
 		{
-			getTEImage( TEX_SKIRT_BAKED )->bind();
+			gGL.getTexUnit(0)->bind(getTEImage( TEX_SKIRT_BAKED ));
 		}
 	}
 
@@ -4813,14 +4894,12 @@ BOOL LLVOAvatar::processSingleAnimationStateChange( const LLUUID& anim_id, BOOL
 					// to support both spatialized and non-spatialized instances of the same sound
 					//if (mIsSelf)
 					//{
-					//  F32 volume = gain * gSavedSettings.getF32("AudioLevelUI")
-					//	gAudiop->triggerSound(LLUUID(gSavedSettings.getString("UISndTyping")), volume);
+					//	gAudiop->triggerSound(LLUUID(gSavedSettings.getString("UISndTyping")), 1.0f, LLAudioEngine::AUDIO_TYPE_UI);
 					//}
 					//else
 					{
 						LLUUID sound_id = LLUUID(gSavedSettings.getString("UISndTyping"));
-						F32 volume = gSavedSettings.getBOOL("MuteSounds") ? 0.f : gSavedSettings.getF32("AudioLevelSFX");
-						gAudiop->triggerSound(sound_id, getID(), volume, char_pos_global);
+						gAudiop->triggerSound(sound_id, getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_SFX, char_pos_global);
 					}
 				}
 			}
@@ -5719,7 +5798,9 @@ BOOL LLVOAvatar::loadMeshNodes()
 
 		//	llinfos << "Parsing mesh data for " << type << "..." << llendl;
 
-		mesh->setColor( 0.8f, 0.8f, 0.8f, 1.0f );
+		// If this isn't set to white (1.0), avatars will *ALWAYS* be darker than their surroundings.
+		// Do not touch!!!
+		mesh->setColor( 1.0f, 1.0f, 1.0f, 1.0f );
 
 		LLPolyMesh *poly_mesh = NULL;
 
@@ -5837,7 +5918,7 @@ void LLVOAvatar::setPixelAreaAndAngle(LLAgent &agent)
 	}
 	else
 	{
-		F32 radius = size.magVec();
+		F32 radius = size.length();
 		mAppAngle = (F32) atan2( radius, range) * RAD_TO_DEG;
 	}
 
@@ -6009,7 +6090,7 @@ void LLVOAvatar::updateShadowFaces()
 			sprite.setPosition(shadow_pos_agent);
 
 			LLVector3 foot_to_knee = mKneeLeftp->getWorldPosition() - joint_world_pos;
-			//foot_to_knee.normVec();
+			//foot_to_knee.normalize();
 			foot_to_knee -= projected_vec(foot_to_knee, sun_vec);
 			sprite.setYaw(azimuth(sun_vec - foot_to_knee));
 		
@@ -6042,7 +6123,7 @@ void LLVOAvatar::updateShadowFaces()
 			sprite.setPosition(shadow_pos_agent);
 
 			LLVector3 foot_to_knee = mKneeRightp->getWorldPosition() - joint_world_pos;
-			//foot_to_knee.normVec();
+			//foot_to_knee.normalize();
 			foot_to_knee -= projected_vec(foot_to_knee, sun_vec);
 			sprite.setYaw(azimuth(sun_vec - foot_to_knee));
 	
@@ -6403,7 +6484,7 @@ void LLVOAvatar::getOffObject()
 		LLVector3 at_axis = LLVector3::x_axis;
 		at_axis = at_axis * av_rot;
 		at_axis.mV[VZ] = 0.f;
-		at_axis.normVec();
+		at_axis.normalize();
 		gAgent.resetAxes(at_axis);
 
 		//reset orientation
@@ -6957,7 +7038,7 @@ BOOL LLVOAvatar::bindScratchTexture( LLGLenum format )
 	GLuint gl_name = getScratchTexName( format, &texture_bytes );
 	if( gl_name )
 	{
-		LLImageGL::bindExternalTexture( gl_name, 0, GL_TEXTURE_2D );
+		gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, gl_name);
 		stop_glerror();
 
 		F32* last_bind_time = LLVOAvatar::sScratchTexLastBindTime.getIfThere( format );
@@ -7015,7 +7096,7 @@ LLGLuint LLVOAvatar::getScratchTexName( LLGLenum format, U32* texture_bytes )
 		glGenTextures(1, &name );
 		stop_glerror();
 
-		LLImageGL::bindExternalTexture( name, 0, GL_TEXTURE_2D ); 
+		gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, name);
 		stop_glerror();
 
 		glTexImage2D(
@@ -7030,7 +7111,7 @@ LLGLuint LLVOAvatar::getScratchTexName( LLGLenum format, U32* texture_bytes )
 		glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
 		stop_glerror();
 
-		LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		stop_glerror();
 
 		LLVOAvatar::sScratchTexNames.addData( format, new LLGLuint( name ) );
@@ -8639,7 +8720,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerImage *src_vi,
 			glGenTextures(1, (GLuint*) &gl_name );
 			stop_glerror();
 
-			LLImageGL::bindExternalTexture( gl_name, 0, GL_TEXTURE_2D ); 
+			gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, gl_name);
 			stop_glerror();
 
 			glTexImage2D(
@@ -9914,7 +9995,7 @@ void LLVOAvatar::getImpostorValues(LLVector3* extents, LLVector3& angle, F32& di
 	extents[1] = ext[1];
 
 	LLVector3 at = LLViewerCamera::getInstance()->getOrigin()-(getRenderPosition()+mImpostorOffset);
-	distance = at.normVec();
+	distance = at.normalize();
 	F32 da = 1.f - (at*LLViewerCamera::getInstance()->getAtAxis());
 	angle.mV[0] = LLViewerCamera::getInstance()->getYaw()*da;
 	angle.mV[1] = LLViewerCamera::getInstance()->getPitch()*da;
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index d66ddfc..8265e8a 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -308,6 +308,16 @@ public:
 	U32 renderTransparent();
 	void renderCollisionVolumes();
 	
+	/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
+									  S32 face = -1,                          // which face to check, -1 = ALL_SIDES
+									  BOOL pick_transparent = FALSE,
+									  S32* face_hit = NULL,                   // which face was hit
+									  LLVector3* intersection = NULL,         // return the intersection point
+									  LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point
+									  LLVector3* normal = NULL,               // return the surface normal at the intersection point
+									  LLVector3* bi_normal = NULL             // return the surface bi-normal at the intersection point
+		);
+
 	/*virtual*/ void updateTextures(LLAgent &agent);
 	// If setting a baked texture, need to request it from a non-local sim.
 	/*virtual*/ S32 setTETexture(const U8 te, const LLUUID& uuid);
diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp
index a028a63..821cf3e 100644
--- a/indra/newview/llvograss.cpp
+++ b/indra/newview/llvograss.cpp
@@ -273,9 +273,9 @@ U32 LLVOGrass::processUpdateMessage(LLMessageSystem *mesgsys,
 
 	updateSpecies();
 
-	if (  (getVelocity().magVecSquared() > 0.f)
-		||(getAcceleration().magVecSquared() > 0.f)
-		||(getAngularVelocity().magVecSquared() > 0.f))
+	if (  (getVelocity().lengthSquared() > 0.f)
+		||(getAcceleration().lengthSquared() > 0.f)
+		||(getAngularVelocity().lengthSquared() > 0.f))
 	{
 		llinfos << "ACK! Moving grass!" << llendl;
 		setVelocity(LLVector3::zero);
@@ -322,7 +322,7 @@ void LLVOGrass::setPixelAreaAndAngle(LLAgent &agent)
 {
 	// This should be the camera's center, as soon as we move to all region-local.
 	LLVector3 relative_position = getPositionAgent() - agent.getCameraPositionAgent();
-	F32 range = relative_position.magVec();
+	F32 range = relative_position.length();
 
 	F32 max_scale = getMaxScale();
 
@@ -501,7 +501,7 @@ void LLVOGrass::getGeometry(S32 idx,
 
 		LLVector3 normal1 = (v1-v2) % (v2-v3);
 		normal1.mV[VZ] = 0.75f;
-		normal1.normVec();
+		normal1.normalize();
 		LLVector3 normal2 = -normal1;
 		normal2.mV[VZ] = -normal2.mV[VZ];
 
@@ -578,3 +578,146 @@ void LLVOGrass::updateDrawable(BOOL force_damped)
 	}
 	clearChanged(SHIFTED);
 }
+
+// virtual 
+BOOL LLVOGrass::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face, BOOL pick_transparent, S32 *face_hitp,
+									  LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
+	
+{
+	BOOL ret = FALSE;
+	if (!mbCanSelect ||
+		mDrawable->isDead() || 
+		!gPipeline.hasRenderType(mDrawable->getRenderType()))
+	{
+		return FALSE;
+	}
+
+	LLVector3 dir = end-start;
+
+	mPatch = mRegionp->getLand().resolvePatchRegion(getPositionRegion());
+	
+	LLVector3 position;
+	// Create random blades of grass with gaussian distribution
+	F32 x,y,xf,yf,dzx,dzy;
+
+	LLColor4U color(255,255,255,255);
+
+	F32 width  = sSpeciesTable[mSpecies]->mBladeSizeX;
+	F32 height = sSpeciesTable[mSpecies]->mBladeSizeY;
+
+	LLVector2 tc[4];
+	LLVector3 v[4];
+	// LLVector3 n[4]; // unused!
+
+	F32 closest_t = 1.f;
+
+	for (S32 i = 0;  i < mNumBlades; i++)
+	{
+		x   = exp_x[i] * mScale.mV[VX];
+		y   = exp_y[i] * mScale.mV[VY];
+		xf  = rot_x[i] * GRASS_BLADE_BASE * width * w_mod[i];
+		yf  = rot_y[i] * GRASS_BLADE_BASE * width * w_mod[i];
+		dzx = dz_x [i];
+		dzy = dz_y [i];
+
+		LLVector3 v1,v2,v3;
+		F32 blade_height= GRASS_BLADE_HEIGHT * height * w_mod[i];
+
+		tc[0]   = LLVector2(0, 0);
+		tc[1]   = LLVector2(0, 0.98f);
+		tc[2]   = LLVector2(1, 0);
+		tc[3]   = LLVector2(1, 0.98f);
+	
+		position.mV[0]  = mPosition.mV[VX] + x + xf;
+		position.mV[1]  = mPosition.mV[VY] + y + yf;
+		position.mV[2]  = mRegionp->getLand().resolveHeightRegion(position);
+		v[0]    = v1 = position + mRegionp->getOriginAgent();
+		
+
+
+		position.mV[0] += dzx;
+		position.mV[1] += dzy;
+		position.mV[2] += blade_height;
+		v[1]    = v2 = position + mRegionp->getOriginAgent();
+		
+		position.mV[0]  = mPosition.mV[VX] + x - xf;
+		position.mV[1]  = mPosition.mV[VY] + y - xf;
+		position.mV[2]  = mRegionp->getLand().resolveHeightRegion(position);
+		v[2]    = v3 = position + mRegionp->getOriginAgent();
+		
+		LLVector3 normal1 = (v1-v2) % (v2-v3);
+		normal1.normalize();
+		
+		position.mV[0] += dzx;
+		position.mV[1] += dzy;
+		position.mV[2] += blade_height;
+		v[3]    = v1 = position + mRegionp->getOriginAgent();
+	
+
+		F32 a,b,t;
+
+		BOOL hit = FALSE;
+
+
+		U32 idx0 = 0,idx1 = 0,idx2 = 0;
+
+		if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, &a, &b, &t, FALSE))
+		{
+			hit = TRUE;
+			idx0 = 0; idx1 = 1; idx2 = 2;
+		}
+		else if (LLTriangleRayIntersect(v[1], v[3], v[2], start, dir, &a, &b, &t, FALSE))
+		{
+			hit = TRUE;
+			idx0 = 1; idx1 = 3; idx2 = 2;
+		}
+		else if (LLTriangleRayIntersect(v[2], v[1], v[0], start, dir, &a, &b, &t, FALSE))
+		{
+			normal1 = -normal1;
+			hit = TRUE;
+			idx0 = 2; idx1 = 1; idx2 = 0;
+		}
+		else if (LLTriangleRayIntersect(v[2], v[3], v[1], start, dir, &a, &b, &t, FALSE))
+		{
+			normal1 = -normal1;
+			hit = TRUE;
+			idx0 = 2; idx1 = 3; idx2 = 1;
+		}
+
+		if (hit)
+		{
+			if (t >= 0.f &&
+				t <= 1.f &&
+				t < closest_t)
+			{
+
+				LLVector2 hit_tc = ((1.f - a - b)  * tc[idx0] +
+									  a              * tc[idx1] +
+									  b              * tc[idx2]);
+				if (pick_transparent ||
+					getTEImage(0)->getMask(hit_tc))
+				{
+					closest_t = t;
+					if (intersection != NULL)
+					{
+						*intersection = start+dir*closest_t;
+					}
+
+					if (tex_coord != NULL)
+					{
+						*tex_coord = hit_tc;
+					}
+
+					if (normal != NULL)
+					{
+						*normal    = normal1;
+					}
+					ret = TRUE;
+				}
+			}
+		}
+	}
+
+	return ret;
+}
+
diff --git a/indra/newview/llvograss.h b/indra/newview/llvograss.h
index 679f5dc..fa22ebb 100644
--- a/indra/newview/llvograss.h
+++ b/indra/newview/llvograss.h
@@ -80,6 +80,16 @@ public:
 	/*virtual*/ BOOL    isActive() const; // Whether this object needs to do an idleUpdate.
 	BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
 
+	/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, 
+										  S32 face = -1,                        // which face to check, -1 = ALL_SIDES
+										  BOOL pick_transparent = FALSE,
+										  S32* face_hit = NULL,                 // which face was hit
+										  LLVector3* intersection = NULL,       // return the intersection point
+										  LLVector2* tex_coord = NULL,          // return the texture coordinates of the intersection point
+										  LLVector3* normal = NULL,             // return the surface normal at the intersection point
+										  LLVector3* bi_normal = NULL           // return the surface bi-normal at the intersection point
+		);
+
 	static S32 sMaxGrassSpecies;
 
 	struct GrassSpeciesData
diff --git a/indra/newview/llvoground.cpp b/indra/newview/llvoground.cpp
index 32622ec..166c879 100644
--- a/indra/newview/llvoground.cpp
+++ b/indra/newview/llvoground.cpp
@@ -45,7 +45,7 @@
 #include "pipeline.h"
 
 LLVOGround::LLVOGround(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
-:	LLStaticViewerObject(id, pcode, regionp)
+:	LLStaticViewerObject(id, pcode, regionp, TRUE)
 {
 	mbCanSelect = FALSE;
 }
diff --git a/indra/newview/llvoicevisualizer.cpp b/indra/newview/llvoicevisualizer.cpp
index f00247b..ad00804 100644
--- a/indra/newview/llvoicevisualizer.cpp
+++ b/indra/newview/llvoicevisualizer.cpp
@@ -378,20 +378,20 @@ void LLVoiceVisualizer::render()
 		//-----------------------------
 		// bind texture 0 (the dot)
 		//-----------------------------
-		mSoundSymbol.mTexture[0]->bind(); 
+		gGL.getTexUnit(0)->bind(mSoundSymbol.mTexture[0]);
 		
 		//-------------------------------------------------------------
 		// now render the dot
 		//-------------------------------------------------------------
 		gGL.color4fv( LLColor4( 1.0f, 1.0f, 1.0f, DOT_OPACITY ).mV );	
 		
-		gGL.begin( LLVertexBuffer::TRIANGLE_STRIP );
+		gGL.begin( LLRender::TRIANGLE_STRIP );
 			gGL.texCoord2i( 0,	0	); gGL.vertex3fv( bottomLeft.mV );
 			gGL.texCoord2i( 1,	0	); gGL.vertex3fv( bottomRight.mV );
 			gGL.texCoord2i( 0,	1	); gGL.vertex3fv( topLeft.mV );
 		gGL.end();
 
-		gGL.begin( LLVertexBuffer::TRIANGLE_STRIP );
+		gGL.begin( LLRender::TRIANGLE_STRIP );
 			gGL.texCoord2i( 1,	0	); gGL.vertex3fv( bottomRight.mV );
 			gGL.texCoord2i( 1,	1	); gGL.vertex3fv( topRight.mV );
 			gGL.texCoord2i( 0,	1	); gGL.vertex3fv( topLeft.mV );
@@ -503,18 +503,19 @@ void LLVoiceVisualizer::render()
 				LLVector3 topRight		= mSoundSymbol.mPosition - l + u;
 							
 				gGL.color4fv( LLColor4( red, green, blue, mSoundSymbol.mWaveOpacity[i] ).mV );		
-				mSoundSymbol.mTexture[i]->bind();
+				gGL.getTexUnit(0)->bind(mSoundSymbol.mTexture[i]);
+
 				
 				//---------------------------------------------------
 				// now, render the mofo
 				//---------------------------------------------------
-				gGL.begin( LLVertexBuffer::TRIANGLE_STRIP );
+				gGL.begin( LLRender::TRIANGLE_STRIP );
 					gGL.texCoord2i( 0, 0 ); gGL.vertex3fv( bottomLeft.mV );
 					gGL.texCoord2i( 1, 0 ); gGL.vertex3fv( bottomRight.mV );
 					gGL.texCoord2i( 0, 1 ); gGL.vertex3fv( topLeft.mV );
 				gGL.end();
 
-				gGL.begin( LLVertexBuffer::TRIANGLE_STRIP );
+				gGL.begin( LLRender::TRIANGLE_STRIP );
 					gGL.texCoord2i( 1, 0 ); gGL.vertex3fv( bottomRight.mV );
 					gGL.texCoord2i( 1, 1 ); gGL.vertex3fv( topRight.mV );
 					gGL.texCoord2i( 0, 1 ); gGL.vertex3fv( topLeft.mV );
@@ -550,8 +551,8 @@ VoiceGesticulationLevel LLVoiceVisualizer::getCurrentGesticulationLevel()
 	//-----------------------------------------------------------------------------------------
 	F32 range = mMaxGesticulationAmplitude - mMinGesticulationAmplitude;
 	
-			if ( mSpeakingAmplitude > mMinGesticulationAmplitude + range * 0.66666f	)	{ gesticulationLevel = VOICE_GESTICULATION_LEVEL_HIGH;		}
-	else	if ( mSpeakingAmplitude > mMinGesticulationAmplitude + range * 0.33333f	)	{ gesticulationLevel = VOICE_GESTICULATION_LEVEL_MEDIUM;	}
+			if ( mSpeakingAmplitude > mMinGesticulationAmplitude + range * 0.5f	)	{ gesticulationLevel = VOICE_GESTICULATION_LEVEL_HIGH;		}
+	else	if ( mSpeakingAmplitude > mMinGesticulationAmplitude + range * 0.25f	)	{ gesticulationLevel = VOICE_GESTICULATION_LEVEL_MEDIUM;	}
 	else	if ( mSpeakingAmplitude > mMinGesticulationAmplitude + range * 0.00000f	)	{ gesticulationLevel = VOICE_GESTICULATION_LEVEL_LOW;		}
 
 	return gesticulationLevel;
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 11d7341..fb91cfa 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -95,7 +95,7 @@ void LLVOPartGroup::setPixelAreaAndAngle(LLAgent &agent)
 {
 	// mPixelArea is calculated during render
 	F32 mid_scale = getMidScale();
-	F32 range = (getRenderPosition()-LLViewerCamera::getInstance()->getOrigin()).magVec();
+	F32 range = (getRenderPosition()-LLViewerCamera::getInstance()->getOrigin()).length();
 
 	if (range < 0.001f || isHUDAttachment())		// range == zero
 	{
@@ -133,15 +133,16 @@ F32 LLVOPartGroup::getPartSize(S32 idx)
 	return 0.f;
 }
 
+LLVector3 LLVOPartGroup::getCameraPosition() const
+{
+	return gAgent.getCameraPositionAgent();
+}
+
 BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
 {
 	LLFastTimer ftm(LLFastTimer::FTM_UPDATE_PARTICLES);
 
 	dirtySpatialGroup();
-
- 	LLVector3 at;
-	LLVector3 position_agent;
-	LLVector3 camera_agent = LLViewerCamera::getInstance()->getOrigin();
 	
 	S32 num_parts = mViewerPartGroupp->getCount();
 	LLFace *facep;
@@ -187,9 +188,9 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
 		const LLViewerPart *part = mViewerPartGroupp->mParticles[i];
 
 		LLVector3 part_pos_agent(part->mPosAgent);
-		at = part_pos_agent - camera_agent;
+		LLVector3 at(part_pos_agent - LLViewerCamera::getInstance()->getOrigin());
 
-		F32 camera_dist_squared = at.magVecSquared();
+		F32 camera_dist_squared = at.lengthSquared();
 		F32 inv_camera_dist_squared;
 		if (camera_dist_squared > 1.f)
 			inv_camera_dist_squared = 1.f / camera_dist_squared;
@@ -278,36 +279,38 @@ void LLVOPartGroup::getGeometry(S32 idx,
 
 	
 	LLVector3 part_pos_agent(part.mPosAgent);
-	LLVector3 camera_agent = gAgent.getCameraPositionAgent();
+	LLVector3 camera_agent = getCameraPosition(); 
 	LLVector3 at = part_pos_agent - camera_agent;
-	LLVector3 up, right;
+	LLVector3 up;
+	LLVector3 right;
 
 	right = at % LLVector3(0.f, 0.f, 1.f);
-	right.normVec();
+	right.normalize();
 	up = right % at;
-	up.normVec();
+	up.normalize();
 
 	if (part.mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK)
 	{
 		LLVector3 normvel = part.mVelocity;
-		normvel.normVec();
+		normvel.normalize();
 		LLVector2 up_fracs;
 		up_fracs.mV[0] = normvel*right;
 		up_fracs.mV[1] = normvel*up;
-		up_fracs.normVec();
+		up_fracs.normalize();
 		LLVector3 new_up;
 		LLVector3 new_right;
 		new_up = up_fracs.mV[0] * right + up_fracs.mV[1]*up;
 		new_right = up_fracs.mV[1] * right - up_fracs.mV[0]*up;
 		up = new_up;
 		right = new_right;
-		up.normVec();
-		right.normVec();
+		up.normalize();
+		right.normalize();
 	}
 
 	right *= 0.5f*part.mScale.mV[0];
 	up *= 0.5f*part.mScale.mV[1];
 
+
 	const LLVector3& normal = -LLViewerCamera::getInstance()->getXAxis();
 		
 	*verticesp++ = part_pos_agent + up - right;
@@ -355,6 +358,13 @@ LLParticlePartition::LLParticlePartition()
 	mLODPeriod = 1;
 }
 
+LLHUDParticlePartition::LLHUDParticlePartition() :
+	LLParticlePartition()
+{
+	mDrawableType = LLPipeline::RENDER_TYPE_HUD;
+	mPartitionType = LLViewerRegion::PARTITION_HUD_PARTICLE;
+}
+
 void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_count, U32& index_count)
 {
 	group->mBufferUsage = mBufferUsage;
@@ -480,3 +490,24 @@ F32 LLParticlePartition::calcPixelArea(LLSpatialGroup* group, LLCamera& camera)
 	return 1024.f;
 }
 
+U32 LLVOHUDPartGroup::getPartitionType() const
+{ 
+	// Commenting out and returning PARTITION_NONE because DEV-16909 
+	// (SVC-2396: Particles not handled properly as hud) didn't work completely 
+	// so this disables HUD particles until they can be fixed properly. -MG
+	//return LLViewerRegion::PARTITION_HUD_PARTICLE; 
+	return LLViewerRegion::PARTITION_NONE;
+}
+
+LLDrawable* LLVOHUDPartGroup::createDrawable(LLPipeline *pipeline)
+{
+	pipeline->allocDrawable(this);
+	mDrawable->setLit(FALSE);
+	mDrawable->setRenderType(LLPipeline::RENDER_TYPE_HUD);
+	return mDrawable;
+}
+
+LLVector3 LLVOHUDPartGroup::getCameraPosition() const
+{
+	return LLVector3(-1,0,0);
+}
diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h
index 5fe6750..037aa63 100644
--- a/indra/newview/llvopartgroup.h
+++ b/indra/newview/llvopartgroup.h
@@ -80,6 +80,23 @@ protected:
 	~LLVOPartGroup();
 
 	LLViewerPartGroup *mViewerPartGroupp;
+
+	virtual LLVector3 getCameraPosition() const;
+
+};
+
+
+class LLVOHUDPartGroup : public LLVOPartGroup
+{
+public:
+	LLVOHUDPartGroup(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) : 
+	  LLVOPartGroup(id, pcode, regionp)   
+	{
+	}
+protected:
+	LLDrawable* createDrawable(LLPipeline *pipeline);
+	U32 getPartitionType() const;
+	virtual LLVector3 getCameraPosition() const;
 };
 
 #endif // LL_LLVOPARTGROUP_H
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 60f674e..8c3b718 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -294,7 +294,7 @@ void LLSkyTex::createGLImage(S32 which)
 
 void LLSkyTex::bindTexture(BOOL curr)
 {
-	mImageGL[getWhich(curr)]->bind();
+	gGL.getTexUnit(0)->bind(mImageGL[getWhich(curr)]);
 }
 
 /***************************************
@@ -308,7 +308,7 @@ S32 LLVOSky::sTileResX = sResolution/NUM_TILES_X;
 S32 LLVOSky::sTileResY = sResolution/NUM_TILES_Y;
 
 LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
-:	LLStaticViewerObject(id, pcode, regionp),
+:	LLStaticViewerObject(id, pcode, regionp, TRUE),
 	mSun(SUN_DISK_RADIUS), mMoon(MOON_DISK_RADIUS),
 	mBrightnessScale(1.f),
 	mBrightnessScaleNew(0.f),
@@ -528,7 +528,7 @@ void LLVOSky::initSkyTextureDirs(const S32 side, const S32 tile)
 			coeff[x_coef] = F32((x<<1) + 1) * inv_res - 1.f;
 			coeff[y_coef] = F32((y<<1) + 1) * inv_res - 1.f;
 			LLVector3 dir(coeff[0], coeff[1], coeff[2]);
-			dir.normVec();
+			dir.normalize();
 			mSkyTex[side].setDir(dir, x, y);
 			mShinyTex[side].setDir(dir, x, y);
 		}
@@ -762,7 +762,7 @@ void LLVOSky::calcSkyColorWLVert(LLVector3 & Pn, LLColor3 & vary_HazeColor, LLCo
 		Pn *= (-32000.f / Pn[1]);
 	}
 
-	Plen = Pn.magVec();
+	Plen = Pn.length();
 	Pn /= Plen;
 
 	// Initialize temp variables
@@ -1082,7 +1082,7 @@ BOOL LLVOSky::updateSky()
 			const static F32 COLOR_CHANGE_THRESHOLD = 0.01f;
 
 			LLVector3 direction = mSun.getDirection();
-			direction.normVec();
+			direction.normalize();
 			const F32 dot_lighting = direction * mLastLightingDirection;
 
 			LLColor3 delta_color;
@@ -1092,7 +1092,7 @@ BOOL LLVOSky::updateSky()
 
 			if ( mForceUpdate 
 				 || ((dot_lighting < LIGHT_DIRECTION_THRESHOLD)
-				 || (delta_color.magVec() > COLOR_CHANGE_THRESHOLD)
+				 || (delta_color.length() > COLOR_CHANGE_THRESHOLD)
 				 || !mInitialized)
 				&& !direction.isExactlyZero())
 			{
@@ -1336,8 +1336,8 @@ BOOL LLVOSky::updateGeometry(LLDrawable *drawable)
 	const LLVector3 &look_at = LLViewerCamera::getInstance()->getAtAxis();
 	LLVector3 right = look_at % LLVector3::z_axis;
 	LLVector3 up = right % look_at;
-	right.normVec();
-	up.normVec();
+	right.normalize();
+	up.normalize();
 
 	const static F32 elevation_factor = 0.0f/sResolution;
 	const F32 cos_max_angle = cosHorizon(elevation_factor);
@@ -1417,8 +1417,8 @@ BOOL LLVOSky::updateHeavenlyBodyGeometry(LLDrawable *drawable, const S32 f, cons
 
 	LLVector3 hb_right = to_dir % LLVector3::z_axis;
 	LLVector3 hb_up = hb_right % to_dir;
-	hb_right.normVec();
-	hb_up.normVec();
+	hb_right.normalize();
+	hb_up.normalize();
 
 	//const static F32 cos_max_turn = sqrt(3.f) / 2; // 30 degrees
 	//const F32 cos_turn_right = 1. / (llmax(cos_max_turn, hb_right * right));
@@ -1601,8 +1601,8 @@ void LLVOSky::updateSunHaloGeometry(LLDrawable *drawable )
 
 	const LLVector3 right = 2 * (v_corner[2] - v_corner[0]);
 	LLVector3 up = 2 * (v_corner[2] - v_corner[3]);
-	up.normVec();
-	F32 size = right.magVec();
+	up.normalize();
+	F32 size = right.length();
 	up = size * up;
 	const LLVector3 draw_pos = 0.25 * (v_corner[0] + v_corner[1] + v_corner[2] + v_corner[3]);
 	
@@ -1654,7 +1654,7 @@ void LLVOSky::updateSunHaloGeometry(LLDrawable *drawable )
 F32 dtReflection(const LLVector3& p, F32 cos_dir_from_top, F32 sin_dir_from_top, F32 diff_angl_dir)
 {
 	LLVector3 P = p;
-	P.normVec();
+	P.normalize();
 
 	const F32 cos_dir_angle = -P.mV[VZ];
 	const F32 sin_dir_angle = sqrt(1 - cos_dir_angle * cos_dir_angle);
@@ -1679,9 +1679,9 @@ F32 dtClip(const LLVector3& v0, const LLVector3& v1, F32 far_clip2)
 {
 	F32 dt_clip;
 	const LLVector3 otrezok = v1 - v0;
-	const F32 A = otrezok.magVecSquared();
+	const F32 A = otrezok.lengthSquared();
 	const F32 B = v0 * otrezok;
-	const F32 C = v0.magVecSquared() - far_clip2;
+	const F32 C = v0.lengthSquared() - far_clip2;
 	const F32 det = sqrt(B*B - A*C);
 	dt_clip = (-B - det) / A;
 	if ((dt_clip < 0) || (dt_clip > 1))
@@ -1701,16 +1701,16 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
 	LLVector3 hb_pos = to_dir * (HORIZON_DIST - 10);
 	LLVector3 to_dir_proj = to_dir;
 	to_dir_proj.mV[VZ] = 0;
-	to_dir_proj.normVec();
+	to_dir_proj.normalize();
 
 	LLVector3 Right = to_dir % LLVector3::z_axis;
 	LLVector3 Up = Right % to_dir;
-	Right.normVec();
-	Up.normVec();
+	Right.normalize();
+	Up.normalize();
 
 	// finding angle between  look direction and sprite.
 	LLVector3 look_at_right = look_at % LLVector3::z_axis;
-	look_at_right.normVec();
+	look_at_right.normalize();
 
 	const static F32 cos_horizon_angle = cosHorizon(0.0f/sResolution);
 	//const static F32 horizon_angle = acos(cos_horizon_angle);
@@ -1745,7 +1745,7 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
 	else
 		dt_hor = llmax(0.0f, llmin(1.0f, dt_hor));
 
-	top_hb.normVec();
+	top_hb.normalize();
 	const F32 cos_angle_of_view = fabs(top_hb.mV[VZ]);
 	const F32 extension = llmin (5.0f, 1.0f / cos_angle_of_view);
 
@@ -1762,11 +1762,11 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
 	F32 cos_dir_from_top[2];
 
 	LLVector3 dir = stretch_corner[0];
-	dir.normVec();
+	dir.normalize();
 	cos_dir_from_top[0] = dir.mV[VZ];
 
 	dir = stretch_corner[1];
-	dir.normVec();
+	dir.normalize();
 	cos_dir_from_top[1] = dir.mV[VZ];
 
 	const F32 sin_dir_from_top = sqrt(1 - cos_dir_from_top[0] * cos_dir_from_top[0]);
@@ -1789,7 +1789,7 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
 	for (vtx = 0; vtx < 2; ++vtx)
 	{
 		LLVector3 light_proj = v_corner[vtx];
-		light_proj.normVec();
+		light_proj.normalize();
 
 		const F32 z = light_proj.mV[VZ];
 		const F32 sin_angle = sqrt(1 - z * z);
@@ -1813,9 +1813,9 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
 	S32 side = 0;
 	LLVector3 refl_corn_norm[2];
 	refl_corn_norm[0] = v_refl_corner[1];
-	refl_corn_norm[0].normVec();
+	refl_corn_norm[0].normalize();
 	refl_corn_norm[1] = v_refl_corner[3];
-	refl_corn_norm[1].normVec();
+	refl_corn_norm[1].normalize();
 
 	F32 cos_refl_look_at[2];
 	cos_refl_look_at[0] = refl_corn_norm[0] * look_at;
@@ -1833,13 +1833,13 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
 	F32 dt_clip;
 	F32 vtx_near2, vtx_far2;
 
-	if ((vtx_far2 = v_refl_corner[side].magVecSquared()) > far_clip2)
+	if ((vtx_far2 = v_refl_corner[side].lengthSquared()) > far_clip2)
 	{
 		// whole thing is sprite: reflection is beyond far clip plane.
 		dt_clip = 1.1f;
 		quads = 1;
 	}
-	else if ((vtx_near2 = v_refl_corner[side+1].magVecSquared()) > far_clip2)
+	else if ((vtx_near2 = v_refl_corner[side+1].lengthSquared()) > far_clip2)
 	{
 		// part is reflection, the rest is sprite.
 		dt_clip = dtClip(v_refl_corner[side + 1], v_refl_corner[side], far_clip2);
@@ -1903,7 +1903,7 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
 		{
 			for (S32 vtx = 0; vtx < 4; ++vtx)
 			{
-				F32 ratio = far_clip / v_refl_corner[vtx].magVec();
+				F32 ratio = far_clip / v_refl_corner[vtx].length();
 				*(verticesp++) = v_refl_corner[vtx] = ratio * v_refl_corner[vtx] + mCameraPosAgent;
 			}
 			const LLVector3 draw_pos = 0.25 *
@@ -1912,10 +1912,10 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
 		}
 		else
 		{
-			F32 ratio = far_clip / v_refl_corner[1].magVec();
+			F32 ratio = far_clip / v_refl_corner[1].length();
 			v_sprite_corner[1] = v_refl_corner[1] * ratio;
 
-			ratio = far_clip / v_refl_corner[3].magVec();
+			ratio = far_clip / v_refl_corner[3].length();
 			v_sprite_corner[3] = v_refl_corner[3] * ratio;
 
 			v_refl_corner[1] = (1 - dt_clip) * v_refl_corner[1] + dt_clip * v_refl_corner[0];
@@ -2039,20 +2039,20 @@ void LLVOSky::updateFog(const F32 distance)
 	LLVector3 tosun = getToSunLast();
 	const F32 tosun_z = tosun.mV[VZ];
 	tosun.mV[VZ] = 0.f;
-	tosun.normVec();
+	tosun.normalize();
 	LLVector3 perp_tosun;
 	perp_tosun.mV[VX] = -tosun.mV[VY];
 	perp_tosun.mV[VY] = tosun.mV[VX];
 	LLVector3 tosun_45 = tosun + perp_tosun;
-	tosun_45.normVec();
+	tosun_45.normalize();
 
 	F32 delta = 0.06f;
 	tosun.mV[VZ] = delta;
 	perp_tosun.mV[VZ] = delta;
 	tosun_45.mV[VZ] = delta;
-	tosun.normVec();
-	perp_tosun.normVec();
-	tosun_45.normVec();
+	tosun.normalize();
+	perp_tosun.normalize();
+	tosun_45.normalize();
 
 	// Sky colors, just slightly above the horizon in the direction of the sun, perpendicular to the sun, and at a 45 degree angle to the sun.
 	initAtmospherics();
@@ -2202,8 +2202,8 @@ F32 azimuth(const LLVector3 &v)
 
 void LLVOSky::initSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_ang_velocity)
 {
-	LLVector3 sun_direction = (sun_dir.magVec() == 0) ? LLVector3::x_axis : sun_dir;
-	sun_direction.normVec();
+	LLVector3 sun_direction = (sun_dir.length() == 0) ? LLVector3::x_axis : sun_dir;
+	sun_direction.normalize();
 	mSun.setDirection(sun_direction);
 	mSun.renewDirection();
 	mSun.setAngularVelocity(sun_ang_velocity);
@@ -2222,8 +2222,8 @@ void LLVOSky::initSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_an
 
 void LLVOSky::setSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_ang_velocity)
 {
-	LLVector3 sun_direction = (sun_dir.magVec() == 0) ? LLVector3::x_axis : sun_dir;
-	sun_direction.normVec();
+	LLVector3 sun_direction = (sun_dir.length() == 0) ? LLVector3::x_axis : sun_dir;
+	sun_direction.normalize();
 
 	// Push the sun "South" as it approaches directly overhead so that we can always see bump mapping
 	// on the upward facing faces of cubes.
@@ -2239,7 +2239,7 @@ void LLVOSky::setSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_ang
 	// Blend between normal sun dir and adjusted sun dir based on how close we are
 	// to having the sun overhead.
 	mBumpSunDir = adjustedDir * sunDot + newDir * (1.0f - sunDot);
-	mBumpSunDir.normVec();
+	mBumpSunDir.normalize();
 
 	F32 dp = mLastLightingDirection * sun_direction;
 	mSun.setDirection(sun_direction);
diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp
index 310a745..7055b30 100644
--- a/indra/newview/llvosurfacepatch.cpp
+++ b/indra/newview/llvosurfacepatch.cpp
@@ -916,6 +916,87 @@ void LLVOSurfacePatch::getGeomSizesEast(const S32 stride, const S32 east_stride,
 	}
 }
 
+BOOL LLVOSurfacePatch::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face, BOOL pick_transparent, S32 *face_hitp,
+									  LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
+	
+{
+
+	if (!lineSegmentBoundingBox(start, end))
+	{
+		return FALSE;
+	}
+
+	LLVector3 delta = end-start;
+		
+	LLVector3 pdelta = delta;
+	pdelta.mV[2] = 0;
+
+	F32 plength = pdelta.length();
+	
+	F32 tdelta = 1.f/plength;
+
+	LLVector3 origin = start - mRegionp->getOriginAgent();
+
+	if (mRegionp->getLandHeightRegion(origin) > origin.mV[2])
+	{
+		//origin is under ground, treat as no intersection
+		return FALSE;
+	}
+
+	//step one meter at a time until intersection point found
+
+	F32 t = 0.f;
+	while ( t <= 1.f)
+	{
+		LLVector3 sample = origin + delta*t;
+		
+		F32 height = mRegionp->getLandHeightRegion(sample);
+		if (height > sample.mV[2])
+		{ //ray went below ground, positive intersection
+			//quick and dirty binary search to get impact point
+			tdelta = -tdelta*0.5f;
+			F32 err_dist = 0.001f;
+			F32 dist = fabsf(sample.mV[2] - height);
+
+			while (dist > err_dist && tdelta*tdelta > 0.0f)
+			{
+				t += tdelta;
+				sample = origin+delta*t;
+				height = mRegionp->getLandHeightRegion(sample);
+				if ((tdelta < 0 && height < sample.mV[2]) ||
+					(height > sample.mV[2] && tdelta > 0))
+				{ //jumped over intersection point, go back
+					tdelta = -tdelta;
+				}
+				tdelta *= 0.5f;
+				dist = fabsf(sample.mV[2] - height);
+			}
+
+			if (intersection)
+			{
+				sample.mV[2] = mRegionp->getLandHeightRegion(sample);
+				*intersection = sample + mRegionp->getOriginAgent();
+			}
+
+			if (normal)
+			{
+				*normal = mRegionp->getLand().resolveNormalGlobal(mRegionp->getPosGlobalFromRegion(sample));
+			}
+
+			return TRUE;
+		}
+
+		t += tdelta;
+		if (t > 1 && t < 1.f+tdelta*0.99f)
+		{ //make sure end point is checked (saves vertical lines coming up negative)
+			t = 1.f;
+		}
+	}
+
+
+	return FALSE;
+}
+
 void LLVOSurfacePatch::updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax)
 {
 	LLVector3 posAgent = getPositionAgent();
diff --git a/indra/newview/llvosurfacepatch.h b/indra/newview/llvosurfacepatch.h
index 52c11c9..f014ca6 100644
--- a/indra/newview/llvosurfacepatch.h
+++ b/indra/newview/llvosurfacepatch.h
@@ -85,6 +85,16 @@ public:
 	void dirtyPatch();
 	void dirtyGeom();
 
+	/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, 
+										  S32 face = -1,                        // which face to check, -1 = ALL_SIDES
+										  BOOL pick_transparent = FALSE,
+										  S32* face_hit = NULL,                 // which face was hit
+										  LLVector3* intersection = NULL,       // return the intersection point
+										  LLVector2* tex_coord = NULL,          // return the texture coordinates of the intersection point
+										  LLVector3* normal = NULL,             // return the surface normal at the intersection point
+										  LLVector3* bi_normal = NULL           // return the surface bi-normal at the intersection point
+		);
+
 	BOOL			mDirtiedPatch;
 protected:
 	~LLVOSurfacePatch();
diff --git a/indra/newview/llvotextbubble.cpp b/indra/newview/llvotextbubble.cpp
index 5424cc8..69b57d9 100644
--- a/indra/newview/llvotextbubble.cpp
+++ b/indra/newview/llvotextbubble.cpp
@@ -126,7 +126,7 @@ void LLVOTextBubble::updateTextures(LLAgent &agent)
 
 	LLVector3 position_local = getPositionAgent() - agent.getCameraPositionAgent();
 	F32 dot_product = position_local * agent.getFrameAgent().getAtAxis();
-	F32 cos_angle = dot_product / position_local.magVec();
+	F32 cos_angle = dot_product / position_local.length();
 
 	if (cos_angle > 1.f)
 	{
diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp
index c86803d..06ab222 100644
--- a/indra/newview/llvotree.cpp
+++ b/indra/newview/llvotree.cpp
@@ -273,9 +273,9 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys,
 	// Do base class updates...
 	U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp);
 
-	if (  (getVelocity().magVecSquared() > 0.f)
-		||(getAcceleration().magVecSquared() > 0.f)
-		||(getAngularVelocity().magVecSquared() > 0.f))
+	if (  (getVelocity().lengthSquared() > 0.f)
+		||(getAcceleration().lengthSquared() > 0.f)
+		||(getAngularVelocity().lengthSquared() > 0.f))
 	{
 		llinfos << "ACK! Moving tree!" << llendl;
 		setVelocity(LLVector3::zero);
@@ -312,7 +312,7 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys,
 	mTreeImagep = gImageList.getImage(sSpeciesTable[mSpecies]->mTextureID);
 	if (mTreeImagep)
 	{
-		mTreeImagep->bindTexture(0);
+		gGL.getTexUnit(0)->bind(mTreeImagep.get());
 	}
 	mBranchLength = sSpeciesTable[mSpecies]->mBranchLength;
 	mTrunkLength = sSpeciesTable[mSpecies]->mTrunkLength;
@@ -359,14 +359,14 @@ BOOL LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
 	mTrunkBend += mTrunkVel;
 	mTrunkVel *= 0.99f;									//  Add damping
 
-	if (mTrunkBend.magVec() > 1.f)
+	if (mTrunkBend.length() > 1.f)
 	{
-		mTrunkBend.normVec();
+		mTrunkBend.normalize();
 	}
 
-	if (mTrunkVel.magVec() > 1.f)
+	if (mTrunkVel.length() > 1.f)
 	{
-		mTrunkVel.normVec();
+		mTrunkVel.normalize();
 	}
 
 	return TRUE;
@@ -391,7 +391,7 @@ void LLVOTree::setPixelAreaAndAngle(LLAgent &agent)
 	
 	// This should be the camera's center, as soon as we move to all region-local.
 	LLVector3 relative_position = getPositionAgent() - agent.getCameraPositionAgent();
-	F32 range = relative_position.magVec();				// ugh, square root
+	F32 range = relative_position.length();				// ugh, square root
 
 	F32 max_scale = mBillboardScale * getMaxScale();
 	F32 area = max_scale * (max_scale*mBillboardRatio);
@@ -713,9 +713,9 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
 				LLVector2 tc;
 				// This isn't totally accurate.  Should compute based on slope as well.
 				start_radius = r0 * (1.f + 1.2f*fabs(z - 0.66f*height)/height);
-				nvec.setVec(	cos(nangle * DEG_TO_RAD)*start_radius*nvec_scale, 
-								sin(nangle * DEG_TO_RAD)*start_radius*nvec_scale, 
-								z*nvec_scalez); 
+				nvec.set(	cos(nangle * DEG_TO_RAD)*start_radius*nvec_scale, 
+							sin(nangle * DEG_TO_RAD)*start_radius*nvec_scale, 
+							z*nvec_scalez); 
 				// First and last slice at 0 radius (to bring in top/bottom of structure)
 				radius = start_radius + turbulence3((F32*)&nvec.mV, (F32)fractal_depth)*noise_scale;
 
@@ -918,7 +918,7 @@ void LLVOTree::updateRadius()
 
 void LLVOTree::updateSpatialExtents(LLVector3& newMin, LLVector3& newMax)
 {
-	F32 radius = getScale().magVec()*0.05f;
+	F32 radius = getScale().length()*0.05f;
 	LLVector3 center = getRenderPosition();
 
 	F32 sz = mBillboardScale*mBillboardRatio*radius*0.5f; 
@@ -926,11 +926,53 @@ void LLVOTree::updateSpatialExtents(LLVector3& newMin, LLVector3& newMax)
 
 	center += LLVector3(0, 0, size.mV[2]) * getRotation();
 	
-	newMin.setVec(center-size);
-	newMax.setVec(center+size);
+	newMin.set(center-size);
+	newMax.set(center+size);
 	mDrawable->setPositionGroup(center);
 }
 
+BOOL LLVOTree::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face, BOOL pick_transparent, S32 *face_hitp,
+									  LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
+	
+{
+
+	if (!lineSegmentBoundingBox(start, end))
+	{
+		return FALSE;
+	}
+
+	const LLVector3* ext = mDrawable->getSpatialExtents();
+
+	LLVector3 center = (ext[1]+ext[0])*0.5f;
+	LLVector3 size = (ext[1]-ext[0]);
+
+	LLQuaternion quat = getRotation();
+
+	center -= LLVector3(0,0,size.magVec() * 0.25f)*quat;
+
+	size.scaleVec(LLVector3(0.25f, 0.25f, 1.f));
+	size.mV[0] = llmin(size.mV[0], 1.f);
+	size.mV[1] = llmin(size.mV[1], 1.f);
+
+	LLVector3 pos, norm;
+		
+	if (linesegment_tetrahedron(start, end, center, size, quat, pos, norm))
+	{
+		if (intersection)
+		{
+			*intersection = pos;
+		}
+
+		if (normal)
+		{
+			*normal = norm;
+		}
+		return TRUE;
+	}
+	
+	return FALSE;
+}
+
 U32 LLVOTree::getPartitionType() const
 { 
 	return LLViewerRegion::PARTITION_TREE; 
diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h
index 180e5b0..d6152a5 100644
--- a/indra/newview/llvotree.h
+++ b/indra/newview/llvotree.h
@@ -80,6 +80,17 @@ public:
 
 	U32 drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD, S32 stop_level, U16 depth, U16 trunk_depth,  F32 scale, F32 twist, F32 droop,  F32 branches, F32 alpha);
  
+
+	 /*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, 
+										  S32 face = -1,                        // which face to check, -1 = ALL_SIDES
+										  BOOL pick_transparent = FALSE,
+										  S32* face_hit = NULL,                 // which face was hit
+										  LLVector3* intersection = NULL,       // return the intersection point
+										  LLVector2* tex_coord = NULL,          // return the texture coordinates of the intersection point
+										  LLVector3* normal = NULL,             // return the surface normal at the intersection point
+										  LLVector3* bi_normal = NULL           // return the surface bi-normal at the intersection point
+		);
+
 	static S32 sMaxTreeSpecies;
 
 	struct TreeSpeciesData
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 9d8369f..47289ff 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -90,7 +90,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re
 	mLOD = MIN_LOD;
 	mSculptLevel = -2;
 	mTextureAnimp = NULL;
-	mVObjRadius = LLVector3(1,1,0.5f).magVec();
+	mVObjRadius = LLVector3(1,1,0.5f).length();
 	mNumFaces = 0;
 	mLODChanged = FALSE;
 	mSculptChanged = FALSE;
@@ -577,7 +577,7 @@ F32 LLVOVolume::getTextureVirtualSize(LLFace* face)
 
 	//get area of circle in texture space
 	LLVector2 tdim = face->mTexExtents[1] - face->mTexExtents[0];
-	F32 texel_area = (tdim * 0.5f).magVecSquared()*3.14159f;
+	F32 texel_area = (tdim * 0.5f).lengthSquared()*3.14159f;
 	if (texel_area <= 0)
 	{
 		// Probably animated, use default
@@ -605,7 +605,7 @@ BOOL LLVOVolume::setMaterial(const U8 material)
 void LLVOVolume::setTexture(const S32 face)
 {
 	llassert(face < getNumTEs());
-	LLViewerImage::bindTexture(getTEImage(face));
+	gGL.getTexUnit(0)->bind(getTEImage(face));
 }
 
 void LLVOVolume::setScale(const LLVector3 &scale, BOOL damped)
@@ -828,7 +828,7 @@ BOOL LLVOVolume::calcLOD()
 
 	S32 cur_detail = 0;
 	
-	F32 radius = getVolume()->mLODScaleBias.scaledVec(getScale()).magVec();
+	F32 radius = getVolume()->mLODScaleBias.scaledVec(getScale()).length();
 	F32 distance = mDrawable->mDistanceWRTCamera;
 	distance *= sDistanceFactor;
 			
@@ -1687,7 +1687,7 @@ void LLVOVolume::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_p
 
 		//transform view vector into volume space
 		view_vector -= getRenderPosition();
-		mDrawable->mDistanceWRTCamera = view_vector.magVec();
+		mDrawable->mDistanceWRTCamera = view_vector.length();
 		LLQuaternion worldRot = getRenderRotation();
 		view_vector = view_vector * ~worldRot;
 		if (!isVolumeGlobal())
@@ -1728,7 +1728,7 @@ void LLVOVolume::updateRadius()
 		return;
 	}
 	
-	mVObjRadius = getScale().magVec();
+	mVObjRadius = getScale().length();
 	mDrawable->setRadius(mVObjRadius);
 }
 
@@ -1841,7 +1841,7 @@ F32 LLVOVolume::getBinRadius()
 	}
 	else if (shrink_wrap)
 	{
-		radius = (ext[1]-ext[0]).magVec()*0.5f;
+		radius = (ext[1]-ext[0]).length()*0.5f;
 	}
 	else if (mDrawable->isStatic())
 	{
@@ -1934,10 +1934,18 @@ LLVector3 LLVOVolume::volumeDirectionToAgent(const LLVector3& dir) const
 }
 
 
-BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face, S32 *face_hitp,
+BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face, BOOL pick_transparent, S32 *face_hitp,
 									  LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
 	
 {
+	if (!mbCanSelect ||
+		(gHideSelectedObjects && isSelected()) ||
+			mDrawable->isDead() || 
+			!gPipeline.hasRenderType(mDrawable->getRenderType()))
+	{
+		return FALSE;
+	}
+
 	LLVolume* volume = getVolume();
 	if (volume)
 	{	
@@ -1946,37 +1954,88 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
 		v_start = agentPositionToVolume(start);
 		v_end = agentPositionToVolume(end);
 		
-		S32 face_hit = volume->lineSegmentIntersect(v_start, v_end, face,
-													intersection, tex_coord, normal, bi_normal);
-		if (face_hit >= 0)
+		LLVector3 p;
+		LLVector3 n;
+		LLVector2 tc;
+		LLVector3 bn;
+
+		if (intersection != NULL)
 		{
-			if (face_hitp != NULL)
-			{
-				*face_hitp = face_hit;
-			}
+			p = *intersection;
+		}
+
+		if (tex_coord != NULL)
+		{
+			tc = *tex_coord;
+		}
+
+		if (normal != NULL)
+		{
+			n = *normal;
+		}
+
+		if (bi_normal != NULL)
+		{
+			bn = *bi_normal;
+		}
+
+		S32 face_hit = -1;
+
+		S32 start_face, end_face;
+		if (face == -1)
+		{
+			start_face = 0;
+			end_face = volume->getNumFaces();
+		}
+		else
+		{
+			start_face = face;
+			end_face = face+1;
+		}
+
+		for (S32 i = start_face; i < end_face; ++i)
+		{
+			face_hit = volume->lineSegmentIntersect(v_start, v_end, i,
+													&p, &tc, &n, &bn);
 			
-			if (intersection != NULL)
+			if (face_hit >= 0)
 			{
-				*intersection = volumePositionToAgent(*intersection);  // must map back to agent space
-			}
+				LLFace* face = mDrawable->getFace(face_hit);
+				if (pick_transparent || !face->getTexture() || face->getTexture()->getMask(face->surfaceToTexture(tc, p, n)))
+				{
+					if (face_hitp != NULL)
+					{
+						*face_hitp = face_hit;
+					}
+					
+					if (intersection != NULL)
+					{
+						*intersection = volumePositionToAgent(p);  // must map back to agent space
+					}
 
-			if (normal != NULL)
-			{
-				*normal = volumeDirectionToAgent(*normal);
-				(*normal).normVec();
-			}
+					if (normal != NULL)
+					{
+						*normal = volumeDirectionToAgent(n);
+						(*normal).normVec();
+					}
 
-			if (bi_normal != NULL)
-			{
-				*bi_normal = volumeDirectionToAgent(*bi_normal);
-				(*bi_normal).normVec();
-			}
+					if (bi_normal != NULL)
+					{
+						*bi_normal = volumeDirectionToAgent(bn);
+						(*bi_normal).normVec();
+					}
 
-			
-			return TRUE;
+					if (tex_coord != NULL)
+					{
+						*tex_coord = tc;
+					}
+					
+					return TRUE;
+				}
+			}
 		}
 	}
-	
+		
 	return FALSE;
 }
 
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index d8828f0..9502bc3 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -114,6 +114,7 @@ public:
 
 	/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, 
 										  S32 face = -1,                        // which face to check, -1 = ALL_SIDES
+										  BOOL pick_transparent = FALSE,
 										  S32* face_hit = NULL,                 // which face was hit
 										  LLVector3* intersection = NULL,       // return the intersection point
 										  LLVector2* tex_coord = NULL,          // return the texture coordinates of the intersection point
diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp
index 159603e..7c8e874 100644
--- a/indra/newview/llvowlsky.cpp
+++ b/indra/newview/llvowlsky.cpp
@@ -87,7 +87,7 @@ inline U32 LLVOWLSky::getStarsNumIndices(void)
 }
 
 LLVOWLSky::LLVOWLSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
-	: LLStaticViewerObject(id, pcode, regionp)
+	: LLStaticViewerObject(id, pcode, regionp, TRUE)
 {
 	initStars();
 }
@@ -488,7 +488,7 @@ void LLVOWLSky::drawStars(void)
 	if (mStarsVerts.notNull())
 	{
 		mStarsVerts->setBuffer(LLDrawPoolWLSky::STAR_VERTEX_DATA_MASK);
-		mStarsVerts->draw(LLVertexBuffer::POINTS, getStarsNumIndices(), 0);
+		mStarsVerts->draw(LLRender::POINTS, getStarsNumIndices(), 0);
 	}
 }
 
@@ -513,7 +513,7 @@ void LLVOWLSky::drawDome(void)
 		strips_segment->setBuffer(data_mask);
 
 		strips_segment->drawRange(
-			LLVertexBuffer::TRIANGLE_STRIP, 
+			LLRender::TRIANGLE_STRIP, 
 			0, strips_segment->getRequestedVerts()-1, strips_segment->getRequestedIndices(), 
 			0);
 		gPipeline.addTrianglesDrawn(strips_segment->getRequestedIndices() - 2);
diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp
index f4f1163..e61c5b6 100644
--- a/indra/newview/llwaterparammanager.cpp
+++ b/indra/newview/llwaterparammanager.cpp
@@ -89,48 +89,57 @@ LLWaterParamManager::~LLWaterParamManager()
 void LLWaterParamManager::loadAllPresets(const std::string& file_name)
 {
 	std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", ""));
-	LL_INFOS2("AppInit", "Shaders") << "Loading water settings from " << path_name << LL_ENDL;
-
-	//mParamList.clear();
-	
+	LL_INFOS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL;
+			
 	bool found = true;			
 	while(found) 
 	{
 		std::string name;
 		found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name, false);
-
-		LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
-		
-		// if we have one
-		if(found) 
+		if(found)
 		{
+
+			name=name.erase(name.length()-4);
+
 			// bugfix for SL-46920: preventing filenames that break stuff.
 			char * curl_str = curl_unescape(name.c_str(), name.size());
 			std::string unescaped_name(curl_str);
 			curl_free(curl_str);
 			curl_str = NULL;
 
-			// not much error checking here since we're getting rid of this
-			std::string water_name = unescaped_name.substr(0, unescaped_name.size() - 4);
-		
-			std::string cur_path(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", name));
-			LL_DEBUGS2("AppInit", "Shaders") << "Loading water from " << cur_path << LL_ENDL;
+			LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
+			loadPreset(unescaped_name,FALSE);
+		}
+	}
+
+	// And repeat for user presets, note the user presets will modify any system presets already loaded
+
+	std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
+	LL_INFOS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL;
 			
-			llifstream water_xml(cur_path);
-			if (water_xml)
-			{
-				LLSD water_data(LLSD::emptyMap());
-				LLPointer<LLSDParser> parser = new LLSDXMLParser();
-				parser->parse(water_xml, water_data, LLSDSerialize::SIZE_UNLIMITED);
+	found = true;			
+	while(found) 
+	{
+		std::string name;
+		found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name, false);
+		if(found)
+		{
+			name=name.erase(name.length()-4);
 
-				addParamSet(water_name, water_data);
-				water_xml.close();
-			}
+			// bugfix for SL-46920: preventing filenames that break stuff.
+			char * curl_str = curl_unescape(name.c_str(), name.size());
+			std::string unescaped_name(curl_str);
+			curl_free(curl_str);
+			curl_str = NULL;
+
+			LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
+			loadPreset(unescaped_name,FALSE);
 		}
 	}
+
 }
 
-void LLWaterParamManager::loadPreset(const std::string & name)
+void LLWaterParamManager::loadPreset(const std::string & name,bool propagate)
 {
 	// bugfix for SL-46920: preventing filenames that break stuff.
 	char * curl_str = curl_escape(name.c_str(), name.size());
@@ -142,8 +151,17 @@ void LLWaterParamManager::loadPreset(const std::string & name)
 
 	std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", escaped_filename));
 	llinfos << "Loading water settings from " << pathName << llendl;
-
-	llifstream presetsXML(pathName);
+	
+	std::ifstream presetsXML;
+	presetsXML.open(pathName.c_str());
+	
+	// That failed, try loading from the users area instead.
+	if(!presetsXML)
+	{
+		pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", escaped_filename);
+		llinfos << "Loading User water setting from " << pathName << llendl;
+		presetsXML.open(pathName.c_str());
+	}
 
 	if (presetsXML)
 	{
@@ -170,10 +188,12 @@ void LLWaterParamManager::loadPreset(const std::string & name)
 		return;
 	}
 
-	getParamSet(name, mCurParams);
-
-	propagateParameters();
-}
+	if(propagate)
+	{
+		getParamSet(name, mCurParams);
+		propagateParameters();
+	}
+}	
 
 void LLWaterParamManager::savePreset(const std::string & name)
 {
@@ -187,7 +207,7 @@ void LLWaterParamManager::savePreset(const std::string & name)
 
 	// make an empty llsd
 	LLSD paramsData(LLSD::emptyMap());
-	std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", escaped_filename));
+	std::string pathName(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", escaped_filename));
 
 	// fill it with LLSD windlight params
 	paramsData = mParamList[name].getAll();
@@ -390,7 +410,8 @@ bool LLWaterParamManager::removeParamSet(const std::string& name, bool delete_fr
 
 	if(delete_from_disk)
 	{
-		std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", ""));
+
+		std::string path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
 		
 		// use full curl escaped name
 		char * curl_str = curl_escape(name.c_str(), name.size());
diff --git a/indra/newview/llwaterparammanager.h b/indra/newview/llwaterparammanager.h
index 872725e..a351697 100644
--- a/indra/newview/llwaterparammanager.h
+++ b/indra/newview/llwaterparammanager.h
@@ -228,7 +228,8 @@ public:
 	void loadAllPresets(const std::string & fileName);
 
 	/// load an individual preset into the sky
-	void loadPreset(const std::string & name);
+
+	void loadPreset(const std::string & name,bool propagate=true);
 
 	/// save the parameter presets to file
 	void savePreset(const std::string & name);
diff --git a/indra/newview/llwebbrowserctrl.cpp b/indra/newview/llwebbrowserctrl.cpp
index e9a7132..8c56e5c 100644
--- a/indra/newview/llwebbrowserctrl.cpp
+++ b/indra/newview/llwebbrowserctrl.cpp
@@ -596,14 +596,14 @@ void LLWebBrowserCtrl::draw()
 		}
 
 		// scale texture to fit the space using texture coords
-		mWebBrowserImage->bindTexture();
+		gGL.getTexUnit(0)->bind(mWebBrowserImage->getTexture());
 		gGL.color4fv( LLColor4::white.mV );
 		F32 max_u = ( F32 )mWebBrowserImage->getBrowserWidth() / ( F32 )mWebBrowserImage->getWidth();
 		F32 max_v = ( F32 )mWebBrowserImage->getBrowserHeight() / ( F32 )mWebBrowserImage->getHeight();
 
 		// draw the browser
 		gGL.setSceneBlendType(LLRender::BT_REPLACE);
-		gGL.begin( LLVertexBuffer::QUADS );
+		gGL.begin( LLRender::QUADS );
 		{
 			// render using web browser reported width and height, instead of trying to invert GL scale
 			gGL.texCoord2f( max_u, max_v );
diff --git a/indra/newview/llwindebug.cpp b/indra/newview/llwindebug.cpp
index d2f6748..04457eb 100644
--- a/indra/newview/llwindebug.cpp
+++ b/indra/newview/llwindebug.cpp
@@ -42,6 +42,7 @@
 #pragma warning(disable: 4200)	//nonstandard extension used : zero-sized array in struct/union
 #pragma warning(disable: 4100)	//unreferenced formal parameter
 
+
 /*
 LLSD Block for Windows Dump Information
 <llsd>
@@ -552,6 +553,58 @@ void LLMemoryReserve::release()
 
 static LLMemoryReserve gEmergencyMemoryReserve;
 
+#ifndef _M_IX86
+	#error "The following code only works for x86!"
+#endif
+LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(
+	LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter)
+{
+	if(lpTopLevelExceptionFilter ==  gFilterFunc)
+		return gFilterFunc;
+
+	llinfos << "Someone tried to set the exception filter. Listing call stack modules" << llendl;
+	LLSD cs_info;
+	GetCallStackData(NULL, cs_info);
+	
+	if(cs_info.has("CallStack") && cs_info["CallStack"].isArray())
+	{
+		LLSD cs = cs_info["CallStack"];
+		for(LLSD::array_iterator i = cs.beginArray(); 
+			i != cs.endArray(); 
+			++i)
+		{
+			llinfos << "Module: " << (*i)["ModuleName"] << llendl;
+		}
+	}
+	
+	return gFilterFunc;
+}
+
+BOOL PreventSetUnhandledExceptionFilter()
+{
+	HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll"));
+	if (hKernel32 == NULL) 
+		return FALSE;
+
+	void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter");
+	if(pOrgEntry == NULL) 
+		return FALSE;
+	
+	unsigned char newJump[ 100 ];
+	DWORD dwOrgEntryAddr = (DWORD)pOrgEntry;
+	dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far
+	void *pNewFunc = &MyDummySetUnhandledExceptionFilter;
+	DWORD dwNewEntryAddr = (DWORD) pNewFunc;
+	DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;
+
+	newJump[ 0 ] = 0xE9;  // JMP absolute
+	memcpy(&newJump[ 1 ], &dwRelativeAddr, sizeof(pNewFunc));
+	SIZE_T bytesWritten;
+	BOOL bRet = WriteProcessMemory(GetCurrentProcess(),
+	pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten);
+	return bRet;
+}
+
 // static
 void  LLWinDebug::initExceptionHandler(LPTOP_LEVEL_EXCEPTION_FILTER filter_func)
 {
@@ -602,6 +655,9 @@ void  LLWinDebug::initExceptionHandler(LPTOP_LEVEL_EXCEPTION_FILTER filter_func)
     LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
 	prev_filter = SetUnhandledExceptionFilter(filter_func);
 
+	// *REMOVE:Mani
+	//PreventSetUnhandledExceptionFilter();
+
 	if(prev_filter != gFilterFunc)
 	{
 		LL_WARNS("AppInit") 
@@ -737,3 +793,10 @@ void LLWinDebug::generateCrashStacks(struct _EXCEPTION_POINTERS *exception_infop
 	LLSDSerialize::toPrettyXML(info, out_file);
 	out_file.close();
 }
+
+void LLWinDebug::clearCrashStacks()
+{
+	LLSD info;
+	std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLifeException.log");
+	LLFile::remove(dump_path);
+}
diff --git a/indra/newview/llwindebug.h b/indra/newview/llwindebug.h
index eef2340..e6e32b4 100644
--- a/indra/newview/llwindebug.h
+++ b/indra/newview/llwindebug.h
@@ -39,7 +39,6 @@ class LLWinDebug
 {
 public:
 
-
 	/** 
 	* @brief initialize the llwindebug exception filter callback
 	* 
@@ -66,6 +65,8 @@ public:
 	static bool checkExceptionHandler();
 
 	static void generateCrashStacks(struct _EXCEPTION_POINTERS *pExceptionInfo = NULL);
+	static void clearCrashStacks(); // Delete the crash stack file(s).
+
 	static void writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename);
 private:
 };
diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp
index 1707fe9..b522284 100644
--- a/indra/newview/llwlparammanager.cpp
+++ b/indra/newview/llwlparammanager.cpp
@@ -106,84 +106,65 @@ LLWLParamManager::~LLWLParamManager()
 
 void LLWLParamManager::loadPresets(const std::string& file_name)
 {
-	// if fileName exists, use legacy loading form the big file, otherwise, search the sky 
-	// directory, and add the list
-	if(file_name != "") 
+	std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", ""));
+	LL_INFOS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL;
+			
+	bool found = true;			
+	while(found) 
 	{
-		std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", file_name));
-		LL_INFOS2("AppInit", "Shaders") << "Loading WindLight settings from " << path_name << LL_ENDL;
-
-		llifstream presetsXML(path_name);
-	
-		if (presetsXML)
+		std::string name;
+		found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name, false);
+		if(found)
 		{
-			LLSD paramsData(LLSD::emptyMap());
 
-			LLPointer<LLSDParser> parser = new LLSDXMLParser();
+			name=name.erase(name.length()-4);
 
-			parser->parse(presetsXML, paramsData, LLSDSerialize::SIZE_UNLIMITED);
+			// bugfix for SL-46920: preventing filenames that break stuff.
+			char * curl_str = curl_unescape(name.c_str(), name.size());
+			std::string unescaped_name(curl_str);
+			curl_free(curl_str);
+			curl_str = NULL;
 
-			LLSD::map_const_iterator endParams = paramsData.endMap();
-			for(LLSD::map_const_iterator curParams = paramsData.beginMap();
-				curParams != endParams;
-				++curParams)
-			{
-				addParamSet(curParams->first, curParams->second);
-			}
+			LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
+			loadPreset(unescaped_name,FALSE);
 		}
 	}
-	
-	// otherwise, search the sky directory and find things there
-	else
+
+	// And repeat for user presets, note the user presets will modify any system presets already loaded
+
+	std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
+	LL_INFOS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL;
+			
+	found = true;			
+	while(found) 
 	{
-		std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", ""));
-		LL_INFOS2("AppInit", "Shaders") << "Loading WindLight settings from " << path_name << LL_ENDL;
-	
-		//mParamList.clear();
-		
-		bool found = true;			
-		while(found) 
+		std::string name;
+		found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name, false);
+		if(found)
 		{
-			std::string name;
-			found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name, false);
+			name=name.erase(name.length()-4);
+
+			// bugfix for SL-46920: preventing filenames that break stuff.
+			char * curl_str = curl_unescape(name.c_str(), name.size());
+			std::string unescaped_name(curl_str);
+			curl_free(curl_str);
+			curl_str = NULL;
 
 			LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
-			
-			// if we have one
-			if(found) 
-			{
-				// bugfix for SL-46920: preventing filenames that break stuff.
-				char * curl_str = curl_unescape(name.c_str(), name.size());
-				std::string unescaped_name(curl_str);
-				curl_free(curl_str);
-				curl_str = NULL;
-
-				// not much error checking here since we're getting rid of this
-				std::string sky_name = unescaped_name.substr(0, unescaped_name.size() - 4);
-			
-				std::string cur_path(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", name));
-				LL_DEBUGS2("AppInit", "Shaders") << "Loading sky from " << cur_path << LL_ENDL;
-				
-				llifstream sky_xml(cur_path);
-				if (sky_xml)
-				{
-					LLSD sky_data(LLSD::emptyMap());
-					LLPointer<LLSDParser> parser = new LLSDXMLParser();
-					parser->parse(sky_xml, sky_data, LLSDSerialize::SIZE_UNLIMITED);
-
-					addParamSet(sky_name, sky_data);
-					sky_xml.close();
-				}
-			}
+			loadPreset(unescaped_name,FALSE);
 		}
 	}
+
 }
 
 void LLWLParamManager::savePresets(const std::string & fileName)
 {
+	//Nobody currently calls me, but if they did, then its reasonable to write the data out to the user's folder
+	//and not over the RO system wide version.
+
 	LLSD paramsData(LLSD::emptyMap());
 	
-	std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", fileName));
+	std::string pathName(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight", fileName));
 
 	for(std::map<std::string, LLWLParamSet>::iterator mIt = mParamList.begin();
 		mIt != mParamList.end();
@@ -201,8 +182,9 @@ void LLWLParamManager::savePresets(const std::string & fileName)
 	presetsXML.close();
 }
 
-void LLWLParamManager::loadPreset(const std::string & name)
+void LLWLParamManager::loadPreset(const std::string & name,bool propagate)
 {
+	
 	// bugfix for SL-46920: preventing filenames that break stuff.
 	char * curl_str = curl_escape(name.c_str(), name.size());
 	std::string escaped_filename(curl_str);
@@ -214,7 +196,16 @@ void LLWLParamManager::loadPreset(const std::string & name)
 	std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", escaped_filename));
 	llinfos << "Loading WindLight sky setting from " << pathName << llendl;
 
-	llifstream presetsXML(pathName);
+	llifstream presetsXML;
+	presetsXML.open(pathName.c_str());
+
+	// That failed, try loading from the users area instead.
+	if(!presetsXML)
+	{
+		pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", escaped_filename);
+		llinfos << "Loading User WindLight sky setting from " << pathName << llendl;
+		presetsXML.open(pathName.c_str());
+	}
 
 	if (presetsXML)
 	{
@@ -241,10 +232,13 @@ void LLWLParamManager::loadPreset(const std::string & name)
 		return;
 	}
 
-	getParamSet(name, mCurParams);
-
-	propagateParameters();
-}
+	
+	if(propagate)
+	{
+		getParamSet(name, mCurParams);
+		propagateParameters();
+	}
+}	
 
 void LLWLParamManager::savePreset(const std::string & name)
 {
@@ -258,7 +252,7 @@ void LLWLParamManager::savePreset(const std::string & name)
 
 	// make an empty llsd
 	LLSD paramsData(LLSD::emptyMap());
-	std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", escaped_filename));
+	std::string pathName(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", escaped_filename));
 
 	// fill it with LLSD windlight params
 	paramsData = mParamList[name].getAll();
@@ -533,7 +527,7 @@ bool LLWLParamManager::removeParamSet(const std::string& name, bool delete_from_
 	
 	if(delete_from_disk)
 	{
-		std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", ""));
+		std::string path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
 		
 		// use full curl escaped name
 		char * curl_str = curl_escape(name.c_str(), name.size());
diff --git a/indra/newview/llwlparammanager.h b/indra/newview/llwlparammanager.h
index 7094051..2e1edad 100644
--- a/indra/newview/llwlparammanager.h
+++ b/indra/newview/llwlparammanager.h
@@ -135,7 +135,7 @@ public:
 	void savePresets(const std::string & fileName);
 
 	/// load an individual preset into the sky
-	void loadPreset(const std::string & name);
+	void loadPreset(const std::string & name,bool propogate=true);
 
 	/// save the parameter presets to file
 	void savePreset(const std::string & name);
@@ -195,7 +195,6 @@ public:
 	// singleton pattern implementation
 	static LLWLParamManager * instance();
 
-
 public:
 
 	// helper variables
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 66c4068..28df561 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -32,6 +32,7 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "llworld.h"
+#include "llrender.h"
 
 #include "indra_constants.h"
 #include "llstl.h"
@@ -108,7 +109,7 @@ LLWorld::LLWorld() :
 	*(default_texture++) = MAX_WATER_COLOR.mV[3];
 	
 	mDefaultWaterTexturep = new LLViewerImage(raw, FALSE);
-	mDefaultWaterTexturep->bind();
+	gGL.getTexUnit(0)->bind(mDefaultWaterTexturep.get());
 	mDefaultWaterTexturep->setClamp(TRUE, TRUE);
 
 }
diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp
index 1048fe9..e83f6a9 100644
--- a/indra/newview/llworldmap.cpp
+++ b/indra/newview/llworldmap.cpp
@@ -498,7 +498,8 @@ void LLWorldMap::processMapLayerReply(LLMessageSystem* msg, void**)
 		new_layer.LayerDefined = TRUE;
 		msg->getUUIDFast(_PREHASH_LayerData, _PREHASH_ImageID, new_layer.LayerImageID, block);
 		new_layer.LayerImage = gImageList.getImage(new_layer.LayerImageID, MIPMAP_TRUE, FALSE);
-		new_layer.LayerImage->bindTexture(0);
+		
+		gGL.getTexUnit(0)->bind(new_layer.LayerImage.get());
 		new_layer.LayerImage->setClamp(TRUE, TRUE);
 		
 		U32 left, right, top, bottom;
@@ -610,7 +611,7 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**)
 			siminfo->mWaterHeight = (F32) water_height;
 			siminfo->mMapImageID[agent_flags] = image_id;
 			siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE);
-			siminfo->mCurrentImage->bindTexture(0);
+			gGL.getTexUnit(0)->bind(siminfo->mCurrentImage.get());
 			siminfo->mCurrentImage->setClamp(TRUE, TRUE);
 			
 			if (siminfo->mMapImageID[2].notNull())
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 92d9588..3fd1d11 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -301,7 +301,7 @@ void LLWorldMapView::draw()
 
 	LLLocalClipRect clip(getLocalRect());
 	{
-		LLGLSNoTexture no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	
 		glMatrixMode(GL_MODELVIEW);
 
@@ -377,7 +377,7 @@ void LLWorldMapView::draw()
 		
 		// Draw using the texture.  If we don't clamp we get artifact at
 		// the edge.
-		LLViewerImage::bindTexture(current_image);
+		gGL.getTexUnit(0)->bind(current_image);
 
 		// Draw map image into RGB
 		//gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -385,7 +385,7 @@ void LLWorldMapView::draw()
 		gGL.setColorMask(true, false);
 		gGL.color4f(1.f, 1.f, 1.f, layer_alpha);
 
-		gGL.begin(LLVertexBuffer::QUADS);
+		gGL.begin(LLRender::QUADS);
 			gGL.texCoord2f(0.0f, 1.0f);
 			gGL.vertex3f(left, top, -1.0f);
 			gGL.texCoord2f(0.0f, 0.0f);
@@ -401,7 +401,7 @@ void LLWorldMapView::draw()
 		gGL.setColorMask(false, true);
 		gGL.color4f(1.f, 1.f, 1.f, 1.f);
 
-		gGL.begin(LLVertexBuffer::QUADS);
+		gGL.begin(LLRender::QUADS);
 			gGL.texCoord2f(0.0f, 1.0f);
 			gGL.vertex2f(left, top);
 			gGL.texCoord2f(0.0f, 0.0f);
@@ -434,7 +434,7 @@ void LLWorldMapView::draw()
 		if (info->mOverlayImage.isNull() && info->mMapImageID[2].notNull())
 		{
 			info->mOverlayImage = gImageList.getImage(info->mMapImageID[2], MIPMAP_TRUE, FALSE);
-			info->mOverlayImage->bind(0);
+			gGL.getTexUnit(0)->bind(info->mOverlayImage.get());
 			info->mOverlayImage->setClamp(TRUE, TRUE);
 		}
 		
@@ -536,13 +536,13 @@ void LLWorldMapView::draw()
 			// Draw using the texture.  If we don't clamp we get artifact at
 			// the edge.
 			LLGLSUIDefault gls_ui;
-			LLViewerImage::bindTexture(simimage);
+			gGL.getTexUnit(0)->bind(simimage);
 
 			gGL.setSceneBlendType(LLRender::BT_ALPHA);
 			F32 alpha = sim_alpha * info->mAlpha;
 			gGL.color4f(1.f, 1.0f, 1.0f, alpha);
 
-			gGL.begin(LLVertexBuffer::QUADS);
+			gGL.begin(LLRender::QUADS);
 				gGL.texCoord2f(0.f, 1.f);
 				gGL.vertex3f(left, top, 0.f);
 				gGL.texCoord2f(0.f, 0.f);
@@ -555,9 +555,9 @@ void LLWorldMapView::draw()
 
 			if (gSavedSettings.getBOOL("MapShowLandForSale") && overlayimage && overlayimage->getHasGLTexture())
 			{
-				LLViewerImage::bindTexture(overlayimage);
+				gGL.getTexUnit(0)->bind(overlayimage);
 				gGL.color4f(1.f, 1.f, 1.f, alpha);
-				gGL.begin(LLVertexBuffer::QUADS);
+				gGL.begin(LLRender::QUADS);
 					gGL.texCoord2f(0.f, 1.f);
 					gGL.vertex3f(left, top, -0.5f);
 					gGL.texCoord2f(0.f, 0.f);
@@ -577,8 +577,8 @@ void LLWorldMapView::draw()
 				gGL.setColorMask(false, true);
 				gGL.color4f(1.f, 1.f, 1.f, 1.f);
 
-				LLGLSNoTexture gls_no_texture;
-				gGL.begin(LLVertexBuffer::QUADS);
+				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+				gGL.begin(LLRender::QUADS);
 					gGL.vertex2f(left, top);
 					gGL.vertex2f(left, bottom);
 					gGL.vertex2f(right, bottom);
@@ -596,8 +596,8 @@ void LLWorldMapView::draw()
 			gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_SOURCE_ALPHA);
 			gGL.color4f(0.2f, 0.0f, 0.0f, 0.4f);
 
-			LLGLSNoTexture gls_no_texture;
-			gGL.begin(LLVertexBuffer::QUADS);
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+			gGL.begin(LLRender::QUADS);
 				gGL.vertex2f(left, top);
 				gGL.vertex2f(left, bottom);
 				gGL.vertex2f(right, bottom);
@@ -612,9 +612,9 @@ void LLWorldMapView::draw()
 		{
 			gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO);
 			
-			LLGLSNoTexture gls_no_texture;
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			gGL.color3f(1.f, 0.f, 0.f);
-			gGL.begin(LLVertexBuffer::LINES);
+			gGL.begin(LLRender::LINES);
 				gGL.vertex2f(left, top);
 				gGL.vertex2f(right, bottom);
 				gGL.vertex2f(left, bottom);
@@ -683,7 +683,7 @@ void LLWorldMapView::draw()
 	// Draw background rectangle
 	LLGLSUIDefault gls_ui;
 	{
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.f);
 		gGL.blendFunc(LLRender::BF_ONE_MINUS_DEST_ALPHA, LLRender::BF_DEST_ALPHA);
 		gGL.color4fv( mBackgroundColor.mV );
@@ -969,7 +969,7 @@ void LLWorldMapView::drawFrustum()
 	F32 ctr_x = getRect().getWidth() * 0.5f + sPanX;
 	F32 ctr_y = getRect().getHeight() * 0.5f + sPanY;
 
-	LLGLSNoTexture gls_no_texture;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	// Since we don't rotate the map, we have to rotate the frustum.
 	gGL.pushMatrix();
@@ -978,7 +978,7 @@ void LLWorldMapView::drawFrustum()
 
 		// Draw triangle with more alpha in far pixels to make it 
 		// fade out in distance.
-		gGL.begin( LLVertexBuffer::TRIANGLES  );
+		gGL.begin( LLRender::TRIANGLES  );
 			gGL.color4f(1.f, 1.f, 1.f, 0.25f);
 			gGL.vertex2f( 0, 0 );
 
@@ -1184,11 +1184,11 @@ static void drawDot(F32 x_pixels, F32 y_pixels,
 		F32 top =		y_pixels + dot_radius;
 		F32 bottom =	y_pixels - dot_radius;
 
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gGL.color4fv( color.mV );
 		LLUI::setLineWidth(1.5f);
 		F32 h_bar = relative_z > HEIGHT_THRESHOLD ? top : bottom; // horizontal bar Y
-		gGL.begin( LLVertexBuffer::LINES );
+		gGL.begin( LLRender::LINES );
 			gGL.vertex2f(center, top);
 			gGL.vertex2f(left, h_bar);
 			gGL.vertex2f(right, h_bar);
diff --git a/indra/newview/lsl_guide.html b/indra/newview/lsl_guide.html
deleted file mode 100644
index aa660b8..0000000
--- a/indra/newview/lsl_guide.html
+++ /dev/null
@@ -1,22078 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
-<HTML
-><HEAD
-><TITLE
->Linden Scripting Language Guide</TITLE
-><META
-NAME="GENERATOR"
-CONTENT="Modular DocBook HTML Stylesheet Version 1.79"></HEAD
-><BODY
-CLASS="book"
-BGCOLOR="#FFFFFF"
-TEXT="#000000"
-LINK="#0000FF"
-VLINK="#840084"
-ALINK="#0000FF"
-><DIV
-CLASS="BOOK"
-><A
-NAME="AEN1"
-></A
-><DIV
-CLASS="TITLEPAGE"
-><H1
-CLASS="title"
-><A
-NAME="AEN2"
->Linden Scripting Language Guide</A
-></H1
-><H3
-CLASS="author"
-><A
-NAME="AEN4"
-></A
->Aaron Brashears</H3
-><H3
-CLASS="author"
-><A
-NAME="AEN7"
-></A
->Andrew Meadows</H3
-><H3
-CLASS="author"
-><A
-NAME="AEN10"
-></A
->Cory Ondrejka</H3
-><H3
-CLASS="author"
-><A
-NAME="AEN13"
-></A
->Doug Soo</H3
-><H3
-CLASS="author"
-><A
-NAME="AEN16"
-></A
->Donald Kjer</H3
-><P
-CLASS="copyright"
->Copyright &copy; 2007 Linden Lab</P
-><DIV
-CLASS="legalnotice"
-><P
-></P
-><A
-NAME="AEN22"
-></A
-><P
-><SPAN
-CLASS="trademark"
->Linden Lab</SPAN
->&reg; and
-      <SPAN
-CLASS="trademark"
->Second Life</SPAN
->&reg; are registered
-      trademarks of Linden Research, Inc.</P
-><P
-></P
-></DIV
-><HR></DIV
-><DIV
-CLASS="TOC"
-><DL
-><DT
-><B
->Table of Contents</B
-></DT
-><DT
->1. <A
-HREF="#AEN27"
->Introduction</A
-></DT
-><DT
->2. <A
-HREF="#AEN33"
->Getting Started</A
-></DT
-><DD
-><DL
-><DT
->2.1. <A
-HREF="#AEN36"
->Hello Avatar</A
-></DT
-><DD
-><DL
-><DT
->2.1.1. <A
-HREF="#AEN50"
->Creating the Script</A
-></DT
-><DT
->2.1.2. <A
-HREF="#AEN56"
->Default State</A
-></DT
-><DT
->2.1.3. <A
-HREF="#AEN67"
->Functions</A
-></DT
-><DT
->2.1.4. <A
-HREF="#AEN82"
->Touch Event</A
-></DT
-><DT
->2.1.5. <A
-HREF="#AEN90"
->Try it Out</A
-></DT
-></DL
-></DD
-><DT
->2.2. <A
-HREF="#AEN103"
->Using The Built-In Editor</A
-></DT
-><DT
->2.3. <A
-HREF="#AEN106"
->Using Alternative Editors</A
-></DT
-></DL
-></DD
-><DT
->3. <A
-HREF="#AEN109"
->Basics</A
-></DT
-><DD
-><DL
-><DT
->3.1. <A
-HREF="#AEN112"
->Comments</A
-></DT
-><DT
->3.2. <A
-HREF="#AEN129"
->Arithmetic Operations</A
-></DT
-><DD
-><DL
-><DT
->3.2.1. <A
-HREF="#AEN132"
->Assignment</A
-></DT
-><DT
->3.2.2. <A
-HREF="#AEN139"
->Hexadecimal Entry</A
-></DT
-><DT
->3.2.3. <A
-HREF="#AEN145"
->Binary Arithmetic Operators</A
-></DT
-><DT
->3.2.4. <A
-HREF="#AEN185"
->Boolean Operators</A
-></DT
-><DT
->3.2.5. <A
-HREF="#AEN217"
->Bitwise Operators</A
-></DT
-></DL
-></DD
-><DT
->3.3. <A
-HREF="#AEN237"
->Types</A
-></DT
-><DD
-><DL
-><DT
->3.3.1. <A
-HREF="#AEN318"
->Type Conversion</A
-></DT
-></DL
-></DD
-><DT
->3.4. <A
-HREF="#AEN360"
->Global Functions</A
-></DT
-><DT
->3.5. <A
-HREF="#AEN365"
->Global Variables</A
-></DT
-><DT
->3.6. <A
-HREF="#AEN373"
->Local Variables</A
-></DT
-></DL
-></DD
-><DT
->4. <A
-HREF="#AEN378"
->Flow Control</A
-></DT
-><DD
-><DL
-><DT
->4.1. <A
-HREF="#AEN381"
->Conditional Statements</A
-></DT
-><DT
->4.2. <A
-HREF="#AEN394"
->Loop Constructs</A
-></DT
-><DD
-><DL
-><DT
->4.2.1. <A
-HREF="#AEN397"
->for loop</A
-></DT
-><DT
->4.2.2. <A
-HREF="#AEN403"
->do-while loop</A
-></DT
-><DT
->4.2.3. <A
-HREF="#AEN409"
->while loop</A
-></DT
-></DL
-></DD
-><DT
->4.3. <A
-HREF="#AEN415"
->Jumps</A
-></DT
-><DT
->4.4. <A
-HREF="#AEN421"
->State Change</A
-></DT
-></DL
-></DD
-><DT
->5. <A
-HREF="#AEN427"
->States</A
-></DT
-><DD
-><DL
-><DT
->5.1. <A
-HREF="#AEN431"
->state_entry()</A
-></DT
-><DT
->5.2. <A
-HREF="#AEN440"
->state_exit()</A
-></DT
-><DT
->5.3. <A
-HREF="#AEN449"
->States vs. Global variables</A
-></DT
-></DL
-></DD
-><DT
->6. <A
-HREF="#AEN452"
->Math</A
-></DT
-><DD
-><DL
-><DT
->6.1. <A
-HREF="#AEN454"
->Tables of Functions</A
-></DT
-></DL
-></DD
-><DT
->7. <A
-HREF="#AEN561"
->Strings</A
-></DT
-><DD
-><DL
-><DT
->7.1. <A
-HREF="#AEN563"
->Tables of Functions</A
-></DT
-></DL
-></DD
-><DT
->8. <A
-HREF="#AEN605"
->Lists</A
-></DT
-><DD
-><DL
-><DT
->8.1. <A
-HREF="#AEN607"
->Tables of Functions</A
-></DT
-></DL
-></DD
-><DT
->9. <A
-HREF="#AEN670"
->Communication</A
-></DT
-><DD
-><DL
-><DT
->9.1. <A
-HREF="#AEN672"
->Tables of Functions</A
-></DT
-></DL
-></DD
-><DT
->10. <A
-HREF="#AEN715"
->Inventory</A
-></DT
-><DD
-><DL
-><DT
->10.1. <A
-HREF="#AEN717"
->Tables of Functions</A
-></DT
-></DL
-></DD
-><DT
->11. <A
-HREF="#AEN768"
->Vehicles</A
-></DT
-><DD
-><DL
-><DT
->11.1. <A
-HREF="#AEN790"
->Overview</A
-></DT
-><DT
->11.2. <A
-HREF="#AEN801"
->Warnings</A
-></DT
-><DT
->11.3. <A
-HREF="#AEN815"
->Definitions</A
-></DT
-><DT
->11.4. <A
-HREF="#AEN826"
->Setting the Vehicle Type</A
-></DT
-><DT
->11.5. <A
-HREF="#AEN837"
->Linear and Angular Deflection</A
-></DT
-><DT
->11.6. <A
-HREF="#AEN853"
->Moving and Steering the Vehicle</A
-></DT
-><DT
->11.7. <A
-HREF="#AEN866"
->The Linear Motor</A
-></DT
-><DT
->11.8. <A
-HREF="#AEN898"
->The Angular Motor</A
-></DT
-><DT
->11.9. <A
-HREF="#AEN921"
->Using the Camera to Steer</A
-></DT
-><DT
->11.10. <A
-HREF="#AEN938"
->The Vertical Attractor</A
-></DT
-><DT
->11.11. <A
-HREF="#AEN949"
->Banking</A
-></DT
-><DT
->11.12. <A
-HREF="#AEN956"
->Friction Timescales</A
-></DT
-><DT
->11.13. <A
-HREF="#AEN972"
->Buoyancy</A
-></DT
-><DT
->11.14. <A
-HREF="#AEN979"
->Hover</A
-></DT
-><DT
->11.15. <A
-HREF="#AEN990"
->Reference Frame</A
-></DT
-></DL
-></DD
-><DT
->A. <A
-HREF="#AEN999"
->Linden Library Functions</A
-></DT
-><DD
-><DL
-><DT
->A.1. <A
-HREF="#AEN1002"
->llAbs</A
-></DT
-><DT
->A.2. <A
-HREF="#AEN1012"
->llAcos</A
-></DT
-><DT
->A.3. <A
-HREF="#AEN1022"
->llAddToLandPassList</A
-></DT
-><DT
->A.4. <A
-HREF="#AEN1035"
->llAdjustSoundVolume</A
-></DT
-><DT
->A.5. <A
-HREF="#AEN1047"
->llAllowInventoryDrop</A
-></DT
-><DT
->A.6. <A
-HREF="#AEN1057"
->llAngleBetween</A
-></DT
-><DT
->A.7. <A
-HREF="#AEN1070"
->llApplyImpulse</A
-></DT
-><DT
->A.8. <A
-HREF="#AEN1083"
->llApplyRotationalImpulse</A
-></DT
-><DT
->A.9. <A
-HREF="#AEN1096"
->llAsin</A
-></DT
-><DT
->A.10. <A
-HREF="#AEN1106"
->llAtan2</A
-></DT
-><DT
->A.11. <A
-HREF="#AEN1119"
->llAttachToAvatar</A
-></DT
-><DT
->A.12. <A
-HREF="#AEN1134"
->llAvatarOnSitTarget</A
-></DT
-><DT
->A.13. <A
-HREF="#AEN1144"
->llAxes2Rot</A
-></DT
-><DT
->A.14. <A
-HREF="#AEN1160"
->llAxisAngle2Rot</A
-></DT
-><DT
->A.15. <A
-HREF="#AEN1173"
->llBase64ToString</A
-></DT
-><DT
->A.16. <A
-HREF="#AEN1182"
->llBreakAllLinks</A
-></DT
-><DT
->A.17. <A
-HREF="#AEN1191"
->llBreakLink</A
-></DT
-><DT
->A.18. <A
-HREF="#AEN1202"
->llCSV2List</A
-></DT
-><DT
->A.19. <A
-HREF="#AEN1212"
->llCeil</A
-></DT
-><DT
->A.20. <A
-HREF="#AEN1222"
->llCloseRemoteDataChannel</A
-></DT
-><DT
->A.21. <A
-HREF="#AEN1231"
->llCloud</A
-></DT
-><DT
->A.22. <A
-HREF="#AEN1241"
->llCollisionFilter</A
-></DT
-><DT
->A.23. <A
-HREF="#AEN1260"
->llCollisionSound</A
-></DT
-><DT
->A.24. <A
-HREF="#AEN1272"
->llCollisionSprite</A
-></DT
-><DT
->A.25. <A
-HREF="#AEN1282"
->llCos</A
-></DT
-><DT
->A.26. <A
-HREF="#AEN1292"
->llCreateLink</A
-></DT
-><DT
->A.27. <A
-HREF="#AEN1306"
->llDeleteSubList</A
-></DT
-><DT
->A.28. <A
-HREF="#AEN1326"
->llDeleteSubString</A
-></DT
-><DT
->A.29. <A
-HREF="#AEN1345"
->llDetachFromAvatar</A
-></DT
-><DT
->A.30. <A
-HREF="#lib_lldetected"
->llDetectedGrab</A
-></DT
-><DT
->A.31. <A
-HREF="#AEN1365"
->llDetectedGroup</A
-></DT
-><DT
->A.32. <A
-HREF="#AEN1375"
->llDetectedKey</A
-></DT
-><DT
->A.33. <A
-HREF="#AEN1386"
->llDetectedLinkNumber</A
-></DT
-><DT
->A.34. <A
-HREF="#AEN1395"
->llDetectedName</A
-></DT
-><DT
->A.35. <A
-HREF="#AEN1406"
->llDetectedOwner</A
-></DT
-><DT
->A.36. <A
-HREF="#AEN1417"
->llDetectedPos</A
-></DT
-><DT
->A.37. <A
-HREF="#AEN1428"
->llDetectedRot</A
-></DT
-><DT
->A.38. <A
-HREF="#AEN1439"
->llDetectedType</A
-></DT
-><DT
->A.39. <A
-HREF="#AEN1453"
->llDetectedVel</A
-></DT
-><DT
->A.40. <A
-HREF="#AEN1464"
->llDialog</A
-></DT
-><DT
->A.41. <A
-HREF="#AEN1481"
->llDie</A
-></DT
-><DT
->A.42. <A
-HREF="#AEN1489"
->llDumpList2String</A
-></DT
-><DT
->A.43. <A
-HREF="#AEN1500"
->llEscapeURL</A
-></DT
-><DT
->A.44. <A
-HREF="#AEN1510"
->llEdgeOfWorld</A
-></DT
-><DT
->A.45. <A
-HREF="#AEN1523"
->llEjectFromLand</A
-></DT
-><DT
->A.46. <A
-HREF="#AEN1533"
->llEmail</A
-></DT
-><DT
->A.47. <A
-HREF="#AEN1549"
->llEuler2Rot</A
-></DT
-><DT
->A.48. <A
-HREF="#AEN1559"
->llFabs</A
-></DT
-><DT
->A.49. <A
-HREF="#AEN1569"
->llFloor</A
-></DT
-><DT
->A.50. <A
-HREF="#AEN1579"
->llFrand</A
-></DT
-><DT
->A.51. <A
-HREF="#AEN1589"
->llGetAccel</A
-></DT
-><DT
->A.52. <A
-HREF="#AEN1597"
->llGetAttached</A
-></DT
-><DT
->A.53. <A
-HREF="#AEN1605"
->llGetAgentInfo</A
-></DT
-><DT
->A.54. <A
-HREF="#AEN1616"
->llGetAgentSize</A
-></DT
-><DT
->A.55. <A
-HREF="#AEN1626"
->llGetAlpha</A
-></DT
-><DT
->A.56. <A
-HREF="#AEN1638"
->llGetAndResetTime</A
-></DT
-><DT
->A.57. <A
-HREF="#AEN1648"
->llGetAnimation</A
-></DT
-><DT
->A.58. <A
-HREF="#AEN1658"
->llGetAnimationList</A
-></DT
-><DT
->A.59. <A
-HREF="#AEN1668"
->llGetBoundingBox</A
-></DT
-><DT
->A.60. <A
-HREF="#AEN1678"
->llGetCenterOfMass</A
-></DT
-><DT
->A.61. <A
-HREF="#AEN1686"
->llGetColor</A
-></DT
-><DT
->A.62. <A
-HREF="#AEN1698"
->llGetCreator</A
-></DT
-><DT
->A.63. <A
-HREF="#AEN1706"
->llGetDate</A
-></DT
-><DT
->A.64. <A
-HREF="#AEN1714"
->llGetEnergy</A
-></DT
-><DT
->A.65. <A
-HREF="#AEN1722"
->llGetForce</A
-></DT
-><DT
->A.66. <A
-HREF="#AEN1730"
->llGetFreeMemory</A
-></DT
-><DT
->A.67. <A
-HREF="#AEN1738"
->llGetGeometricCenter</A
-></DT
-><DT
->A.68. <A
-HREF="#AEN1746"
->llGetGMTclock</A
-></DT
-><DT
->A.69. <A
-HREF="#AEN1754"
->llGetInventoryCreator</A
-></DT
-><DT
->A.70. <A
-HREF="#AEN1764"
->llGetInventoryKey</A
-></DT
-><DT
->A.71. <A
-HREF="#AEN1774"
->llGetInventoryName</A
-></DT
-><DT
->A.72. <A
-HREF="#AEN1789"
->llGetInventoryNumber</A
-></DT
-><DT
->A.73. <A
-HREF="#AEN1801"
->llGetInventoryPermMask</A
-></DT
-><DT
->A.74. <A
-HREF="#AEN1816"
->llGetInventoryType</A
-></DT
-><DT
->A.75. <A
-HREF="#AEN1828"
->llGetKey</A
-></DT
-><DT
->A.76. <A
-HREF="#AEN1836"
->llGetLandOwnerAt</A
-></DT
-><DT
->A.77. <A
-HREF="#AEN1847"
->llGetLinkKey</A
-></DT
-><DT
->A.78. <A
-HREF="#AEN1857"
->llGetLinkName</A
-></DT
-><DT
->A.79. <A
-HREF="#AEN1867"
->llGetLinkNumber</A
-></DT
-><DT
->A.80. <A
-HREF="#AEN1875"
->llGetListEntryType</A
-></DT
-><DT
->A.81. <A
-HREF="#AEN1889"
->llGetListLength</A
-></DT
-><DT
->A.82. <A
-HREF="#AEN1899"
->llGetLocalPos</A
-></DT
-><DT
->A.83. <A
-HREF="#AEN1907"
->llGetLocalRot</A
-></DT
-><DT
->A.84. <A
-HREF="#AEN1915"
->llGetMass</A
-></DT
-><DT
->A.85. <A
-HREF="#AEN1923"
->llGetObjectMass</A
-></DT
-><DT
->A.86. <A
-HREF="#AEN1933"
->llGetNextEmail</A
-></DT
-><DT
->A.87. <A
-HREF="#AEN1946"
->llGetNotecardLine</A
-></DT
-><DT
->A.88. <A
-HREF="#AEN1964"
->llGetNumberOfNotecardLines</A
-></DT
-><DT
->A.89. <A
-HREF="#AEN1977"
->llGetNumberOfPrims</A
-></DT
-><DT
->A.90. <A
-HREF="#AEN1985"
->llGetNumberOfSides</A
-></DT
-><DT
->A.91. <A
-HREF="#AEN1993"
->llGetObjectDesc</A
-></DT
-><DT
->A.92. <A
-HREF="#AEN2001"
->llGetObjectName</A
-></DT
-><DT
->A.93. <A
-HREF="#AEN2009"
->llGetObjectPermMask</A
-></DT
-><DT
->A.94. <A
-HREF="#AEN2022"
->llGetOmega</A
-></DT
-><DT
->A.95. <A
-HREF="#AEN2030"
->llGetOwner</A
-></DT
-><DT
->A.96. <A
-HREF="#AEN2038"
->llGetOwnerKey</A
-></DT
-><DT
->A.97. <A
-HREF="#AEN2048"
->llGetPermissions</A
-></DT
-><DT
->A.98. <A
-HREF="#AEN2058"
->llGetPermissionsKey</A
-></DT
-><DT
->A.99. <A
-HREF="#AEN2067"
->llGetPos</A
-></DT
-><DT
->A.100. <A
-HREF="#AEN2075"
->llGetPrimitiveParams</A
-></DT
-><DT
->A.101. <A
-HREF="#AEN2092"
->llGetRegionCorner</A
-></DT
-><DT
->A.102. <A
-HREF="#AEN2100"
->llGetRegionFPS</A
-></DT
-><DT
->A.103. <A
-HREF="#AEN2108"
->llGetRegionName</A
-></DT
-><DT
->A.104. <A
-HREF="#AEN2116"
->llGetRegionTimeDilation</A
-></DT
-><DT
->A.105. <A
-HREF="#AEN2124"
->llGetRootPosition</A
-></DT
-><DT
->A.106. <A
-HREF="#AEN2132"
->llGetRootRotation</A
-></DT
-><DT
->A.107. <A
-HREF="#AEN2140"
->llGetRot</A
-></DT
-><DT
->A.108. <A
-HREF="#AEN2148"
->llGetScale</A
-></DT
-><DT
->A.109. <A
-HREF="#AEN2156"
->llGetScriptName</A
-></DT
-><DT
->A.110. <A
-HREF="#AEN2164"
->llGetStartParameter</A
-></DT
-><DT
->A.111. <A
-HREF="#AEN2174"
->llGetScriptState</A
-></DT
-><DT
->A.112. <A
-HREF="#AEN2184"
->llGetStatus</A
-></DT
-><DT
->A.113. <A
-HREF="#AEN2195"
->llGetSubString</A
-></DT
-><DT
->A.114. <A
-HREF="#AEN2214"
->llGetSunDirection</A
-></DT
-><DT
->A.115. <A
-HREF="#AEN2222"
->llGetTexture</A
-></DT
-><DT
->A.116. <A
-HREF="#AEN2232"
->llGetTextureOffset</A
-></DT
-><DT
->A.117. <A
-HREF="#AEN2242"
->llGetTextureRot</A
-></DT
-><DT
->A.118. <A
-HREF="#AEN2252"
->llGetTextureScale</A
-></DT
-><DT
->A.119. <A
-HREF="#AEN2262"
->llGetTime</A
-></DT
-><DT
->A.120. <A
-HREF="#AEN2273"
->llGetTimeOfDay</A
-></DT
-><DT
->A.121. <A
-HREF="#AEN2281"
->llGetTimestamp</A
-></DT
-><DT
->A.122. <A
-HREF="#AEN2289"
->llGetTorque</A
-></DT
-><DT
->A.123. <A
-HREF="#AEN2297"
->llGetVel</A
-></DT
-><DT
->A.124. <A
-HREF="#AEN2306"
->llGetWallclock</A
-></DT
-><DT
->A.125. <A
-HREF="#AEN2314"
->llGiveInventory</A
-></DT
-><DT
->A.126. <A
-HREF="#AEN2326"
->llGiveInventoryList</A
-></DT
-><DT
->A.127. <A
-HREF="#AEN2342"
->llGiveMoney</A
-></DT
-><DT
->A.128. <A
-HREF="#AEN2356"
->llGround</A
-></DT
-><DT
->A.129. <A
-HREF="#AEN2366"
->llGroundContour</A
-></DT
-><DT
->A.130. <A
-HREF="#AEN2376"
->llGroundNormal</A
-></DT
-><DT
->A.131. <A
-HREF="#AEN2386"
->llGroundRepel</A
-></DT
-><DT
->A.132. <A
-HREF="#AEN2405"
->llGroundSlope</A
-></DT
-><DT
->A.133. <A
-HREF="#AEN2415"
->llInsertString</A
-></DT
-><DT
->A.134. <A
-HREF="#AEN2431"
->llInstantMessage</A
-></DT
-><DT
->A.135. <A
-HREF="#AEN2444"
->llKey2Name</A
-></DT
-><DT
->A.136. <A
-HREF="#AEN2454"
->llList2CSV</A
-></DT
-><DT
->A.137. <A
-HREF="#AEN2464"
->llList2Float</A
-></DT
-><DT
->A.138. <A
-HREF="#AEN2477"
->llList2Integer</A
-></DT
-><DT
->A.139. <A
-HREF="#AEN2490"
->llList2Key</A
-></DT
-><DT
->A.140. <A
-HREF="#AEN2503"
->llList2List</A
-></DT
-><DT
->A.141. <A
-HREF="#AEN2526"
->llList2ListStrided</A
-></DT
-><DT
->A.142. <A
-HREF="#AEN2544"
->llList2Rot</A
-></DT
-><DT
->A.143. <A
-HREF="#AEN2557"
->llList2String</A
-></DT
-><DT
->A.144. <A
-HREF="#AEN2570"
->llList2Vector</A
-></DT
-><DT
->A.145. <A
-HREF="#AEN2583"
->llListFindList</A
-></DT
-><DT
->A.146. <A
-HREF="#AEN2598"
->llListInsertList</A
-></DT
-><DT
->A.147. <A
-HREF="#AEN2614"
->llListRandomize</A
-></DT
-><DT
->A.148. <A
-HREF="#AEN2629"
->llListReplaceList</A
-></DT
-><DT
->A.149. <A
-HREF="#AEN2648"
->llListSort</A
-></DT
-><DT
->A.150. <A
-HREF="#AEN2665"
->llListen</A
-></DT
-><DT
->A.151. <A
-HREF="#AEN2686"
->llListenControl</A
-></DT
-><DT
->A.152. <A
-HREF="#AEN2701"
->llListenRemove</A
-></DT
-><DT
->A.153. <A
-HREF="#AEN2712"
->llLoadURL</A
-></DT
-><DT
->A.154. <A
-HREF="#AEN2731"
->llLog</A
-></DT
-><DT
->A.155. <A
-HREF="#AEN2742"
->llLog10</A
-></DT
-><DT
->A.156. <A
-HREF="#AEN2753"
->llLookAt</A
-></DT
-><DT
->A.157. <A
-HREF="#AEN2773"
->llLoopSound</A
-></DT
-><DT
->A.158. <A
-HREF="#AEN2790"
->llLoopSoundMaster</A
-></DT
-><DT
->A.159. <A
-HREF="#AEN2802"
->llLoopSoundSlave</A
-></DT
-><DT
->A.160. <A
-HREF="#AEN2814"
->llMakeExplosion</A
-></DT
-><DT
->A.161. <A
-HREF="#AEN2836"
->llMakeFire</A
-></DT
-><DT
->A.162. <A
-HREF="#AEN2858"
->llMakeFountain</A
-></DT
-><DT
->A.163. <A
-HREF="#AEN2880"
->llMakeSmoke</A
-></DT
-><DT
->A.164. <A
-HREF="#AEN2902"
->llMD5String</A
-></DT
-><DT
->A.165. <A
-HREF="#AEN2919"
->llMessageLinked</A
-></DT
-><DT
->A.166. <A
-HREF="#AEN2940"
->llMinEventDelay</A
-></DT
-><DT
->A.167. <A
-HREF="#AEN2949"
->llModifyLand</A
-></DT
-><DT
->A.168. <A
-HREF="#AEN2963"
->llModPow</A
-></DT
-><DT
->A.169. <A
-HREF="#AEN2980"
->llMoveToTarget</A
-></DT
-><DT
->A.170. <A
-HREF="#AEN2995"
->llOffsetTexture</A
-></DT
-><DT
->A.171. <A
-HREF="#AEN3011"
->llOpenRemoteDataChannel</A
-></DT
-><DT
->A.172. <A
-HREF="#AEN3019"
->llOverMyLand</A
-></DT
-><DT
->A.173. <A
-HREF="#AEN3031"
->llParcelMediaCommandList</A
-></DT
-><DT
->A.174. <A
-HREF="#AEN3091"
->llParcelMediaQuery</A
-></DT
-><DT
->A.175. <A
-HREF="#AEN3105"
->llParseString2List</A
-></DT
-><DT
->A.176. <A
-HREF="#AEN3127"
->llParseStringKeepNulls</A
-></DT
-><DT
->A.177. <A
-HREF="#AEN3149"
->llParticleSystem</A
-></DT
-><DT
->A.178. <A
-HREF="#AEN3162"
->llPassCollisions</A
-></DT
-><DT
->A.179. <A
-HREF="#AEN3173"
->llPassTouches</A
-></DT
-><DT
->A.180. <A
-HREF="#AEN3184"
->llPlaySound</A
-></DT
-><DT
->A.181. <A
-HREF="#AEN3198"
->llPlaySoundSlave</A
-></DT
-><DT
->A.182. <A
-HREF="#AEN3210"
->llPointAt</A
-></DT
-><DT
->A.183. <A
-HREF="#AEN3220"
->llPow</A
-></DT
-><DT
->A.184. <A
-HREF="#AEN3233"
->llPreloadSound</A
-></DT
-><DT
->A.185. <A
-HREF="#AEN3243"
->llPushObject</A
-></DT
-><DT
->A.186. <A
-HREF="#AEN3261"
->llReleaseControls</A
-></DT
-><DT
->A.187. <A
-HREF="#AEN3271"
->llRemoteDataReply</A
-></DT
-><DT
->A.188. <A
-HREF="#AEN3284"
->llRemoteDataSetRegion</A
-></DT
-><DT
->A.189. <A
-HREF="#AEN3292"
->llRemoteLoadScript</A
-></DT
-><DT
->A.190. <A
-HREF="#AEN3300"
->llRemoteLoadScriptPin</A
-></DT
-><DT
->A.191. <A
-HREF="#AEN3325"
->llRemoveInventory</A
-></DT
-><DT
->A.192. <A
-HREF="#AEN3335"
->llRemoveVehicleFlags</A
-></DT
-><DT
->A.193. <A
-HREF="#AEN3346"
->llRequestAgentData</A
-></DT
-><DT
->A.194. <A
-HREF="#AEN3363"
->llRequestInventoryData</A
-></DT
-><DT
->A.195. <A
-HREF="#AEN3375"
->llRequestPermissions</A
-></DT
-><DT
->A.196. <A
-HREF="#AEN3391"
->llRequestSimulatorData</A
-></DT
-><DT
->A.197. <A
-HREF="#AEN3408"
->llResetScript</A
-></DT
-><DT
->A.198. <A
-HREF="#AEN3416"
->llResetOtherScript</A
-></DT
-><DT
->A.199. <A
-HREF="#AEN3426"
->llResetTime</A
-></DT
-><DT
->A.200. <A
-HREF="#AEN3434"
->llRezAtRoot</A
-></DT
-><DT
->A.201. <A
-HREF="#AEN3461"
->llRezObject</A
-></DT
-><DT
->A.202. <A
-HREF="#AEN3486"
->llRot2Angle</A
-></DT
-><DT
->A.203. <A
-HREF="#AEN3496"
->llRot2Axis</A
-></DT
-><DT
->A.204. <A
-HREF="#AEN3506"
->llRot2Euler</A
-></DT
-><DT
->A.205. <A
-HREF="#AEN3516"
->llRot2Fwd</A
-></DT
-><DT
->A.206. <A
-HREF="#AEN3526"
->llRot2Left</A
-></DT
-><DT
->A.207. <A
-HREF="#AEN3536"
->llRot2Up</A
-></DT
-><DT
->A.208. <A
-HREF="#AEN3546"
->llRotBetween</A
-></DT
-><DT
->A.209. <A
-HREF="#AEN3559"
->llRotLookAt</A
-></DT
-><DT
->A.210. <A
-HREF="#AEN3579"
->llRotTarget</A
-></DT
-><DT
->A.211. <A
-HREF="#AEN3593"
->llRotTargetRemove</A
-></DT
-><DT
->A.212. <A
-HREF="#AEN3603"
->llRotateTexture</A
-></DT
-><DT
->A.213. <A
-HREF="#AEN3618"
->llRound</A
-></DT
-><DT
->A.214. <A
-HREF="#AEN3628"
->llSameGroup</A
-></DT
-><DT
->A.215. <A
-HREF="#AEN3640"
->llSay</A
-></DT
-><DT
->A.216. <A
-HREF="#AEN3654"
->llScaleTexture</A
-></DT
-><DT
->A.217. <A
-HREF="#AEN3671"
->llScriptDanger</A
-></DT
-><DT
->A.218. <A
-HREF="#AEN3680"
->llSendRemoteData</A
-></DT
-><DT
->A.219. <A
-HREF="#AEN3693"
->llSensor</A
-></DT
-><DT
->A.220. <A
-HREF="#AEN3720"
->llSensorRemove</A
-></DT
-><DT
->A.221. <A
-HREF="#AEN3728"
->llSensorRepeat</A
-></DT
-><DT
->A.222. <A
-HREF="#AEN3758"
->llSetAlpha</A
-></DT
-><DT
->A.223. <A
-HREF="#AEN3773"
->llSetBuoyancy</A
-></DT
-><DT
->A.224. <A
-HREF="#AEN3782"
->llSetCameraAtOffset</A
-></DT
-><DT
->A.225. <A
-HREF="#AEN3791"
->llSetClickAction</A
-></DT
-><DT
->A.226. <A
-HREF="#AEN3800"
->llForceMouselook</A
-></DT
-><DT
->A.227. <A
-HREF="#AEN3809"
->llSetCameraEyeOffset</A
-></DT
-><DT
->A.228. <A
-HREF="#AEN3818"
->llSetColor</A
-></DT
-><DT
->A.229. <A
-HREF="#AEN3832"
->llSetDamage</A
-></DT
-><DT
->A.230. <A
-HREF="#AEN3841"
->llSetForce</A
-></DT
-><DT
->A.231. <A
-HREF="#AEN3855"
->llSetForceAndTorque</A
-></DT
-><DT
->A.232. <A
-HREF="#AEN3872"
->llSetHoverHeight</A
-></DT
-><DT
->A.233. <A
-HREF="#AEN3887"
->llSetLinkAlpha</A
-></DT
-><DT
->A.234. <A
-HREF="#AEN3906"
->llSetLinkColor</A
-></DT
-><DT
->A.235. <A
-HREF="#AEN3925"
->llSetLinkPrimitiveParams</A
-></DT
-><DT
->A.236. <A
-HREF="#AEN3941"
->llSetLinkTexture</A
-></DT
-><DT
->A.237. <A
-HREF="#AEN3960"
->llSetLocalRot</A
-></DT
-><DT
->A.238. <A
-HREF="#AEN3969"
->llSetObjectDesc</A
-></DT
-><DT
->A.239. <A
-HREF="#AEN3979"
->llSetObjectName</A
-></DT
-><DT
->A.240. <A
-HREF="#AEN3989"
->llSetParcelMusicURL</A
-></DT
-><DT
->A.241. <A
-HREF="#AEN3999"
->llSetPayPrice</A
-></DT
-><DT
->A.242. <A
-HREF="#AEN4011"
->llSetPos</A
-></DT
-><DT
->A.243. <A
-HREF="#AEN4020"
->llSetPrimitiveParams</A
-></DT
-><DT
->A.244. <A
-HREF="#AEN4034"
->llSetRemoteScriptAccessPin</A
-></DT
-><DT
->A.245. <A
-HREF="#AEN4043"
->llSetRot</A
-></DT
-><DT
->A.246. <A
-HREF="#AEN4052"
->llSetScale</A
-></DT
-><DT
->A.247. <A
-HREF="#AEN4061"
->llSetScriptState</A
-></DT
-><DT
->A.248. <A
-HREF="#AEN4072"
->llSetSitText</A
-></DT
-><DT
->A.249. <A
-HREF="#AEN4082"
->llSetSoundQueueing</A
-></DT
-><DT
->A.250. <A
-HREF="#AEN4095"
->llSetStatus</A
-></DT
-><DT
->A.251. <A
-HREF="#AEN4110"
->llSetText</A
-></DT
-><DT
->A.252. <A
-HREF="#AEN4126"
->llSetTexture</A
-></DT
-><DT
->A.253. <A
-HREF="#AEN4140"
->llSetTextureAnim</A
-></DT
-><DT
->A.254. <A
-HREF="#AEN4188"
->llSetTimerEvent</A
-></DT
-><DT
->A.255. <A
-HREF="#AEN4200"
->llSetTorque</A
-></DT
-><DT
->A.256. <A
-HREF="#AEN4214"
->llSetTouchText</A
-></DT
-><DT
->A.257. <A
-HREF="#AEN4224"
->llSetVehicleFlags</A
-></DT
-><DT
->A.258. <A
-HREF="#AEN4235"
->llSetVehicleFloatParam</A
-></DT
-><DT
->A.259. <A
-HREF="#AEN4249"
->llSetVehicleType</A
-></DT
-><DT
->A.260. <A
-HREF="#AEN4260"
->llSetVehicleRotationParam</A
-></DT
-><DT
->A.261. <A
-HREF="#AEN4274"
->llSetVehicleVectorParam</A
-></DT
-><DT
->A.262. <A
-HREF="#AEN4288"
->llShout</A
-></DT
-><DT
->A.263. <A
-HREF="#AEN4302"
->llSin</A
-></DT
-><DT
->A.264. <A
-HREF="#AEN4312"
->llSitTarget</A
-></DT
-><DT
->A.265. <A
-HREF="#AEN4325"
->llSleep</A
-></DT
-><DT
->A.266. <A
-HREF="#AEN4335"
->llSqrt</A
-></DT
-><DT
->A.267. <A
-HREF="#AEN4346"
->llStartAnimation</A
-></DT
-><DT
->A.268. <A
-HREF="#AEN4578"
->llStopAnimation</A
-></DT
-><DT
->A.269. <A
-HREF="#AEN4588"
->llStopHover</A
-></DT
-><DT
->A.270. <A
-HREF="#AEN4596"
->llStopLookAt</A
-></DT
-><DT
->A.271. <A
-HREF="#AEN4604"
->llStopMoveToTarget</A
-></DT
-><DT
->A.272. <A
-HREF="#AEN4612"
->llStopPointAt</A
-></DT
-><DT
->A.273. <A
-HREF="#AEN4620"
->llStopSound</A
-></DT
-><DT
->A.274. <A
-HREF="#AEN4631"
->llStringLength</A
-></DT
-><DT
->A.275. <A
-HREF="#AEN4641"
->llSubStringIndex</A
-></DT
-><DT
->A.276. <A
-HREF="#AEN4652"
->llStringToBase64</A
-></DT
-><DT
->A.277. <A
-HREF="#AEN4661"
->llTakeControls</A
-></DT
-><DT
->A.278. <A
-HREF="#AEN4678"
->llTan</A
-></DT
-><DT
->A.279. <A
-HREF="#AEN4688"
->llTarget</A
-></DT
-><DT
->A.280. <A
-HREF="#AEN4701"
->llTargetOmega</A
-></DT
-><DT
->A.281. <A
-HREF="#AEN4718"
->llTargetRemove</A
-></DT
-><DT
->A.282. <A
-HREF="#AEN4728"
->llTeleportAgentHome</A
-></DT
-><DT
->A.283. <A
-HREF="#AEN4737"
->llToLower</A
-></DT
-><DT
->A.284. <A
-HREF="#AEN4746"
->llToUpper</A
-></DT
-><DT
->A.285. <A
-HREF="#AEN4756"
->llTriggerSound</A
-></DT
-><DT
->A.286. <A
-HREF="#AEN4770"
->llTriggerSoundLimited</A
-></DT
-><DT
->A.287. <A
-HREF="#AEN4790"
->llUnescapeURL</A
-></DT
-><DT
->A.288. <A
-HREF="#AEN4800"
->llUnSit</A
-></DT
-><DT
->A.289. <A
-HREF="#AEN4810"
->llVecDist</A
-></DT
-><DT
->A.290. <A
-HREF="#AEN4823"
->llVecMag</A
-></DT
-><DT
->A.291. <A
-HREF="#AEN4833"
->llVecNorm</A
-></DT
-><DT
->A.292. <A
-HREF="#AEN4843"
->llVolumeDetect</A
-></DT
-><DT
->A.293. <A
-HREF="#AEN4852"
->llWater</A
-></DT
-><DT
->A.294. <A
-HREF="#AEN4862"
->llWhisper</A
-></DT
-><DT
->A.295. <A
-HREF="#AEN4876"
->llWind</A
-></DT
-><DT
->A.296. <A
-HREF="#AEN4886"
->llXorBase64Strings</A
-></DT
-></DL
-></DD
-><DT
->B. <A
-HREF="#AEN4899"
->Events</A
-></DT
-><DD
-><DL
-><DT
->B.1. <A
-HREF="#AEN4902"
->at_rot_target</A
-></DT
-><DT
->B.2. <A
-HREF="#AEN4916"
->at_target</A
-></DT
-><DT
->B.3. <A
-HREF="#AEN4930"
->attach</A
-></DT
-><DT
->B.4. <A
-HREF="#AEN4940"
->changed</A
-></DT
-><DT
->B.5. <A
-HREF="#AEN4951"
->collision</A
-></DT
-><DT
->B.6. <A
-HREF="#AEN4961"
->collision_end</A
-></DT
-><DT
->B.7. <A
-HREF="#AEN4971"
->collision_start</A
-></DT
-><DT
->B.8. <A
-HREF="#AEN4981"
->control</A
-></DT
-><DT
->B.9. <A
-HREF="#AEN4997"
->dataserver</A
-></DT
-><DT
->B.10. <A
-HREF="#AEN5012"
->email</A
-></DT
-><DT
->B.11. <A
-HREF="#AEN5030"
->land_collision</A
-></DT
-><DT
->B.12. <A
-HREF="#AEN5039"
->land_collision_end</A
-></DT
-><DT
->B.13. <A
-HREF="#AEN5048"
->land_collision_start</A
-></DT
-><DT
->B.14. <A
-HREF="#AEN5057"
->link_message</A
-></DT
-><DT
->B.15. <A
-HREF="#AEN5073"
->listen</A
-></DT
-><DT
->B.16. <A
-HREF="#AEN5092"
->money</A
-></DT
-><DT
->B.17. <A
-HREF="#AEN5105"
->moving_end</A
-></DT
-><DT
->B.18. <A
-HREF="#AEN5113"
->moving_start</A
-></DT
-><DT
->B.19. <A
-HREF="#AEN5121"
->no_sensor</A
-></DT
-><DT
->B.20. <A
-HREF="#AEN5130"
->not_at_rot_target</A
-></DT
-><DT
->B.21. <A
-HREF="#AEN5139"
->not_at_target</A
-></DT
-><DT
->B.22. <A
-HREF="#AEN5148"
->object_rez</A
-></DT
-><DT
->B.23. <A
-HREF="#AEN5159"
->on_rez</A
-></DT
-><DT
->B.24. <A
-HREF="#AEN5171"
->run_time_permissions</A
-></DT
-><DT
->B.25. <A
-HREF="#AEN5183"
->sensor</A
-></DT
-><DT
->B.26. <A
-HREF="#AEN5195"
->state_entry</A
-></DT
-><DT
->B.27. <A
-HREF="#AEN5203"
->state_exit</A
-></DT
-><DT
->B.28. <A
-HREF="#AEN5211"
->timer</A
-></DT
-><DT
->B.29. <A
-HREF="#AEN5220"
->touch</A
-></DT
-><DT
->B.30. <A
-HREF="#AEN5231"
->touch_end</A
-></DT
-><DT
->B.31. <A
-HREF="#AEN5242"
->touch_start</A
-></DT
-><DT
->B.32. <A
-HREF="#AEN5253"
->remote_data</A
-></DT
-></DL
-></DD
-><DT
->C. <A
-HREF="#AEN5292"
->Constants</A
-></DT
-><DD
-><DL
-><DT
->C.1. <A
-HREF="#AEN5295"
->Boolean Constants</A
-></DT
-><DT
->C.2. <A
-HREF="#AEN5304"
->Status Constants</A
-></DT
-><DT
->C.3. <A
-HREF="#AEN5338"
->Object Type Constants</A
-></DT
-><DT
->C.4. <A
-HREF="#AEN5360"
->Permission Constants</A
-></DT
-><DT
->C.5. <A
-HREF="#AEN5411"
->Inventory Constants</A
-></DT
-><DT
->C.6. <A
-HREF="#AEN5434"
->Pay Price Constants</A
-></DT
-><DT
->C.7. <A
-HREF="#AEN5448"
->Attachment Constants</A
-></DT
-><DT
->C.8. <A
-HREF="#AEN5574"
->Land Constants</A
-></DT
-><DT
->C.9. <A
-HREF="#AEN5616"
->Link Constants</A
-></DT
-><DT
->C.10. <A
-HREF="#AEN5643"
->Control Constants</A
-></DT
-><DT
->C.11. <A
-HREF="#AEN5690"
->Change Constants</A
-></DT
-><DT
->C.12. <A
-HREF="#AEN5733"
->Type Constants</A
-></DT
-><DT
->C.13. <A
-HREF="#AEN5767"
->Agent Info Constants</A
-></DT
-><DT
->C.14. <A
-HREF="#AEN5817"
->Texture Animation
-    Constants</A
-></DT
-><DT
->C.15. <A
-HREF="#AEN5851"
->Particle System Constants</A
-></DT
-><DT
->C.16. <A
-HREF="#AEN6005"
->Agent Data Constants</A
-></DT
-><DT
->C.17. <A
-HREF="#AEN6041"
->Float Constants</A
-></DT
-><DT
->C.18. <A
-HREF="#AEN6070"
->Key Constant</A
-></DT
-><DT
->C.19. <A
-HREF="#AEN6073"
->Miscellaneous Integer Constants</A
-></DT
-><DT
->C.20. <A
-HREF="#AEN6076"
->Miscellaneous String
-    Constants</A
-></DT
-><DT
->C.21. <A
-HREF="#AEN6080"
->Vector Constant</A
-></DT
-><DT
->C.22. <A
-HREF="#AEN6083"
->Rotation Constant</A
-></DT
-><DT
->C.23. <A
-HREF="#AEN6086"
->Simulator Data Constants</A
-></DT
-><DT
->C.24. <A
-HREF="#AEN6112"
->Vehicle Parameters</A
-></DT
-><DT
->C.25. <A
-HREF="#AEN6231"
->Vehicle Flags</A
-></DT
-><DT
->C.26. <A
-HREF="#AEN6288"
->Vehicle Types</A
-></DT
-><DT
->C.27. <A
-HREF="#AEN6323"
->Primitive Constants</A
-></DT
-><DT
->C.28. <A
-HREF="#AEN6409"
->XML-RPC Constants</A
-></DT
-><DT
->C.29. <A
-HREF="#AEN6412"
->Permission Mask Constants</A
-></DT
-><DT
->C.30. <A
-HREF="#AEN6459"
->Parcel Media Constants</A
-></DT
-><DT
->C.31. <A
-HREF="#AEN6521"
->Click Action Constants</A
-></DT
-></DL
-></DD
-></DL
-></DIV
-><DIV
-CLASS="LOT"
-><DL
-CLASS="LOT"
-><DT
-><B
->List of Tables</B
-></DT
-><DT
->3-1. <A
-HREF="#AEN148"
->Binary Arithmetic Operators</A
-></DT
-><DT
->3-2. <A
-HREF="#AEN188"
->Boolean Operators</A
-></DT
-><DT
->3-3. <A
-HREF="#AEN220"
->Bitwise Operators</A
-></DT
-><DT
->3-4. <A
-HREF="#AEN258"
->Vector Arithmetic Operators</A
-></DT
-><DT
->3-5. <A
-HREF="#AEN282"
->Rotation Arithmetic Operators</A
-></DT
-><DT
->6-1. <A
-HREF="#AEN456"
->Trigonometry Functions</A
-></DT
-><DT
->6-2. <A
-HREF="#AEN505"
->Vector Functions</A
-></DT
-><DT
->6-3. <A
-HREF="#AEN521"
->Rotation Functions</A
-></DT
-><DT
->7-1. <A
-HREF="#AEN565"
->String Functions</A
-></DT
-><DT
->8-1. <A
-HREF="#AEN609"
->List Functions</A
-></DT
-><DT
->9-1. <A
-HREF="#AEN674"
->In World Functions</A
-></DT
-><DT
->9-2. <A
-HREF="#AEN699"
->Messaging Functions</A
-></DT
-><DT
->10-1. <A
-HREF="#AEN719"
->Inventory Functions</A
-></DT
-></DL
-></DIV
-><DIV
-CLASS="chapter"
-><HR><H1
-><A
-NAME="AEN27"
-></A
->Chapter 1. Introduction</H1
-><P
->The Linden Scripting Language (LSL) is a simple, powerful
-  language used to attach behaviors to the objects found in Second
-  Life. It follows the familiar syntax of a c/Java style language,
-  with an implicit state machine for every script.</P
-><P
->Multiple scripts may also be attached to the same object,
-  allowing a style of small, single-function scripts to evolve.  This
-  leads to scripts that perform specific functions ("hover", "follow",
-  etc.) and allows them to be combined to form new behaviors.</P
-><P
->The text of the script is compiled into an executable byte
-  code, much like Java.  This byte code is then run within a virtual
-  machine on the simulator.  Each script receives a time slice of the
-  total simulator time allocated to scripts, so a simulator with many
-  scripts would allow each individual script less time rather than
-  degrading its own performance.  In addition, each script executes
-  within its own chunk of memory, preventing scripts from writing into
-  protected simulator memory or into other scripts, making it much
-  harder for scripts to crash the simulator.</P
-><P
->This tutorial introduces the reader to the basic features of
-  LSL, how to edit and apply your scripts, and a complete reference
-  for standard linden constants, events, and library functions.</P
-></DIV
-><DIV
-CLASS="chapter"
-><HR><H1
-><A
-NAME="AEN33"
-></A
->Chapter 2. Getting Started</H1
-><P
->You're probably wondering what you can do with LSL, and how
-  quickly you can do it. We'll start with some simple examples, dissect
-  them, and introduce you the script development process while
-  we're at it.</P
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN36"
->2.1. Hello Avatar</A
-></H2
-><P
->Continuing a long tradition of getting started by looking at
-    a script that says "Hello", we'll do just that. Though obviously
-    not a particularly useful example on it's own, this example will
-    introduce us to:</P
-><P
-></P
-><UL
-><LI
-><P
->Creating a basic script</P
-></LI
-><LI
-><P
->Script states</P
-></LI
-><LI
-><P
->Calling functions</P
-></LI
-><LI
-><P
->Script events</P
-></LI
-><LI
-><P
->Applying a script to an object</P
-></LI
-></UL
-><DIV
-CLASS="section"
-><HR><H3
-CLASS="section"
-><A
-NAME="AEN50"
->2.1.1. Creating the Script</A
-></H3
-><P
->Start by opening your inventory and selecting 'Create|New
-      Script' from the inventory pull down menu. This will create an
-      empty script called 'New Script' in your 'Scripts'
-      folder. Double click on the text or icon of the script to open
-      the script in the built in editor. When you open the script, the
-      viewer will automatically insert a basic skeleton for lsl. It
-      should look like:</P
-><P
-><PRE
-CLASS="programlisting"
->&#13;default
-{
-    state_entry()
-    {
-        llSay(0, "Hello, Avatar!");
-    }
-
-    touch_start(integer total_number)
-    {
-        llSay(0, "Touched.");
-    }
-}
-      </PRE
-></P
-><P
->A casual inspection of this script reveals that this script
-      probably says 'Hello, Avatar!' when it enters some state, and it
-      says 'Touched.' when it is touched. But since this is also
-      probably the first time you have seen a script we'll dissect this
-      short listing, explaining each segment individually.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H3
-CLASS="section"
-><A
-NAME="AEN56"
->2.1.2. Default State</A
-></H3
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN59"
-></A
-><PRE
-CLASS="programlisting"
->&#13;default
-{
-...
-}
-      </PRE
-><P
-></P
-></DIV
-></P
-><P
->All LSL scripts have a simple implicit state machine with
-      one or more states. All scripts must have a default state, so
-      if there is only one state, it will be the 'default'
-      state. When a script is first started or reset, it will start
-      out in the default state.</P
-><P
->The default state is declared by placing the default at
-      the root level of the document, and marking the beginning with
-      an open brace '{' and ending with a close brace '}'. Because of
-      it's privileged status, you do not declare that it is fact a
-      state like you normally would with other states.</P
-><P
->Every time you enter a state, the script engine will
-      automatically call the state_entry() event and execute the code
-      found there. On state exit, the script engine will automatically
-      call the state_exit() event before calling the next state's
-      state_entry handler. In our example, we call the 
-	  <A
-HREF="#AEN3640"
->llSay()</A
->
-      function in state_entry() and do not bother to define a
-      state_exit() handler. the state entry and exit handlers are a
-      convenient place to initialize state data and clean up state
-      specific data such as listen event callback.</P
-><P
->You can read more about the default state, and how to
-      create and utilize other states in the <A
-HREF="#AEN427"
->states chapter</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H3
-CLASS="section"
-><A
-NAME="AEN67"
->2.1.3. Functions</A
-></H3
-><P
->The language comes with well over 200 <A
-HREF="#AEN999"
->built in functions</A
-> which allow scripts and
-      objects to interact with their environment. All of the built in
-      functions start with 'll'.</P
-><P
->The example calls the <A
-HREF="#AEN3640"
->llSay()</A
-> 
-	  function twice, which is used to emit text on the specified channel.
-	  </P
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN73"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSay</CODE
->(
-	    integer channel
-	    string text
-	  );</CODE
-></P
-><P
-></P
-></DIV
-><P
->Say text on channel. Channel 0 is the public chat channel
-      that all avatars see as chat text. Channels 1 to 2,147,483,648
-      are private channels that aren't sent to avatars but other
-      scripts can listen for.</P
-><P
->You can define your own functions as long as the name does
-      not conflict with a reserved word, built in constant, or built
-      in function.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H3
-CLASS="section"
-><A
-NAME="AEN82"
->2.1.4. Touch Event</A
-></H3
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN85"
-></A
-><PRE
-CLASS="programlisting"
->&#13;touch_start(integer total_number)
-{
-    llSay(0, "Touched.");
-}
-      </PRE
-><P
-></P
-></DIV
-></P
-><P
->There are many <A
-HREF="#AEN4899"
->events</A
-> that can 
-	  be detected in your scripts by declaring a handler. The 
-	  <A
-HREF="#AEN5242"
-> touch_start()</A
-> 
-	  event is raised when a
-      user touches the object through the user interface.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H3
-CLASS="section"
-><A
-NAME="AEN90"
->2.1.5. Try it Out</A
-></H3
-><P
->Now that we have seen the default script, and examined it
-      in some detail, it is time to see the script in action. Save
-      the script by clicking on <SPAN
-CLASS="guibutton"
->Save</SPAN
->. During
-      the save process, the editor will save the text of the script
-      and compile the script into bytecode and then save that. When
-      you see message 'Compile successful!' in the preview window, you
-      know the compile and save is done.</P
-><P
->To test the script you will have to apply it to an object
-      in the world. Create a new object in the world by
-      <SPAN
-CLASS="mousebutton"
->context clicking</SPAN
-> in the main world
-      view and selecting <SPAN
-CLASS="guimenu"
->Create</SPAN
->. When the wand
-      appears, you can create a simple primitive by
-      <SPAN
-CLASS="mousebutton"
->clicking</SPAN
-> in the world. Once the
-      object appears, you can drag your newly created script onto the
-      object to start the script.</P
-><P
->Soon after dragging the script onto the object, you will
-      see the message <SAMP
-CLASS="computeroutput"
->Object: Hello
-      Avatar!</SAMP
-></P
-><P
->Make sure the touch event is working by
-      <SPAN
-CLASS="mousebutton"
->clicking</SPAN
-> on the object. You should
-      see the message <SAMP
-CLASS="computeroutput"
->Touched printed into the chat
-      history.</SAMP
-></P
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN103"
->2.2. Using The Built-In Editor</A
-></H2
-><P
->The built in editor comes with most of the typical features
-    you would expect from a basic text editor. Highlight text with the
-    mouse, or by holding down the shift key while using the arrow
-    keys. You can cut, copy, paste, and delete your selection using
-    the 'Edit' pull down menu or by pressing the usual shortcut
-    key.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN106"
->2.3. Using Alternative Editors</A
-></H2
-><P
->Since the built-in editor supports pasting text from the
-    clipboard, you can employ a different editor to edit your scripts,
-    copying them into Second Life when you're ready to save them.</P
-></DIV
-></DIV
-><DIV
-CLASS="chapter"
-><HR><H1
-><A
-NAME="AEN109"
-></A
->Chapter 3. Basics</H1
-><P
->Now that we have seen a very simple script in action, we need
-  to look at the our toolchest for writing scripts. The next set of
-  tools we will consider are the basic building blocks for programming
-  a script, and will be used in every non-trivial script you write.</P
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN112"
->3.1. Comments</A
-></H2
-><P
->Commenting your scripts is a good idea, and will help when
-    you update and modify the script, or when you adapt parts of it
-    into other scripts. Unless the meaning is obvious, you should add
-    comments:</P
-><P
-><P
-></P
-><UL
-><LI
-><P
->at the start of the script to explain the
-	purpose of the script</P
-></LI
-><LI
-><P
->before every global variable to describe what
-	it holds</P
-></LI
-><LI
-><P
->before every global function to describe what
-	it does</P
-></LI
-><LI
-><P
->sprinkled through your script wherever the code
-	solves a problem that took you more than a few minutes to
-	figure out.</P
-></LI
-></UL
-></P
-><P
->LSL uses Java/C++ style single line comments.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN127"
-></A
-><PRE
-CLASS="programlisting"
->&#13;// This script toggles a the rotation of an object
-
-// g_is_rotating stores the current state of the rotation. TRUE is
-// rotating, FALSE otherwise.
-integer g_is_rotating = FALSE;
-default
-{
-    // toggle state during the touch handler
-    touch(integer num)
-    {
-        if(g_is_rotating)
-        {
-            // turn off rotation
-            llTargetOmega(&#60;0,0,1&#62;, 0, 0);
-            g_is_rotating = FALSE;
-        }
-        else
-        {
-            // rotate around the positive z axis - up.
-            llTargetOmega(&#60;0,0,1&#62;, 4, 1);
-            g_is_rotating = TRUE;
-        }
-    }
-}
-    </PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN129"
->3.2. Arithmetic Operations</A
-></H2
-><P
->Most of the common arithmetic operations are supported in
-    lsl, and follow the C/Java syntax.</P
-><DIV
-CLASS="section"
-><HR><H3
-CLASS="section"
-><A
-NAME="AEN132"
->3.2.1. Assignment</A
-></H3
-><P
->The most common arithmetic operation is assignment,
-      denoted with the '=' sign. Loosely translated, it means, take
-      what you find on the right hand side of the equal sign and
-      assign it to the left hand side. Any expression that evaluates
-      to a basic type can be used as the right hand side of an
-      assignment, but the left hand side must be a normal
-      variable.</P
-><P
->All basic types support assignment '=', equality '==' and
-      inequality '!=' operators.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN137"
-></A
-><PRE
-CLASS="programlisting"
->&#13;// variables to hold a information about the target
-key g_target;
-vector g_target_postion;
-float g_target_distance;
-
-// function that demonstrates assignment
-set_globals(key target, vector pos)
-{
-    g_target = target;
-    g_target_position = pos;
-
-    // assignment from the return value of a function
-    vector my_pos = llGetPos(); 
-    g_target_distance = llVecDist(g_target_position, my_pos);
-}
-      </PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H3
-CLASS="section"
-><A
-NAME="AEN139"
->3.2.2. Hexadecimal Entry</A
-></H3
-><P
->Integers may be entered in hex form (e.g. 0xffff).  For example:</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN143"
-></A
-><PRE
-CLASS="programlisting"
->&#13;integer Mask = 0xff;  // Equivalent to integer Mask = 255;
-integer Bit  = 0x0100 // Equivalent to integer Mask = 256;
-	</PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H3
-CLASS="section"
-><A
-NAME="AEN145"
->3.2.3. Binary Arithmetic Operators</A
-></H3
-><P
->Binary arithmetic operators behave like a function call
-      that accepts two parameters of the same type, and then return
-      that type; however, the syntax is slightly different.</P
-><DIV
-CLASS="table"
-><A
-NAME="AEN148"
-></A
-><P
-><B
->Table 3-1. Binary Arithmetic Operators</B
-></P
-><TABLE
-BORDER="1"
-CLASS="CALSTABLE"
-><COL><COL><THEAD
-><TR
-><TH
->Operator</TH
-><TH
->Meaning</TH
-></TR
-></THEAD
-><TBODY
-><TR
-><TD
->+</TD
-><TD
->Addition</TD
-></TR
-><TR
-><TD
->-</TD
-><TD
->Subtraction</TD
-></TR
-><TR
-><TD
->*</TD
-><TD
->Multiplication</TD
-></TR
-><TR
-><TD
->/</TD
-><TD
->Division</TD
-></TR
-><TR
-><TD
->%</TD
-><TD
->Modulo (remainder)</TD
-></TR
-><TR
-><TD
->^</TD
-><TD
->Exclusive OR</TD
-></TR
-><TR
-><TD
->&#60;&#60;</TD
-><TD
->Shift Left</TD
-></TR
-><TR
-><TD
->&#62;&#62;</TD
-><TD
->Shift Right</TD
-></TR
-></TBODY
-></TABLE
-></DIV
-><P
->Where noted, each type may have a special interpretation
-      of a binary arithmetic operator. See the <A
-HREF="#AEN237"
->lsl types</A
-> section for more
-      details.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN183"
-></A
-><PRE
-CLASS="programlisting"
->&#13;      </PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H3
-CLASS="section"
-><A
-NAME="AEN185"
->3.2.4. Boolean Operators</A
-></H3
-><P
-></P
-><DIV
-CLASS="table"
-><A
-NAME="AEN188"
-></A
-><P
-><B
->Table 3-2. Boolean Operators</B
-></P
-><TABLE
-BORDER="1"
-CLASS="CALSTABLE"
-><COL><COL><THEAD
-><TR
-><TH
->Operator</TH
-><TH
->Meaning</TH
-></TR
-></THEAD
-><TBODY
-><TR
-><TD
->&#60;</TD
-><TD
->Operator returns TRUE if the left hand side is less
-	      than the right hand side.</TD
-></TR
-><TR
-><TD
->&#62;</TD
-><TD
->Operator returns TRUE if the left hand side is greater
-	      than the right hand side.</TD
-></TR
-><TR
-><TD
->&#60;=</TD
-><TD
->Operator returns TRUE if the left hand side is less
-	      than or equal to the right hand side.</TD
-></TR
-><TR
-><TD
->&#62;=</TD
-><TD
->Operator returns TRUE if the left hand side is greater
-	      than or equal to the right hand side.</TD
-></TR
-><TR
-><TD
->&#38;&#38;</TD
-><TD
->Operator returns TRUE if the left hand side and right
-	      hand side are both true.</TD
-></TR
-><TR
-><TD
->||</TD
-><TD
->Operator returns TRUE if either the left hand or right
-	      hand side are true.</TD
-></TR
-><TR
-><TD
->!</TD
-><TD
->Unary operator returns the logical negation of the
-	      expression to the right.</TD
-></TR
-></TBODY
-></TABLE
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H3
-CLASS="section"
-><A
-NAME="AEN217"
->3.2.5. Bitwise Operators</A
-></H3
-><P
-></P
-><DIV
-CLASS="table"
-><A
-NAME="AEN220"
-></A
-><P
-><B
->Table 3-3. Bitwise Operators</B
-></P
-><TABLE
-BORDER="1"
-CLASS="CALSTABLE"
-><COL><COL><THEAD
-><TR
-><TH
->Operator</TH
-><TH
->Meaning</TH
-></TR
-></THEAD
-><TBODY
-><TR
-><TD
->&#38;</TD
-><TD
->Returns the bitwise and of the left and right hand
-	      side.</TD
-></TR
-><TR
-><TD
->|</TD
-><TD
->Returns the bitwise or of the left and right hand
-	      side.</TD
-></TR
-><TR
-><TD
->~</TD
-><TD
->Unary operator returns the bitwise complement of the
-	      expression to the right.</TD
-></TR
-></TBODY
-></TABLE
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN237"
->3.3. Types</A
-></H2
-><P
->Variables, return values, and parameters have type
-    information. LSL provides a small set of basic types that are used
-    throughout the language.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->LSL Types</B
-></P
-><DL
-><DT
->integer</DT
-><DD
-><P
->A signed, 32-bit integer value with valid range from
-	  -2147483648 to 2147483647.</P
-></DD
-><DT
->float</DT
-><DD
-><P
->An IEEE 32-bit floating point value with
-	values ranging from 1.175494351E-38 to
-	3.402823466E+38.</P
-></DD
-><DT
->key</DT
-><DD
-><P
->A unique identifier that can be used to
-	reference objects and agents in Second Life.</P
-></DD
-><DT
->vector</DT
-><DD
-><P
->3 floats that are used together as a single
-	item. A vector can be used to represent a 3 dimensional
-	position, direction, velocity, force, impulse, or a
-	color. Each component can be accessed via '.x', '.y', and
-	'.z'.</P
-><DIV
-CLASS="table"
-><A
-NAME="AEN258"
-></A
-><P
-><B
->Table 3-4. Vector Arithmetic Operators</B
-></P
-><TABLE
-BORDER="1"
-CLASS="CALSTABLE"
-><COL><COL><THEAD
-><TR
-><TH
->Operator</TH
-><TH
->Meaning</TH
-></TR
-></THEAD
-><TBODY
-><TR
-><TD
->+</TD
-><TD
->Add two vectors together</TD
-></TR
-><TR
-><TD
->-</TD
-><TD
->Subtract one vector from another</TD
-></TR
-><TR
-><TD
->*</TD
-><TD
->Vector dot product</TD
-></TR
-><TR
-><TD
->%</TD
-><TD
->Vector cross product</TD
-></TR
-></TBODY
-></TABLE
-></DIV
-></DD
-><DT
->rotation</DT
-><DD
-><P
->4 floats that are used together as a single
-	item to represent a rotation. This data is interpreted as a
-	quaternion. Each component can be accessed via '.x', '.y',
-	'.z', and '.s'.</P
-><DIV
-CLASS="table"
-><A
-NAME="AEN282"
-></A
-><P
-><B
->Table 3-5. Rotation Arithmetic Operators</B
-></P
-><TABLE
-BORDER="1"
-CLASS="CALSTABLE"
-><COL><COL><THEAD
-><TR
-><TH
->Operator</TH
-><TH
->Meaning</TH
-></TR
-></THEAD
-><TBODY
-><TR
-><TD
->+</TD
-><TD
->Add two rotations together</TD
-></TR
-><TR
-><TD
->-</TD
-><TD
->Subtract one rotation from another</TD
-></TR
-><TR
-><TD
->*</TD
-><TD
->Rotate the first rotation by the second</TD
-></TR
-><TR
-><TD
->/</TD
-><TD
->Rotate the first rotation by the inverse of the second</TD
-></TR
-></TBODY
-></TABLE
-></DIV
-></DD
-><DT
->list</DT
-><DD
-><P
->A heterogeneous list of the other data types. Lists are
-	created via comma separated values of the other data types
-	enclosed by '[' and ']'.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN307"
-></A
-><PRE
-CLASS="programlisting"
->&#13;string StringVar = "Hello, Carbon Unit";
-list MyList = [ 1234, ZERO_ROTATION, StringVar ];
-        </PRE
-><P
-></P
-></DIV
->
-        Yields the list: <SAMP
-CLASS="computeroutput"
->[ 1234, &#60;0,0,0,1&#62;, "Hello,
-        Carbon Unit" ]</SAMP
->
-        </P
-><P
->Lists can be combined with other lists. For example:
-        <DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN311"
-></A
-><PRE
-CLASS="programlisting"
->&#13;MyList = 3.14159 + MyList;
-        </PRE
-><P
-></P
-></DIV
->
-        Yields the list: <SAMP
-CLASS="computeroutput"
->[ 3.14159, 1234, &#60;0,0,0,1&#62;,
-        "Hello, Carbon Unit" ]</SAMP
->
-         And similarly, 
-        <DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN314"
-></A
-><PRE
-CLASS="programlisting"
->&#13;MyList = MyList + MyList;
-        </PRE
-><P
-></P
-></DIV
->
-        Yields: <SAMP
-CLASS="computeroutput"
->[ 3.14159, 1234, &#60;0,0,0,1&#62;, "Hello,
-        Carbon Unit", 3.14159, 1234, &#60;0,0,0,1&#62;, "Hello, Carbon Unit"
-        ]</SAMP
->
-        </P
-><P
->Library functions exist used to copy data from lists,
-        sort lists, copy/remove sublists.</P
-></DD
-></DL
-></DIV
-><DIV
-CLASS="section"
-><HR><H3
-CLASS="section"
-><A
-NAME="AEN318"
->3.3.1. Type Conversion</A
-></H3
-><P
->Type conversion can either occur implicitly or explicitly.
-      Explicit type casts are accomplished using C syntax:
-      <DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN321"
-></A
-><PRE
-CLASS="programlisting"
->&#13;float foo_float = 1.0;
-integer  foo_int = (integer)foo_float;
-      </PRE
-><P
-></P
-></DIV
->
-      </P
-><DIV
-CLASS="section"
-><HR><H4
-CLASS="section"
-><A
-NAME="AEN323"
->3.3.1.1. Implicit Casting</A
-></H4
-><P
->LSL only supports two implicit type casts: integer to
-	float and string to key. Thus, any place you see a float
-	specified you can supply an integer, and any place you see a
-	key specified, you can supply a string.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H4
-CLASS="section"
-><A
-NAME="AEN326"
->3.3.1.2. Explicit Casting</A
-></H4
-><P
->LSL supports the following explicit casts:
-          <P
-></P
-><UL
-><LI
-STYLE="list-style-type: opencircle"
-><P
->Integer to String</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->Float to Integer</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->Float to String</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->Vector to String</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->Rotation to String</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->Integer to List</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->Float to List</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->Key to List</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->String to List</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->Vector to List</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->Rotation to List</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->String to Integer</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->String to Float</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->String to Vector</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->String to Rotation</P
-></LI
-></UL
->
-        </P
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN360"
->3.4. Global Functions</A
-></H2
-><P
->Global functions are also declared much like Java/C, with
-    the exception that no 'void' return value exists. Instead, if no
-    return value is needed, just don't specify one:
-
-    <DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN363"
-></A
-><PRE
-CLASS="programlisting"
->&#13;make_physical_and_spin(vector torque)
-{
-    // double the torque
-    vector double_torque = 2.0*torque;
-    llSetStatus(STATUS_PHYSICS, TRUE);
-    llApplyTorque(double_torque);
-}    
-    </PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN365"
->3.5. Global Variables</A
-></H2
-><P
->Global variables and functions are accessible from anywhere
-    in the file. Global variables are declared much like Java or C,
-    although only one declaration may be made per line:
-    <DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN368"
-></A
-><PRE
-CLASS="programlisting"
->&#13;vector gStartPosition;
-    </PRE
-><P
-></P
-></DIV
-></P
-><P
->Global variables may also be initialized if desired,
-    although uninitialized global and local variables are initialized
-    to legal zero values:
-    <DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN371"
-></A
-><PRE
-CLASS="programlisting"
->&#13;vector gStartPosition = &#60;10.0,10.0,10.0&#62;
-    </PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN373"
->3.6. Local Variables</A
-></H2
-><P
->Local variables are scoped below their declaration within
-    the block of code they are declared in and may be declared within
-    any block of code. Thus the following code is legal and will work
-    like C:
-    <DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN376"
-></A
-><PRE
-CLASS="programlisting"
->&#13;integer test_function()
-{
-    // Test vector that we can use anywhere in the function
-    vector test = &#60;1,2,3&#62;;
-    integer j;
-    for (j = 0; j &#60; 10; j++)
-    {
-        // This vector is a different variable than the one declared above
-        // This IS NOT good coding practice
-        vector test = &#60;j, j, j&#62;;
-    }
-    // this test fails
-    if (test == &#60;9,9,9&#62;)
-    {
-        // never reached
-    }
-}
-    </PRE
-><P
-></P
-></DIV
-></P
-></DIV
-></DIV
-><DIV
-CLASS="chapter"
-><HR><H1
-><A
-NAME="AEN378"
-></A
->Chapter 4. Flow Control</H1
-><P
->LSL comes with a complete complement of constructs meant to
-  deal with conditional processing, looping, as well as simply jumping
-  to a different point in the script.</P
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN381"
->4.1. Conditional Statements</A
-></H2
-><P
->The 'if' statement operates and has the 
-	same syntax as the Java/C version.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN385"
-></A
-><PRE
-CLASS="programlisting"
->&#13;check_message(string message)
-{
-    if(message == "open")
-    {
-        open();
-    }
-    else if(message == "close")
-    {
-        close();
-    }
-    else
-    {
-        llSay(0, "Unknown command: " + message);
-    }
-}
-    </PRE
-><P
-></P
-></DIV
-></P
-><P
->The statements between the open and close curly brace are
-    performed if the conditional inside the parentheses evaluates to a
-    non-zero integer. Once a conditional is determined to be true
-    (non-zero), no further processing of 'else' conditionals will be
-    considered.  The <A
-HREF="#AEN6070"
->NULL_KEY</A
-> constant
-    is counted as FALSE by conditional expressions.</P
-><P
->There can be zero or more 'else if' statements, and an
-    optional final 'else' to handle the case when none of the if
-    statements evaluate to a non-zero integer.</P
-><P
->The usual set of integer arithmetic and comparison operators
-    are available.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN392"
-></A
-><PRE
-CLASS="programlisting"
->&#13;// a function that accepts some information about its environment and
-// determines the 'best' next step. This kind of code might be
-// part of a simple box meant to move close to an agent and attach to
-// them once near. This code sample relies on the standard linden
-// library functions as well as two other methods not defined here.
-assess_next_step(integer perm, integer attached, integer balance, float dist)
-{
-    string msg;
-    if(!attached)
-    {
-        if((perm &#38; PERMISSION_ATTACH) &#38;&#38; (dist &#60; 10.0))
-        {
-             attach();
-        }
-        else if((dist &#62; 10.0) || ((dist &#62; 20.0) &#38;&#38; (balance &#62; 1000)))
-        {
-            move_closer();
-        }
-        else
-        {
-            llRequestPermissions(llGetOwner(), PERMISSION_ATTACH);
-        }
-    }
-}
-    </PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN394"
->4.2. Loop Constructs</A
-></H2
-><P
->Loops are a basic building block of most useful programming
-    languages, and LSL offers the same loop constructs as found in
-    Java or C.</P
-><DIV
-CLASS="section"
-><HR><H3
-CLASS="section"
-><A
-NAME="AEN397"
->4.2.1. for loop</A
-></H3
-><P
->A for loop is most useful for when you know how many times
-      you need to iterate over an operation. Just like a Java or C for
-      loop, the parentheses have three parts, the initializer, the
-      continuation condition, and the increment. The loop continues
-      while the middle term evaluates to true, and the increment step
-      is performed at the end of every loop.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN401"
-></A
-><PRE
-CLASS="programlisting"
->&#13;// move a non-physical block smoothly upward (positive z) the total
-// distance specified divided into steps discrete moves.
-move_up(float distance, integer steps)
-{
-    float step_distance = distance / (float)steps;
-    vector offset = &#60;0.0, 0.0, step_distance&#62;;
-    vector base_pos = llGetPos();
-    integer i;
-    for(i = 0; i &#60;= steps; ++i)
-    {
-        llSetPos(base_pos + i * offset);
-        llSleep(0.1);
-    }
-}
-      </PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H3
-CLASS="section"
-><A
-NAME="AEN403"
->4.2.2. do-while loop</A
-></H3
-><P
->The do-while loop construct is most useful when you are
-      sure that you want to perform an operation at least once, but
-      you are not sure how many times you want to loop. The syntax is
-      the same as you would find in a Java or C program. A simple
-      English translation would be 'do the code inside the curly braces
-      and continue doing it if the statement after the while is
-      true.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN407"
-></A
-><PRE
-CLASS="programlisting"
->&#13;// output the name of all inventory items attached to this object
-talk_about_inventory(integer type)
-{
-    string name;
-    integer i = 0;
-    integer continue = TRUE;
-    do
-    {
-        name = llGetInventoryName(type, i);
-        if(llStringLength(name) &#62; 0)
-        {
-            llSay(0, "Inventory " + (string)i + ": " + name);
-        }
-        else
-        {
-            llSay(0, "No more inventory items");
-            continue = FALSE;
-        }
-        i++;
-    } while(continue);
-}
-      </PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H3
-CLASS="section"
-><A
-NAME="AEN409"
->4.2.3. while loop</A
-></H3
-><P
->The while loop behaves similarly to the do-while loop,
-      except it allows you to exit the loop without doing a single
-      iteration inside.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN413"
-></A
-><PRE
-CLASS="programlisting"
->&#13;mention_inventory_type(integer type)
-{
-    integer i = llGetInventoryNumber(type);
-    while(i--)
-    {
-        llSay(0, "item: " + llGetInventory(i));
-    }
-}
-      </PRE
-><P
-></P
-></DIV
-></P
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN415"
->4.3. Jumps</A
-></H2
-><P
->A jump is used to move the running script to a new point
-    inside of a function or event handler. You cannot jump into other
-    functions or event handlers. Usually, you will want to use a jump
-    for in situations where the if..else statements would become too
-    cumbersome. For example, you may want to check several
-    preconditions, and exit if any of them are not met.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN419"
-></A
-><PRE
-CLASS="programlisting"
->&#13;attach_if_ready(vector target_pos)
-{
-    // make sure we have permission
-    integer perm = llGetPerm();
-    if(!(perm &#38; PERMISSION_ATTACH))
-    {
-        jump early_exit;
-    }
-
-    // make sure we're 10 or less meters away
-    vector pos = llGetPos()
-    float dist = llVecDist(pos, target_pos);
-    if(dist &#62; 10.0)
-    {
-        jump early_exit;
-    }
-
-    // make sure we're roughly pointed toward the target.
-    // the calculation of max_cos_theta could be precomputed 
-    // as a constant, but is manually computed here to 
-    // illustrate the math.
-    float max_cos_theta = llCos(PI / 4.0);
-    vector toward_target = llVecNorm(target_pos - pos);
-    rotation rot = llGetRot();
-    vector fwd = llRot2Fwd(rot);
-    float cos_theta = toward_target * fwd;
-    if(cos_theta &#62; max_cos_theta)
-    {
-        jump early_exit;
-    }
-
-    // at this point, we've done all the checks.
-    attach();
-
-    @early_exit;
-}
-    </PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN421"
->4.4. State Change</A
-></H2
-><P
->State change allow you to move through the lsl virtual
-    machine's flexible state machine by transitioning your script to
-    and from user defined states and the default state. You can define
-    your own script state by placing the keyword 'state' before its
-    name and enclosing the event handlers with open and close curly
-    braces ('{' and '}'.) You can invoke the transition to a new state
-    by calling it with the syntax: 'state &#60;statename&#62;'.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN425"
-></A
-><PRE
-CLASS="programlisting"
->&#13;default
-{
-    state_entry()
-    {
-        llSay(0, "I am in the default state");
-        llSetTimer(1.0);
-    }
-
-    timer()
-    {
-        state SpinState;
-    }
-}
-
-state SpinState
-{
-    state_entry()
-    {
-        llSay(0, "I am in SpinState!");
-        llTargetOmega(&#60;0,0,1&#62;, 4, 1.0);
-        llSetTimer(2.0);
-    }
-
-    timer()
-    {
-        state default;
-    }
-
-    state_exit()
-    {
-        llTargetOmega(&#60;0,0,1&#62;, 0, 0.0);
-    }
-}
-    </PRE
-><P
-></P
-></DIV
-></P
-></DIV
-></DIV
-><DIV
-CLASS="chapter"
-><HR><H1
-><A
-NAME="AEN427"
-></A
->Chapter 5. States</H1
-><P
->All scripts must have a 'default' state, which is the first
-  state entered when the script starts. States contain event handlers
-  that are triggered by the LSL virtual machine. All states must
-  supply at least one event handler - it's not really a state without
-  one.</P
-><P
->When state changes, all callback settings are retained and all
-  pending events are cleared.</P
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN431"
->5.1. state_entry()</A
-></H2
-><P
->The <A
-HREF="#AEN5195"
->state_entry</A
->
-	event occurs whenever a new state is
-    entered, including program start, and is always the first event
-    handled. No data is passed to this event handler.</P
-><P
->You will usually want to set callbacks for things such as
-    timers and sensor in the state_entry() callback of the state to
-    put your object into a useful condition for that state.</P
-><P
->Warning: It is a common mistake to assume that the state_entry()
-      callback is called when you rez an object out of your
-      inventory. When you derez an object into your inventory the
-      current state of the script is saved, so there will not be a
-      call to state_entry() during the rez. If you need to provide
-      startup code every time an object is created, you should create
-      a global function and call it from both state_entry() and the
-      on_rez() callbacks.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN438"
-></A
-><PRE
-CLASS="programlisting"
->&#13;// global initialization function.
-init()
-{
-    // Set up a listen callback for whoever owns this object.
-    key owner = llGetOwner();
-    llListen(0, "", owner, "");
-}
-
-default
-{
-    state_entry()
-    {
-        init();
-    }
-
-    on_rez(integer start_param)
-    {
-        init();
-    }
-
-    listen(integer channel, string name, key id, string message)
-    {
-        llSay(0, "Hi " + name + "! You own me.");
-    }
-}
-      </PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN440"
->5.2. state_exit()</A
-></H2
-><P
->You will want to provide a <A
-HREF="#AEN5203"
->&#13;	state_exit()</A
-> if you need to clean
-    up any events that you have requested in the current state, but do
-    not expect in the next state.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN445"
-></A
-><PRE
-CLASS="programlisting"
->&#13;default
-{
-    state_entry()
-    {
-        state TimerState;
-    }
-}
-
-state TimerState
-{
-    state_entry()
-    {
-        // set a timer event for 5 seconds in the future.
-        llSetTimerEvent(5.0);
-    }
-
-    timer()
-    {
-        llSay(0, "timer");
-        state ListenState;
-    }
-
-    state_exit()
-    {
-        // turn off future timer events.
-        llSetTimerEvent(0.0);
-    }
-}
-
-integer g_listen_control;
-
-state ListenState
-{
-    state_entry()
-    {
-        // listen for anything on the public channel
-        g_listen_control = llListen(0, "", NULL_KEY, "");
-    }
-
-    listen(integer channel, string name, key id, string message)
-    {
-        llSay(0, "listen");
-        state TimerState;
-    }
-
-    state_exit()
-    {
-        // turn off the listener
-        llListenRemove(g_listen_control);
-    }
-}
-    </PRE
-><P
-></P
-></DIV
-></P
-><P
->The <A
-HREF="#AEN5203"
->state_exit()</A
-> 
-	handler is not called when an object is
-    being deleted - all callbacks, handlers, sounds, etc, will be
-    cleaned up automatically for you.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN449"
->5.3. States vs. Global variables</A
-></H2
-><P
->A state and a set of global variables can serve the same
-    purpose, and each can be expressed in terms of the other. In
-    general, you should prefer the use of states over global variables
-    since states allow you to immediately assume script state without
-    making comparisons. The less comparisons a script makes, the more
-    regular code statements it can run.</P
-></DIV
-></DIV
-><DIV
-CLASS="chapter"
-><HR><H1
-><A
-NAME="AEN452"
-></A
->Chapter 6. Math</H1
-><DIV
-CLASS="section"
-><H2
-CLASS="section"
-><A
-NAME="AEN454"
->6.1. Tables of Functions</A
-></H2
-><DIV
-CLASS="table"
-><A
-NAME="AEN456"
-></A
-><P
-><B
->Table 6-1. Trigonometry Functions</B
-></P
-><TABLE
-BORDER="1"
-CLASS="CALSTABLE"
-><COL><THEAD
-><TR
-><TH
->Function</TH
-></TR
-></THEAD
-><TBODY
-><TR
-><TD
-><A
-HREF="#AEN1002"
->llAbs</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1012"
->llAcos</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1096"
->llAsin</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1106"
->llAtan2</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1212"
->llCeil</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1282"
->llCos</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1559"
->llFabs</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1569"
->llFloor</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1579"
->llFrand</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN3220"
->llPow</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN3618"
->llRound</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN4302"
->llSin</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN4335"
->llSqrt</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN4678"
->llTan</A
-></TD
-></TR
-></TBODY
-></TABLE
-></DIV
-><DIV
-CLASS="table"
-><A
-NAME="AEN505"
-></A
-><P
-><B
->Table 6-2. Vector Functions</B
-></P
-><TABLE
-BORDER="1"
-CLASS="CALSTABLE"
-><COL><THEAD
-><TR
-><TH
->Function</TH
-></TR
-></THEAD
-><TBODY
-><TR
-><TD
-><A
-HREF="#AEN4810"
->llVecDist</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN4823"
->llVecMag</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN4833"
->llVecNorm</A
-></TD
-></TR
-></TBODY
-></TABLE
-></DIV
-><DIV
-CLASS="table"
-><A
-NAME="AEN521"
-></A
-><P
-><B
->Table 6-3. Rotation Functions</B
-></P
-><TABLE
-BORDER="1"
-CLASS="CALSTABLE"
-><COL><THEAD
-><TR
-><TH
->Function</TH
-></TR
-></THEAD
-><TBODY
-><TR
-><TD
-><A
-HREF="#AEN1057"
->llAngleBetween</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1144"
->llAxes2Rot</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1160"
->llAxisAngle2Rot</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1549"
->llEuler2Rot</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN3486"
->llRot2Angle</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN3496"
->llRot2Axis</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN3506"
->llRot2Euler</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN3516"
->llRot2Fwd</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN3526"
->llRot2Left</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN3536"
->llRot2Up</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN3546"
->llRotBetween</A
-></TD
-></TR
-></TBODY
-></TABLE
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="chapter"
-><HR><H1
-><A
-NAME="AEN561"
-></A
->Chapter 7. Strings</H1
-><DIV
-CLASS="section"
-><H2
-CLASS="section"
-><A
-NAME="AEN563"
->7.1. Tables of Functions</A
-></H2
-><DIV
-CLASS="table"
-><A
-NAME="AEN565"
-></A
-><P
-><B
->Table 7-1. String Functions</B
-></P
-><TABLE
-BORDER="1"
-CLASS="CALSTABLE"
-><COL><THEAD
-><TR
-><TH
->Function</TH
-></TR
-></THEAD
-><TBODY
-><TR
-><TD
-><A
-HREF="#AEN1173"
->llBase64ToString</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1326"
->llDeleteSubString</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2195"
->llGetSubString</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2415"
->llInsertString</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2902"
->llMD5String</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN4631"
->llStringLength</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN4641"
->llSubStringIndex</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN4652"
->llStringToBase64</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN4737"
->llToLower</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN4746"
->llToUpper</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN4886"
->llXorBase64Strings</A
-></TD
-></TR
-></TBODY
-></TABLE
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="chapter"
-><HR><H1
-><A
-NAME="AEN605"
-></A
->Chapter 8. Lists</H1
-><DIV
-CLASS="section"
-><H2
-CLASS="section"
-><A
-NAME="AEN607"
->8.1. Tables of Functions</A
-></H2
-><DIV
-CLASS="table"
-><A
-NAME="AEN609"
-></A
-><P
-><B
->Table 8-1. List Functions</B
-></P
-><TABLE
-BORDER="1"
-CLASS="CALSTABLE"
-><COL><THEAD
-><TR
-><TH
->Function</TH
-></TR
-></THEAD
-><TBODY
-><TR
-><TD
-><A
-HREF="#AEN1202"
->llCSV2List</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1306"
->llDeleteSubList</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1875"
->llGetListEntryType</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1889"
->llGetListLength</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2454"
->llList2CSV</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2464"
->llList2Float</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2477"
->llList2Integer</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2490"
->llList2Key</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2503"
->llList2List</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2526"
->llList2ListStrided</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2544"
->llList2Rot</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2557"
->llList2String</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2570"
->llList2Vector</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2583"
->llListFindList</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2598"
->llListInsertList</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2614"
->llListRandomize</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2648"
->llListSort</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN3105"
->llParseString2List</A
-></TD
-></TR
-></TBODY
-></TABLE
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="chapter"
-><HR><H1
-><A
-NAME="AEN670"
-></A
->Chapter 9. Communication</H1
-><DIV
-CLASS="section"
-><H2
-CLASS="section"
-><A
-NAME="AEN672"
->9.1. Tables of Functions</A
-></H2
-><DIV
-CLASS="table"
-><A
-NAME="AEN674"
-></A
-><P
-><B
->Table 9-1. In World Functions</B
-></P
-><TABLE
-BORDER="1"
-CLASS="CALSTABLE"
-><COL><THEAD
-><TR
-><TH
->Function</TH
-></TR
-></THEAD
-><TBODY
-><TR
-><TD
-><A
-HREF="#AEN2665"
->llListen</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2686"
->llListenControl</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2701"
->llListenRemove</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN3640"
->llSay</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN4288"
->llShout</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN4862"
->llWhisper</A
-></TD
-></TR
-></TBODY
-></TABLE
-></DIV
-><DIV
-CLASS="table"
-><A
-NAME="AEN699"
-></A
-><P
-><B
->Table 9-2. Messaging Functions</B
-></P
-><TABLE
-BORDER="1"
-CLASS="CALSTABLE"
-><COL><THEAD
-><TR
-><TH
->Function</TH
-></TR
-></THEAD
-><TBODY
-><TR
-><TD
-><A
-HREF="#AEN1533"
->llEmail</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1933"
->llGetNextEmail</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2431"
->llInstantMessage</A
-></TD
-></TR
-></TBODY
-></TABLE
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="chapter"
-><HR><H1
-><A
-NAME="AEN715"
-></A
->Chapter 10. Inventory</H1
-><DIV
-CLASS="section"
-><H2
-CLASS="section"
-><A
-NAME="AEN717"
->10.1. Tables of Functions</A
-></H2
-><DIV
-CLASS="table"
-><A
-NAME="AEN719"
-></A
-><P
-><B
->Table 10-1. Inventory Functions</B
-></P
-><TABLE
-BORDER="1"
-CLASS="CALSTABLE"
-><COL><THEAD
-><TR
-><TH
->Function</TH
-></TR
-></THEAD
-><TBODY
-><TR
-><TD
-><A
-HREF="#AEN1047"
->llAllowInventoryDrop</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1754"
->llGetInventoryCreator</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1764"
->llGetInventoryKey</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1774"
->llGetInventoryName</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1816"
->llGetInventoryType</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1789"
->llGetInventoryNumber</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1801"
->llGetInventoryPermMask</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN1946"
->llGetNotecardLine</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2314"
->llGiveInventory</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN2326"
->llGiveInventoryList</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN3325"
->llRemoveInventory</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN3363"
->llRequestInventoryData</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN3461"
->llRezObject</A
-></TD
-></TR
-><TR
-><TD
-><A
-HREF="#AEN3434"
->llRezAtRoot</A
-></TD
-></TR
-></TBODY
-></TABLE
-></DIV
-></DIV
-></DIV
-><DIV
-CLASS="chapter"
-><HR><H1
-><A
-NAME="AEN768"
-></A
->Chapter 11. Vehicles</H1
-><P
->Custom Vehicles can be constructed and controlled using the LSL.
-  This chapter will cover the basics of how vehicles work, the
-  terms used when describing vehicles, and a more thorough examination
-  of the api available.</P
-><P
->There are several ways to make scripted objects move
-  themselves around. One way is to turn the object into a
-  "vehicle". This feature is versatile enough to make things
-  that slide, hover, fly, and float. Some of the behaviors that can be
-  enabled are:</P
-><P
-><P
-></P
-><UL
-><LI
-STYLE="list-style-type: opencircle"
-><P
->deflection of linear and angular velocity to
-    preferred axis of motion</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->&#13;		<A
-HREF="#AEN956"
->asymmetric linear 
-		and angular friction</A
-></P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->&#13;		<A
-HREF="#AEN979"
->hovering</A
-> over terrain/water or 
-		at a global height</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->&#13;		<A
-HREF="#AEN949"
->banking</A
-> on turns
-		</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->&#13;		<A
-HREF="#AEN866"
->linear</A
-> and 
-		<A
-HREF="#AEN898"
->angular</A
-> motor for 
-		<A
-HREF="#AEN853"
->push and turning</A
->
-	</P
-></LI
-></UL
-></P
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN790"
->11.1. Overview</A
-></H2
-><P
->Each scripted object can have one vehicle behavior that is
-	configurable through the <A
-HREF="#AEN4249"
->llSetVehicleType</A
->, <A
-HREF="#AEN4235"
->llSetVehicleFloatParam</A
->,
-	<A
-HREF="#AEN4274"
->llSetVehicleVectorParam</A
->,
-	<A
-HREF="#AEN4260"
->llSetVehicleRotationParam</A
->,
-	<A
-HREF="#AEN4224"
->llSetVehicleFlags</A
->,
-	and <A
-HREF="#AEN3335"
->llRemoveVehicleFlags</A
->
-	library calls.</P
-><P
->These script calls are described in more detail below, but
-	the important thing to notice here is that the vehicle behavior
-	has several parameters that can be adjusted to change how the
-	vehicle handles. Depending on the values chosen the vehicle can
-	veer like a boat in water, or ride like a sled on rails.</P
-><P
->Setting the vehicle flags allow you to make exceptions to
-	some default behaviors. Some of these flags only have an effect
-	when certain behaviors are enabled. For example, the
-	VEHICLE_FLAG_HOVER_WATER_ONLY will make the vehicle ignore the
-	height of the terrain, however it only makes a difference if the
-	vehicle is hovering.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN801"
->11.2. Warnings</A
-></H2
-><P
->Vehicles are a work in progress and will
-	likely experience changes in future versions of Second Life.
-	Some of the details of vehicle behavior may be changed 
-	as necessary to ensure stability
-	and user safety. In particular, many of the limits and defaults
-	described in the appendices will probably change and should not be
-	relied upon in the long term.</P
-><P
->It is not recommended that you mix vehicle behavior with
-	some of the other script calls that provide impulse and forces to
-	the object, especially <A
-HREF="#AEN3773"
->llSetBuoyancy</A
->, <A
-HREF="#AEN3841"
->llSetForce</A
->, <A
-HREF="#AEN4200"
->llSetTorque</A
->, and <A
-HREF="#AEN3872"
->llSetHoverHeight</A
->.</P
-><P
->While the following methods probably don't cause any
-	instabilities, their behavior may conflict with vehicles and cause
-	undesired and/or inconsistent results, so use <A
-HREF="#AEN2753"
->llLookAt</A
->, <A
-HREF="#AEN3559"
->llRotLookAt</A
->, <A
-HREF="#AEN2980"
->llMoveToTarget</A
->, and <A
-HREF="#AEN4701"
->llTargetOmega</A
-> at your own
-	risk.</P
-><P
->If you think you have found a bug relating to how vehicle's
-	work, one way to submit the problem is to give a copy of the
-	vehicle and script to Andrew Linden with comments or a notecard
-	describing the problem. Please name all submissions "Bugged
-	Vehicle XX" where XX are your Second Life initials. The
-	vehicle and script will be examined at the earliest
-	convenience.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN815"
->11.3. Definitions</A
-></H2
-><P
->&#13;	The terms "roll", "pitch", and
-	"yaw" are often used to describe the modes of rotations
-	that can happen to a airplane or boat. They correspond to
-	rotations about the local x-, y-, and z-axis respectively.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN819"
-></A
-><PRE
-CLASS="programlisting"
->&#13;        z-axis  .
-      yaw-axis /|\
-                |     __. y-axis
-   ._        ___|      /| pitch-axis
-  _||\       \\ |\.   /
-  \|| \_______\_|__\_/_______
-   | _ _   o o o o o o o    |\_  ______\ x-axis
-   // ./_______,----,__________)       / roll-axis
-  /_,/        //  ./
-             /__,/ 
-	</PRE
-><P
-></P
-></DIV
-></P
-><P
->&#13;	The right-hand-rule, often introduced in beginning physics
-	courses, is used to define the direction of positive rotation
-	about any axis. As an example of how to use the right hand rule,
-	consider a positive rotation about the roll axis. To help
-	visualize how such a rotation would move the airplane, place your
-	right thumb parallel to the plane's roll-axis such that the thumb
-	points in the positive x-direction, then curl the four fingers
-	into a fist. Your fingers will be pointing in the direction that
-	the plane will spin.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN823"
-></A
-><PRE
-CLASS="programlisting"
->&#13;    .-.--.--.--.              __
-   / /  /  /  _ \            /  \
-  (-(- (- (- (   | _________|______\ axis of
-   \.\._\._\._)  |          |      / rotation
-    |           \:__,---.  \|/
-    |                    |  + positive
-     \           .,_.___.'    rotation
-      \_ ^ `.__,/ 
-      |      / 
-      |      | 
-	</PRE
-><P
-></P
-></DIV
-></P
-><P
->&#13;	Many of the parameters that control a vehicle's behavior are
-	of the form: VEHICLE_BEHAVIOR_TIMESCALE. A behavior's
-	"timescale" can usually be understood as the time for
-	the behavior to push, twist, or otherwise affect the vehicle such
-	that the difference between what it is doing, and what it is
-	supposed to be doing, has been reduced to 1/e of what it was,
-	where "e" is the natural exponent (approximately
-	2.718281828). In other words, it is the timescale for exponential
-	decay toward full compliance to the desired behavior. When you
-	want the vehicle to be very responsive use a short timescale of
-	one second or less, and if you want to disable a behavior then set
-	the timescale to a very large number like 300 (5 minutes) or
-	more. Note, for stability reasons, there is usually a limit to how
-	small a timescale is allowed to be, and is usually on the order of
-	a tenth of a second. Setting a timescale to zero is safe and is
-	always equivalent to setting it to its minimum. Any feature with a
-	timescale can be effectively disabled by setting the timescale so
-	large that it would take them all day to have any
-	effect.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN826"
->11.4. Setting the Vehicle Type</A
-></H2
-><P
->Before any vehicle parameters can be set the vehicle
-	behavior must first be enabled. It is enabled by calling <A
-HREF="#AEN4249"
->llSetVehicleType</A
-> with any
-	VEHICLE_TYPE_*, except VEHICLE_TYPE_NONE which will disable the
-	vehicle. See the <A
-HREF="#AEN6288"
->vehicle type
-	constants</A
-> section for currently available types. More types
-	will be available soon.</P
-><P
->Setting the vehicle type is necessary for enabling the
-    vehicle behavior and sets all of the parameters to its default
-    values. For each vehicle type listed we provide the corresponding
-    equivalent code in long format. Is is
-    <SPAN
-CLASS="emphasis"
-><I
-CLASS="emphasis"
->important</I
-></SPAN
-> to realize that the defaults are
-    <SPAN
-CLASS="emphasis"
-><I
-CLASS="emphasis"
->not</I
-></SPAN
-> the optimal settings for any of these
-    vehicle types and that they will definitely be changed in the
-    future. Do not rely on these values to be constant until
-    specified.</P
-><P
->Should you want to make a unique or experimental vehicle you
-	will still have to enable the vehicle behavior with one of the
-	default types first, after which you will be able to change any of
-	the parameters or flags within the allowed ranges.</P
-><P
->Setting the vehicle type does not automatically take
-	controls or otherwise move the object. However should you enable
-	the vehicle behavior while the object is free to move and parked
-	on a hill then it may start to slide away.</P
-><P
->We're looking for new and better default vehicle types. If
-    you think you've found a set of parameters that make a better car,
-    boat, or any other default type of vehicle then you may submit
-    your proposed list of settings to Andrew Linden via a script or
-    notecard.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN837"
->11.5. Linear and Angular Deflection</A
-></H2
-><P
->A common feature of real vehicles is their tendency to move
-	along "preferred axes of motion". That is, due to
-	their wheels, wings, shape, or method of propulsion they tend to
-	push or redirect themselves along axes that are static in the 
-	vehicle's local frame.  This general feature defines a
-	class of vehicles and included in this category a common 
-	dart is a "vehicle": it
-	has fins in the back such that if it were to tumble in the air it
-	would eventually align itself to move point-forward -- we'll call
-	this alignment effect <SPAN
-CLASS="emphasis"
-><I
-CLASS="emphasis"
->angular 
-	deflection</I
-></SPAN
->.</P
-><P
->A wheeled craft exhibits a 
-	different effect: when a
-	skateboard is pushed in some direction it will tend to redirect
-	the resultant motion along that which it is free to roll -- we'll
-	call this effect <SPAN
-CLASS="emphasis"
-><I
-CLASS="emphasis"
->&#13;	linear deflection</I
-></SPAN
->.</P
-><P
->So a typical Second Life vehicle is an object that
-	exhibits linear and/or angular deflection along the
-	"preferential axes of motion".  The default
-	preferential axes of motion are the local x- (at), y- (left), and
-	z- (up) axes of the <SPAN
-CLASS="emphasis"
-><I
-CLASS="emphasis"
->local frame</I
-></SPAN
-> of the
-	vehicle's root primitive.  The deflection behaviors relate to the
-	x-axis (at): linear deflection will tend to rotate its velocity
-	until it points along it's positive local x-axis while the
-	angular deflection will tend to reorient the vehicle such that
-	it's x-axis points in the direction that it is moving.  The other
-	axes are relevant to vehicle behaviors that are described later,
-	such as the 
-	<A
-HREF="#AEN938"
->vertical attractor</A
-> 
-	which tries to keep a vehicle's
-	local z-axis pointed toward the world z-axis (up).  The vehicle
-	axes can be rotated relative to the object's actual local axes by
-	using the 
-	<A
-HREF="#AEN990"
->VEHICLE_REFERENCE_FRAME</A
-> 
-	parameter, however that is an
-	advanced feature and is covered in detail in a later section of
-	these documents.</P
-><P
->Depending on the vehicle it might be desirable to have lots
-	of linear and/or angular deflection or not.  The speed of the
-	deflections are controlled by setting the relevant parameters
-	using the <A
-HREF="#AEN4235"
->llSetVehicleFloatParam</A
->
-	script call.  Each variety of deflection has a
-	"timescale" parameter that determines how quickly a
-	full deflection happens.  Basically the timescale it the time
-	coefficient for exponential decay toward full deflection.  So, a
-	vehicle that deflects quickly should have a small timescale.  For
-	instance, a typical dart might have a angular deflection
-	timescale of a couple of seconds but a linear deflection of
-	several seconds; it will tend to reorient itself before it
-	changes direction.  To set the deflection timescales of a dart
-	you might use the lines below:</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN850"
-></A
-><PRE
-CLASS="programlisting"
->&#13;llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 2.0);
-llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 6.0);
-	</PRE
-><P
-></P
-></DIV
-></P
-><P
-> Each variety of deflection has an "efficiency"
-	parameter that is a slider between 0.0 and 1.0.  Unlike the other
-	efficiency parameters of other vehicle behaviors, the deflection
-	efficiencies do not slide between "bouncy" and
-	"damped", but instead slide from "no deflection
-	whatsoever" (0.0) to "maximum deflection" (1.0).
-	That is, they behave much like the deflection timescales, however
-	they are normalized to the range between 0.0 and 1.0.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN853"
->11.6. Moving and Steering the Vehicle</A
-></H2
-><P
->Once enabled, a vehicle can be pushed and rotated by
-	external forces and/or from script calls such as 
-	<A
-HREF="#AEN1070"
->llApplyImpulse</A
->, 
-	however linear and angular motors have been built in 
-	to make motion smoother and easier to control.
-	Their directions can be set using the 
-	<A
-HREF="#AEN4274"
->llSetVehicleVectorParam</A
->
-	call. For example, to make the vehicle try to move at 5
-	meters/second along its local x-axis (the default look-at
-	direction) you would put the following line in your script:</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN859"
-></A
-><PRE
-CLASS="programlisting"
->&#13;llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, &#60;5, 0, 0&#62;);
-	</PRE
-><P
-></P
-></DIV
-></P
-><P
->The motor strength is not the full story, since you can also
-	control how fast the motor engages (VEHICLE_LINEAR_MOTOR_TIMESCALE) 
-	and there is a parameter that causes the motor's effectiveness to 
-	decay over time (VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE).</P
-><P
->Steering the vehicle involves setting the 
-	VEHICLE_ANGULAR_MOTOR_DIRECTION and related parameters.
-	It is also possible to set some flags that allow the angular
-	motor slave to your camera view when in mouselook.</P
-><P
->For more details about the vehicle motors
-	read the sections on the <A
-HREF="#AEN866"
->linear
-	</A
-> and <A
-HREF="#AEN898"
->angular</A
-> 
-	motors below.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN866"
->11.7. The Linear Motor</A
-></H2
-><P
->The parameters that control the linear motor are:</P
-><P
-><P
-></P
-><UL
-><LI
-STYLE="list-style-type: opencircle"
-><P
->&#13;	VEHICLE_LINEAR_MOTOR_DIRECTION</P
-><P
->A vector. 
-		It is the velocity (meters/sec) that the vehicle will 
-		try to attain. It points in the vehicle's local frame, and has a 
-		maximum length of 40.</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->&#13;	VEHICLE_LINEAR_MOTOR_OFFSET</P
-><P
->A vector. 
-		It is the offset point from the vehicle's center of mass at which 
-		the linear motor's impulse is applied. This allows the linear motor
-		to also cause rotational torque. It is in the vehicle's local
-		frame and its maximum length is 100 meters!  No need to worry
-		about stability -- if the vehicle starts to spin too fast
-		(greater than about 4*PI radians per second) then angular
-		velocity damping will kick in.  The reason the offset is allowed
-		to be so large is so that it can compete with the other vehicle
-		behaviors such as <A
-HREF="#vehicle_angular_deflection"
->angular deflection</A
->
-		and the <A
-HREF="#AEN938"
->vertical
-		attractor</A
->.  Some of the other vehicle behaviors may
-		drastically reduce the effective torque from the linear motor
-		offset, in which case a longer leverage arm may help.</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->&#13;	VEHICLE_LINEAR_MOTOR_TIMESCALE</P
-><P
->A float. Determines how long it takes for the motor to 
-		push the vehicle to full speed.  Its minimum value is approximately
-		0.06 seconds.</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->&#13;	VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE</P
-><P
->A float. The effectiveness of the motor will exponentially
-		decay over this timescale, but the effectiveness will be reset 
-		whenever the motor's value is explicitly set. The maximum value 
-		of this decay timescale is 120 seconds,
-		and this timescale is always in effect.</P
-></LI
-></UL
-></P
-><P
->The flags that affect the linear motor are:</P
-><P
-><P
-></P
-><UL
-><LI
-STYLE="list-style-type: opencircle"
-><P
->VEHICLE_FLAG_LIMIT_MOTOR_UP</P
-><P
->Useful for "ground vehicles". 
-	Setting this flag will clamp the z-component of the linear
-	motor (in world frame) to prevent it from defeating gravity.</P
-></LI
-></UL
-></P
-><P
->Setting the motor speed is not enough to enable all
-	interesting vehicles. For example, some will want a car that
-	immediately gets up to the speed they want, while others will want
-	a boat that slowly climbs up to its maximum velocity. To control
-	this effect the VEHICLE_LINEAR_MOTOR_TIMESCALE parameter can be 
-	used. Basically the "timescale" of a motor is the
-	time constant for the vehicle to exponentially accelerate toward
-	its full speed.</P
-><P
->What would happen if you were to accidentally set the
-	vehicle's linear velocity to maximum possible speed and then let
-	go? It would run away and never stop, right? Not necessarily: an
-	automatic "motor decay" has been built in such that all
-	motors will gradually decrease their effectiveness after being
-	set.</P
-><P
->Each time the linear motor's vector is set its 
-	"grip"
-	immediately starts to decay exponentially with a timescale
-	determined by the VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, such
-	that after enough time the motor ceases to have any effect.
-	This decay timescale serves two purposes.  First, since it
-	<SPAN
-CLASS="emphasis"
-><I
-CLASS="emphasis"
->cannot</I
-></SPAN
-> be set longer than 120 seconds, 
-	and is <SPAN
-CLASS="emphasis"
-><I
-CLASS="emphasis"
->always</I
-></SPAN
-> enabled it
-	guarantees that a vehicle will not push itself about forever 
-	in the absence
-	of active control (from keyboard commands or some logic loop in
-	the script).  Second, it can be used to push some vehicles around
-	using a simple impulse model.  That is, rather than setting the
-	motor "on" or "off" depending on whether
-	a particular key is pressed "down" or "up"
-	the decay timescale can be set short and the motor can be set 
-	"on" whenever the key transitions from "up"
-	to "down" and allowed to automatically decay.</P
-><P
-> Since the motor's effectiveness is reset whenever the
-	motor's vector is set, then setting it to a vector of length zero
-	is different from allowing it to decay completely. The first case
-	will cause the vehicle to try to reach zero velocity, while the
-	second will leave the motor impotent.</P
-><P
->The two motor timescales have very similar names, but have
-	different effects, so try not to get them confused.
-	VEHICLE_LINEAR_MOTOR_TIMESCALE is the time for motor to
-	"win", and VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE is the
-	time for the motor's "effectiveness" to decay toward
-	zero. If you set one when you think you are changing the other
-	you will have frustrating results. Also, if the motor's decay
-	timescale is shorter than the regular timescale, then the
-	effective magnitude of the motor vector will be
-	diminished.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN898"
->11.8. The Angular Motor</A
-></H2
-><P
->The parameters that control the angular motor are:</P
-><P
-><P
-></P
-><UL
-><LI
-STYLE="list-style-type: opencircle"
-><P
->&#13;	VEHICLE_ANGULAR_MOTOR_DIRECTION</P
-><P
->A vector. It is the angular velocity (radians/sec) 
-		that the vehicle will try to rotate. It points in the vehicle's 
-		local frame, and has a maximum value of 4*PI (two revolutions
-		per second).</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->&#13;	VEHICLE_ANGULAR_MOTOR_TIMESCALE</P
-><P
->A float. Determines how long it takes for the motor to 
-		spin the vehicle to full speed.  Its minimum value is approximately
-		0.06 seconds.</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->&#13;	VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE</P
-><P
->A float. The effectiveness of the motor will exponentially
-		decay over this timescale, but the effectiveness will be reset 
-		whenever the motor's value is explicitly set. The maximum value 
-		of this decay timescale is 120 seconds,
-		and this timescale is always in effect.</P
-></LI
-></UL
-></P
-><P
->Like the linear motor the angular motor can be set explicitly,
-	and has magnitude/direction, a timescale, and a decay timescale.  </P
-><P
->When it comes to actually steering a vehicle there are 
-	several ways to do it.  One way would be for the script to grab
-	keyboard input and to explicitly turn the motor on/off based on 
-	which keys are pressed.  When steering this way you probably 
-	don't want it to turn very far or for very long. One way to do
-	it using the angular motor would be to leave the decay timescale
-	long, enable a significant amount of angular friction (to
-	quickly slow the vehicle down when the motor is turned off) then
-	set the angular motor to a large vector on a key press, and set
-	it to zero when the key is released.  That has the effect of
-	making the vehicle unresponsive to external collisions, due to
-	the angular friction.</P
-><P
->Another way to do it is to set the
-	VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE to a short value and push
-	the vehicle about with a more impulsive method that sets the
-	motor fast on a key press down (and optionally setting the motor
-	to zero on a key up) relying on the automatic exponential decay
-	of the motor's effectiveness rather than a constant angular 
-	friction.</P
-><P
->Finally, it may be possible to discard the angular motor
-	entirely and use the VEHICLE_LINEAR_MOTOR_OFFSET. Whenever the 
-	offset has a component that is perpendicular to the direction
-	of the linear motor the vehicle will rotate as it travels. 
-	Note, with the incorrect values for offset and strength the 
-	linear motor effect can easily cause the vehicle to tumble 
-	and spin uncontrollably, so experiement with small offsets 
-	first!.</P
-><P
->Setting the angular motor to zero magnitude is different
-	from allowing it to decay.  When the motor completely decays 
-	it no longer affects the motion of the vehicle, however setting
-	it to zero will reset the "grip" of the vehicle and
-	will make the vehicle try to achieve zero angular velocity.
-	</P
-><P
->Many real vehicles bank (roll about their
-	forward axis) to effect a turn, such as motorcycles and airplanes. 
-	To make it easier to build banking vehicles there is 
-	<A
-HREF="#AEN949"
->banking behavior</A
-> 
-	available which can be controlled by setting other parameters and is
-	described in more detail here.</P
-><P
->It is also possible to make a 
-	<A
-HREF="#AEN921"
->vehicle turn in response 
-	to changing the camera view</A
-> 
-	(right now this only works in mouselook).</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN921"
->11.9. Using the Camera to Steer</A
-></H2
-><P
->The vehicle can be instructed to rotate its forward axis
-	to point in the same direction as the camera view. This
-	is achieved by setting some flags that change how the 
-	VEHICLE_ANGULAR_MOTOR_DIRECTION is interpreted. When used properly
-	this feature has the advantage of being able to provide simple
-	and stable steering that is resilient to bad render frame rates
-	on the client.  </P
-><P
->The flags that affect the angular motor are:</P
-><P
-><P
-></P
-><UL
-><LI
-STYLE="list-style-type: opencircle"
-><P
->&#13;	VEHICLE_FLAG_MOUSELOOK_STEER</P
-><P
->Steer the vehicle using the mouse.  Use this flag to make 
-	the angular motor try to make the vehicle
-	turn such that its local x-axis points in the same direction as 
-	the client-side camera.</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->&#13;	VEHICLE_FLAG_MOUSELOOK_BANK</P
-><P
->Same as above, but relies on banking.  It remaps left-right 
-	motions of the client camera (also known as "yaw") to rotations about 
-	the vehicle's local x-axis (also known as "roll").  </P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->&#13;	VEHICLE_FLAG_CAMERA_DECOUPLED</P
-><P
->Makes mouselook camera rotate independently of the vehicle.
-	By default the client mouselook camera will rotate about
-	with the vehicle, however when this flag is set the camera
-	direction is independent of the vehicle's rotation.</P
-></LI
-></UL
-></P
-><P
->When using the VEHICLE_FLAG_MOUSELOOK_STEER (or 
-	VEHICLE_FLAG_MOUSELOOK_BANK) the meaning of the 
-	VEHICLE_ANGULAR_MOTOR_DIRECTION parameter subtly changes.  Instead
-	of representing the "angular velocity" of the motor
-	the components of the parameter scale the "measured angular
-	velocity" (as determined by the rotation between 
-	the client's camera view direction and the forward-axis of the vehicle)
-	to compute the "final angular velocity".  That is,
-	suppose you set the angular motor to &#60;0, 0, 5&#62;, then moved the
-	camera view to be PI/4 radians to the left of the vehicle's forward axis,
-	and down PI/8 toward the ground.
-	The measured angular velocity would be &#60;0, -PI/8, PI/4&#62; 
-	radians/second, but the final velocity would be &#60;0, 0, 5*PI/4&#62;...
-	the vehicle will turn left, but will not dip its nose down.
-	Thus, by setting a component of the VEHICLE_ANGULAR_MOTOR_DIRECTION 
-	to zero, one can negate the pitch or yaw response of the motor, 
-	or even scale one to be much more responsive than the other.
-	</P
-><P
->The VEHICLE_ANGULAR_MOTOR_TIMESCALE still has an effect when
-	using mouselook control, and scales the global responsiveness of the
-	angular motor.  The VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, on the other
-	hand, is ignored when using mouselook controls.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN938"
->11.10. The Vertical Attractor</A
-></H2
-><P
->Some vehicles, like boats, should always keep their up-side
-	up. This can be done by enabling the "vertical
-	attractor" behavior that springs the vehicle's local z-axis
-	to the world z-axis (a.k.a. "up"). To take advantage of
-	this feature you would set the VEHICLE_VERTICAL_ATTRACTION_TIMESCALE
-	to control the period of the spring frequency, and then set the
-	VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY to control the damping. An
-	efficiency of 0.0 will cause the spring to wobble around its
-	equilibrium, while an efficiency of 1.0 will cause the spring to
-	reach it's equilibrium with exponential decay.</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN942"
-></A
-><PRE
-CLASS="programlisting"
->&#13;llSetVehicleVectorParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 4.0);
-llSetVehicleVectorParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.5);
-	</PRE
-><P
-></P
-></DIV
-></P
-><P
->The vertical attractor is disabled by setting its timescale
-	to anything larger than 300 seconds.</P
-><P
->Note that by default the vertical attractor will prevent the
-	vehicle from diving and climbing. So, if you wanted to make a
-	airplane you would probably want to unlock the attractor around the
-	pitch axis by setting the VEHICLE_FLAG_LIMIT_ROLL_ONLY bit:</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN947"
-></A
-><PRE
-CLASS="programlisting"
->&#13;llSetVehicleFlags(VEHICLE_FLAG_LIMIT_ROLL_ONLY);
-	</PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN949"
->11.11. Banking</A
-></H2
-><P
->The <A
-HREF="#AEN938"
->&#13;	vertical attractor</A
-> feature must be enabled in order for
-	the banking behavior to function. The way banking works is this: a
-	rotation around the vehicle's roll-axis will produce a angular
-	velocity around the yaw-axis, causing the vehicle to turn. The
-	magnitude of the yaw effect will be proportional to the
-	VEHICLE_BANKING_EFFICIENCY, the angle of the roll rotation, and
-	sometimes the vehicle's velocity along it's preferred axis of
-	motion.</P
-><P
->The VEHICLE_BANKING_EFFICIENCY can vary between -1 and +1. When
-	it's positive then any positive rotation (by the right-hand rule)
-	about the roll-axis will effect a (negative) torque around the
-	yaw-axis, making it turn to the right -- that is the vehicle will
-	lean into the turn, which is how real airplanes and motorcycle's
-	work. Negating the banking coefficient will make it so that the
-	vehicle leans to the outside of the turn (not very
-	"physical" but might allow interesting vehicles so why
-	not?).</P
-><P
->The VEHICLE_BANKING_MIX is a fake (i.e. non-physical)
-	parameter that is useful for making banking vehicles do what you
-	want rather than what the laws of physics allow. For example,
-	consider a real motorcycle... it must be moving forward in order
-	for it to turn while banking, however video-game motorcycles are
-	often configured to turn in place when at a dead stop -- because
-	they're often easier to control that way using the limited
-	interface of the keyboard or game controller. The
-	VEHICLE_BANKING_MIX enables combinations of both realistic and
-	non-realistic banking by functioning as a slider between a banking
-	that is correspondingly totally static (0.0) and totally dynamic
-	(1.0). By "static" we mean that the banking effect
-	depends only on the vehicle's rotation about it's roll-axis
-	compared to "dynamic" where the banking is also
-	proportional to it's velocity along it's roll-axis. Finding the
-	best value of the "mixture" will probably require trial
-	and error.</P
-><P
->The time it takes for the 
-	banking behavior to defeat a
-	pre-existing angular velocity about the world z-axis is determined
-	by the VEHICLE_BANKING_TIMESCALE. So if you want the vehicle to
-	bank quickly then give it a banking timescale of about a second or
-	less, otherwise you can make a sluggish vehicle by giving it a
-	timescale of several seconds.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN956"
->11.12. Friction Timescales</A
-></H2
-><P
->&#13;	VEHICLE_LINEAR_FRICTION_TIMESCALE is a vector parameter that
-	defines the timescales for the vehicle to come to a complete stop
-	along the three local axes of the 
-	<A
-HREF="#AEN990"
->vehicle's reference frame</A
->.
-	The timescale along each axis is independent of the others.
-	For example, a sliding ground car would probably have very little
-	friction along its x- and z-axes (so it can easily slide forward
-	and fall down) while there would usually significant friction
-	along its y-axis:</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN961"
-></A
-><PRE
-CLASS="programlisting"
->&#13;llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, &#60;1000, 1000, 3&#62;);
-	</PRE
-><P
-></P
-></DIV
-></P
-><P
->Remember that a longer timescale corresponds to a weaker
-	friction, hence to effectively disable all linear friction you
-	would set all of the timescales to large values.</P
-><P
->Setting the linear friction as a scalar is allowed, and has
-	the effect of setting all of the timescales to the same
-	value. Both code snippets below are equivalent, and both make friction
-	negligible:</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN966"
-></A
-><PRE
-CLASS="programlisting"
->&#13;// set all linear friction timescales to 1000
-llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, &#60;1000, 1000, 1000&#62;);
-	</PRE
-><P
-></P
-></DIV
-></P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN969"
-></A
-><PRE
-CLASS="programlisting"
->&#13;// same as above, but fewer characters
-llSetVehicleFloatParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, 1000);
-	</PRE
-><P
-></P
-></DIV
-></P
-><P
->&#13;	VEHICLE_ANGULAR_FRICTION_TIMESCALE is also a vector
-	parameter that defines the timescales for the vehicle to stop
-	rotating about the x-, y-, and z-axes, and are set and disabled in
-	the same way as the linear friction.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN972"
->11.13. Buoyancy</A
-></H2
-><P
->The vehicle has a built-in buoyancy feature that is 
-	independent of the <A
-HREF="#AEN3773"
->llSetBuoyancy</A
-> call.  It
-	is recommended that the two buoyancies do not mix!  To make
-	a vehicle buoyant, set the VEHICLE_BUOYANCY parameter to something
-	between -1.0 (extra gravity) to 1.0 (full anti-gravity).
-	</P
-><P
->The buoyancy behavior is independent of hover, however
-	in order for hover to work without a large offset of the 
-	VEHICLE_HOVER_HEIGHT, the VEHICLE_BUOYANCY should be set to 1.0.
-	</P
-><P
->It is not recommended that you mix vehicle buoyancy with
-	the <A
-HREF="#AEN3773"
->llSetBuoyancy</A
-> script call.
-	It would probably cause the object to fly up into space.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN979"
->11.14. Hover</A
-></H2
-><P
->The hover behavior is enabled by setting the 
-	VEHICLE_HOVER_TIMESCALE to a value less than 300 seconds; larger
-	timescales totally disable it.  Most vehicles will work 
-	best with short hover timescales of a few seconds or less.
-	The shorter the timescale, the faster the vehicle will 
-	slave to is target height.  Note, that if the values of
-	VEHICLE_LINEAR_FRICTION_TIMESCALE may affect the speed of
-	the hover.</P
-><P
->Hover is independent of buoyancy, however the 
-	VEHICLE_BUOYANCY should be set to 1.0, otherwise the vehicle
-	will not lift itself off of the ground until the 
-	VEHICLE_HOVER_HEIGHT is made large enough to counter the
-	acceleration of gravity, and the vehicle will never float
-	all the way to its target height.  </P
-><P
->The VEHICLE_HOVER_EFFICIENCY can be thought of as a slider
-	between bouncy (0.0) and smoothed (1.0).  When in the
-	bouncy range the vehicle will tend to hover a little lower than 
-	its target height and the VEHICLE_HOVER_TIMESCALE will be
-	approximately the oscillation period of the bounce (the real
-	period will tend to be a little longer than the timescale).</P
-><P
->For performance reasons, until improvements are made to the
-	Second Life physics engine the vehicles can only hover over the
-	terrain and water, so they will not be able to hover above
-	objects made out of primitives, such as bridges and houses. By
-	default the hover behavior will float over terrain and water,
-	however this can be changed by setting some flags: </P
-><P
->If you wanted to make a boat you should set the 
-	<A
-HREF="#const_vehicle_flag_hover_water_only"
->&#13;	VEHICLE_HOVER_WATER_ONLY </A
-> flag, or if you wanted to drive a hover
-	tank under water you would use the 
-	<A
-HREF="#const_vehicle_flag_hover_terrain_only"
->&#13;	VEHICLE_HOVER_TERRAIN_ONLY </A
-> flag instead.  
-	Finally, if you wanted to make a submarine or a balloon you would use the 
-	<A
-HREF="#const_vehicle_flag_hover_global_height"
->&#13;	VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT</A
->.  Note that
-	the flags are independent of each other and that setting two 
-	contradictory flags will have undefined behavior.  The flags are 
-	set using the script call llSetVehicleFlags().</P
-><P
->The VEHICLE_HOVER_HEIGHT determines 
-	how high the vehicle
-	will hover over the terrain and/or water, or the global height, 
-	and has a maximum value of 100 meters.  Note that for hovering
-	purposes the "center" of the vehicle is its "center of mass"
-	which is not always obvious to the untrained eye, and it 
-	changes when avatar's sit on the vehicle.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN990"
->11.15. Reference Frame</A
-></H2
-><P
->The vehicle relies on the x- (at), y- (left), and z- (up)
-	axes in order to figure out which way it prefers to move and
-	which end is up.  By default these axes are identical to the
-	local axes of the root primitive of the object, however this
-	means that the vehicle's root primitive must, by default, be
-	oriented to agree with the designed at, left, and up axes of the
-	vehicle.  But, what if the vehicle object was already pre-built
-	with the root primitive in some non-trivial orientation
-	relative to where the vehicle as a whole should move?  This is
-	where the VEHICLE_REFERENCE_FRAME parameter becomes useful; the
-	vehicle's axes can be arbitrarily reoriented by setting this
-	parameter.  </P
-><P
->As an example, suppose you had built a rocket out of a big
-	cylinder, a cone for the nose, and some stretched cut boxes for
-	the fins, then linked them all together with the cylinder as the
-	root primitive.  Ideally the rocket would move nose-first,
-	however the cylinder's axis of symmetry is its local z-axis while
-	the default "at-axis" of the vehicle, the axis it will
-	want to deflect to forward under angular deflection, is the local
-	x-axis and points out from the curved surface of the cylinder.
-	The script code below will rotate the vehicle's axes such that
-	the local z-axis becomes the "at-axis" and the local
-	negative x-axis becomes the "up-axis":</P
-><P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN995"
-></A
-><PRE
-CLASS="programlisting"
->&#13;// rotate the vehicle frame -PI/2 about the local y-axis (left-axis)
-rotation rot = llEuler2Rot(0, PI/2, 0);
-llSetVehicleRotationParam(VEHICLE_REFERENCE_FRAME, rot);
-</PRE
-><P
-></P
-></DIV
-></P
-><P
->Another example of how the reference frame parameter could
-	be used is to consider flying craft that uses the vertical
-	attractor for stability during flying but wants to use VTOL
-	(vertical takeoff and landing).  During flight the craft's dorsal
-	axis should point up, but during landing its nose-axis should be
-	up.  To land the vehicle: while the 
-	<A
-HREF="#AEN938"
->vertical attractor</A
-> 
-	is in effect, rotate the existing VEHICLE_REFERENCE_FRAME by +PI/2
-	about the left-axis, then the vehicle will pitch up such that
-	it's nose points toward the sky.  The vehicle could be allowed to
-	fall to the landing pad under friction, or a decreasing hover
-	effect.  </P
-></DIV
-></DIV
-><DIV
-CLASS="appendix"
-><HR><H1
-><A
-NAME="AEN999"
-></A
->Appendix A. Linden Library Functions</H1
-><P
->Complete listing of the Linden Library function calls
-  available in lsl.</P
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1002"
->A.1. llAbs</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1004"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llAbs</CODE
->(integer val);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the absolute value of
-    <CODE
-CLASS="parameter"
->val</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1012"
->A.2. llAcos</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1014"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llAcos</CODE
->(float val);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the arccosine in radians of
-    <CODE
-CLASS="parameter"
->val</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1022"
->A.3. llAddToLandPassList</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1024"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llAddToLandPassList</CODE
->(key avatar, float hours);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Add <CODE
-CLASS="parameter"
->avatar</CODE
-> to the land pass list for 
-    <CODE
-CLASS="parameter"
->hours</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1035"
->A.4. llAdjustSoundVolume</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1037"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llAdjustSoundVolume</CODE
->(float volume);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Adjusts the volume of the currently playing attached sound
-    started with <A
-HREF="#AEN3184"
->llPlaySound</A
-> or
-    <A
-HREF="#AEN2773"
->llLoopSound</A
->. This function
-    Has no effect on sounds started with <A
-HREF="#AEN4756"
->llTriggerSound</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1047"
->A.5. llAllowInventoryDrop</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1049"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llAllowInventoryDrop</CODE
->(integer add);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If <CODE
-CLASS="parameter"
->add</CODE
-> == TRUE, users that do no have
-    object modify permissions can still drop inventory items onto
-    object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1057"
->A.6. llAngleBetween</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1059"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llAngleBetween</CODE
->(rotation a, rotation b);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the angle in radians between rotations
-    <CODE
-CLASS="parameter"
->a</CODE
-> and <CODE
-CLASS="parameter"
->b</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1070"
->A.7. llApplyImpulse</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1072"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llApplyImpulse</CODE
->(vector force, integer local);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Applies the <CODE
-CLASS="parameter"
->impulse</CODE
-> in local
-    coordinates if <CODE
-CLASS="parameter"
->local</CODE
-> == TRUE. Otherwise the
-    impulse is applied in global coordinates. This function only works
-    on physical objects.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1083"
->A.8. llApplyRotationalImpulse</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1085"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llApplyRotationalImpulse</CODE
->(vector force, integer local);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Applies a rotational <CODE
-CLASS="parameter"
->impulse</CODE
-> force in
-    local coordinates if <CODE
-CLASS="parameter"
->local</CODE
-> ==
-    TRUE. Otherwise the impulse is applied in global coordinates. This
-    function only works on physical objects.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1096"
->A.9. llAsin</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1098"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llAsin</CODE
->(float val);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the arcsine in radians of
-    <CODE
-CLASS="parameter"
->val</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1106"
->A.10. llAtan2</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1108"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llAtan2</CODE
->(float y, float x);</CODE
-></P
-><P
-></P
-></DIV
-><P
->returns the arctangent2 of <CODE
-CLASS="parameter"
->y</CODE
->,
-    <CODE
-CLASS="parameter"
->x</CODE
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1119"
->A.11. llAttachToAvatar</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1121"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llAttachToAvatar</CODE
->(key avatar, integer attachment);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Attach to <CODE
-CLASS="parameter"
->avatar</CODE
-> at point <A
-HREF="#AEN5448"
-><CODE
-CLASS="parameter"
->attachment</CODE
-></A
->.
-    Requires the <A
-HREF="#const_permission_attach"
->PERMISSION_ATTACH</A
-> runtime
-    permission.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1134"
->A.12. llAvatarOnSitTarget</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1136"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llAvatarOnSitTarget</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If an avatar is sitting on the sit target, return
-    the avatar's key, <A
-HREF="#AEN6070"
->NULL_KEY</A
-> otherwise.
-    This only will detect avatars sitting on sit targets defined with <A
-HREF="#AEN4312"
->llSitTarget</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1144"
->A.13. llAxes2Rot</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1146"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->rotation llAxes2Rot</CODE
->(vector fwd, vector left, vector up);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the rotation represented by coordinate axes
-    <CODE
-CLASS="parameter"
->fwd</CODE
->, <CODE
-CLASS="parameter"
->left</CODE
->, and
-    <CODE
-CLASS="parameter"
->up</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1160"
->A.14. llAxisAngle2Rot</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1162"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->rotation llAxisAngle2Rot</CODE
->(vector axis, float angle);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the rotation generated <CODE
-CLASS="parameter"
->angle</CODE
->
-    about <CODE
-CLASS="parameter"
->axis</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1173"
->A.15. llBase64ToString</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1175"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llBase64ToString</CODE
->(string str);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Converts a Base 64 string to a conventional string. If the
-  conversion creates any unprintable characters, they are converted to
-  spaces.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1182"
->A.16. llBreakAllLinks</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1184"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llBreakAllLinks</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Delinks all objects in the link set. Requires the permission
-    <A
-HREF="#const_permission_change_links"
->PERMISSION_CHANGE_LINKS</A
->
-    be set.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1191"
->A.17. llBreakLink</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1193"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llBreakLink</CODE
->(integer linknum);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Delinks the object with the given
-    <CODE
-CLASS="parameter"
->link</CODE
-> number. Requires permission <A
-HREF="#const_permission_change_links"
->PERMISSION_CHANGE_LINKS</A
->
-    be set.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1202"
->A.18. llCSV2List</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1204"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->list llCSV2List</CODE
->(string src);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Create a list from a string of comma separated values
-    specified in <CODE
-CLASS="parameter"
->src</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1212"
->A.19. llCeil</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1214"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llCeil</CODE
->(float val);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns largest integer value &#62;=
-    <CODE
-CLASS="parameter"
->val</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1222"
->A.20. llCloseRemoteDataChannel</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1224"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llCloseRemoteDataChannel</CODE
->(key channel);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Closes XML-RPC channel.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1231"
->A.21. llCloud</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1233"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llCloud</CODE
->(vector offset);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the cloud density at the object position +
-    <CODE
-CLASS="parameter"
->offset</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1241"
->A.22. llCollisionFilter</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1243"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llCollisionFilter</CODE
->(string name, key id, integer accept);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If <CODE
-CLASS="parameter"
->accept</CODE
-> == TRUE, only accept
-    collisions with objects <CODE
-CLASS="parameter"
->name</CODE
-> and
-    <CODE
-CLASS="parameter"
->id</CODE
->, otherwise with objects not
-    <CODE
-CLASS="parameter"
->name</CODE
-> or <CODE
-CLASS="parameter"
->id</CODE
->. Specify
-    an empty string or <A
-HREF="#AEN6070"
->NULL_KEY</A
-> to
-    not filter on the corresponding parameter.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1260"
->A.23. llCollisionSound</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1262"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llCollisionSound</CODE
->(string impact_sound, float impact_volume);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Suppress default collision sounds, replace default impact
-    sounds with <CODE
-CLASS="parameter"
->impact_sound</CODE
-> found in the
-    object inventory. Supply an empty string to suppress collision
-    sounds.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1272"
->A.24. llCollisionSprite</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1274"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llCollisionSprite</CODE
->(string impact_sprite);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Suppress default collision sprites, replace default impact
-    sprite with <CODE
-CLASS="parameter"
->impact_sprite</CODE
-> found in the
-    object inventory. Supply an empty string to just suppress.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1282"
->A.25. llCos</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1284"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llCos</CODE
->(float theta);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the cosine of <CODE
-CLASS="parameter"
->theta</CODE
->
-    radians.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1292"
->A.26. llCreateLink</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1294"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llCreateLink</CODE
->(key target, integer parent);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Attempt to link object script is attached to and
-    <CODE
-CLASS="parameter"
->target</CODE
->. Requires permission <A
-HREF="#const_permission_change_links"
->PERMISSION_CHANGE_LINKS</A
->
-    be set. If <CODE
-CLASS="parameter"
->parent</CODE
-> == TRUE, object script is
-    attached to is the root.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1306"
->A.27. llDeleteSubList</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1308"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->list llDeleteSubList</CODE
->(list src, integer start, integer end);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Remove the slice from the list and return the remainder.
-    The <CODE
-CLASS="parameter"
->start</CODE
-> and <CODE
-CLASS="parameter"
->end</CODE
->
-    are inclusive, so 0, length - 1 would delete the entire list and
-    0,0 would delete the first list entry. Using negative numbers for
-    <CODE
-CLASS="parameter"
->start</CODE
-> and/or <CODE
-CLASS="parameter"
->end</CODE
->
-    causes the index to count backwards from the length of the list,
-    so 0,-1 would delete the entire list. If
-    <CODE
-CLASS="parameter"
->start</CODE
-> is larger than
-    <CODE
-CLASS="parameter"
->end</CODE
-> the list deleted is the exclusion of the
-    entries, so 6,4 would delete the entire list except for the
-    5<SUP
->th</SUP
-> list entry.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1326"
->A.28. llDeleteSubString</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1328"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llDeleteSubString</CODE
->(string src, integer start, integer end);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Removes the indicated substring and returns the result. The
-    <CODE
-CLASS="parameter"
->start</CODE
-> and <CODE
-CLASS="parameter"
->end</CODE
-> are
-    inclusive, so 0,length-1 would delete the entire string and 0,0
-    would delete the first character. Using negative numbers for
-    <CODE
-CLASS="parameter"
->start</CODE
-> and/or <CODE
-CLASS="parameter"
->end</CODE
->
-    causes the index to count backwards from the length of the string,
-    so 0,-1 would delete the entire string. If
-    <CODE
-CLASS="parameter"
->start</CODE
-> is larger than end the sub string is
-    the exclusion of the entries, so 6,4 would delete the entire
-    string except for the 5<SUP
->th</SUP
->
-    character.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1345"
->A.29. llDetachFromAvatar</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1347"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llDetachFromAvatar</CODE
->(key avatar);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Drop off of <CODE
-CLASS="parameter"
->avatar</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="lib_lldetected"
->A.30. llDetectedGrab</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1357"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llDetectedGrab</CODE
->(integer number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the grab offset of detected object
-    <CODE
-CLASS="parameter"
->number</CODE
->. Returns &#60;0,0,0&#62; if number is
-    not valid sensed object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1365"
->A.31. llDetectedGroup</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1367"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llDetectedGroup</CODE
->(integer number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns TRUE if detected object
-    <CODE
-CLASS="parameter"
->number</CODE
-> is part of same group as
-    owner.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1375"
->A.32. llDetectedKey</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1377"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llDetectedKey</CODE
->(integer number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the key of detected object
-    <CODE
-CLASS="parameter"
->number</CODE
->. Returns <A
-HREF="#AEN6070"
->NULL_KEY</A
-> if number is not valid sensed
-    object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1386"
->A.33. llDetectedLinkNumber</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1388"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llDetectedLinkNumber</CODE
->(integer number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the link position of the triggered event for
-    touches. 0 for a non-linked object, 1 for the root of a linked
-    object, 2 for the first child, etc.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1395"
->A.34. llDetectedName</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1397"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llDetectedName</CODE
->(integer number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the name of detected object
-    <CODE
-CLASS="parameter"
->number</CODE
->. Returns empty string if
-    <CODE
-CLASS="parameter"
->number</CODE
-> is not valid sensed object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1406"
->A.35. llDetectedOwner</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1408"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llDetectedOwner</CODE
->(integer number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the key of detected <CODE
-CLASS="parameter"
->number</CODE
->
-    object's owner. Returns invalid key if
-    <CODE
-CLASS="parameter"
->number</CODE
-> is not valid sensed object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1417"
->A.36. llDetectedPos</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1419"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llDetectedPos</CODE
->(integer number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the position of detected object
-    <CODE
-CLASS="parameter"
->number</CODE
->. Returns &#60;0,0,0&#62; if
-    <CODE
-CLASS="parameter"
->number</CODE
-> is not valid sensed object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1428"
->A.37. llDetectedRot</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1430"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->rotation llDetectedRot</CODE
->(integer number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the rotation of detected object
-    <CODE
-CLASS="parameter"
->number</CODE
->. Returns &#60;0,0,0,1&#62; if
-    <CODE
-CLASS="parameter"
->number</CODE
-> is not valid sensed object).</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1439"
->A.38. llDetectedType</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1441"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llDetectedType</CODE
->(integer number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the type (AGENT, ACTIVE, PASSIVE, SCRIPTED) of
-    detected object <CODE
-CLASS="parameter"
->number</CODE
->. Returns 0 if
-    <CODE
-CLASS="parameter"
->number</CODE
-> is not valid sensed object. Note
-    that <CODE
-CLASS="parameter"
->number</CODE
-> is a bitfield, so comparisons
-    need to be a bitwise and check. eg:
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN1451"
-></A
-><PRE
-CLASS="programlisting"
->&#13;integer type = llDetectedType(0);
-if (type &#38; AGENT)
-{
-  // ...do stuff with the agent
-}
-</PRE
-><P
-></P
-></DIV
->
-    </P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1453"
->A.39. llDetectedVel</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1455"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llDetectedVel</CODE
->(integer number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the velocity of detected object
-    <CODE
-CLASS="parameter"
->number</CODE
->. Returns &#60;0,0,0&#62; if
-    <CODE
-CLASS="parameter"
->number</CODE
-> is not valid sensed object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1464"
->A.40. llDialog</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1466"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llDialog</CODE
->(key avatar, string message, list buttons, integer channel);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Opens a "notify box" in the top-right corner of the given avatar's screen displaying the message. Up to twelve buttons can be specified in a list of strings. When the player clicks a button, the name of the button is chatted on the specified channel. Channels work just like llSay(), so channel 0 can be heard by everyone. The chat originates at the object's position, not the avatar's position. e.g.
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN1479"
-></A
-><PRE
-CLASS="programlisting"
->&#13;LLDialog(who, "Are you a boy or a girl?", [ "Boy", "Girl" ], 4913);
-LLDialog(who, "This shows only an OK button.", [], 192);
-llDialog(who, "This chats so you can hear it.", ["Hooray"], 0);
-</PRE
-><P
-></P
-></DIV
->
-    </P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1481"
->A.41. llDie</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1483"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llDie</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Delete the object which holds the script.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1489"
->A.42. llDumpList2String</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1491"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llDumpList2String</CODE
->(list src, string separator);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Write the list out in a single string using separator between values.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1500"
->A.43. llEscapeURL</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1502"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llEscapeURL</CODE
->(string url);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the string that is the URL escaped version of <CODE
-CLASS="parameter"
->url</CODE
->,
-    replacing spaces with %20 etc.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1510"
->A.44. llEdgeOfWorld</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1512"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llEdgeOfWorld</CODE
->(vector pos, vector dir);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns TRUE if the line along <CODE
-CLASS="parameter"
->dir</CODE
->
-    from <CODE
-CLASS="parameter"
->pos</CODE
-> hits the edge of the world in the
-    current simulator and returns FALSE if that edge crosses into
-    another simulator.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1523"
->A.45. llEjectFromLand</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1525"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llEjectFromLand</CODE
->(key pest);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Ejects <CODE
-CLASS="parameter"
->pest</CODE
-> from land that you
-    own.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1533"
->A.46. llEmail</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1535"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llEmail</CODE
->(string address, string subject, string message);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sends email to <CODE
-CLASS="parameter"
->address</CODE
-> with
-    <CODE
-CLASS="parameter"
->subject</CODE
-> and
-    <CODE
-CLASS="parameter"
->message</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1549"
->A.47. llEuler2Rot</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1551"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->rotation llEuler2Rot</CODE
->(vector vec);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the rotation represented by Euler Angle
-    <CODE
-CLASS="parameter"
->vec</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1559"
->A.48. llFabs</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1561"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llFabs</CODE
->(float val);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the absolute value of
-    <CODE
-CLASS="parameter"
->val</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1569"
->A.49. llFloor</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1571"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llFloor</CODE
->(float val);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns largest integer value &#60;=
-    <CODE
-CLASS="parameter"
->val</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1579"
->A.50. llFrand</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1581"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llFrand</CODE
->(float mag);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns a pseudo-random number between [0,
-    <CODE
-CLASS="parameter"
->mag</CODE
->).</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1589"
->A.51. llGetAccel</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1591"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetAccel</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Gets the acceleration.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1597"
->A.52. llGetAttached</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1599"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llGetAttached</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the object attachment point or 0 if not attached.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1605"
->A.53. llGetAgentInfo</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1607"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llGetAgentInfo</CODE
->(key id);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns information about the given agent
-    <CODE
-CLASS="parameter"
->id</CODE
->. Returns a bitfield of <A
-HREF="#AEN5767"
->agent info constants</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1616"
->A.54. llGetAgentSize</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1618"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetAgentSize</CODE
->(key id);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If the agent <CODE
-CLASS="parameter"
->id</CODE
-> is in the same sim as
-    the object, returns the size of the avatar.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1626"
->A.55. llGetAlpha</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1628"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llGetAlpha</CODE
->(integer face);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the alpha of the given
-    <CODE
-CLASS="parameter"
->face</CODE
->. If <CODE
-CLASS="parameter"
->face</CODE
-> is
-    <A
-HREF="#AEN6073"
->ALL_SIDES</A
-> the value returned is
-    the mean average of all faces.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1638"
->A.56. llGetAndResetTime</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1640"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llGetAndResetTime</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the seconds of elapsed time from an internal timer
-    associated with the script. The timer is reset to zero during the
-    call. The timer is also reset on rez, simulator restart, script
-    reset, and in calls to <A
-HREF="#AEN3426"
->llResetTime</A
->. Use <A
-HREF="#AEN4188"
->llSetTimerEvent</A
-> if you want a
-    reliable timing mechanism.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1648"
->A.57. llGetAnimation</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1650"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llGetAnimation</CODE
->(key id);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the currently playing animation for avatar
-    <CODE
-CLASS="parameter"
->id</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1658"
->A.58. llGetAnimationList</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1660"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->list llGetAnimationList</CODE
->(key id);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns a list of currently playing animations for avatar
-    <CODE
-CLASS="parameter"
->id</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1668"
->A.59. llGetBoundingBox</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1670"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->list llGetBoundingBox</CODE
->(key object);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the bounding box around <CODE
-CLASS="parameter"
->object</CODE
-> (including any linked prims)
-	relative to the root prim.  Returned value is a list of the form:
-	[ (vector) min_corner, (vector) max_corner ]</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1678"
->A.60. llGetCenterOfMass</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1680"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetCenterOfMass</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the center of mass of the root object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1686"
->A.61. llGetColor</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1688"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetColor</CODE
->(integer face);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the color of <CODE
-CLASS="parameter"
->face</CODE
-> as a vector
-    of red, green, and blue values between 0 and 1. If
-    <CODE
-CLASS="parameter"
->face</CODE
-> is <A
-HREF="#AEN6073"
->ALL_SIDES</A
-> the color returned is the
-    mean average of each channel.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1698"
->A.62. llGetCreator</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1700"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llGetCreator</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the creator of the object which has the script.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1706"
->A.63. llGetDate</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1708"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llGetDate</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the current UTC date as YYYY-MM-DD.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1714"
->A.64. llGetEnergy</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1716"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llGetEnergy</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns how much energy is in the object as a percentage of
-    maximum.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1722"
->A.65. llGetForce</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1724"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetForce</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the current force if the script is physical.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1730"
->A.66. llGetFreeMemory</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1732"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llGetFreeMemory</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the available heap space for the current script.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1738"
->A.67. llGetGeometricCenter</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1740"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetGeometricCenter</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the geometric center of the linked set the script is attached to.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1746"
->A.68. llGetGMTclock</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1748"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llGetGMTclock</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the time in seconds since GMT midnight.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1754"
->A.69. llGetInventoryCreator</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1756"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llGetInventoryCreator</CODE
->(string name);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the key for the creator of the inventory
-    <CODE
-CLASS="parameter"
->name</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1764"
->A.70. llGetInventoryKey</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1766"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llGetInventoryKey</CODE
->(string name);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the key of the inventory
-    <CODE
-CLASS="parameter"
->name</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1774"
->A.71. llGetInventoryName</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1776"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llGetInventoryName</CODE
->(integer type, integer number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Get the name of the inventory item
-    <CODE
-CLASS="parameter"
->number</CODE
-> of <CODE
-CLASS="parameter"
->type</CODE
->. Use
-    the <A
-HREF="#AEN5411"
->inventory constants</A
-> to
-    specify the <CODE
-CLASS="parameter"
->type</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1789"
->A.72. llGetInventoryNumber</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1791"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llGetInventoryNumber</CODE
->(integer type);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Get the number of items of <CODE
-CLASS="parameter"
->type</CODE
-> in
-    the object inventory. Use the <A
-HREF="#AEN5411"
->inventory constants</A
-> to specify
-    the <CODE
-CLASS="parameter"
->type</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1801"
->A.73. llGetInventoryPermMask</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1803"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llGetInventoryPermMask</CODE
->(string item, integer mask);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the requested permission <CODE
-CLASS="parameter"
->mask</CODE
-> for the 
-	specified inventory item.  See <A
-HREF="#AEN6412"
->Permission Mask Constants</A
->
-	for more information.  Example usage:
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN1814"
-></A
-><PRE
-CLASS="programlisting"
->&#13;integer JeansPerms = llGetInventoryPermMask("Black Jeans", MASK_NEXT);
-if (JeansPerms &#38; PERM_COPY)
-{
-	llSay(0, "The next owner may copy the 'Black Jeans'");
-}
-</PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1816"
->A.74. llGetInventoryType</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1818"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llGetInventoryType</CODE
->(string name);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the type of the inventory
-    <CODE
-CLASS="parameter"
->name</CODE
->.  INVENTORY_NONE is returned if no
-	inventory matching <CODE
-CLASS="parameter"
->name</CODE
-> is found.  Use the <A
-HREF="#AEN5411"
->inventory constants</A
-> to compare
-    against the return value.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1828"
->A.75. llGetKey</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1830"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llGetKey</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Get the key for the object which has this script.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1836"
->A.76. llGetLandOwnerAt</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1838"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llGetLandOwnerAt</CODE
->(vector pos);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the key of the land owner at
-    <CODE
-CLASS="parameter"
->pos</CODE
-> or <A
-HREF="#AEN6070"
->NULL_KEY</A
-> if public.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1847"
->A.77. llGetLinkKey</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1849"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llGetLinkKey</CODE
->(integer linknum);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the key of <CODE
-CLASS="parameter"
->linknum</CODE
-> in the link
-    set.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1857"
->A.78. llGetLinkName</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1859"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llGetLinkName</CODE
->(integer linknum);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the name of <CODE
-CLASS="parameter"
->linknum</CODE
-> in the
-    link set.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1867"
->A.79. llGetLinkNumber</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1869"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llGetLinkNumber</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns what link number in a link set the for the object
-    which has this script. 0 means no link, 1 the root, 2 for first
-    child, etc.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1875"
->A.80. llGetListEntryType</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1877"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llGetListEntryType</CODE
->(list src, integer index);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the <A
-HREF="#AEN5733"
->type</A
-> of the
-    variable at <CODE
-CLASS="parameter"
->index</CODE
-> in
-    <CODE
-CLASS="parameter"
->src</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1889"
->A.81. llGetListLength</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1891"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llGetListLength</CODE
->(list src);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the number of elements in
-    <CODE
-CLASS="parameter"
->src</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1899"
->A.82. llGetLocalPos</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1901"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetLocalPos</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the local position of a child object relative to the
-    root.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1907"
->A.83. llGetLocalRot</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1909"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->rotation llGetLocalRot</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the local rotation of a child object relative to the
-    root.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1915"
->A.84. llGetMass</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1917"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llGetMass</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the mass of the object in Kilograms. Most materials
-    in Second Life are less dense than their first life counterparts,
-    so the returned mass may be less than you might expect.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1923"
->A.85. llGetObjectMass</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1925"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llGetObjectMass</CODE
->(key id);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the mass of the object specified by <CODE
-CLASS="parameter"
->id</CODE
-> in Kilograms. Most materials
-    in Second Life are less dense than their first life counterparts,
-    so the returned mass may be less than you might expect.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1933"
->A.86. llGetNextEmail</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1935"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llGetNextEmail</CODE
->(string address, string subject);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Get the next waiting email with appropriate
-    <CODE
-CLASS="parameter"
->address</CODE
-> and/or
-    <CODE
-CLASS="parameter"
->subject</CODE
->. If the parameters are blank, they
-    are not used for filtering.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1946"
->A.87. llGetNotecardLine</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1948"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llGetNotecardLine</CODE
->(string name, integer line);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This function fetches line number
-    <CODE
-CLASS="parameter"
->line</CODE
-> of notecard
-    <CODE
-CLASS="parameter"
->name</CODE
-> and returns the data through the <A
-HREF="#AEN4997"
->dataserver</A
-> event. The line count
-    starts at zero. If the requested line is past the end of the
-    notecard the <A
-HREF="#AEN4997"
->dataserver</A
->
-    event will return the constant <A
-HREF="#AEN6076"
->EOF</A
-> string. The key returned by
-    this function is a unique identifier which will be supplied to the
-    <A
-HREF="#AEN4997"
->dataserver</A
-> event in the
-    <CODE
-CLASS="parameter"
->requested</CODE
-> parameter.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1964"
->A.88. llGetNumberOfNotecardLines</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1966"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llGetNumberOfNotecardLines</CODE
->(string name);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This function reads the number of lines in notecard <CODE
-CLASS="parameter"
->name</CODE
->
-	and returns this information through the <A
-HREF="#AEN4997"
->dataserver</A
-> event.  
-	The key returned by this function is a unique identifier which will be supplied to the
-	<A
-HREF="#AEN4997"
->dataserver</A
-> event in the <CODE
-CLASS="parameter"
->requested</CODE
-> 
-	parameter.  You will need to cast the returned string to an integer.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1977"
->A.89. llGetNumberOfPrims</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1979"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llGetNumberOfPrims</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the number of prims in the linked set the script is attached to.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1985"
->A.90. llGetNumberOfSides</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1987"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llGetNumberOfSides</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the number of sides of the current which has the
-    script.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN1993"
->A.91. llGetObjectDesc</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN1995"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llGetObjectDesc</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the description of the object which has the script.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2001"
->A.92. llGetObjectName</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2003"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llGetObjectName</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the name of the object which has the script.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2009"
->A.93. llGetObjectPermMask</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2011"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llGetObjectPermMask</CODE
->(integer mask);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the requested permission <CODE
-CLASS="parameter"
->mask</CODE
-> for the root object the
-	task is attached to.  See <A
-HREF="#AEN6412"
->Permission Mask Constants</A
->
-	for more information.  Example usage:
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN2020"
-></A
-><PRE
-CLASS="programlisting"
->&#13;integer ObjectPerms = llGetObjectPermMask(MASK_NEXT);
-if (ObjectPerms &#38; PERM_COPY)
-{
-	llSay(0, "The next owner may copy this item");
-}
-</PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2022"
->A.94. llGetOmega</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2024"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetOmega</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the omega.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2030"
->A.95. llGetOwner</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2032"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llGetOwner</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the owner of the object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2038"
->A.96. llGetOwnerKey</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2040"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llGetOwnerKey</CODE
->(key id);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the owner of object
-    <CODE
-CLASS="parameter"
->id</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2048"
->A.97. llGetPermissions</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2050"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llGetPermissions</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns what permissions have been enabled. eg:
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN2056"
-></A
-><PRE
-CLASS="programlisting"
->&#13;integer perm = llGetPermissions();
-if((perm &#38; PERMISSION_DEBIT) == PERMISSION_DEBIT)
-{
-    // code goes here
-}
-</PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2058"
->A.98. llGetPermissionsKey</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2060"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llGetPermissionsKey</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns avatar that has enabled permissions. Returns <A
-HREF="#AEN6070"
->NULL_KEY</A
-> if not enabled.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2067"
->A.99. llGetPos</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2069"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetPos</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the position.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2075"
->A.100. llGetPrimitiveParams</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2077"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->list llGetPrimitiveParams</CODE
->(list parameters);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Get primitive parameters specified in <CODE
-CLASS="parameter"
->parameters</CODE
->. The
-	    <CODE
-CLASS="parameter"
->parameters</CODE
-> are identical to the rules of <A
-HREF="#AEN4020"
->llSetPrimitiveParams</A
->, and the returned list is ordered as such.  Most requested parameters do not require a value to be associated, except for texture-related requests (PRIM_TEXTURE, PRIM_COLOR, and PRIM_BUMP_SHINY) which require a side number to be specified as well.  
-  
-    Valid parameters can be found in the <A
-HREF="#AEN6323"
->Primitive Constants</A
->.
-    Here is a simple example:
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN2088"
-></A
-><PRE
-CLASS="programlisting"
->&#13;llGetPrimitiveParams([PRIM_TYPE, PRIM_MATERIAL, PRIM_COLOR, ALL_SIDES, PRIM_POSITION]);
-</PRE
-><P
-></P
-></DIV
->
-    This would return a list similar to this:
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN2090"
-></A
-><PRE
-CLASS="programlisting"
->&#13;    [PRIM_TYPE_BOX, PRIM_HOLE_DEFAULT, &#60;0, 1, 0&#62;, 0.0, &#60;0, 0, 0&#62;, &#60;1, 1, 0&#62;, &#60;0, 0, 0&#62;, // PRIM_TYPE
-     PRIM_MATERIAL_WOOD, 	// PRIM_MATERIAL
-     0, &#60;1, 1, 1&#62;, 1.0, 	// PRIM_COLOR (ALL_SIDES specified, so all 6 sides returned)
-     1, &#60;1, 0, 0&#62;, 0.5,
-     2, &#60;0, 0, 1&#62;, 1.0,
-     3, &#60;0, 1, 0&#62;, 1.0,
-     4, &#60;0, 0, 0&#62;, 0.5,
-     5, &#60;1, 1, 1&#62;, 1.0,
-     &#60;37.341, 195.283, 31.239&#62;]	// PRIM_POSITION
-</PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2092"
->A.101. llGetRegionCorner</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2094"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llGetRegionCorner</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns a vector with the south west corner position of the
-      current region.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2100"
->A.102. llGetRegionFPS</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2102"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llGetRegionFPS</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the mean region frames per second.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2108"
->A.103. llGetRegionName</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2110"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llGetRegionName</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the current region name.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2116"
->A.104. llGetRegionTimeDilation</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2118"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llGetRegionTimeDilation</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the current time dilation as a float between 0 and 1.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2124"
->A.105. llGetRootPosition</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2126"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetRootPosition</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the global position of the root object of the object the script is attached to.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2132"
->A.106. llGetRootRotation</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2134"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->rotation llGetRootRotation</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the global rotation of the root object of the object the script is attached to.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2140"
->A.107. llGetRot</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2142"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->rotation llGetRot</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the rotation.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2148"
->A.108. llGetScale</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2150"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetScale</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the scale.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2156"
->A.109. llGetScriptName</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2158"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llGetScriptName</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the name of this script.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2164"
->A.110. llGetStartParameter</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2166"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llGetStartParameter</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the start parameter passed to <A
-HREF="#AEN3461"
->llRezObject</A
-> or <A
-HREF="#AEN3434"
->llRezAtRoot</A
->. If the object was
-    created from agent inventory, this function returns 0.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2174"
->A.111. llGetScriptState</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2176"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llGetScriptState</CODE
->(string name);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Resets TRUE if script <CODE
-CLASS="parameter"
->name</CODE
-> is running</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2184"
->A.112. llGetStatus</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2186"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llGetStatus</CODE
->(integer status);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the value of <CODE
-CLASS="parameter"
->status</CODE
->. The
-    value will be one of the <A
-HREF="#AEN5304"
->status
-    constants</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2195"
->A.113. llGetSubString</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2197"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llGetSubString</CODE
->(string src, integer start, integer end);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the indicated substring from
-    <CODE
-CLASS="parameter"
->src</CODE
->. The <CODE
-CLASS="parameter"
->start</CODE
-> and
-    <CODE
-CLASS="parameter"
->end</CODE
-> are inclusive, so 0,length-1 would
-    capture the entire string and 0,0 would capture the first
-    character. Using negative numbers for <CODE
-CLASS="parameter"
->start</CODE
->
-    and/or <CODE
-CLASS="parameter"
->end</CODE
-> causes the index to count
-    backwards from the length of the string, so 0,-1 would capture the
-    entire string. If start is larger than end the sub string is the
-    exclusion of the entries, so 6,4 would give the entire string
-    except for the 5<SUP
->th</SUP
-> character.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2214"
->A.114. llGetSunDirection</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2216"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetSunDirection</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the sun direction on the simulator.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2222"
->A.115. llGetTexture</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2224"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llGetTexture</CODE
->(integer face);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the texture of <CODE
-CLASS="parameter"
->face</CODE
-> if it is
-    found in object inventory.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2232"
->A.116. llGetTextureOffset</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2234"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetTextureOffset</CODE
->(integer side);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the texture offset of <CODE
-CLASS="parameter"
->side</CODE
-> in
-    the x and y components of a vector.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2242"
->A.117. llGetTextureRot</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2244"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llGetTextureRot</CODE
->(integer side);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the texture rotation of
-    <CODE
-CLASS="parameter"
->side</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2252"
->A.118. llGetTextureScale</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2254"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetTextureScale</CODE
->(integer side);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the texture scale of <CODE
-CLASS="parameter"
->side</CODE
-> in
-    the x and y components of a vector.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2262"
->A.119. llGetTime</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2264"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llGetTime</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the seconds of elapsed time from an internal timer
-    associated with the script. The timer is reset on rez, simulator
-    restart, script reset, and in calls to <A
-HREF="#AEN1638"
->llGetAndResetTime</A
-> or <A
-HREF="#AEN3426"
->llResetTime</A
->. Use <A
-HREF="#AEN4188"
->llSetTimerEvent</A
-> if you want a
-    reliable timing mechanism.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2273"
->A.120. llGetTimeOfDay</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2275"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llGetTimeOfDay</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Gets the time in seconds since midnight in Second Life.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2281"
->A.121. llGetTimestamp</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2283"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llGetTimestamp</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns a timestamp in the format: YYYY-MM-DDThh:mm:ss.ff..fZ.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2289"
->A.122. llGetTorque</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2291"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetTorque</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the torque if the script is physical.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2297"
->A.123. llGetVel</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2299"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGetVel</CODE
->();</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the velocity.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2306"
->A.124. llGetWallclock</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2308"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llGetWallclock</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the time in seconds since simulator timezone
-    midnight. Currently this is PST.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2314"
->A.125. llGiveInventory</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2316"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llGiveInventory</CODE
->(key destination, string inventory);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Give the named inventory item to the keyed avatar or object
-    in the same simulator as the giver. If the recipient is an avatar,
-    the avatar then follows the normal procedure of accepting or
-    denying the offer. If the recipient is an object, the same
-    permissions apply as if you were dragging inventory onto the
-    object by hand, ie if <A
-HREF="#AEN1047"
->llAllowInventoryDrop</A
-> has
-    been called with TRUE, any other object can pass objects to its
-    inventory.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2326"
->A.126. llGiveInventoryList</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2328"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llGiveInventoryList</CODE
->(key destination, string category, list  inventory);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Give the list of named inventory items to the keyed avatar
-    or object in the same simulator as the giver. If the recipient is
-    an avatar, the avatar then follows the normal procedure of
-    accepting or denying the offer. The offered inventory is then
-    placed in a folder named <CODE
-CLASS="parameter"
->category</CODE
-> in the
-    recipients inventory. If the recipient is an object, the same
-    permissions apply as if you were dragging inventory onto the
-    object by hand, ie if <A
-HREF="#AEN1047"
->llAllowInventoryDrop</A
-> has
-    been called with TRUE, any other object can pass objects to its
-    inventory.If the recipient is an object, the
-    <CODE
-CLASS="parameter"
->category</CODE
-> parameter is ignored.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2342"
->A.127. llGiveMoney</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2344"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llGiveMoney</CODE
->(key destination, integer amount);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Transfer <CODE
-CLASS="parameter"
->amount</CODE
-> from the script owner
-    to <CODE
-CLASS="parameter"
->destination</CODE
->. This call will fail if
-    <A
-HREF="#AEN5360"
->PERMISSION_DEBIT</A
-> has not
-    been set.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2356"
->A.128. llGround</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2358"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llGround</CODE
->(vector offset);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the ground height at the object position +
-    <CODE
-CLASS="parameter"
->offset</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2366"
->A.129. llGroundContour</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2368"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGroundContour</CODE
->(vector offset);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the ground contour at the object position +
-    <CODE
-CLASS="parameter"
->offset</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2376"
->A.130. llGroundNormal</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2378"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGroundNormal</CODE
->(vector offset);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the ground contour at the object position +
-    <CODE
-CLASS="parameter"
->offset</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2386"
->A.131. llGroundRepel</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2388"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llGroundRepel</CODE
->(float height, integer water, float tau);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Critically damps to <CODE
-CLASS="parameter"
->height</CODE
-> if within
-    <CODE
-CLASS="parameter"
->height</CODE
-> * 0.5 of
-    <CODE
-CLASS="parameter"
->level</CODE
->. The <CODE
-CLASS="parameter"
->height</CODE
->
-    is above ground level if <CODE
-CLASS="parameter"
->water</CODE
-> is FALSE or
-    above the higher of land and water if <CODE
-CLASS="parameter"
->water</CODE
->
-    is TRUE.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2405"
->A.132. llGroundSlope</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2407"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llGroundSlope</CODE
->(vector offset);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the ground slope at the object position +
-    <CODE
-CLASS="parameter"
->offset</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2415"
->A.133. llInsertString</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2417"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llInsertString</CODE
->(string dst, integer position, string src);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Inserts <CODE
-CLASS="parameter"
->src</CODE
-> into
-    <CODE
-CLASS="parameter"
->dst</CODE
-> at <CODE
-CLASS="parameter"
->position</CODE
-> and
-    returns the result.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2431"
->A.134. llInstantMessage</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2433"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llInstantMessage</CODE
->(key user, string message);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Send <CODE
-CLASS="parameter"
->message</CODE
-> to the
-    <CODE
-CLASS="parameter"
->user</CODE
-> as an instant message.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2444"
->A.135. llKey2Name</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2446"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llKey2Name</CODE
->(key id);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If object <CODE
-CLASS="parameter"
->id</CODE
-> is in the same
-    simulator, return the name of the object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2454"
->A.136. llList2CSV</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2456"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llList2CSV</CODE
->(list src);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Create a string of comma separated values from
-    <CODE
-CLASS="parameter"
->list</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2464"
->A.137. llList2Float</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2466"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llList2Float</CODE
->(list src, integer index);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the float at <CODE
-CLASS="parameter"
->index</CODE
-> in the
-    list <CODE
-CLASS="parameter"
->src</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2477"
->A.138. llList2Integer</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2479"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llList2Integer</CODE
->(list src, integer index);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the integer at <CODE
-CLASS="parameter"
->index</CODE
-> in the list
-    <CODE
-CLASS="parameter"
->src</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2490"
->A.139. llList2Key</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2492"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llList2Key</CODE
->(list src, integer index);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the key at <CODE
-CLASS="parameter"
->index</CODE
-> in the list
-    <CODE
-CLASS="parameter"
->src</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2503"
->A.140. llList2List</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2505"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->list llList2List</CODE
->(list src, integer start, integer end);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the slice of the list from
-    <CODE
-CLASS="parameter"
->start</CODE
-> to <CODE
-CLASS="parameter"
->end</CODE
-> from
-    the list <CODE
-CLASS="parameter"
->src</CODE
-> as a new list. The
-    <CODE
-CLASS="parameter"
->start</CODE
-> and <CODE
-CLASS="parameter"
->end</CODE
->
-    parameters are inclusive, so 0,length-1 would copy the entire list
-    and 0,0 would capture the first list entry. Using negative numbers
-    for <CODE
-CLASS="parameter"
->start</CODE
-> and/or <CODE
-CLASS="parameter"
->end</CODE
->
-    causes the index to count backwards from the length of the list,
-    so 0,-1 would capture the entire list. If
-    <CODE
-CLASS="parameter"
->start</CODE
-> is larger than
-    <CODE
-CLASS="parameter"
->end</CODE
-> the list returned is the exclusion of
-    the entries, so 6,4 would give the entire list except for the
-    5<SUP
->th</SUP
-> entry.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2526"
->A.141. llList2ListStrided</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2528"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->list llList2ListStrided</CODE
->(list src, integer start, integer end, integer stride);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Copy the strided slice of <CODE
-CLASS="parameter"
->src</CODE
-> from
-    <CODE
-CLASS="parameter"
->start</CODE
-> to <CODE
-CLASS="parameter"
->end</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2544"
->A.142. llList2Rot</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2546"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->rotation llList2Rot</CODE
->(list src, integer index);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the rotation at <CODE
-CLASS="parameter"
->index</CODE
-> in
-    <CODE
-CLASS="parameter"
->src</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2557"
->A.143. llList2String</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2559"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llList2String</CODE
->(list src, integer index);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the string at <CODE
-CLASS="parameter"
->index</CODE
-> in
-    <CODE
-CLASS="parameter"
->src</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2570"
->A.144. llList2Vector</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2572"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llList2Vector</CODE
->(list src, integer index);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the string at <CODE
-CLASS="parameter"
->index</CODE
-> in
-    <CODE
-CLASS="parameter"
->src</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2583"
->A.145. llListFindList</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2585"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llListFindList</CODE
->(list src, list  test);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the position of the first instance of
-    <CODE
-CLASS="parameter"
->test</CODE
-> in <CODE
-CLASS="parameter"
->src</CODE
->. Returns
-    -1 if <CODE
-CLASS="parameter"
->test</CODE
-> is not in
-    <CODE
-CLASS="parameter"
->src</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2598"
->A.146. llListInsertList</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2600"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->list llListInsertList</CODE
->(list dest, list src, integer pos);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the list created by inserting
-    <CODE
-CLASS="parameter"
->src</CODE
-> into <CODE
-CLASS="parameter"
->dest</CODE
-> at
-    <CODE
-CLASS="parameter"
->pos</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2614"
->A.147. llListRandomize</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2616"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->list llListRandomize</CODE
->(list src, integer stride);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns <CODE
-CLASS="parameter"
->src</CODE
-> randomized into blocks of
-    size <CODE
-CLASS="parameter"
->stride</CODE
->. If the length of
-    <CODE
-CLASS="parameter"
->src</CODE
-> divided by
-    <CODE
-CLASS="parameter"
->stride</CODE
-> is non-zero, this function does
-    not randomize the list.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2629"
->A.148. llListReplaceList</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2631"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->list llListReplaceList</CODE
->(list dest, list src, integer start, integer end);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the list created by replacing the segment of <CODE
-CLASS="parameter"
->dest</CODE
-> from 
-    <CODE
-CLASS="parameter"
->start</CODE
-> to <CODE
-CLASS="parameter"
->end</CODE
-> with <CODE
-CLASS="parameter"
->src</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2648"
->A.149. llListSort</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2650"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->list llListSort</CODE
->(list src, integer stride, integer ascending);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns <CODE
-CLASS="parameter"
->src</CODE
-> sorted into blocks of
-    <CODE
-CLASS="parameter"
->stride</CODE
-> in ascending order if
-    <CODE
-CLASS="parameter"
->ascending</CODE
-> is <A
-HREF="#AEN5295"
->TRUE</A
->. Note that sort only works in
-    the head of each sort block is the same type.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2665"
->A.150. llListen</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2667"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llListen</CODE
->(integer channel, string name, key id, string msg);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets a listen event callback for <CODE
-CLASS="parameter"
->msg</CODE
->
-    on <CODE
-CLASS="parameter"
->channel</CODE
-> from <CODE
-CLASS="parameter"
->name</CODE
->
-    and returns an identifier that can be used to deactivate or remove
-    the listen. The <CODE
-CLASS="parameter"
->name</CODE
->,
-    <CODE
-CLASS="parameter"
->id</CODE
-> and/or <CODE
-CLASS="parameter"
->msg</CODE
->
-    parameters can be blank to indicate not to filter on that
-    argument. Channel 0 is the public chat channel that all avatars
-    see as chat text. Channels 1 to 2,147,483,648 are hidden channels
-    that are not sent to avatars.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2686"
->A.151. llListenControl</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2688"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llListenControl</CODE
->(integer number, integer active);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Make a listen event callback active or inactive. Pass in the
-    value returned from <A
-HREF="#AEN2665"
->llListen</A
->
-    to the <CODE
-CLASS="parameter"
->number</CODE
-> parameter to specify which
-    event you are controlling. Use <A
-HREF="#AEN5295"
->boolean</A
-> values to specify
-    <CODE
-CLASS="parameter"
->active</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2701"
->A.152. llListenRemove</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2703"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llListenRemove</CODE
->(integer number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Removes a listen event callback. Pass in the value returned
-    from <A
-HREF="#AEN2665"
->llListen</A
-> to the
-    <CODE
-CLASS="parameter"
->number</CODE
-> parameter to specify which event you
-    are removing.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2712"
->A.153. llLoadURL</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2714"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llLoadURL</CODE
->(key avatar_id, string message, string url);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Displays a dialog to user <CODE
-CLASS="parameter"
->avatar_id</CODE
->
-	with <CODE
-CLASS="parameter"
->message</CODE
-> offering to
-	go to the web page at <CODE
-CLASS="parameter"
->url</CODE
->.  If the user clicks the
-	"Go to page" button, their default web browser is launched and
-	directed to <CODE
-CLASS="parameter"
->url</CODE
->.</P
-><P
->The <CODE
-CLASS="parameter"
->url</CODE
-> must begin with "http:" or 
-	"https:", other protocols are not currently supported.  
-	The dialog box shows the name of the object's
-	owner so that abuse (e.g. spamming) can be easily reported.
-	This function has a 10 second implicit sleep.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2731"
->A.154. llLog</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2733"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llLog</CODE
->(float val);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the natural logarithm (base e) of
-    <CODE
-CLASS="parameter"
->val</CODE
-> if <CODE
-CLASS="parameter"
->val</CODE
-> &#62; 0,
-    otherwise returns 0.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2742"
->A.155. llLog10</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2744"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llLog10</CODE
->(float val);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the base 10 log of <CODE
-CLASS="parameter"
->val</CODE
-> if
-    <CODE
-CLASS="parameter"
->val</CODE
-> &#62; 0, otherwise returns 0.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2753"
->A.156. llLookAt</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2755"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llLookAt</CODE
->(vector target, float strength, float damping);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Cause object to point the forward axis toward
-    <CODE
-CLASS="parameter"
->target</CODE
->. Good
-    <CODE
-CLASS="parameter"
->strength</CODE
-> values are around half the mass of
-    the object and good <CODE
-CLASS="parameter"
->damping</CODE
-> values are less
-    than 1/10<SUP
->th</SUP
-> of the
-    <CODE
-CLASS="parameter"
->strength</CODE
->. Asymmetrical shapes require
-    smaller <CODE
-CLASS="parameter"
->damping</CODE
->. A
-    <CODE
-CLASS="parameter"
->strength</CODE
-> of 0.0 cancels the look at.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2773"
->A.157. llLoopSound</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2775"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llLoopSound</CODE
->(string sound, float volume);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Similar to <A
-HREF="#AEN3184"
->llPlaySound</A
->, this function plays
-    a sound attached to an object, but will continuously loop that
-    sound until <A
-HREF="#AEN4620"
->llStopSound</A
-> or
-    <A
-HREF="#AEN3184"
->llPlaySound</A
-> is called. Only
-    one sound may be attached to an object at a time. A second call to
-    llLoopSound with the same key will not restart the sound, but the
-    new volume will be used. This allows control over the volume of
-    already playing sounds. Setting the <CODE
-CLASS="parameter"
->volume</CODE
->
-    to 0 is not the same as calling <A
-HREF="#AEN4620"
->llStopSound</A
->; a sound with 0
-    volume will continue to loop. To restart the sound from the
-    beginning, call <A
-HREF="#AEN4620"
->llStopSound</A
->
-    before calling llLoopSound again.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2790"
->A.158. llLoopSoundMaster</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2792"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llLoopSoundMaster</CODE
->(string sound, float volume);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Behaviour is identical to <A
-HREF="#AEN2773"
->llLoopSound</A
->, with the addition of
-    marking the source as a "Sync Master", causing "Slave" sounds to
-    sync to it. If there are multiple masters within a viewer's
-    interest area, the most audible one (a function of both distance
-    and volume) will win out as the master. The use of multiple
-    masters within a small area is unlikely to produce the desired
-    effect.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2802"
->A.159. llLoopSoundSlave</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2804"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llLoopSoundSlave</CODE
->(string sound, float volume);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Behaviour is identical to <A
-HREF="#AEN2773"
->llLoopSound</A
->, unless there is a
-    "Sync Master" present. If a Sync Master is already playing the
-    Slave sound will begin playing from the same point the master is
-    in its loop synchronizing the loop points of both sounds. If a
-    Sync Master is started when the Slave is already playing, the
-    Slave will skip to the correct position to sync with the
-    Master.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2814"
->A.160. llMakeExplosion</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2816"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llMakeExplosion</CODE
->(integer particles, float scale, float velocity, float lifetime, float arc, string texture, vector offset);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Make a round explosion of particles using
-    <CODE
-CLASS="parameter"
->texture</CODE
-> from the object's inventory.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2836"
->A.161. llMakeFire</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2838"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llMakeFire</CODE
->(integer particles, float scale, float velocity, float lifetime, float arc, string texture, vector offset);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Make fire particles using <CODE
-CLASS="parameter"
->texture</CODE
->
-    from the object's inventory.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2858"
->A.162. llMakeFountain</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2860"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llMakeFountain</CODE
->(integer particles, float scale, float velocity, float lifetime, float arc, string texture, vector offset);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Make a fountain of particles using
-    <CODE
-CLASS="parameter"
->texture</CODE
-> from the object's inventory.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2880"
->A.163. llMakeSmoke</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2882"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llMakeSmoke</CODE
->(integer particles, float scale, float velocity, float lifetime, float arc, string texture, vector offset);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Make smoky particles using <CODE
-CLASS="parameter"
->texture</CODE
->
-    from the object's inventory.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2902"
->A.164. llMD5String</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2904"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llMD5String</CODE
->(string str, integer nonce);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Performs a RSA Data Security, Inc. MD5 Message-Digest
-    Algorithm on <CODE
-CLASS="parameter"
->str</CODE
-> with
-    <CODE
-CLASS="parameter"
->nonce</CODE
->. The function returns the digest as a
-    32 character hex string. The digest is computed on the string in
-    the following format:
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN2915"
-></A
-><PRE
-CLASS="programlisting"
->&#13;<CODE
-CLASS="parameter"
->str</CODE
-> + ":" + (string)<CODE
-CLASS="parameter"
->nonce</CODE
->
-</PRE
-><P
-></P
-></DIV
->
-    </P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2919"
->A.165. llMessageLinked</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2921"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llMessageLinked</CODE
->(integer linknum, integer num, string str, key id);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sends <CODE
-CLASS="parameter"
->num</CODE
->,
-    <CODE
-CLASS="parameter"
->str</CODE
->, and <CODE
-CLASS="parameter"
->id</CODE
-> to
-    members of the link set. The <CODE
-CLASS="parameter"
->linknum</CODE
->
-    parameter is either the linked number available through <A
-HREF="#AEN1867"
->llGetLinkNumber</A
-> or a <A
-HREF="#AEN5616"
->link constant</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2940"
->A.166. llMinEventDelay</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2942"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llMinEventDelay</CODE
->(float delay);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Set the minimum time between events being handled.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2949"
->A.167. llModifyLand</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2951"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llModifyLand</CODE
->(integer action, integer size);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Modify land with <CODE
-CLASS="parameter"
->action</CODE
-> on
-    <CODE
-CLASS="parameter"
->size</CODE
-> area. The parameters can be chosen
-    from the <A
-HREF="#AEN5574"
->land constants</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2963"
->A.168. llModPow</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2965"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llModPow</CODE
->(integer a, integer b, integer c);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Raise <CODE
-CLASS="parameter"
->a</CODE
-> to the <CODE
-CLASS="parameter"
->b</CODE
-> power, modulo <CODE
-CLASS="parameter"
->c</CODE
->.
-    <CODE
-CLASS="parameter"
->b</CODE
-> is capped at 0xFFFF (16 bits).</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2980"
->A.169. llMoveToTarget</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2982"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llMoveToTarget</CODE
->(vector target, float tau);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Critically damp to position <CODE
-CLASS="parameter"
->target</CODE
-> in
-    <CODE
-CLASS="parameter"
->tau</CODE
-> seconds if the script is physical. Good
-    <CODE
-CLASS="parameter"
->tau</CODE
-> values are greater than 0.2. A
-    <CODE
-CLASS="parameter"
->tau</CODE
-> of 0.0 stops the critical
-    damping.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN2995"
->A.170. llOffsetTexture</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN2997"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llOffsetTexture</CODE
->(float offset_s, float offset_t, integer face);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the texture s and t offsets of
-    <CODE
-CLASS="parameter"
->face</CODE
->. If <CODE
-CLASS="parameter"
->face</CODE
-> is
-    <A
-HREF="#AEN6073"
->ALL_SIDES</A
-> this
-    function sets the texture offsets for all faces.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3011"
->A.171. llOpenRemoteDataChannel</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3013"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llOpenRemoteDataChannel</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Creates a channel to listen for XML-RPC calls.
-    Will trigger a remote_data event with type = REMOTE_DATA_CHANNEL and a channel id once it is available.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3019"
->A.172. llOverMyLand</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3021"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llOverMyLand</CODE
->(key id);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns <A
-HREF="#AEN5295"
->TRUE</A
-> if
-    <CODE
-CLASS="parameter"
->id</CODE
-> is over land owned by the object owner,
-    <A
-HREF="#AEN5295"
->FALSE</A
-> otherwise.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3031"
->A.173. llParcelMediaCommandList</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3033"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llParcelMediaCommandList</CODE
->(list command_list);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Controls the playback of movies and other multimedia resources on a land parcel.  
-	<CODE
-CLASS="parameter"
->command</CODE
-> can be one of 
-	<A
-HREF="#AEN6459"
->PARCEL_MEDIA_COMMAND_STOP</A
->, 
-	<A
-HREF="#AEN6459"
->PARCEL_MEDIA_COMMAND_PAUSE</A
->, 
-	<A
-HREF="#AEN6459"
->PARCEL_MEDIA_COMMAND_PLAY</A
->,
-	<A
-HREF="#AEN6459"
->PARCEL_MEDIA_COMMAND_LOOP</A
->,
-	<A
-HREF="#AEN6459"
->PARCEL_MEDIA_COMMAND_TEXTURE</A
->,
-	<A
-HREF="#AEN6459"
->PARCEL_MEDIA_COMMAND_URL</A
->,
-	<A
-HREF="#AEN6459"
->PARCEL_MEDIA_COMMAND_TYPE</A
->,
-	<A
-HREF="#AEN6459"
->PARCEL_MEDIA_COMMAND_DESC</A
->,
-	<A
-HREF="#AEN6459"
->PARCEL_MEDIA_COMMAND_SIZE</A
->,
-	<A
-HREF="#AEN6459"
->PARCEL_MEDIA_COMMAND_TIME</A
->,
-	<A
-HREF="#AEN6459"
->PARCEL_MEDIA_COMMAND_AGENT</A
->,
-	<A
-HREF="#AEN6459"
->PARCEL_MEDIA_COMMAND_UNLOAD</A
->, or
-	<A
-HREF="#AEN6459"
->PARCEL_MEDIA_COMMAND_AUTO_ALIGN</A
->.
-	</P
-><P
->You are allowed one movie (or "media" resource) per land parcel.  
-	The movie will be played by replacing a texture on an object with the 
-	movie.  Users will only see the movie when they are standing on your 
-	land parcel.  Otherwise they will see the static texture.</P
-><P
->Most of the QuickTime media formats are supported including:
-	<P
-></P
-><UL
-><LI
-><P
->QuickTime movies (.mov)</P
-></LI
-><LI
-><P
->Streamable stored QuickTime movies (.mov)</P
-></LI
-><LI
-><P
->Real time QuickTime streams (rtsp://)</P
-></LI
-><LI
-><P
->MPEG4 movies (.mp4, .mpeg4) (simple profile only)</P
-></LI
-><LI
-><P
->QuickTime VR scenes and objects (.mov)</P
-></LI
-><LI
-><P
->Flash movies (.swf) (only non-interative, version 5 and earlier</P
-></LI
-><LI
-><P
->and many others from http://www.apple.com/quicktime/products/qt/specifications.html</P
-></LI
-></UL
->
-	A good rule of thumb is if it plays in the QuickTime Media Player, it will play in Second Life.
-	</P
-><P
->You can set up a movie for playback as follows:
-	<P
-></P
-><UL
-><LI
-><P
->First, select a texture from your inventory to be the static texture.  It should not be a common texture -- a test pattern would be better than the default plywood.</P
-></LI
-><LI
-><P
->Apply that texture to an object.</P
-></LI
-><LI
-><P
->Right click on your land and select "About Land..."</P
-></LI
-><LI
-><P
->Under "Options" use the GUI to select the static texture.</P
-></LI
-><LI
-><P
->Enter the URL of your movie or media stream.</P
-></LI
-><LI
-><P
->Create objects you want to click on for PLAY, STOP, PAUSE and LOOP (play forever)</P
-></LI
-><LI
-><P
->Attach the following script (or similar) to each.</P
-></LI
-></UL
->
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN3087"
-></A
-><PRE
-CLASS="programlisting"
->&#13;default
-{
-    touch_start ( integer total_number )
-    {
-		// This will play the current movie for all agents in the parcel.
-        llParcelMediaCommandList( [PARCEL_MEDIA_COMMAND_LOOP] );
-    }
-}
-</PRE
-><P
-></P
-></DIV
->
-Or a more advanced example:
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN3089"
-></A
-><PRE
-CLASS="programlisting"
->&#13;float START_TIME = 30.0;
-float RUN_LENGTH = 10.0;
-
-default
-{
-	state_entry()
-	{
-		llParcelMediaCommandList( [
-			PARCEL_MEDIA_COMMAND_URL, "http://enter_your.url/here",
-			PARCEL_MEDIA_COMMAND_TEXTURE, (key) llGetTexture(0) ] );
-	}
-
-	touch_start(integer num_detected)
-	{
-		llParcelMediaCommandList( [
-			PARCEL_MEDIA_COMMAND_AGENT, llDetectedKey(0),
-			PARCEL_MEDIA_COMMAND_TIME, START_TIME,
-			PARCEL_MEDIA_COMMAND_PLAY ] );
-		list Info = llParcelMediaQuery([PARCEL_MEDIA_COMMAND_URL, PARCEL_MEDIA_COMMAND_TEXTURE]);
-		llSay(0, "Playing '" + llList2String(Info, 0) + "' on texture '" + (string)llList2Key(Info, 1) + "' for agent " + llDetectedName(0));
-		llSetTimerEvent(RUN_LENGTH);
-	}
-
-	timer()
-	{
-		llParcelMediaCommandList( [ PARCEL_MEDIA_COMMAND_STOP ] );
-		llSetTimerEvent(0.0);
-	}
-}
-</PRE
-><P
-></P
-></DIV
->
-
-
-	</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3091"
->A.174. llParcelMediaQuery</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3093"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->list llParcelMediaQuery</CODE
->(list query_list);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Controls the playback of movies and other multimedia resources on a land parcel.  
-	<CODE
-CLASS="parameter"
->command</CODE
-> can be one of 
-	<A
-HREF="#AEN6459"
->PARCEL_MEDIA_COMMAND_TEXTURE</A
-> or
-	<A
-HREF="#AEN6459"
->PARCEL_MEDIA_COMMAND_URL</A
->.
-	</P
-><P
->This allows you to query the texture or url for media on the parcel.  
-	See <A
-HREF="#AEN3031"
->llParcelMediaCommandList</A
-> for an example
-	of usage.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3105"
->A.175. llParseString2List</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3107"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->list llParseString2List</CODE
->(string src, list separators, list spacers);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Breaks <CODE
-CLASS="parameter"
->src</CODE
-> into a list, discarding
-    anything in <CODE
-CLASS="parameter"
->separators</CODE
->, keeping any entry
-    in <CODE
-CLASS="parameter"
->spacers</CODE
->. The
-    <CODE
-CLASS="parameter"
->separators</CODE
-> and
-    <CODE
-CLASS="parameter"
->spacers</CODE
-> must be lists of strings with a
-    maximum of 8 entries each. So, if you had made the call:
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN3123"
-></A
-><PRE
-CLASS="programlisting"
->&#13;llParseString2List("Parsethisnow!  I dare:you to.", ["this", "!", " "], [":"]);
-</PRE
-><P
-></P
-></DIV
->
-    You would get the list:
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN3125"
-></A
-><PRE
-CLASS="programlisting"
->&#13;["Parse", "now", "I", "dare", ":", "you", "to"]
-</PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3127"
->A.176. llParseStringKeepNulls</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3129"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->list llParseStringKeepNulls</CODE
->(string src, list separators, list spacers);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Breaks <CODE
-CLASS="parameter"
->src</CODE
-> into a list, discarding
-    anything in <CODE
-CLASS="parameter"
->separators</CODE
->, keeping any entry
-    in <CODE
-CLASS="parameter"
->spacers</CODE
->.  Any resulting null values 
-	are kept.  The <CODE
-CLASS="parameter"
->separators</CODE
-> and
-    <CODE
-CLASS="parameter"
->spacers</CODE
-> must be lists of strings with a
-    maximum of 8 entries each. So, if you had made the call:
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN3145"
-></A
-><PRE
-CLASS="programlisting"
->&#13;llParseString2List("!Parsethisthisnow I dare::you to.", ["this", "!", " "], [":"]);
-</PRE
-><P
-></P
-></DIV
->
-    You would get the list:
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN3147"
-></A
-><PRE
-CLASS="programlisting"
->&#13;[NULL, "Parse", NULL, "now", "I", "dare", ":", NULL, ":", "you", "to"]
-</PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3149"
->A.177. llParticleSystem</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3151"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llParticleSystem</CODE
->(list parameters);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Makes a particle system based on the parameter list. The
-    <CODE
-CLASS="parameter"
->parameters</CODE
-> are specified as an ordered list
-    of parameter and value. Valid parameters and their expected values
-    can be found in the <A
-HREF="#AEN5851"
->particle system
-    constants</A
->. Here is a simple example:
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN3160"
-></A
-><PRE
-CLASS="programlisting"
->&#13;llParticleSystem([PSYS_PART_FLAGS, PSYS_PART_WIND_MASK,
-                  PSYS_PART_START_COLOR, &#60;1,0,0&#62;,
-                  PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_EXPLODE]);
-</PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3162"
->A.178. llPassCollisions</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3164"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llPassCollisions</CODE
->(integer pass);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If <CODE
-CLASS="parameter"
->pass</CODE
-> is <A
-HREF="#AEN5295"
->TRUE</A
->, land and object collisions
-    are passed from children on to parents.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3173"
->A.179. llPassTouches</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3175"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llPassTouches</CODE
->(integer pass);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If <CODE
-CLASS="parameter"
->pass</CODE
-> is <A
-HREF="#AEN5295"
->TRUE</A
->, touches are passed from
-    children on to parents.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3184"
->A.180. llPlaySound</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3186"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llPlaySound</CODE
->(string sound, float volume);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Plays a sound once. The sound will be attached to an object
-    and follow object movement. Only one sound may be attached to an
-    object at a time, and attaching a new sound or calling <A
-HREF="#AEN4620"
->llStopSound</A
-> will stop the
-    previously attached sound. A second call to llPlaySound with the
-    same <CODE
-CLASS="parameter"
->sound</CODE
-> will not restart the sound, but
-    the new volume will be used, which allows control over the volume
-    of already playing sounds. To restart the sound from the
-    beginning, call <A
-HREF="#AEN4620"
->llStopSound</A
->
-    before calling llPlaySound again.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3198"
->A.181. llPlaySoundSlave</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3200"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llPlaySoundSlave</CODE
->(string sound, float volume);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Behaviour is identical to llPlaySound, unless there is a
-    "Sync Master" present. If a Sync Master is already
-    playing the Slave sound will not be played until the Master hits
-    its loop point and returns to the beginning. llPlaySoundSlave will
-    play the sound exactly once; if it is desired to have the sound
-    play every time the Master loops, either use <A
-HREF="#AEN2802"
->llLoopSoundSlave</A
-> with extra
-    silence padded on the end of the sound or ensure that
-    llPlaySoundSlave is called at least once per loop of the
-    Master.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3210"
->A.182. llPointAt</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3212"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llPointAt</CODE
->(vector pos);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Make avatar that owns object point at
-    <CODE
-CLASS="parameter"
->pos</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3220"
->A.183. llPow</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3222"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llPow</CODE
->(float base, float exp);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns <CODE
-CLASS="parameter"
->base</CODE
-> raised to the
-    <CODE
-CLASS="parameter"
->exp</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3233"
->A.184. llPreloadSound</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3235"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llPreloadSound</CODE
->(string sound);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Preloads <CODE
-CLASS="parameter"
->sound</CODE
-> from object inventory
-    on nearby viewers.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3243"
->A.185. llPushObject</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3245"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llPushObject</CODE
->(key id, vector impulse, vector angular_impulse, integer local);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Applies <CODE
-CLASS="parameter"
->impulse</CODE
-> and
-    <CODE
-CLASS="parameter"
->angular_impulse</CODE
-> to object
-    <CODE
-CLASS="parameter"
->id</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3261"
->A.186. llReleaseControls</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3263"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llReleaseControls</CODE
->(key avatar);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Stop taking inputs from <CODE
-CLASS="parameter"
->avatar</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3271"
->A.187. llRemoteDataReply</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3273"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llRemoteDataReply</CODE
->(key channel, key message_id, string sdata);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Send an XML-RPC reply to message_id on channel with payload of string sdata.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3284"
->A.188. llRemoteDataSetRegion</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3286"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llRemoteDataSetRegion</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If an object using remote data channels changes regions, you
-    must call this function to reregister the remote data
-    channels. You do not need to make this call if your object does
-    not change regions or use remote data channels.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3292"
->A.189. llRemoteLoadScript</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3294"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llRemoteLoadScript</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Deprecated. Please use llRemoteLoadScriptPin instead.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3300"
->A.190. llRemoteLoadScriptPin</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3302"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llRemoteLoadScriptPin</CODE
->(key target, string name, integer pin, integer running, integer param);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If the owner of the object this script is attached can modify <CODE
-CLASS="parameter"
->target</CODE
->, it has the correct <CODE
-CLASS="parameter"
->pin</CODE
-> and the objects are in the same region, copy script <CODE
-CLASS="parameter"
->name</CODE
-> onto <CODE
-CLASS="parameter"
->target</CODE
->, if <CODE
-CLASS="parameter"
->running</CODE
-> == TRUE, start the script with <CODE
-CLASS="parameter"
->param</CODE
->. If <CODE
-CLASS="parameter"
->name</CODE
-> already exists on <CODE
-CLASS="parameter"
->target</CODE
->, it is replaced.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3325"
->A.191. llRemoveInventory</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3327"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llRemoveInventory</CODE
->(string inventory);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Remove the name <CODE
-CLASS="parameter"
->inventory</CODE
-> item from
-    the object inventory.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3335"
->A.192. llRemoveVehicleFlags</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3337"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llRemoveVehicleFlags</CODE
->(integer flags);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the vehicle <CODE
-CLASS="parameter"
->flags</CODE
-> to
-    FALSE. Valid parameters can be found in the <A
-HREF="#AEN6231"
->vehicle flags constants</A
->
-    section.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3346"
->A.193. llRequestAgentData</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3348"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llRequestAgentData</CODE
->(key id, integer data);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This function requests data about agent
-    <CODE
-CLASS="parameter"
->id</CODE
->. If and when the information is
-    collected, the <A
-HREF="#AEN4997"
->dataserver</A
->
-    event is called with the returned key returned from this function
-    passed in the <CODE
-CLASS="parameter"
->requested</CODE
-> parameter. See the
-    <A
-HREF="#AEN6005"
->agent data constants</A
-> for
-    details about valid values of <CODE
-CLASS="parameter"
->data</CODE
-> and what
-    each will return in the <A
-HREF="#AEN4997"
->dataserver</A
-> event.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3363"
->A.194. llRequestInventoryData</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3365"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llRequestInventoryData</CODE
->(string name);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Requests data from object inventory item
-    <CODE
-CLASS="parameter"
->name</CODE
->. When data is available the <A
-HREF="#AEN4997"
->dataserver</A
-> event will be raised
-    with the key returned from this function in the
-    <CODE
-CLASS="parameter"
->requested</CODE
-> parameter. The only request
-    currently implemented is to request data from landmarks, where the
-    data returned is in the form "&#60;float, float,
-    float&#62;" which can be cast to a vector. This position is in
-    region local coordinates of the region the script call is made 
-	(possible even resulting in negative values).  So, to
-	convert this value into a global position, just add the result of
-	llGetRegionCorner.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3375"
->A.195. llRequestPermissions</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3377"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llRequestPermissions</CODE
->(key avatar, integer perm);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Ask <CODE
-CLASS="parameter"
->avatar</CODE
-> to allow the script to do
-    <CODE
-CLASS="parameter"
->perm</CODE
->. The <CODE
-CLASS="parameter"
->perm</CODE
->
-    parameter should be a <A
-HREF="#AEN5360"
->permission
-    constant</A
->. Multiple permissions can be requested
-    simultaneously by or'ing the constants together. Many of the
-    permissions requests can only go to object owner. This call will
-    not stop script execution - if the specified avatar grants the
-    requested permissions, the <A
-HREF="#AEN5171"
->run_time_permissions</A
->
-    event will be called.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3391"
->A.196. llRequestSimulatorData</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3393"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llRequestSimulatorData</CODE
->(string sim_name, integer data);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This function requests data about simulator
-    <CODE
-CLASS="parameter"
->sim_name</CODE
->. When the information is
-    collected, the <A
-HREF="#AEN4997"
->dataserver</A
->
-    event is called with the returned key returned from this function
-    passed in the <CODE
-CLASS="parameter"
->requested</CODE
-> parameter. See the
-    <A
-HREF="#AEN6086"
->simulator data constants</A
-> for
-    details about valid values of <CODE
-CLASS="parameter"
->data</CODE
-> and what
-    each will return in the <A
-HREF="#AEN4997"
->dataserver</A
-> event.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3408"
->A.197. llResetScript</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3410"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llResetScript</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Resets this script.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3416"
->A.198. llResetOtherScript</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3418"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llResetOtherScript</CODE
->(string name);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Resets the script <CODE
-CLASS="parameter"
->name</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3426"
->A.199. llResetTime</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3428"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llResetTime</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the internal script timer to zero.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3434"
->A.200. llRezAtRoot</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3436"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llRezAtRoot</CODE
->(string inventory, vector pos, vector vel, rotation rot, integer param);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Creates object's <CODE
-CLASS="parameter"
->inventory</CODE
-> object at
-    position <CODE
-CLASS="parameter"
->pos</CODE
-> with velocity
-    <CODE
-CLASS="parameter"
->vel</CODE
-> and rotation
-    <CODE
-CLASS="parameter"
->rot</CODE
->. The last selected root object's location
-	in a multi-object selection will be placed at <CODE
-CLASS="parameter"
->pos</CODE
->.
-	All other objects in a selection will be created relative to the last
-	selected root's position, taking <CODE
-CLASS="parameter"
->rot</CODE
-> into account.
-	The <CODE
-CLASS="parameter"
->param</CODE
-> value
-    will be available to the newly created object in the <A
-HREF="#AEN5159"
->on_rez</A
-> event or through the <A
-HREF="#AEN2164"
->llGetStartParameter</A
->
-    library function. The <CODE
-CLASS="parameter"
->vel</CODE
-> parameter is
-    ignored if the rezzed object is not physical.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3461"
->A.201. llRezObject</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3463"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llRezObject</CODE
->(string inventory, vector pos, vector vel, rotation rot, integer param);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Creates object's <CODE
-CLASS="parameter"
->inventory</CODE
-> object at
-    position <CODE
-CLASS="parameter"
->pos</CODE
-> with velocity
-    <CODE
-CLASS="parameter"
->vel</CODE
-> and rotation
-    <CODE
-CLASS="parameter"
->rot</CODE
->. The <CODE
-CLASS="parameter"
->param</CODE
-> value
-    will be available to the newly created object in the <A
-HREF="#AEN5159"
->on_rez</A
-> event or through the <A
-HREF="#AEN2164"
->llGetStartParameter</A
->
-    library function. The <CODE
-CLASS="parameter"
->vel</CODE
-> parameter is
-    ignored if the rezzed object is not physical.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3486"
->A.202. llRot2Angle</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3488"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llRot2Angle</CODE
->(rotation rot);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the rotation angle represented by
-    <CODE
-CLASS="parameter"
->rot</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3496"
->A.203. llRot2Axis</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3498"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llRot2Axis</CODE
->(rotation rot);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the rotation axis represented by
-    <CODE
-CLASS="parameter"
->rot</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3506"
->A.204. llRot2Euler</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3508"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llRot2Euler</CODE
->(rotation rot);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the Euler Angle representation of
-    <CODE
-CLASS="parameter"
->rot</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3516"
->A.205. llRot2Fwd</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3518"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llRot2Fwd</CODE
->(rotation rot);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the forward axis represented by
-    <CODE
-CLASS="parameter"
->rot</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3526"
->A.206. llRot2Left</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3528"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llRot2Left</CODE
->(rotation rot);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the left axis represented by
-    <CODE
-CLASS="parameter"
->rot</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3536"
->A.207. llRot2Up</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3538"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llRot2Up</CODE
->(rotation rot);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the up axis represented by
-    <CODE
-CLASS="parameter"
->rot</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3546"
->A.208. llRotBetween</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3548"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->rotation llRotBetween</CODE
->(vector a, vector b);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the rotation needed to rotate
-    <CODE
-CLASS="parameter"
->a</CODE
-> to <CODE
-CLASS="parameter"
->b</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3559"
->A.209. llRotLookAt</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3561"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llRotLookAt</CODE
->(rotation rot, float strength, float damping);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Cause object to rotate to <CODE
-CLASS="parameter"
->rot</CODE
->. Good
-    <CODE
-CLASS="parameter"
->strength</CODE
-> values are around half the mass of
-    the object and good <CODE
-CLASS="parameter"
->damping</CODE
-> values are less
-    than 1/10<SUP
->th</SUP
-> of the
-    <CODE
-CLASS="parameter"
->strength</CODE
->. Asymmetrical shapes require
-    smaller <CODE
-CLASS="parameter"
->damping</CODE
->. A
-    <CODE
-CLASS="parameter"
->strength</CODE
-> of 0.0 cancels the look at.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3579"
->A.210. llRotTarget</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3581"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llRotTarget</CODE
->(rotation rot, float error);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Set object rotation within <CODE
-CLASS="parameter"
->error</CODE
-> of
-    <CODE
-CLASS="parameter"
->rotation</CODE
-> as a rotational target and return
-    an integer number for the target. The number can be used in <A
-HREF="#AEN3593"
->llRotTargetRemove</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3593"
->A.211. llRotTargetRemove</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3595"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llRotTargetRemove</CODE
->(integer number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Remove rotational target
-    <CODE
-CLASS="parameter"
->number</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3603"
->A.212. llRotateTexture</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3605"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llRotateTexture</CODE
->(float radians, integer face);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the texture rotation of <CODE
-CLASS="parameter"
->face</CODE
-> to
-    <CODE
-CLASS="parameter"
->radians</CODE
->. If <CODE
-CLASS="parameter"
->face</CODE
->
-    <A
-HREF="#AEN6073"
->ALL_SIDES</A
->, rotate the
-    texture of all faces.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3618"
->A.213. llRound</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3620"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llRound</CODE
->(float val);</CODE
-></P
-><P
-></P
-></DIV
-><P
->returns <CODE
-CLASS="parameter"
->val</CODE
-> rounded to the nearest
-    integer.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3628"
->A.214. llSameGroup</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3630"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llSameGroup</CODE
->(key id);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns <A
-HREF="#AEN5295"
->TRUE</A
-> if the
-    object or agent <CODE
-CLASS="parameter"
->id</CODE
-> is in the same simulator
-    and has the same active group as this object. Otherwise, returns
-    <A
-HREF="#AEN5295"
->FALSE</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3640"
->A.215. llSay</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3642"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSay</CODE
->(integer channel, string text);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Say <CODE
-CLASS="parameter"
->text</CODE
-> on
-    <CODE
-CLASS="parameter"
->channel</CODE
->. Channel 0 is the public chat
-    channel that all avatars see as chat text. Channels 1 to
-    2,147,483,648 are private channels that are not sent to avatars
-    but other scripts can listen for through the <A
-HREF="#AEN2665"
->llListen</A
-> api.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3654"
->A.216. llScaleTexture</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3656"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llScaleTexture</CODE
->(integer scale_s, integer scale_t, integer face);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the texture s and t scales of
-    <CODE
-CLASS="parameter"
->face</CODE
-> to <CODE
-CLASS="parameter"
->scale_s</CODE
-> and
-    <CODE
-CLASS="parameter"
->scale_t</CODE
-> respectively. If face is <A
-HREF="#AEN6073"
->ALL_SIDES</A
->, scale the texture
-    to all faces.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3671"
->A.217. llScriptDanger</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3673"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llScriptDanger</CODE
->(vector pos);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns true if pos is over public land, land that doesn't allow everyone to edit and build, or land that doesn't allow outside scripts.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3680"
->A.218. llSendRemoteData</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3682"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->key llSendRemoteData</CODE
->(string dest, integer idata, string sdata);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Send an XML-RPC request to dest through channel with payload
-    of channel (in a string), integer idata and string sdata. An
-    XML-RPC reply will trigger a remote_data event with type =
-    REMOTE_DATA_REPLY. The call returns a message_id that can be used
-    to identify XML-RPC replies.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3693"
->A.219. llSensor</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3695"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSensor</CODE
->(string name, key id, integer type, float range, float arc);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Performs a single scan for <CODE
-CLASS="parameter"
->name</CODE
-> and
-    <CODE
-CLASS="parameter"
->id</CODE
-> with <CODE
-CLASS="parameter"
->type</CODE
-> within
-    <CODE
-CLASS="parameter"
->range</CODE
-> meters and <CODE
-CLASS="parameter"
->arc</CODE
->
-    radians of forward vector. Specifying a blank name or <A
-HREF="#AEN6070"
->NULL_KEY</A
-> id will not filter results for
-    any particular name or id.  A range of 0.0 does not perform a
-    scan. Range is limited to 96.0.  The <CODE
-CLASS="parameter"
->type</CODE
-> parameter should be an <A
-HREF="#AEN5338"
->object type constant</A
-> value.  If anything is found
-	during the scan, a <A
-HREF="#AEN5183"
->sensor</A
-> event is triggered.  A maximum
-	of 16 items are passed to this event.  If nothing is found during the scan, a 
-	<A
-HREF="#AEN5121"
->no sensor</A
-> event is triggered instead.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3720"
->A.220. llSensorRemove</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3722"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSensorRemove</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Removes the sensor.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3728"
->A.221. llSensorRepeat</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3730"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSensorRepeat</CODE
->(string name, key id, integer type, float range, float arc, float rate);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Performs a single scan for <CODE
-CLASS="parameter"
->name</CODE
-> and
-    <CODE
-CLASS="parameter"
->id</CODE
-> with <CODE
-CLASS="parameter"
->type</CODE
-> within
-    <CODE
-CLASS="parameter"
->range</CODE
-> meters and <CODE
-CLASS="parameter"
->arc</CODE
->
-    radians of forward vector and repeats every
-    <CODE
-CLASS="parameter"
->rate</CODE
-> seconds. Specifying a blank name or
-    <A
-HREF="#AEN6070"
->NULL_KEY</A
-> id will not filter
-    results for any particular name or id.  A range of 0.0 cancels the
-    scan.  Range is limited to 96.0.  The <CODE
-CLASS="parameter"
->type</CODE
-> parameter should be an <A
-HREF="#AEN5338"
->object type constant</A
->
-    value. If anything is found during the scan, a <A
-HREF="#AEN5183"
->sensor</A
-> 
-	event is triggered.  A maximum of 16 items are passed to this event.  If nothing is found 
-	during the scan, a <A
-HREF="#AEN5121"
->no sensor</A
-> event is triggered instead.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3758"
->A.222. llSetAlpha</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3760"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetAlpha</CODE
->(float alpha, integer face);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the alpha value for <CODE
-CLASS="parameter"
->face</CODE
->. If
-    face is <A
-HREF="#AEN6073"
->ALL_SIDES</A
->, set
-    the alpha to all faces. The <CODE
-CLASS="parameter"
->alpha</CODE
-> value is
-    interpreted as an opacity percentage - 1.0 is fully opaque, and
-    0.2 is mostly transparent. This api will clamp
-    <CODE
-CLASS="parameter"
->alpha</CODE
-> values less 0.1 to .1 and greater
-    than 1.0 to 1.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3773"
->A.223. llSetBuoyancy</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3775"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetBuoyancy</CODE
->(float buoyancy);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Set the object buoyancy. A value of 0 is none, less than 1.0 sinks,
-    1.0 floats, and greater than 1.0 rises.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3782"
->A.224. llSetCameraAtOffset</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3784"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetCameraAtOffset</CODE
->(vector offset);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the camera at offset used in this object if an avatar
-    sits on it.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3791"
->A.225. llSetClickAction</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3793"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetClickAction</CODE
->(integer action);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets which action is invoked when a resident clicks a prim.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3800"
->A.226. llForceMouselook</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3802"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llForceMouselook</CODE
->(integer mouselook);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Puts the camera into mouselook mode if an avatar
-    sits on this object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3809"
->A.227. llSetCameraEyeOffset</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3811"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetCameraEyeOffset</CODE
->(vector offset);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the camera eye offset used in this object if an avatar
-    sits on it.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3818"
->A.228. llSetColor</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3820"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetColor</CODE
->(vector color, integer face);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the <CODE
-CLASS="parameter"
->color</CODE
-> of
-    <CODE
-CLASS="parameter"
->face</CODE
->. If face is <A
-HREF="#AEN6073"
->ALL_SIDES</A
->, set the alpha to
-    all faces.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3832"
->A.229. llSetDamage</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3834"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetDamage</CODE
->(float damage);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the amount of damage that will be done to an object
-    that this object hits. This object will be destroyed on damaging
-    another object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3841"
->A.230. llSetForce</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3843"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetForce</CODE
->(vector force, integer local);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If the object is physical, this function sets the
-    <CODE
-CLASS="parameter"
->force</CODE
->. The vector is in local coordinates if
-    local is <A
-HREF="#AEN5295"
->TRUE</A
->, global if
-    <A
-HREF="#AEN5295"
->FALSE</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3855"
->A.231. llSetForceAndTorque</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3857"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetForceAndTorque</CODE
->(vector force, vector torque, integer local);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If the object is physical, this function sets the
-    <CODE
-CLASS="parameter"
->force</CODE
-> and
-    <CODE
-CLASS="parameter"
->torque</CODE
->. The vectors are in local coordinates
-    if local is <A
-HREF="#AEN5295"
->TRUE</A
->, global if
-    <A
-HREF="#AEN5295"
->FALSE</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3872"
->A.232. llSetHoverHeight</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3874"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetHoverHeight</CODE
->(float height, float water, float tau);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Critically damps to a height. The height is above ground and
-    water if <CODE
-CLASS="parameter"
->water</CODE
-> is <A
-HREF="#AEN5295"
->TRUE</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3887"
->A.233. llSetLinkAlpha</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3889"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetLinkAlpha</CODE
->(integer linknumber, float alpha, integer face);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the <CODE
-CLASS="parameter"
->alpha</CODE
-> of a prim in the link set.
-    The <CODE
-CLASS="parameter"
->linknum</CODE
->
-    parameter is either the linked number available through <A
-HREF="#AEN1867"
->llGetLinkNumber</A
-> or a <A
-HREF="#AEN5616"
->link constant</A
->.
-    If <CODE
-CLASS="parameter"
->face</CODE
-> is
-    <A
-HREF="#AEN6073"
->ALL_SIDES</A
->, set the alpha 
-    of all faces.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3906"
->A.234. llSetLinkColor</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3908"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetLinkColor</CODE
->(integer linknumber, vector color, integer face);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the <CODE
-CLASS="parameter"
->color</CODE
-> of a prim in the link set.
-    The <CODE
-CLASS="parameter"
->linknum</CODE
->
-    parameter is either the linked number available through <A
-HREF="#AEN1867"
->llGetLinkNumber</A
-> or a <A
-HREF="#AEN5616"
->link constant</A
->.
-    If <CODE
-CLASS="parameter"
->face</CODE
-> is
-    <A
-HREF="#AEN6073"
->ALL_SIDES</A
->, set the color
-    of all faces.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3925"
->A.235. llSetLinkPrimitiveParams</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3927"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetLinkPrimitiveParams</CODE
->(integer linknumber, list rules);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the primitive parameters of a prim in the link set.
-    The <CODE
-CLASS="parameter"
->linknum</CODE
->
-    parameter is either the linked number available through <A
-HREF="#AEN1867"
->llGetLinkNumber</A
-> or a <A
-HREF="#AEN5616"
->link constant</A
->.
-    The <CODE
-CLASS="parameter"
->rules</CODE
->
-	list is identical to that of 
-	<A
-HREF="#AEN4020"
->llSetPrimitiveParams</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3941"
->A.236. llSetLinkTexture</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3943"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetLinkTexture</CODE
->(integer linknumber, string texture, integer face);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the <CODE
-CLASS="parameter"
->texture</CODE
-> of a prim in the link set.
-    The <CODE
-CLASS="parameter"
->linknum</CODE
->
-    parameter is either the linked number available through <A
-HREF="#AEN1867"
->llGetLinkNumber</A
-> or a <A
-HREF="#AEN5616"
->link constant</A
->.
-    If <CODE
-CLASS="parameter"
->face</CODE
-> is
-    <A
-HREF="#AEN6073"
->ALL_SIDES</A
->, set the texture
-    of all faces.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3960"
->A.237. llSetLocalRot</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3962"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetLocalRot</CODE
->(rotation rot);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If the object is not physical, this function sets the
-    rotation of a child prim relative to the root prim, and the
-    linked set is adjusted.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3969"
->A.238. llSetObjectDesc</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3971"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetObjectDesc</CODE
->(string description);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the object description to <CODE
-CLASS="parameter"
->description</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3979"
->A.239. llSetObjectName</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3981"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetObjectName</CODE
->(string name);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the object name to <CODE
-CLASS="parameter"
->name</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3989"
->A.240. llSetParcelMusicURL</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN3991"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetParcelMusicURL</CODE
->(string url);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the streaming audio URL for the parcel where the object
-    is currently located. The <CODE
-CLASS="parameter"
->url</CODE
-> must be an
-    http streaming source of mp3 or ogg data.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN3999"
->A.241. llSetPayPrice</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4001"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetPayPrice</CODE
->(integer default_price, list quick_pay_buttons);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the default pay price and optionally the quick pay buttons
-    for the 'Pay' window when someone pays this object.  
-    See also <A
-HREF="#AEN5434"
->Pay Button Constants</A
->. </P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4011"
->A.242. llSetPos</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4013"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetPos</CODE
->(vector pos);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If the object is not physical, this function sets the
-    position in region coordinates. If the object is a child, the
-    position is treated as root relative and the linked set is
-    adjusted.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4020"
->A.243. llSetPrimitiveParams</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4022"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetPrimitiveParams</CODE
->(list rules);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Set primitive parameters based on <CODE
-CLASS="parameter"
->rules</CODE
->. The
-    <CODE
-CLASS="parameter"
->rules</CODE
-> are specified as an ordered list
-    of parameter and value(s). Valid parameters and their expected values
-    can be found in the <A
-HREF="#AEN6323"
->Primitive Constants</A
->. 
-    Here is a simple example:
-<DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN4032"
-></A
-><PRE
-CLASS="programlisting"
->&#13;llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_BOX, PRIM_HOLE_DEFAULT, &#60;0,1,0&#62;,
-                  0.5, &#60;-0.2, 0.2, 0&#62;, &#60;0.5,0.5,0&#62;,&#60;-0.5,0.5,0&#62;]);
-</PRE
-><P
-></P
-></DIV
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4034"
->A.244. llSetRemoteScriptAccessPin</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4036"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetRemoteScriptAccessPin</CODE
->(integer pin);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If pin is set to a non-zero number, the task will accept remote script
-    loads via llRemoteLoadScriptPin if it passes in the correct pin.
-    Otherwise, llRemoteLoadScriptPin is ignored.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4043"
->A.245. llSetRot</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4045"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetRot</CODE
->(rotation rot);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If the object is not physical, this function sets the
-    rotation. If the object is a child, the position is treated as
-    root relative and the linked set is adjusted.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4052"
->A.246. llSetScale</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4054"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetScale</CODE
->(vector scale);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the object scale.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4061"
->A.247. llSetScriptState</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4063"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetScriptState</CODE
->(string name, integer run);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Control the state of a script on the object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4072"
->A.248. llSetSitText</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4074"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetSitText</CODE
->(string text);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Displays <CODE
-CLASS="parameter"
->text</CODE
-> rather than 'sit' in
-    viewer pie menu.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4082"
->A.249. llSetSoundQueueing</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4084"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetSoundQueueing</CODE
->(integer queue);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets whether successive calls to <A
-HREF="#AEN3184"
->llPlaySound</A
->, <A
-HREF="#AEN2773"
->llLoopSound</A
->, etc., (attached
-    sounds) interrupt the playing sound. The default for objects is
-    <A
-HREF="#AEN5295"
->FALSE</A
->. Setting this value to
-    <A
-HREF="#AEN5295"
->TRUE</A
-> will make the sound wait
-    until the current playing sound reaches its end. The queue is one
-    level deep.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4095"
->A.250. llSetStatus</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4097"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetStatus</CODE
->(integer status, integer value);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the <CODE
-CLASS="parameter"
->status</CODE
-> to
-    <CODE
-CLASS="parameter"
->value</CODE
->. Use <A
-HREF="#AEN5304"
->status constants</A
-> for the values of
-    <CODE
-CLASS="parameter"
->status</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4110"
->A.251. llSetText</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4112"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetText</CODE
->(string text, vector color, float alpha);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets text that floats above object to
-    <CODE
-CLASS="parameter"
->text</CODE
->, using the specified
-    <CODE
-CLASS="parameter"
->color</CODE
-> and
-    <CODE
-CLASS="parameter"
->alpha</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4126"
->A.252. llSetTexture</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4128"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetTexture</CODE
->(string texture, integer face);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the <CODE
-CLASS="parameter"
->texture</CODE
-> from object
-    inventory of <CODE
-CLASS="parameter"
->face</CODE
->. If face is <A
-HREF="#AEN6073"
->ALL_SIDES</A
->, set the texture to
-    all faces.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4140"
->A.253. llSetTextureAnim</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4142"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetTextureAnim</CODE
->(integer mode, integer face, integer sizex, integer sizey, float start, float length, float rate);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Animates a texture by setting the texture scale and
-    offset. The mode is a mask of <A
-HREF="#AEN5817"
->texture animation
-    constants</A
->. You can only have one texture animation on an
-    object, calling llSetTextureAnim more than once on an object will
-    reset it.</P
-><P
->You can only do one traditional animation, <A
-HREF="#AEN5817"
->ROTATE</A
-> or <A
-HREF="#AEN5817"
->SCALE</A
-> at a time, you
-    cannot combine masks. In the case of <A
-HREF="#AEN5817"
->ROTATE</A
-> or <A
-HREF="#AEN5817"
->SCALE</A
->,
-    <CODE
-CLASS="parameter"
->sizex</CODE
-> and <CODE
-CLASS="parameter"
->sizey</CODE
-> are
-    ignored, and <CODE
-CLASS="parameter"
->start</CODE
-> and
-    <CODE
-CLASS="parameter"
->length</CODE
-> are used as the start and length
-    values of the animation. For rotation,
-    <CODE
-CLASS="parameter"
->start</CODE
-> and <CODE
-CLASS="parameter"
->length</CODE
-> are
-    in radians.</P
-><P
->The <CODE
-CLASS="parameter"
->face</CODE
-> specified which face to
-    animate. If <CODE
-CLASS="parameter"
->face</CODE
-> is <A
-HREF="#AEN6073"
->ALL_SIDES</A
->, all textures on the
-    object are animated. </P
-><P
->The <CODE
-CLASS="parameter"
->sizex</CODE
-> and
-    <CODE
-CLASS="parameter"
->sizey</CODE
-> describe the layout of the frames
-    within the texture. <CODE
-CLASS="parameter"
->sizex</CODE
-> specifies how
-    many horizontal frames and <CODE
-CLASS="parameter"
->sizey</CODE
-> is how
-    many vertical frames.</P
-><P
-><CODE
-CLASS="parameter"
->start</CODE
-> is the frame number to begin
-    the animation on. Frames are numbered from left to right, top to
-    bottom, starting at 0.</P
-><P
-><CODE
-CLASS="parameter"
->length</CODE
-> is the number of frames to
-    animate. 0 means to animate all frames after the start
-    frame.</P
-><P
-><CODE
-CLASS="parameter"
->rate</CODE
-> is the frame rate to animate
-    at. 1.0 means 1 frame per second, 10.0 means 10
-    frames per second, etc.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4188"
->A.254. llSetTimerEvent</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4190"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetTimerEvent</CODE
->(float sec);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the <A
-HREF="#AEN5211"
->timer</A
-> event to
-    be triggered every <CODE
-CLASS="parameter"
->sec</CODE
-> seconds. Passing in
-    0.0 stops further <A
-HREF="#AEN5211"
->timer</A
->
-    events.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4200"
->A.255. llSetTorque</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4202"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetTorque</CODE
->(vector torque, integer local);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If the object is physical, this function sets the
-    <CODE
-CLASS="parameter"
->torque</CODE
->. The vector is in local coordinates
-    if local is <A
-HREF="#AEN5295"
->TRUE</A
->, global if
-    <A
-HREF="#AEN5295"
->FALSE</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4214"
->A.256. llSetTouchText</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4216"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetTouchText</CODE
->(string text);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Displays <CODE
-CLASS="parameter"
->text</CODE
-> in viewer pie menu that
-    acts as a touch.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4224"
->A.257. llSetVehicleFlags</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4226"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetVehicleFlags</CODE
->(integer flags);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the vehicle <CODE
-CLASS="parameter"
->flags</CODE
-> to TRUE. Valid
-    parameters can be found in the <A
-HREF="#AEN6231"
->vehicle flags constants</A
->
-    section.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4235"
->A.258. llSetVehicleFloatParam</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4237"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetVehicleFloatParam</CODE
->(integer param_name, float param_value);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the vehicle floating point parameter
-    <CODE
-CLASS="parameter"
->param_name</CODE
-> to
-    <CODE
-CLASS="parameter"
->param_value</CODE
->. Valid parameters and their
-    expected values can be found in the <A
-HREF="#AEN6112"
->vehicle parameter
-    constants</A
-> section.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4249"
->A.259. llSetVehicleType</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4251"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetVehicleType</CODE
->(integer type);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Activates the vehicle action and choose vehicle
-    <CODE
-CLASS="parameter"
->type</CODE
->. Valid types and an explanation of
-    their characteristics can be found in the <A
-HREF="#AEN6288"
->vehicle type constants</A
->
-    section.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4260"
->A.260. llSetVehicleRotationParam</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4262"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetVehicleRotationParam</CODE
->(integer param_name, rotation param_value);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the vehicle rotation parameter
-    <CODE
-CLASS="parameter"
->param_name</CODE
-> to
-    <CODE
-CLASS="parameter"
->param_value</CODE
->. Valid parameters can be found
-    in the <A
-HREF="#AEN6112"
->vehicle parameter
-    constants</A
-> section.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4274"
->A.261. llSetVehicleVectorParam</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4276"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSetVehicleVectorParam</CODE
->(integer param_name, vector param_value);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Sets the vehicle vector parameter
-    <CODE
-CLASS="parameter"
->param_name</CODE
-> to
-    <CODE
-CLASS="parameter"
->param_value</CODE
->. Valid parameters can be found
-    in the <A
-HREF="#AEN6112"
->vehicle parameter
-    constants</A
-> section.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4288"
->A.262. llShout</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4290"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llShout</CODE
->(integer channel, string text);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Shout <CODE
-CLASS="parameter"
->text</CODE
-> on
-    <CODE
-CLASS="parameter"
->channel</CODE
->. Channel 0 is the public chat
-    channel that all avatars see as chat text. Channels 1 to
-    2,147,483,648 are private channels that are not sent to avatars
-    but other scripts can listen for through the <A
-HREF="#AEN2665"
->llListen</A
-> api.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4302"
->A.263. llSin</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4304"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llSin</CODE
->(float theta);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the sine of <CODE
-CLASS="parameter"
->theta</CODE
-> in
-    radians.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4312"
->A.264. llSitTarget</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4314"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSitTarget</CODE
->(vector offset, rotation rot);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Set the sit location for this object. If
-    <CODE
-CLASS="parameter"
->offset</CODE
-> == <A
-HREF="#AEN6080"
->ZERO_VECTOR</A
->
-    clear the sit target.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4325"
->A.265. llSleep</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4327"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llSleep</CODE
->(float sec);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Puts the script to sleep for <CODE
-CLASS="parameter"
->sec</CODE
->
-    seconds.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4335"
->A.266. llSqrt</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4337"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llSqrt</CODE
->(float val);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the square root of <CODE
-CLASS="parameter"
->val</CODE
->. If
-    <CODE
-CLASS="parameter"
->val</CODE
-> is less than 0.0, this function returns
-    0.0 and raises a math runtime error.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4346"
->A.267. llStartAnimation</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4348"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llStartAnimation</CODE
->(string anim);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This function starts animation <CODE
-CLASS="parameter"
->anim</CODE
->
-    for the avatar that owns the object.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Valid strings for <CODE
-CLASS="parameter"
->anim</CODE
-></B
-></P
-><DL
-><DT
->hold_R_bazooka, hold_R_handgun, hold_R_rifle</DT
-><DD
-><P
->Holds the appropriately shaped weapon in the
-	right hand. Automatically switches to the aims (below) when
-	user enters mouse look</P
-></DD
-><DT
->aim_R_bazooka, aim_R_handgun, aim_R_rifle</DT
-><DD
-><P
->Aims the appropriately shaped weapon along the
-	direction the avatar is looking.</P
-></DD
-><DT
->away</DT
-><DD
-><P
->Flops over in "away from keyboard"
-	state.</P
-></DD
-><DT
->backflip</DT
-><DD
-><P
->Performs a backflip.</P
-></DD
-><DT
->bow</DT
-><DD
-><P
->Bows at waist.</P
-></DD
-><DT
->brush</DT
-><DD
-><P
->Brushes dirt from shirt.</P
-></DD
-><DT
->clap</DT
-><DD
-><P
->Applauds.</P
-></DD
-><DT
->courtbow</DT
-><DD
-><P
->Bows with a courtly flourish.</P
-></DD
-><DT
->crouch</DT
-><DD
-><P
->Crouches in place.</P
-></DD
-><DT
->crouchwalk</DT
-><DD
-><P
->Walks in place while crouching.</P
-></DD
-><DT
->dance1, dance2, dance3, dance4, dance5, dance6, dance7, dance8</DT
-><DD
-><P
->Various dance maneuvers.</P
-></DD
-><DT
->falldown</DT
-><DD
-><P
->Freefall falling animation.</P
-></DD
-><DT
->female_walk</DT
-><DD
-><P
->Walks with hip sway.</P
-></DD
-><DT
->fly</DT
-><DD
-><P
->Flies forward.</P
-></DD
-><DT
->flyslow</DT
-><DD
-><P
->Flies forward at a less aggressive
-        angle.</P
-></DD
-><DT
->hello</DT
-><DD
-><P
->Waves.</P
-></DD
-><DT
->hold_throw_R</DT
-><DD
-><P
->Hold object in right hand, prepared to throw
-        it.</P
-></DD
-><DT
->hover</DT
-><DD
-><P
->Hovers in place.</P
-></DD
-><DT
->hover_down</DT
-><DD
-><P
->Pretends to hover straight
-        down.</P
-></DD
-><DT
->hover_up</DT
-><DD
-><P
->Pretends to hover straight
-        up.</P
-></DD
-><DT
->jump</DT
-><DD
-><P
->Midair jump position.</P
-></DD
-><DT
->kick_roundhouse_R</DT
-><DD
-><P
->Roundhouse kick with right
-        leg.</P
-></DD
-><DT
->land</DT
-><DD
-><P
->Lands after flying.</P
-></DD
-><DT
->prejump</DT
-><DD
-><P
->Prepares to jump.</P
-></DD
-><DT
->punch_L</DT
-><DD
-><P
->Punch with left hand.</P
-></DD
-><DT
->punch_R</DT
-><DD
-><P
->Punch with right hand.</P
-></DD
-><DT
->punch_onetwo</DT
-><DD
-><P
->Punch with one hand then the
-        other.</P
-></DD
-><DT
->run</DT
-><DD
-><P
->Runs in place.</P
-></DD
-><DT
->salute</DT
-><DD
-><P
->Salutes with right hand.</P
-></DD
-><DT
->sit</DT
-><DD
-><P
->Sits on object at knee
-        height.</P
-></DD
-><DT
->sit_ground</DT
-><DD
-><P
->Sits down on ground.</P
-></DD
-><DT
->slowwalk</DT
-><DD
-><P
->Walks in place slowly.</P
-></DD
-><DT
->smoke_idle</DT
-><DD
-><P
->Leans on imaginary prop while holding
-        cigarette.</P
-></DD
-><DT
->smoke_inhale</DT
-><DD
-><P
->Leans on imaginary prop and smokes a
-        cigarette.</P
-></DD
-><DT
->smoke_throw_down</DT
-><DD
-><P
->Leans on imaginary prop, throws down a
-        cigarette, and stamps it out.</P
-></DD
-><DT
->snapshot</DT
-><DD
-><P
->Pantomimes taking a picture.</P
-></DD
-><DT
->soft_land</DT
-><DD
-><P
->Stumbles a bit as if
-        landing.</P
-></DD
-><DT
->stand</DT
-><DD
-><P
->Stands in place.</P
-></DD
-><DT
->standup</DT
-><DD
-><P
->Falls on face and stands up.</P
-></DD
-><DT
->stride</DT
-><DD
-><P
->Legs extended as if stepping off of a
-        ledge.</P
-></DD
-><DT
->sword_strike_R</DT
-><DD
-><P
->Strike with sword in right
-        hand.</P
-></DD
-><DT
->talk</DT
-><DD
-><P
->Head moves as if talking.</P
-></DD
-><DT
->throw_R</DT
-><DD
-><P
->Throws object in right hand.</P
-></DD
-><DT
->tryon_shirt</DT
-><DD
-><P
->Turns around and models a new
-        shirt.</P
-></DD
-><DT
->turnleft</DT
-><DD
-><P
->Pretends to turn left.</P
-></DD
-><DT
->turnright</DT
-><DD
-><P
->Pretends to turn right.</P
-></DD
-><DT
->type</DT
-><DD
-><P
->Makes typing motion.</P
-></DD
-><DT
->uphillwalk</DT
-><DD
-><P
->Walks uphill in place.</P
-></DD
-><DT
->walk</DT
-><DD
-><P
->Walks in place.</P
-></DD
-><DT
->whisper</DT
-><DD
-><P
->Whispers behind hand.</P
-></DD
-><DT
->whistle</DT
-><DD
-><P
->Whistles with hands in
-        mouth.</P
-></DD
-><DT
->yell</DT
-><DD
-><P
->Shouts between cupped hands.</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4578"
->A.268. llStopAnimation</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4580"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llStopAnimation</CODE
->(string anim);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Stop animation <CODE
-CLASS="parameter"
->anim</CODE
-> for avatar that
-    owns object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4588"
->A.269. llStopHover</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4590"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llStopHover</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Stop hover to a height.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4596"
->A.270. llStopLookAt</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4598"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llStopLookAt</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Stop causing object to look at target.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4604"
->A.271. llStopMoveToTarget</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4606"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llStopMoveToTarget</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Stops critically damped motion.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4612"
->A.272. llStopPointAt</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4614"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llStopPointAt</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Stop avatar that owns object pointing.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4620"
->A.273. llStopSound</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4622"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llStopSound</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Stops a currently playing attached sound started with <A
-HREF="#AEN3184"
->llPlaySound</A
-> or <A
-HREF="#AEN2773"
->llLoopSound</A
->. Has no effect on
-    sounds started with <A
-HREF="#AEN4756"
->llTriggerSound</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4631"
->A.274. llStringLength</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4633"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llStringLength</CODE
->(string src);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the number of characters in
-    <CODE
-CLASS="parameter"
->src</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4641"
->A.275. llSubStringIndex</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4643"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llSubStringIndex</CODE
->(string source, string pattern);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Finds index in source where pattern first appears. Returns
-    -1 if no match is found.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4652"
->A.276. llStringToBase64</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4654"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llStringToBase64</CODE
->(string str);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Converts a string to the Base 64 representation of the string.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4661"
->A.277. llTakeControls</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4663"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llTakeControls</CODE
->(integer controls, integer accept, integer pass_on);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If (<CODE
-CLASS="parameter"
->accept</CODE
-> ==
-    (<CODE
-CLASS="parameter"
->controls</CODE
-> &#38; input)), send input to
-    object. If the boolean <CODE
-CLASS="parameter"
->pass_on</CODE
-> is <A
-HREF="#AEN5295"
->TRUE</A
->, also send input to
-    avatar.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4678"
->A.278. llTan</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4680"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llTan</CODE
->(float theta);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the tangent of <CODE
-CLASS="parameter"
->theta</CODE
->
-    radians.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4688"
->A.279. llTarget</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4690"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->integer llTarget</CODE
->(vector position, float range);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Set object position within <CODE
-CLASS="parameter"
->range</CODE
-> of
-    <CODE
-CLASS="parameter"
->position</CODE
-> as a target and returns an integer
-    ID for the target.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4701"
->A.280. llTargetOmega</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4703"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llTargetOmega</CODE
->(vector axis, float spinrate, float gain);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Attempt to spin at <CODE
-CLASS="parameter"
->spinrate</CODE
-> with
-    strength <CODE
-CLASS="parameter"
->gain</CODE
-> on
-    <CODE
-CLASS="parameter"
->axis</CODE
->. A <CODE
-CLASS="parameter"
->spinrate</CODE
-> of
-    0.0 cancels the spin. This function works in object local
-    coordinates for child objects and works in world coordinates for
-    root objects.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4718"
->A.281. llTargetRemove</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4720"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llTargetRemove</CODE
->(integer tnumber);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Remove target number <CODE
-CLASS="parameter"
->tnumber</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4728"
->A.282. llTeleportAgentHome</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4730"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llTeleportAgentHome</CODE
->(key id);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Teleport agent on the owner's land to agent's home
-    location.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4737"
->A.283. llToLower</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4739"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llToLower</CODE
->();</CODE
-></P
-><P
-></P
-></DIV
-><P
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4746"
->A.284. llToUpper</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4748"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llToUpper</CODE
->(string src);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns <CODE
-CLASS="parameter"
->src</CODE
-> in all lower case.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4756"
->A.285. llTriggerSound</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4758"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llTriggerSound</CODE
->(string sound, float volume);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Plays a transient sound NOT attached to an object. The sound
-    plays from a stationary position located at the center of the
-    object at the time of the trigger. There is no limit to the number
-    of triggered sounds which can be generated by an object, and
-    calling <A
-HREF="#AEN4756"
->llTriggerSound</A
->
-    does not affect the attached sounds created by <A
-HREF="#AEN3184"
->llPlaySound</A
-> and <A
-HREF="#AEN2773"
->llLoopSound</A
->. This is very useful
-    for things like collision noises, explosions, etc. There is no
-    way to stop or alter the volume of a sound triggered by
-    this function.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4770"
->A.286. llTriggerSoundLimited</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4772"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llTriggerSoundLimited</CODE
->(string sound, float volume, vector tne, vector bsw);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Plays a transient sound NOT attached to an object with its
-    audible range limited by the axis aligned bounding box define by
-    <CODE
-CLASS="parameter"
->tne</CODE
-> (top-north-eash) and
-    <CODE
-CLASS="parameter"
->bsw</CODE
-> (bottom-south-west). The sound plays
-    from a stationary position located at the center of the object at
-    the time of the trigger. There is no limit to the number of
-    triggered sounds which can be generated by an object, and calling
-    <A
-HREF="#AEN4756"
->llTriggerSound</A
-> does not
-    affect the attached sounds created by <A
-HREF="#AEN3184"
->llPlaySound</A
-> and <A
-HREF="#AEN2773"
->llLoopSound</A
->. This is very useful
-    for things like collision noises, explosions, etc. There is no way
-    to stop or alter the volume of a sound triggered by this
-    function.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4790"
->A.287. llUnescapeURL</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4792"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llUnescapeURL</CODE
->(string url);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the string that is the URL unescaped version of <CODE
-CLASS="parameter"
->url</CODE
->,
-    replacing %20 with spaces etc.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4800"
->A.288. llUnSit</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4802"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llUnSit</CODE
->(key id);</CODE
-></P
-><P
-></P
-></DIV
-><P
->If agent identified by <CODE
-CLASS="parameter"
->id</CODE
-> is sitting
-    on the object the script is attached to or is over land owned by
-    the objects owner, the agent is forced to stand up.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4810"
->A.289. llVecDist</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4812"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llVecDist</CODE
->(vector a, vector b);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the distance from <CODE
-CLASS="parameter"
->a</CODE
-> to
-    <CODE
-CLASS="parameter"
->b</CODE
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4823"
->A.290. llVecMag</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4825"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llVecMag</CODE
->(vector vec);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the magnitude of <CODE
-CLASS="parameter"
->vec</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4833"
->A.291. llVecNorm</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4835"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llVecNorm</CODE
->(vector vec);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns normalized <CODE
-CLASS="parameter"
->vec</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4843"
->A.292. llVolumeDetect</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4845"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llVolumeDetect</CODE
->(integer detect);</CODE
-></P
-><P
-></P
-></DIV
-><P
->When detect = TRUE, this makes the entire link set the script is attached to phantom but if another object interpenetrates it, it will get a collision_start event. When an object stops interpenetrating, a collision_end event is generated. While the other is interpenetrating, collision events are NOT generated. The script must be applied to the root object of the link set to get the collision events. Collision filters work normally.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4852"
->A.293. llWater</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4854"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->float llWater</CODE
->(vector offset);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the water height at the object position +
-    <CODE
-CLASS="parameter"
->offset</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4862"
->A.294. llWhisper</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4864"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->llWhisper</CODE
->(integer channel, string text);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Whisper <CODE
-CLASS="parameter"
->text</CODE
-> on
-    <CODE
-CLASS="parameter"
->channel</CODE
->. Channel 0 is the public chat
-    channel that all avatars see as chat text. Channels 1 to
-    2,147,483,648 are private channels that are not sent to avatars
-    but other scripts can listen for through the <A
-HREF="#AEN2665"
->llListen</A
-> api.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4876"
->A.295. llWind</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4878"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->vector llWind</CODE
->(vector offset);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Returns the wind velocity below the object position +
-    <CODE
-CLASS="parameter"
->offset</CODE
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4886"
->A.296. llXorBase64Strings</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4888"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->string llXorBase64Strings</CODE
->(string s1, string s2);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Performs an exclusive or on two Base 64 strings and returns
-    a Base 64 string. The <CODE
-CLASS="parameter"
->s2</CODE
-> parameter repeats if
-    it is shorter than <CODE
-CLASS="parameter"
->s1</CODE
->.</P
-></DIV
-></DIV
-><DIV
-CLASS="appendix"
-><HR><H1
-><A
-NAME="AEN4899"
-></A
->Appendix B. Events</H1
-><P
->Every state must have at least one handler. You can choose to
-  handle an event by defining one of the reserved event
-  handlers named here.</P
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4902"
->B.1. at_rot_target</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4904"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->at_rot_target</CODE
->(integer number, rotation target_rotation, rotation our_rotation);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is triggered when a script comes within a defined
-    angle of a target rotation. The range is set by a call to <A
-HREF="#AEN3579"
->llRotTarget</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4916"
->B.2. at_target</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4918"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->not_at_target</CODE
->(integer number, vector target_position, vector our_position);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is triggered when a script comes within a defined
-    range from a target position. The range and position are set by a
-    call to <A
-HREF="#AEN4688"
->llTarget</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4930"
->B.3. attach</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4932"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->attach</CODE
->(key attached);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is triggered whenever a object with this script
-    is attached or detached from an avatar. If it is attached,
-    attached is the key of the avatar it is attached to, otherwise
-    attached is <A
-HREF="#AEN6070"
->NULL_KEY</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4940"
->B.4. changed</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4942"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->changed</CODE
->(integer changed);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Triggered when various events change the object. The
-    <CODE
-CLASS="parameter"
->changed</CODE
-> will be a bitfield of <A
-HREF="#AEN5690"
->change constants</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4951"
->B.5. collision</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4953"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->collision</CODE
->(integer total_number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is raised while another object is colliding with
-    the object the script is attached to. The number of detected
-    objects is passed to the script. Information on those objects may
-    be gathered via the <A
-HREF="#lib_lldetected"
->llDetected*</A
-> library
-    functions. (Collisions are also generated if a user walks into an
-    object.)</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4961"
->B.6. collision_end</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4963"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->collision_end</CODE
->(integer total_number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is raised when another object stops colliding
-    with the object the script is attached to. The number of detected
-    objects is passed to the script. Information on those objects may
-    be gathered via the <A
-HREF="#lib_lldetected"
->llDetected*</A
-> library
-    functions. (Collisions are also generated if a user walks into an
-    object.)</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4971"
->B.7. collision_start</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4973"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->collision_start</CODE
->(integer total_number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is raised when another object begins to collide
-    with the object the script is attached to. The number of detected
-    objects is passed to the script. Information on those objects may
-    be gathered via the <A
-HREF="#lib_lldetected"
->llDetected*</A
-> library
-    functions. (Collisions are also generated if a user walks into an
-    object.)</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4981"
->B.8. control</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4983"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->control</CODE
->(key name, integer levels, integer edges);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Once a script has the ability to grab control inputs from
-    the avatar, this event will be used to pass the commands into the
-    script. The <CODE
-CLASS="parameter"
->levels</CODE
-> and
-    <CODE
-CLASS="parameter"
->edges</CODE
-> are bitfields of <A
-HREF="#AEN5643"
->control constants</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN4997"
->B.9. dataserver</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN4999"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->dataserver</CODE
->(key requested, string data);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is triggered when the requested data is returned
-    to the script. Data may be requested by the <A
-HREF="#AEN3346"
->llRequestAgentData</A
->, the <A
-HREF="#AEN3391"
->llRequestSimulatorData</A
->, the
-    <A
-HREF="#AEN3363"
->llRequestInventoryData</A
->,
-    and the <A
-HREF="#AEN1946"
->llGetNotecardLine</A
-> function
-    calls.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5012"
->B.10. email</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5014"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->email</CODE
->(string time, string address, string subject, string body, integer remaining);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is triggered when an email sent to this script
-    arrives. The <CODE
-CLASS="parameter"
->remaining</CODE
-> tells how many more
-    emails are known as still pending.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5030"
->B.11. land_collision</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5032"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->land_collision</CODE
->(vector position);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is raised when the object the script is attached
-    to is colliding with the ground.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5039"
->B.12. land_collision_end</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5041"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->land_collision_end</CODE
->(vector position);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is raised when the object the script is attached
-    to stops colliding with the ground.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5048"
->B.13. land_collision_start</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5050"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->land_collision_start</CODE
->(vector position);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is raised when the object the script is attached
-    to begins to collide with the ground.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5057"
->B.14. link_message</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5059"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->link_message</CODE
->(integer sender_number, integer number, string message, key id);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Triggered when object receives a link message via <A
-HREF="#AEN2919"
->llMessageLinked</A
-> library
-    function call.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5073"
->B.15. listen</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5075"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->listen</CODE
->(integer channel, string name, key id, string message);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is raised whenever a chat message matching the
-    constraints passed in the <A
-HREF="#AEN2665"
->llListen</A
->
-    command is heard. The <CODE
-CLASS="parameter"
->name</CODE
-> and
-    <CODE
-CLASS="parameter"
->id</CODE
-> of the speaker as well as the
-    <CODE
-CLASS="parameter"
->message</CODE
-> are passed in as parameters.
-    Channel 0 is the public chat channel that all avatars see as chat
-    text. Channels 1 through 2,147,483,648 are private channels that
-    are not sent to avatars but other scripts can listen on those
-    channels.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5092"
->B.16. money</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5094"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->money</CODE
->(key giver, integer amount);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is triggered when user
-    <CODE
-CLASS="parameter"
->giver</CODE
-> has given an
-    <CODE
-CLASS="parameter"
->amount</CODE
-> of Linden dollars to the
-    object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5105"
->B.17. moving_end</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5107"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->moving_end</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Triggered whenever a object with this script stops
-    moving.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5113"
->B.18. moving_start</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5115"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->moving_start</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Triggered whenever a object with this script starts
-    moving.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5121"
->B.19. no_sensor</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5123"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->no_sensor</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is raised when sensors are active (via the <A
-HREF="#AEN3693"
->llSensor</A
-> library call) but are not
-    sensing anything.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5130"
->B.20. not_at_rot_target</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5132"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->not_at_rot_target</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->When a target is set via the <A
-HREF="#AEN3579"
->llRotTarget</A
-> library call, but the
-    script is outside the specified angle this event is raised.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5139"
->B.21. not_at_target</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5141"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->not_at_target</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->When a target is set via the <A
-HREF="#AEN4688"
->llTarget</A
-> library call, but the
-    script is outside the specified range this event is raised.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5148"
->B.22. object_rez</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5150"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->object_rez</CODE
->(key id);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Triggered when object rezzes another object from its
-    inventory via the <A
-HREF="#AEN3461"
->llRezObject</A
-> api. The
-    <CODE
-CLASS="parameter"
->id</CODE
-> is the globally unique key for the
-    object.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5159"
->B.23. on_rez</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5161"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->on_rez</CODE
->(integer start_param);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Triggered whenever a object is rezzed from inventory or by
-    another object. The <CODE
-CLASS="parameter"
->start_param</CODE
-> is the
-    parameter passed in from the call to <A
-HREF="#AEN3461"
->llRezObject</A
-> or <A
-HREF="#AEN3434"
->llRezAtRoot</A
->.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5171"
->B.24. run_time_permissions</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5173"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->run_time_permissions</CODE
->(integer permissions);</CODE
-></P
-><P
-></P
-></DIV
-><P
->Scripts need permission from either the owner or the avatar
-    they wish to act on before they perform certain functions, such as
-    debiting money from their owner's account, triggering an animation
-    on an avatar, or capturing control inputs. The <A
-HREF="#AEN3375"
->llRequestPermissions</A
->
-    library function is used to request these permissions and the
-    various <A
-HREF="#AEN5360"
->permissions integer
-    constants</A
-> can be supplied. The integer returned to this
-    event handler contains the current set of permissions flags, so if
-    <CODE
-CLASS="parameter"
->permissions</CODE
-> equal 0 then no permissions are
-    set.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5183"
->B.25. sensor</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5185"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->sensor</CODE
->(integer total_number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is raised whenever objects matching the
-    constraints of the <A
-HREF="#AEN3693"
->llSensor</A
->
-    command are detected. The number of detected objects is passed to
-    the script in the <CODE
-CLASS="parameter"
->total_number</CODE
->
-    parameter. A maximum of 16 objects are passed to this event.
-	Information on those objects may be gathered via the
-    <A
-HREF="#lib_lldetected"
->llDetected*</A
-> library
-    functions.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5195"
->B.26. state_entry</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5197"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->state_entry</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->The state_entry event occurs whenever a new state is
-    entered, including program start, and is always the first event
-    handled.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5203"
->B.27. state_exit</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5205"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->state_exit</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->The state_exit event occurs whenever the state command is
-    used to transition to another state. It is handled before the new
-    state's state_entry event.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5211"
->B.28. timer</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5213"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->timer</CODE
->(void);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is raised at regular intervals set by the <A
-HREF="#AEN4188"
->llSetTimerEvent</A
-> library
-    function.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5220"
->B.29. touch</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5222"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->touch</CODE
->(integer total_number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is raised while a user is touching the object the
-    script is attached to. The number of touching objects is passed to
-    the script in the <CODE
-CLASS="parameter"
->total_number</CODE
->
-    parameter. Information on those objects may be gathered via the
-    <A
-HREF="#lib_lldetected"
->llDetected*</A
-> library
-    functions.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5231"
->B.30. touch_end</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5233"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->touch_end</CODE
->(integer total_number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is raised when a user stops touching the object
-    the script is attached to. The number of touching objects is
-    passed to the script in the <CODE
-CLASS="parameter"
->total_number</CODE
->
-    parameter. Information on those objects may be gathered via the
-    <A
-HREF="#lib_lldetected"
->llDetected*</A
-> library
-    functions.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5242"
->B.31. touch_start</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5244"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->touch_start</CODE
->(integer total_number);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is raised when a user first touches the object
-    the script is attached to. The number of touching objects is
-    passed to the script in the <CODE
-CLASS="parameter"
->total_number</CODE
->
-    parameter. Information on those objects may be gathered via the
-    <A
-HREF="#lib_lldetected"
->llDetected*</A
-> library
-    functions.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5253"
->B.32. remote_data</A
-></H2
-><DIV
-CLASS="funcsynopsis"
-><P
-></P
-><A
-NAME="AEN5255"
-></A
-><P
-><CODE
-><CODE
-CLASS="FUNCDEF"
->remote_data</CODE
->(integer type, key channel, key message_id, string sender, integer ival, string sval);</CODE
-></P
-><P
-></P
-></DIV
-><P
->This event is raised when a user creates an XML-RPC
-    channel via <A
-HREF="#AEN3011"
->llOpenRemoteDataChannel</A
->,
-    a remote XML-RPC server replies to a <A
-HREF="#AEN3680"
->llSendRemoteData</A
->,
-    or a remote XML-RPC client sends in an XML-RPC request.  In the open case,
-    <CODE
-CLASS="parameter"
->type</CODE
-> = REMOTE_DATA_CHANNEL, <CODE
-CLASS="parameter"
->channel</CODE
-> = NULL_KEY,
-    <CODE
-CLASS="parameter"
->message_id</CODE
-> = NULL_KEY, <CODE
-CLASS="parameter"
->sender</CODE
-> is an empty string,
-    <CODE
-CLASS="parameter"
->ival</CODE
-> = 0, and <CODE
-CLASS="parameter"
->sval</CODE
-> is an empty string.  In the reply case,
-    <CODE
-CLASS="parameter"
->type</CODE
-> = REMOTE_DATA_REPLY, <CODE
-CLASS="parameter"
->channel</CODE
-> is set to the channel that the request was sent on,
-    <CODE
-CLASS="parameter"
->message_id</CODE
-> is set to the id of the message, <CODE
-CLASS="parameter"
->sender</CODE
-> is an empty string,
-    <CODE
-CLASS="parameter"
->ival</CODE
-> = 0, and <CODE
-CLASS="parameter"
->sval</CODE
-> is a string.  In the remote request case,
-    <CODE
-CLASS="parameter"
->type</CODE
-> = REMOTE_DATA_REQUEST, <CODE
-CLASS="parameter"
->channel</CODE
-> is set to the channel that sent the message,
-    <CODE
-CLASS="parameter"
->message_id</CODE
-> is set to the id of the message, <CODE
-CLASS="parameter"
->sender</CODE
-> is set by the sender,
-    <CODE
-CLASS="parameter"
->ival</CODE
-> is an integer, and <CODE
-CLASS="parameter"
->sval</CODE
-> is a string.
-    parameter.</P
-></DIV
-></DIV
-><DIV
-CLASS="appendix"
-><HR><H1
-><A
-NAME="AEN5292"
-></A
->Appendix C. Constants</H1
-><P
->To ease scripting, many useful constants are defined by
-  LSL.</P
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5295"
->C.1. Boolean Constants</A
-></H2
-><P
->The boolean constants represent the values for TRUE and
-    FALSE. LSL represents booleans as integer values 1 and 0
-    respectively. Since there is no boolean type these constants act
-    as a scripting aid usually employed for testing variables which
-    conceptually represent boolean values.</P
-><P
-><P
-></P
-><UL
-><LI
-><P
->TRUE</P
-></LI
-><LI
-><P
->FALSE</P
-></LI
-></UL
-></P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5304"
->C.2. Status Constants</A
-></H2
-><P
->The status constants are used in the <A
-HREF="#AEN4095"
->llSetStatus</A
-> and <A
-HREF="#AEN2184"
->llGetStatus</A
-> library calls. These
-    constants can be bitwise or'ed together when calling the library
-    functions to set the same value to more than one status
-    flag</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Status Constants</B
-></P
-><DL
-><DT
->STATUS_PHYSICS</DT
-><DD
-><P
->Controls whether the object moves
-        physically. This controls the same flag that the ui checkbox
-        for 'Physical' controls. The default is FALSE.</P
-></DD
-><DT
->STATUS_PHANTOM</DT
-><DD
-><P
->Controls whether the object collides or
-        not. Setting the value to TRUE makes the object non-colliding
-        with all objects. It is a good idea to use this for most
-        objects that move or rotate, but are non-physical. It is also
-        useful for simulating volumetric lighting. The default is
-        FALSE.</P
-></DD
-><DT
->STATUS_ROTATE_X, STATUS_ROTATE_Y, STATUS_ROTATE_Z</DT
-><DD
-><P
->Controls whether the object can physically rotate
-          around the specific axis or not. This flag has no meaning
-          for non-physical objects. Set the value to FALSE 
-          to disable rotation around that axis. The default is TRUE
-          for a physical object.</P
-><P
->A useful example to think about when visualizing the
-          effect is a 'sit-and-spin' device. They spin around the Z
-          axis (up) but not around the X or Y axis.</P
-></DD
-><DT
->STATUS_BLOCK_GRAB</DT
-><DD
-><P
->Controls whether the object can be grabbed. A
-        grab is the default action when in third person, and is
-        available as the 'hand' tool in build mode. This is useful for
-        physical objects that you don't want other people to be able
-        to trivially disturb. The default if FALSE</P
-></DD
-><DT
->STATUS_SANDBOX</DT
-><DD
-><P
->Controls whether the object can cross region
-        boundaries and move more than 20 meters from its creation
-        point. The default if FALSE.</P
-></DD
-><DT
->STATUS_DIE_AT_EDGE</DT
-><DD
-><P
->Controls whether the object is returned to the
-        owner's inventory if it wanders off the edge of the world. It
-        is useful to set this status TRUE for things like bullets or
-        rockets. The default is TRUE</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5338"
->C.3. Object Type Constants</A
-></H2
-><P
->These constants can be combined using the binary '|'
-    operator and are used in the <A
-HREF="#AEN3693"
->llSensor</A
-> and related calls.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Object Type Constants</B
-></P
-><DL
-><DT
->AGENT</DT
-><DD
-><P
->Objects in world that are agents.</P
-></DD
-><DT
->ACTIVE</DT
-><DD
-><P
->Objects in world that are running a script or
-        currently physically moving.</P
-></DD
-><DT
->PASSIVE</DT
-><DD
-><P
->Static in-world objects.</P
-></DD
-><DT
->SCRIPTED</DT
-><DD
-><P
->Scripted in-world objects.</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5360"
->C.4. Permission Constants</A
-></H2
-><P
->The permission constants are used for passing values to
-    <A
-HREF="#AEN3375"
->llRequestPermissions</A
->,
-    determining the value of <A
-HREF="#AEN2048"
->llGetPermissions</A
->, and
-    explicitly passed to the <A
-HREF="#AEN5171"
->run_time_permissions</A
->
-    event. For many of the basic library functions to work, a
-    specific permission must be enabled. The permission constants can
-    be or'ed together to be used in conjunction.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Permission Constants</B
-></P
-><DL
-><DT
->PERMISSION_DEBIT</DT
-><DD
-><P
->If this permission is enabled, the object can
-        successfully call <A
-HREF="#AEN2342"
->llGiveMoney</A
-> to debit the
-        owner's account.</P
-></DD
-><DT
->PERMISSION_TAKE_CONTROLS</DT
-><DD
-><P
->If this permission enabled, the object can
-        successfully call the <A
-HREF="#AEN4661"
->llTakeControls</A
-> library
-        call.</P
-></DD
-><DT
->PERMISSION_REMAP_CONTROLS</DT
-><DD
-><P
->(not yet implemented)</P
-></DD
-><DT
->PERMISSION_TRIGGER_ANIMATION</DT
-><DD
-><P
->If this permission is enabled, the object can
-        successfully call <A
-HREF="#AEN4346"
->llStartAnimation</A
-> for the
-        avatar that owns this object.</P
-></DD
-><DT
-><A
-NAME="const_permission_attach"
-></A
->PERMISSION_ATTACH</DT
-><DD
-><P
->If this permission is enabled, the object can
-        successfully call <A
-HREF="#AEN1119"
->llAttachToAvatar</A
-> to attach
-        to the given avatar.</P
-></DD
-><DT
->PERMISSION_RELEASE_OWNERSHIP</DT
-><DD
-><P
->(not yet implemented)</P
-></DD
-><DT
-><A
-NAME="const_permission_change_links"
-></A
->PERMISSION_CHANGE_LINKS</DT
-><DD
-><P
->If this permission is enabled, the object can
-        successfully call <A
-HREF="#AEN1292"
->llCreateLink</A
->, <A
-HREF="#AEN1191"
->llBreakLink</A
->, and <A
-HREF="#AEN1182"
->llBreakAllLinks</A
-> to change
-        links to other objects.</P
-></DD
-><DT
->PERMISSION_CHANGE_JOINTS</DT
-><DD
-><P
->(not yet implemented)</P
-></DD
-><DT
->PERMISSION_CHANGE_PERMISSIONS</DT
-><DD
-><P
->(not yet implemented)</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5411"
->C.5. Inventory Constants</A
-></H2
-><P
->These constants can be used to refer to a specific inventory
-    type in calls to <A
-HREF="#AEN1789"
->llGetInventoryNumber</A
-> and
-    <A
-HREF="#AEN1774"
->llGetInventoryName</A
->.  They
-	are also returned by <A
-HREF="#AEN1816"
->llGetInventoryType</A
->.
-	</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Inventory Constants</B
-></P
-><DL
-><DT
->INVENTORY_TEXTURE, INVENTORY_SOUND, INVENTORY_OBJECT, INVENTORY_SCRIPT, INVENTORY_LANDMARK, INVENTORY_CLOTHING, INVENTORY_NOTECARD, INVENTORY_BODYPART, INVENTORY_ANIMATION, INVENTORY_GESTURE, INVENTORY_ALL, INVENTORY_NONE</DT
-><DD
-><P
->Each constant refers to the named type of
-        inventory.</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5434"
->C.6. Pay Price Constants</A
-></H2
-><P
->These constants can be used in <A
-HREF="#AEN1789"
->llSetPayPrice</A
-></P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Pay Price Constants</B
-></P
-><DL
-><DT
->PAY_HIDE</DT
-><DD
-><P
->Do not show this quick pay button.</P
-></DD
-><DT
->PAY_DEFAULT</DT
-><DD
-><P
->Use the default value for this quick pay button.</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5448"
->C.7. Attachment Constants</A
-></H2
-><P
->These constants are used to refer to attachment points in
-    calls to <A
-HREF="#AEN1119"
->llAttachToAvatar</A
->.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Attachment Constants</B
-></P
-><DL
-><DT
->ATTACH_CHEST</DT
-><DD
-><P
->Attach to the avatar chest.</P
-></DD
-><DT
->ATTACH_HEAD</DT
-><DD
-><P
->Attach to the avatar head.</P
-></DD
-><DT
->ATTACH_LSHOULDER</DT
-><DD
-><P
->Attach to the avatar left shoulder.</P
-></DD
-><DT
->ATTACH_RSHOULDER</DT
-><DD
-><P
->Attach to the avatar right shoulder.</P
-></DD
-><DT
->ATTACH_LHAND</DT
-><DD
-><P
->Attach to the avatar left hand.</P
-></DD
-><DT
->ATTACH_RHAND</DT
-><DD
-><P
->Attach to the avatar right hand.</P
-></DD
-><DT
->ATTACH_LFOOT</DT
-><DD
-><P
->Attach to the avatar left foot.</P
-></DD
-><DT
->ATTACH_RFOOT</DT
-><DD
-><P
->Attach to the avatar right foot.</P
-></DD
-><DT
->ATTACH_BACK</DT
-><DD
-><P
->Attach to the avatar back.</P
-></DD
-><DT
->ATTACH_PELVIS</DT
-><DD
-><P
->Attach to the avatar pelvis.</P
-></DD
-><DT
->ATTACH_MOUTH</DT
-><DD
-><P
->Attach to the avatar mouth.</P
-></DD
-><DT
->ATTACH_CHIN</DT
-><DD
-><P
->Attach to the avatar chin.</P
-></DD
-><DT
->ATTACH_LEAR</DT
-><DD
-><P
->Attach to the avatar left ear.</P
-></DD
-><DT
->ATTACH_REAR</DT
-><DD
-><P
->Attach to the avatar right ear.</P
-></DD
-><DT
->ATTACH_LEYE</DT
-><DD
-><P
->Attach to the avatar left eye.</P
-></DD
-><DT
->ATTACH_REYE</DT
-><DD
-><P
->Attach to the avatar right eye.</P
-></DD
-><DT
->ATTACH_NOSE</DT
-><DD
-><P
->Attach to the avatar nose.</P
-></DD
-><DT
->ATTACH_RUARM</DT
-><DD
-><P
->Attach to the avatar right upper arm.</P
-></DD
-><DT
->ATTACH_RLARM</DT
-><DD
-><P
->Attach to the avatar right lower arm.</P
-></DD
-><DT
->ATTACH_LUARM</DT
-><DD
-><P
->Attach to the avatar left upper arm.</P
-></DD
-><DT
->ATTACH_LLARM</DT
-><DD
-><P
->Attach to the avatar left lower arm.</P
-></DD
-><DT
->ATTACH_RHIP</DT
-><DD
-><P
->Attach to the avatar right hip.</P
-></DD
-><DT
->ATTACH_RULEG</DT
-><DD
-><P
->Attach to the avatar right upper leg.</P
-></DD
-><DT
->ATTACH_RLLEG</DT
-><DD
-><P
->Attach to the avatar right lower leg.</P
-></DD
-><DT
->ATTACH_LHIP</DT
-><DD
-><P
->Attach to the avatar left hip.</P
-></DD
-><DT
->ATTACH_LULEG</DT
-><DD
-><P
->Attach to the avatar lower upper leg.</P
-></DD
-><DT
->ATTACH_LLLEG</DT
-><DD
-><P
->Attach to the avatar lower left leg.</P
-></DD
-><DT
->ATTACH_BELLY</DT
-><DD
-><P
->Attach to the avatar belly.</P
-></DD
-><DT
->ATTACH_RPEC</DT
-><DD
-><P
->Attach to the avatar right pectoral.</P
-></DD
-><DT
->ATTACH_LPEC</DT
-><DD
-><P
->Attach to the avatar left pectoral.</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5574"
->C.8. Land Constants</A
-></H2
-><P
->These constants are only used in calls to <A
-HREF="#AEN2949"
->llModifyLand</A
->. The constants
-    are equivalent to the similarly labelled user interface elements
-    for editing land in the viewer.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Land Constants</B
-></P
-><DL
-><DT
->LAND_LEVEL</DT
-><DD
-><P
->Action to make the land flat and level.</P
-></DD
-><DT
->LAND_RAISE</DT
-><DD
-><P
->Action to raise the land.</P
-></DD
-><DT
->LAND_LOWER</DT
-><DD
-><P
->Action to lower the land.</P
-></DD
-><DT
->LAND_SMOOTH</DT
-><DD
-><P
->Action to smooth the land.</P
-></DD
-><DT
->LAND_NOISE</DT
-><DD
-><P
->Action to push the land toward a pseudo-random 
-		heightfield.</P
-></DD
-><DT
->LAND_REVERT</DT
-><DD
-><P
->Action to push the land toward the original
-		shape from when it was first terraformed.</P
-></DD
-><DT
->LAND_SMALL_BRUSH</DT
-><DD
-><P
->Use a small brush size.</P
-></DD
-><DT
->LAND_MEDIUM_BRUSH</DT
-><DD
-><P
->Use a medium brush size.</P
-></DD
-><DT
->LAND_LARGE_BRUSH</DT
-><DD
-><P
->Use a large brush size.</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5616"
->C.9. Link Constants</A
-></H2
-><P
->These constants are used in calls to <A
-HREF="#AEN3906"
->llSetLinkColor</A
-> and <A
-HREF="#AEN2919"
->llMessageLinked</A
->.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Link Constants</B
-></P
-><DL
-><DT
->LINK_SET</DT
-><DD
-><P
->This targets every object in the linked
-        set.</P
-></DD
-><DT
->LINK_ROOT</DT
-><DD
-><P
->This targets the root of the linked
-        set.</P
-></DD
-><DT
->LINK_ALL_OTHERS</DT
-><DD
-><P
->This targets every object in the linked set
-        except the object with the script.</P
-></DD
-><DT
->LINK_ALL_CHILDREN</DT
-><DD
-><P
->This targets every object except the root in
-        the linked set.</P
-></DD
-><DT
->LINK_THIS</DT
-><DD
-><P
->This targets the object making the call only.
-		</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5643"
->C.10. Control Constants</A
-></H2
-><P
->These constants are used in <A
-HREF="#AEN4661"
->llTakeControls</A
-> as well as the
-    <A
-HREF="#AEN4981"
->control</A
-> event handler.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Control Constants</B
-></P
-><DL
-><DT
->CONTROL_FWD</DT
-><DD
-><P
->Test for the avatar move forward
-        control.</P
-></DD
-><DT
->CONTROL_BACK</DT
-><DD
-><P
->Test for the avatar move back
-        control.</P
-></DD
-><DT
->CONTROL_LEFT</DT
-><DD
-><P
->Test for the avatar move left
-        control.</P
-></DD
-><DT
->CONTROL_RIGHT</DT
-><DD
-><P
->Test for the avatar move right
-        control.</P
-></DD
-><DT
->CONTROL_ROT_LEFT</DT
-><DD
-><P
->Test for the avatar rotate left
-        control.</P
-></DD
-><DT
->CONTROL_ROT_RIGHT</DT
-><DD
-><P
->Test for the avatar rotate right
-        control.</P
-></DD
-><DT
->CONTROL_UP</DT
-><DD
-><P
->Test for the avatar move up
-        control.</P
-></DD
-><DT
->CONTROL_DOWN</DT
-><DD
-><P
->Test for the avatar move down
-        control.</P
-></DD
-><DT
->CONTROL_LBUTTON</DT
-><DD
-><P
->Test for the avatar left button
-        control.</P
-></DD
-><DT
->CONTROL_ML_BUTTON</DT
-><DD
-><P
->Test for the avatar left button control while
-        in mouse look.</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5690"
->C.11. Change Constants</A
-></H2
-><P
->These constants are used in the <A
-HREF="#AEN4940"
->changed</A
-> event handler.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Change Constants</B
-></P
-><DL
-><DT
->CHANGED_INVENTORY</DT
-><DD
-><P
->The object inventory has changed.</P
-></DD
-><DT
->CHANGED_ALLOWED_DROP</DT
-><DD
-><P
->The object inventory has changed because an item
-        was added through the <A
-HREF="#AEN1047"
->llAllowInventoryDrop</A
->
-        interface.</P
-></DD
-><DT
->CHANGED_COLOR</DT
-><DD
-><P
->The object color has changed.</P
-></DD
-><DT
->CHANGED_SHAPE</DT
-><DD
-><P
->The object shape has changed, eg, a box to a
-        cylinder</P
-></DD
-><DT
->CHANGED_SCALE</DT
-><DD
-><P
->The object scale has changed.</P
-></DD
-><DT
->CHANGED_TEXTURE</DT
-><DD
-><P
->The texture offset, scale rotation, or simply
-        the object texture has changed.</P
-></DD
-><DT
->CHANGED_LINK</DT
-><DD
-><P
->The object has linked or its links were
-        broken.</P
-></DD
-><DT
->CHANGED_REGION</DT
-><DD
-><P
->The object has changed regions.</P
-></DD
-><DT
->CHANGED_TELEPORT</DT
-><DD
-><P
->The object has been teleported.</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5733"
->C.12. Type Constants</A
-></H2
-><P
->These constants are used to determine the variable type
-    stored in a heterogeneous list. The value returned from <A
-HREF="#AEN1875"
->llGetListEntryType</A
-> can be
-    used for comparison against these constants.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Type Constants</B
-></P
-><DL
-><DT
->TYPE_INTEGER</DT
-><DD
-><P
->The list entry is an integer.</P
-></DD
-><DT
->TYPE_FLOAT</DT
-><DD
-><P
->The list entry is a float.</P
-></DD
-><DT
->TYPE_STRING</DT
-><DD
-><P
->The list entry is a string.</P
-></DD
-><DT
->TYPE_KEY</DT
-><DD
-><P
->The list entry is a key.</P
-></DD
-><DT
->TYPE_VECTOR</DT
-><DD
-><P
->The list entry is a vector.</P
-></DD
-><DT
->TYPE_ROTATION</DT
-><DD
-><P
->The list entry is a rotation.</P
-></DD
-><DT
->TYPE_INVALID</DT
-><DD
-><P
->The list entry is invalid.</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5767"
->C.13. Agent Info Constants</A
-></H2
-><P
->Each of these constants represents a bit in the integer
-    returned from the <A
-HREF="#AEN1605"
->llGetAgentInfo</A
-> function and can
-    be used in an expression to determine the specified information
-    about an agent.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Agent Info Constants</B
-></P
-><DL
-><DT
->AGENT_FLYING</DT
-><DD
-><P
->The agent is flying.</P
-></DD
-><DT
->AGENT_ATTACHMENTS</DT
-><DD
-><P
->The agent has attachments.</P
-></DD
-><DT
->AGENT_SCRIPTED</DT
-><DD
-><P
->The agent has scripted attachments.</P
-></DD
-><DT
->AGENT_SITTING</DT
-><DD
-><P
->The agent is sitting.</P
-></DD
-><DT
->AGENT_ON_OBJECT</DT
-><DD
-><P
->The agent is sitting on an object.</P
-></DD
-><DT
->AGENT_WALKING</DT
-><DD
-><P
->The agent is walking.</P
-></DD
-><DT
->AGENT_IN_AIR</DT
-><DD
-><P
->The agent is in the air.</P
-></DD
-><DT
->AGENT_MOUSELOOK</DT
-><DD
-><P
->The agent is in mouselook.</P
-></DD
-><DT
->AGENT_AWAY</DT
-><DD
-><P
->The agent is away (AFK).</P
-></DD
-><DT
->AGENT_TYPING</DT
-><DD
-><P
->The agent is typing.</P
-></DD
-><DT
->AGENT_CROUCHING</DT
-><DD
-><P
->The agent is crouching.</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5817"
->C.14. Texture Animation
-    Constants</A
-></H2
-><P
->These constants are used in the <A
-HREF="#AEN4140"
->llSetTextureAnim</A
-> api to
-    control the animation mode.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Texture Animation Constants</B
-></P
-><DL
-><DT
->ANIM_ON</DT
-><DD
-><P
->Texture animation is on.</P
-></DD
-><DT
->LOOP</DT
-><DD
-><P
->Loop the texture animation.</P
-></DD
-><DT
->REVERSE</DT
-><DD
-><P
->Play animation in reverse direction.</P
-></DD
-><DT
->PING_PONG</DT
-><DD
-><P
->play animation going forwards, then
-        backwards.</P
-></DD
-><DT
->SMOOTH</DT
-><DD
-><P
->slide in the X direction, instead of playing
-        separate frames.</P
-></DD
-><DT
->ROTATE</DT
-><DD
-><P
->Animate texture rotation.</P
-></DD
-><DT
->SCALE</DT
-><DD
-><P
->Animate the texture scale.</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN5851"
->C.15. Particle System Constants</A
-></H2
-><P
->These constants are used in calls to the <A
-HREF="#AEN3149"
->llParticleSystem</A
-> api to
-    specify parameters.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Particle System Parameters</B
-></P
-><DL
-><DT
->PSYS_PART_FLAGS</DT
-><DD
-><P
->Each particle that is emitted by the particle system
-          is simulated based on the following flags. To use multiple
-          flags, bitwise or (|) them together.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->PSYS_PART_FLAGS Values</B
-></P
-><DL
-><DT
->PSYS_PART_INTERP_COLOR_MASK</DT
-><DD
-><P
->Interpolate both the color and alpha
-                from the start value to the end
-                value.</P
-></DD
-><DT
->PSYS_PART_INTERP_SCALE_MASK</DT
-><DD
-><P
->Interpolate the particle scale from
-                the start value to the end value.</P
-></DD
-><DT
->PSYS_PART_WIND_MASK</DT
-><DD
-><P
->Particles have their velocity damped
-                towards the wind velocity.</P
-></DD
-><DT
->PSYS_PART_BOUNCE_MASK</DT
-><DD
-><P
->Particles bounce off of a plane at the
-                object's Z height.</P
-></DD
-><DT
->PSYS_PART_FOLLOW_SRC_MASK</DT
-><DD
-><P
->The particle position is relative to
-                the source object's position.</P
-></DD
-><DT
->PSYS_PART_FOLLOW_VELOCITY_MASK</DT
-><DD
-><P
->The particle orientation is rotated so
-                the vertical axis faces towards the particle
-                velocity.</P
-></DD
-><DT
->PSYS_PART_TARGET_POS_MASK</DT
-><DD
-><P
->The particle heads towards the
-                location of the target object as defined by
-                PSYS_SRC_TARGET_KEY.</P
-></DD
-><DT
->PSYS_PART_EMISSIVE_MASK</DT
-><DD
-><P
->The particle glows.</P
-></DD
-><DT
->PSYS_PART_RANDOM_ACCEL_MASK</DT
-><DD
-><P
->(not implemented)</P
-></DD
-><DT
->PSYS_PART_RANDOM_VEL_MASK</DT
-><DD
-><P
->(not implemented)</P
-></DD
-><DT
->PSYS_PART_TRAIL_MASK</DT
-><DD
-><P
->(not implemented)</P
-></DD
-></DL
-></DIV
-></DD
-><DT
->PSYS_SRC_PATTERN</DT
-><DD
-><P
->The pattern which is used to generate particles. Use
-          one of the following values:</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->PSYS_SRC_PATTERN Values</B
-></P
-><DL
-><DT
->PSYS_SRC_PATTERN_DROP</DT
-><DD
-><P
->Drop particles at the source
-                position.</P
-></DD
-><DT
->PSYS_SRC_PATTERN_EXPLODE</DT
-><DD
-><P
->Shoot particles out in all directions,
-                using the burst parameters.</P
-></DD
-><DT
->PSYS_SRC_PATTERN_ANGLE</DT
-><DD
-><P
->Shoot particles across a 2 dimensional
-                area defined by the arc created from
-                PSYS_SRC_OUTERANGLE. There will be an open area
-                defined by PSYS_SRC_INNERANGLE within the larger
-                arc.</P
-></DD
-><DT
->PSYS_SRC_PATTERN_ANGLE_CONE</DT
-><DD
-><P
->Shoot particles out in a 3 dimensional
-                cone with an outer arc of PSYS_SRC_OUTERANGLE and an
-                inner open area defined by
-                PSYS_SRC_INNERANGLE.</P
-></DD
-></DL
-></DIV
-></DD
-><DT
->PSYS_PART_START_COLOR</DT
-><DD
-><P
->a vector &#60;r,g,b&#62; which determines the starting
-        color of the object.</P
-></DD
-><DT
->PSYS_PART_START_ALPHA</DT
-><DD
-><P
->a float which determines the starting alpha of
-        the object.</P
-></DD
-><DT
->PSYS_PART_END_COLOR</DT
-><DD
-><P
->a vector &#60;r, g, b&#62; which determines the ending
-        color of the object.</P
-></DD
-><DT
->PSYS_PART_END_ALPHA</DT
-><DD
-><P
->a float which determines the ending alpha of
-        the object.</P
-></DD
-><DT
->PSYS_PART_START_SCALE</DT
-><DD
-><P
->a vector &#60;sx, sy, z&#62;, which is the starting
-        size of the particle billboard in meters (z is
-        ignored).</P
-></DD
-><DT
->PSYS_PART_END_SCALE</DT
-><DD
-><P
->a vector &#60;sx, sy, z&#62;, which is the ending size
-        of the particle billboard in meters (z is
-        ignored).</P
-></DD
-><DT
->PSYS_PART_MAX_AGE</DT
-><DD
-><P
->age in seconds of a particle at which it
-        dies.</P
-></DD
-><DT
->PSYS_SRC_ACCEL</DT
-><DD
-><P
->a vector &#60;x, y, z&#62; which is the acceleration
-        to apply on particles.</P
-></DD
-><DT
->PSYS_SRC_TEXTURE</DT
-><DD
-><P
->an asset name for the texture to use for the
-        particles.</P
-></DD
-><DT
->PSYS_SRC_BURST_RATE</DT
-><DD
-><P
->how often to release a particle burst (float
-        seconds).</P
-></DD
-><DT
->PSYS_SRC_INNERANGLE</DT
-><DD
-><P
->specifies the inner angle of the arc created
-        by the PSYS_SRC_PATTERN_ANGLE or
-        PSYS_SRC_PATTERN_ANGLE_CONE source pattern. The area
-        specified will not have particles in it..</P
-></DD
-><DT
->PSYS_SRC_OUTERANGLE</DT
-><DD
-><P
->specifies the outer angle of the arc created
-        by the PSYS_SRC_PATTERN_ANGLE or
-        PSYS_SRC_PATTERN_ANGLE_CONE source pattern. The area
-        between the outer and inner angle will be filled with
-        particles..</P
-></DD
-><DT
->PSYS_SRC_BURST_PART_COUNT</DT
-><DD
-><P
->how many particles to release in a
-        burst.</P
-></DD
-><DT
->PSYS_SRC_BURST_RADIUS</DT
-><DD
-><P
->what distance from the center of the object to
-        create the particles.</P
-></DD
-><DT
->PSYS_SRC_BURST_SPEED_MIN</DT
-><DD
-><P
->minimum speed that a particle should be
-        moving.</P
-></DD
-><DT
->PSYS_SRC_BURST_SPEED_MAX</DT
-><DD
-><P
->maximum speed that a particle should be
-        moving.</P
-></DD
-><DT
->PSYS_SRC_MAX_AGE</DT
-><DD
-><P
->how long this particle system should last, 0.0
-        means forever.</P
-></DD
-><DT
->PSYS_SRC_TARGET_KEY</DT
-><DD
-><P
->the key of a target object to move towards if
-        PSYS_PART_TARGET_POS_MASK is enabled.</P
-></DD
-><DT
->PSYS_SRC_OMEGA</DT
-><DD
-><P
->Sets the angular velocity to rotate the axis
-        that SRC_PATTERN_ANGLE and SRC_PATTERN_ANGLE_CONE
-        use..</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6005"
->C.16. Agent Data Constants</A
-></H2
-><P
->These constants are used in calls to the <A
-HREF="#AEN3346"
->llRequestAgentData</A
-> api to
-    collect information about an agent which will be provided in the
-    <A
-HREF="#AEN4997"
->dataserver event</A
->.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Agent Data Constants</B
-></P
-><DL
-><DT
->DATA_ONLINE</DT
-><DD
-><P
->"1" for online "0" for
-        offline.</P
-></DD
-><DT
->DATA_NAME</DT
-><DD
-><P
->The name of the agent.</P
-></DD
-><DT
->DATA_BORN</DT
-><DD
-><P
->The date the agent was born returned in ISO
-        8601 format of YYYY-MM-DD.</P
-></DD
-><DT
->DATA_RATING</DT
-><DD
-><P
->Returns the agent ratings as a comma separated
-        string of six integers. They are:
-          <P
-></P
-><OL
-TYPE="1"
-><LI
-><P
->Positive rated behavior</P
-></LI
-><LI
-><P
->Negative rated behavior</P
-></LI
-><LI
-><P
->Positive rated appearance</P
-></LI
-><LI
-><P
->Negative rated appearance</P
-></LI
-><LI
-><P
->Positive rated building</P
-></LI
-><LI
-><P
->Negative rated building</P
-></LI
-></OL
->
-        </P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6041"
->C.17. Float Constants</A
-></H2
-><P
->LSL provides a small collection of floating point constants
-    for use in float arithmetic. These constants are usually employed
-    while performing trigonometric calculations, but are sometimes
-    useful for other applications such as specifying arc radians to
-    sensor or particle system functions.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Float Constants</B
-></P
-><DL
-><DT
->PI</DT
-><DD
-><P
->3.14159265 - The radians of a
-        hemicircle.</P
-></DD
-><DT
->TWO_PI</DT
-><DD
-><P
->6.28318530 - The radians of a
-        circle.</P
-></DD
-><DT
->PI_BY_TWO</DT
-><DD
-><P
->1.57079633 - The radians of a quarter
-        circle.</P
-></DD
-><DT
->DEG_TO_RAD</DT
-><DD
-><P
->0.01745329 - Number of radians per degree.
-        You can use this to convert degrees to radians by multiplying
-        the degrees by this number.</P
-></DD
-><DT
->RAD_TO_DEG</DT
-><DD
-><P
->57.2957795 - Number of degrees per radian. You
-        can use this number to convert radians to degrees by
-        multiplying the radians by this number.</P
-></DD
-><DT
->SQRT2</DT
-><DD
-><P
->1.41421356 - The square root of 2.</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6070"
->C.18. Key Constant</A
-></H2
-><P
->There is only one key constant which acts as an invalid
-    key: NULL_KEY.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6073"
->C.19. Miscellaneous Integer Constants</A
-></H2
-><P
->There is one uncategorized integer constant which is used in
-    some of the texturing and coloring api: ALL_SIDES</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6076"
->C.20. Miscellaneous String
-    Constants</A
-></H2
-><P
->There is one uncategorized string constant
-    which is used in the <A
-HREF="#AEN4997"
->dataserver</A
-> event:
-    EOF</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6080"
->C.21. Vector Constant</A
-></H2
-><P
->There is only one vector constant which acts as a zero
-    vector: ZERO_VECTOR = &#60;0,0,0&#62;.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6083"
->C.22. Rotation Constant</A
-></H2
-><P
->There is only one rotation constant which acts as a zero
-    rotation: ZERO_ROTATION = &#60;0,0,0,1&#62;.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6086"
->C.23. Simulator Data Constants</A
-></H2
-><P
->These constants are used in calls to the <A
-HREF="#AEN3391"
->llRequestSimulatorData</A
-> api to
-    collect information about a simulator which will be provided in the
-    <A
-HREF="#AEN4997"
->dataserver event</A
->.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Simulator Data Constants</B
-></P
-><DL
-><DT
->DATA_SIM_POS</DT
-><DD
-><P
->The global position of the simulator.  Cast the 
-		value to a vector.</P
-></DD
-><DT
->DATA_SIM_STATUS</DT
-><DD
-><P
->The status of the simulator.  Currently, this may be one of the following: 
-		<P
-></P
-><UL
-><LI
-STYLE="list-style-type: opencircle"
-><P
->up</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->down</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->stopping</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->starting</P
-></LI
-><LI
-STYLE="list-style-type: opencircle"
-><P
->crashed</P
-></LI
-></UL
->
-		</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6112"
->C.24. Vehicle Parameters</A
-></H2
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Parameters</B
-></P
-><DL
-><DT
-><A
-HREF="#AEN956"
->VEHICLE_LINEAR_FRICTION_TIMESCALE</A
-></DT
-><DD
-><P
->A vector of timescales for exponential decay of the
-        vehicle's linear velocity along its preferred axes of motion (at, left,
-        up). Range = [0.07, inf) seconds for each element of the vector.
-        </P
-></DD
-><DT
-><A
-HREF="#AEN956"
->VEHICLE_ANGULAR_FRICTION_TIMESCALE</A
-></DT
-><DD
-><P
->A vector of timescales for exponential decay of the
-        vehicle's angular velocity about its preferred axes of motion (at,
-        left, up). Range = [0.07, inf) seconds for each element of the vector.
-        </P
-></DD
-><DT
-><A
-HREF="#AEN866"
->VEHICLE_LINEAR_MOTOR_DIRECTION</A
-></DT
-><DD
-><P
->The direction and magnitude (in preferred frame) of the
-        vehicle's linear motor. The vehicle will accelerate (or decelerate if
-        necessary) to match its velocity to its motor. Range of magnitude =
-        [0, 30] meters/second.
-		</P
-></DD
-><DT
-><A
-HREF="#AEN866"
->VEHICLE_LINEAR_MOTOR_OFFSET</A
-></DT
-><DD
-><P
->The offset point from the vehicle's center of mass at which
-		the linear motor's impulse is applied. This allows the linear motor
-		to also cause rotational torque.  Range of magnitude = [0, 100]
-		meters.</P
-></DD
-><DT
-><A
-HREF="#AEN866"
->VEHICLE_LINEAR_MOTOR_TIMESCALE</A
-></DT
-><DD
-><P
->The timescale for exponential approach to full
-        linear motor velocity.</P
-></DD
-><DT
-><A
-HREF="#AEN866"
->VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE</A
-></DT
-><DD
-><P
->The timescale for exponential decay of the linear
-        motor's magnitude.</P
-></DD
-><DT
-><A
-HREF="#AEN898"
->VEHICLE_ANGULAR_MOTOR_DIRECTION</A
-></DT
-><DD
-><P
->The direction and magnitude (in preferred frame)
-        of the vehicle's angular motor.The vehicle will accelerate (or
-        decelerate if necessary) to match its velocity to its
-        motor.</P
-></DD
-><DT
-><A
-HREF="#AEN898"
->VEHICLE_ANGULAR_MOTOR_TIMESCALE</A
-></DT
-><DD
-><P
->The timescale for exponential approach to full
-        angular motor velocity.</P
-></DD
-><DT
-><A
-HREF="#AEN898"
->VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE</A
-></DT
-><DD
-><P
->The timescale for exponential decay of the angular
-        motor's magnitude.</P
-></DD
-><DT
-><A
-HREF="#AEN979"
->VEHICLE_HOVER_HEIGHT</A
-></DT
-><DD
-><P
->The height (above the terrain or water, or global)
-        at which the vehicle will try to hover.</P
-></DD
-><DT
-><A
-HREF="#AEN979"
->VEHICLE_HOVER_EFFICIENCY</A
-></DT
-><DD
-><P
->A slider between minimum (0.0 = bouncy) and
-        maximum (1.0 = fast as possible) damped motion of the hover
-        behavior.</P
-></DD
-><DT
-><A
-HREF="#AEN979"
->VEHICLE_HOVER_TIMESCALE</A
-></DT
-><DD
-><P
->The period of bounce (or timescale of exponential
-        approach, depending on the hover efficiency) for the vehicle to
-        hover to the proper height.</P
-></DD
-><DT
-><A
-HREF="#AEN972"
->VEHICLE_BUOYANCY</A
-></DT
-><DD
-><P
->A slider between minimum (0.0) and maximum
-        anti-gravity (1.0).</P
-></DD
-><DT
-><A
-HREF="#vehicle_linear_deflection"
->VEHICLE_LINEAR_DEFLECTION_EFFICIENCY</A
-></DT
-><DD
-><P
->A slider between minimum (0.0) and maximum (1.0)
-        deflection of linear velocity. That is, it's a simple scalar for
-        modulating the strength of linear deflection.</P
-></DD
-><DT
-><A
-HREF="#vehicle_linear_deflection"
->VEHICLE_LINEAR_DEFLECTION_TIMESCALE</A
-></DT
-><DD
-><P
->The timescale for exponential success of linear
-        deflection. It is another way to specify how much time
-        it takes for the vehicle's linear velocity to be redirected to
-        it's preferred axis of motion.</P
-></DD
-><DT
-><A
-HREF="#vehicle_angular_deflection"
->VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY</A
-></DT
-><DD
-><P
->A slider between minimum (0.0) and maximum (1.0)
-        deflection of angular orientation. That is, it's a simple scalar
-        for modulating the strength of angular deflection such that the
-        vehicle's preferred axis of motion points toward it's real
-        velocity.</P
-></DD
-><DT
-><A
-HREF="#vehicle_angular_deflection"
->VEHICLE_ANGULAR_DEFLECTION_TIMESCALE</A
-></DT
-><DD
-><P
->The timescale for exponential success of angular
-        deflection. It's another way to specify the strength
-        of the vehicle's tendency to reorient itself so that it's
-        preferred axis of motion agrees with it's true
-        velocity.</P
-></DD
-><DT
-><A
-HREF="#AEN938"
->VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY</A
-></DT
-><DD
-><P
->A slider between minimum (0.0 = wobbly) and
-        maximum (1.0 = firm as possible) stability of the vehicle to keep
-        itself upright.</P
-></DD
-><DT
-><A
-HREF="#AEN938"
->VEHICLE_VERTICAL_ATTRACTION_TIMESCALE</A
-></DT
-><DD
-><P
->The period of wobble, or timescale for exponential
-        approach, of the vehicle to rotate such that it's preferred
-        "up" axis is oriented along the world's "up"
-        axis.</P
-></DD
-><DT
-><A
-HREF="#AEN949"
->VEHICLE_BANKING_EFFICIENCY</A
-></DT
-><DD
-><P
->A slider between anti (-1.0), none (0.0), and
-        maximum (1.0) banking strength.</P
-></DD
-><DT
-><A
-HREF="#AEN949"
->VEHICLE_BANKING_MIX</A
-></DT
-><DD
-><P
->A slider between static (0.0) and dynamic (1.0)
-        banking. "Static" means the banking scales only with the
-        angle of roll, whereas "dynamic" is a term that also
-        scales with the vehicle's linear speed.</P
-></DD
-><DT
-><A
-HREF="#AEN949"
->VEHICLE_BANKING_TIMESCALE</A
-></DT
-><DD
-><P
->The timescale for banking to exponentially
-        approach it's maximum effect. This is another way to scale the
-        strength of the banking effect, however it affects the term that
-        is proportional to the difference between what the banking
-        behavior is trying to do, and what the vehicle is actually
-        doing.</P
-></DD
-><DT
-><A
-HREF="#AEN990"
->VEHICLE_REFERENCE_FRAME</A
-></DT
-><DD
-><P
->A rotation of the vehicle's preferred axes of
-        motion and orientation (at, left, up) with respect to the
-        vehicle's local frame (x, y, z).</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6231"
->C.25. Vehicle Flags</A
-></H2
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Flags</B
-></P
-><DL
-><DT
-><A
-NAME="const_vehicle_flag_no_deflection_up"
-></A
->VEHICLE_FLAG_NO_DEFLECTION_UP</DT
-><DD
-><P
->This flag prevents 
-		<A
-HREF="#vehicle_linear_deflection"
->linear deflection</A
-> 
-		parallel to world z-axis. This is useful for preventing ground 
-		vehicles with large linear deflection, like bumper cars, from climbing 
-		their linear deflection into the sky.</P
-></DD
-><DT
-><A
-NAME="const_vehicle_flag_limit_roll_only"
-></A
->VEHICLE_FLAG_LIMIT_ROLL_ONLY</DT
-><DD
-><P
->For vehicles with 
-		<A
-HREF="#AEN938"
->vertical attractor</A
->
-		that want to be able to climb/dive, for instance, airplanes that want 
-        to use the <A
-HREF="#AEN949"
->banking</A
->
-		feature.</P
-></DD
-><DT
-><A
-NAME="const_vehicle_flag_hover_water_only"
-></A
->VEHICLE_FLAG_HOVER_WATER_ONLY</DT
-><DD
-><P
->Ignore terrain height when 
-		<A
-HREF="#AEN979"
->hovering</A
->.</P
-></DD
-><DT
-><A
-NAME="const_vehicle_flag_hover_terrain_only"
-></A
->VEHICLE_FLAG_HOVER_TERRAIN_ONLY</DT
-><DD
-><P
->Ignore water height when 
-		<A
-HREF="#AEN979"
->hovering</A
->.</P
-></DD
-><DT
-><A
-NAME="const_vehicle_flag_hover_global_height"
-></A
->VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT</DT
-><DD
-><P
-><A
-HREF="#AEN979"
->Hover</A
-> at 
-		global height instead of height above ground or water.</P
-></DD
-><DT
-><A
-NAME="const_vehicle_flag_hover_up_only"
-></A
->VEHICLE_FLAG_HOVER_UP_ONLY</DT
-><DD
-><P
-><A
-HREF="#AEN979"
->Hover</A
-> doesn't 
-		push down. Use this flag for hovering
-        vehicles that should be able to jump above their 
-		<A
-HREF="#vehicle_hover_height"
->hover height</A
->.
-        </P
-></DD
-><DT
->VEHICLE_FLAG_LIMIT_MOTOR_UP</DT
-><DD
-><P
->Prevents ground vehicles from motoring into the 
-        sky. This flag has a subtle effect when used with conjunction
-		with <A
-HREF="#AEN949"
->banking</A
->: the strength
-		of the banking will decay when the vehicle no longer experiences
-		collisions. The decay timescale is the same as 
-		<A
-HREF="#vehicle_banking_timescale"
->VEHICLE_BANKING_TIMESCALE
-		</A
->. This is to help prevent ground vehicles from steering
-		when they are in mid jump.
-		</P
-></DD
-><DT
-><A
-NAME="const_vehicle_flag_mouselook_steer"
-></A
->VEHICLE_FLAG_MOUSELOOK_STEER</DT
-><DD
-><P
->Steer the vehicle using the mouse.  Use this 
-		flag to make the angular motor try to make the vehicle
-		turn such that its <A
-HREF="#vehicle_roll_pitch_yaw"
->local 
-		x-axis</A
-> points in the same direction as 
-		the client-side camera.</P
-></DD
-><DT
-><A
-NAME="const_vehicle_flag_mouselook_bank"
-></A
->VEHICLE_FLAG_MOUSELOOK_BANK</DT
-><DD
-><P
->Same as above, but relies on
-		<A
-HREF="#AEN949"
->banking</A
->.  It remaps 
-		left-right motions of the client camera (also known as "yaw") to 
-		rotations about the vehicle's <A
-HREF="#vehicle_roll_pitch_yaw"
->&#13;		local x-axis</A
->.
-		</P
-></DD
-><DT
-><A
-NAME="const_vehicle_flag_camera_decoupled"
-></A
->VEHICLE_FLAG_CAMERA_DECOUPLED</DT
-><DD
-><P
->Makes mouselook camera rotate independently of 
-		the vehicle.  By default the client mouselook camera will rotate 
-		about with the vehicle, however when this flag is set the camera
-		direction is independent of the vehicle's rotation.
-		</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6288"
->C.26. Vehicle Types</A
-></H2
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Types</B
-></P
-><DL
-><DT
->VEHICLE_TYPE_SLED</DT
-><DD
-><P
->Simple vehicle that bumps along the ground, and likes to move along
-        it's local x-axis.</P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN6296"
-></A
-><PRE
-CLASS="programlisting"
->&#13;// most friction for left-right, least for up-down
-llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, &#60;30, 1, 1000&#62; );
-
-// no angular friction
-llSetVehicleVectorParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, &#60;1000, 1000, 1000&#62; );
-
-// no linear motor
-llSetVehicleVectorParam( VEHICLE_LINEAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
-llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 1000 );
-llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 120 );
-
-// no angular motor
-llSetVehicleVectorParam( VEHICLE_ANGULAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
-llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 1000 );
-llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 120 );
-
-// no hover (but with timescale of 10 sec if enabled)
-llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 0 );
-llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY, 10 );
-llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 10 );
-llSetVehicleFloatParam( VEHICLE_BUOYANCY, 0 );
-
-// maximum linear deflection with timescale of 1 second
-llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 1 );
-llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 1 );
-
-// no angular deflection 
-llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0 );
-llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 10 );
-
-// no vertical attractor (doesn't mind flipping over)
-llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 1 );
-llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 1000 );
-
-// no banking
-llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, 0 );
-llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 1 );
-llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 10 );
-
-// default rotation of local frame
-llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, &#60;0, 0, 0, 1&#62; );
-
-// remove these flags 
-llRemoveVehicleFlags( VEHICLE_FLAG_HOVER_WATER_ONLY 
-                      | VEHICLE_FLAG_HOVER_TERRAIN_ONLY 
-                      | VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT 
-                      | VEHICLE_FLAG_HOVER_UP_ONLY );
-
-// set these flags (the limit_roll flag will have no effect
-// until banking is enabled, if ever)
-llSetVehicleFlags( VEHICLE_FLAG_NO_DEFLECTION_UP 
-                   | VEHICLE_FLAG_LIMIT_ROLL_ONLY
-                   | VEHICLE_FLAG_LIMIT_MOTOR_UP );
-        </PRE
-><P
-></P
-></DIV
-></DD
-><DT
->VEHICLE_TYPE_CAR</DT
-><DD
-><P
->Another vehicle that bounces along the ground but
-        needs the motors to be driven from external controls or <A
-HREF="#AEN5211"
->timer</A
-> events.</P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN6303"
-></A
-><PRE
-CLASS="programlisting"
->&#13;// most friction for left-right, least for up-down
-llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, &#60;100, 2, 1000&#62; );
-        
-// no angular friction
-llSetVehicleVectorParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, &#60;1000, 1000, 1000&#62; );
-
-// linear motor wins after about a second, decays after about a minute
-llSetVehicleVectorParam( VEHICLE_LINEAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
-llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 1 );
-llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 60 );
-
-// angular motor wins after a second, decays in less time than that
-llSetVehicleVectorParam( VEHICLE_ANGULAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
-llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 1 );
-llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.8 );
-
-// no hover 
-llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 0 );
-llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY, 0 );
-llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 1000 );
-llSetVehicleFloatParam( VEHICLE_BUOYANCY, 0 );
-
-// maximum linear deflection with timescale of 2 seconds
-llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 1 );
-llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 2 );
-
-// no angular deflection 
-llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0 );
-llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 10 );
-        
-// critically damped vertical attractor
-llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 1 );
-llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 10 );
-
-// weak negative critically damped banking
-llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, -0.2 );
-llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 1 );
-llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 1 );
-
-// default rotation of local frame
-llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, &#60;0, 0, 0, 1&#62; );
-
-// remove these flags 
-llRemoveVehicleFlags( VEHICLE_FLAG_HOVER_WATER_ONLY 
-                      | VEHICLE_FLAG_HOVER_TERRAIN_ONLY 
-                      | VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT);
-
-// set these flags 
-llSetVehicleFlags( VEHICLE_FLAG_NO_DEFLECTION_UP 
-                   | VEHICLE_FLAG_LIMIT_ROLL_ONLY 
-                   | VEHICLE_FLAG_HOVER_UP_ONLY
-                   | VEHICLE_FLAG_LIMIT_MOTOR_UP );
-        </PRE
-><P
-></P
-></DIV
-></DD
-><DT
->VEHICLE_TYPE_BOAT</DT
-><DD
-><P
->Hovers over water with lots of friction and some angular deflection.</P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN6309"
-></A
-><PRE
-CLASS="programlisting"
->&#13;// least for forward-back, most friction for up-down
-llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, &#60;10, 3, 2&#62; );
-        
-// uniform angular friction (setting it as a scalar rather than a vector)
-llSetVehicleFloatParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, 10 );
-
-// linear motor wins after about five seconds, decays after about a minute
-llSetVehicleVectorParam( VEHICLE_LINEAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
-llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 5 );
-llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 60 );
-
-// angular motor wins after four seconds, decays in same amount of time
-llSetVehicleVectorParam( VEHICLE_ANGULAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
-llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 4 );
-llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 4 );
-
-// hover 
-llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 0 );
-llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY, 0.5 );
-llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 2.0 );
-llSetVehicleFloatParam( VEHICLE_BUOYANCY, 1 );
-
-// halfway linear deflection with timescale of 3 seconds
-llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.5 );
-llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 3 );
-
-// angular deflection 
-llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.5 );
-llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 5 );
-        
-// somewhat bouncy vertical attractor 
-llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.5 );
-llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 5 );
-
-// weak negative damped banking
-llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, -0.3 );
-llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 0.8 );
-llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 1 );
-
-// default rotation of local frame
-llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, &#60;0, 0, 0, 1&#62; );
-
-// remove these flags 
-llRemoveVehicleFlags( VEHICLE_FLAG_HOVER_TERRAIN_ONLY 
-                      | VEHICLE_FLAG_LIMIT_ROLL_ONLY 
-                      | VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT);
-
-// set these flags 
-llSetVehicleFlags( VEHICLE_FLAG_NO_DEFLECTION_UP 
-                   | VEHICLE_FLAG_HOVER_WATER_ONLY 
-                   | VEHICLE_FLAG_HOVER_UP_ONLY 
-                   | VEHICLE_FLAG_LIMIT_MOTOR_UP );
-        </PRE
-><P
-></P
-></DIV
-></DD
-><DT
->VEHICLE_TYPE_AIRPLANE</DT
-><DD
-><P
->Uses linear deflection for lift, no hover, and banking to turn.</P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN6315"
-></A
-><PRE
-CLASS="programlisting"
->&#13;// very little friction along forward-back axis
-llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, &#60;200, 10, 5&#62; );
-        
-// uniform angular friction
-llSetVehicleFloatParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, 20 );
-
-// linear motor
-llSetVehicleVectorParam( VEHICLE_LINEAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
-llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 2 );
-llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 60 );
-
-// angular motor
-llSetVehicleVectorParam( VEHICLE_ANGULAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
-llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 4 );
-llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 8 );
-
-// no hover 
-llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 0 );
-llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY, 0.5 );
-llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 1000 );
-llSetVehicleFloatParam( VEHICLE_BUOYANCY, 0 );
-
-// linear deflection 
-llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.5 );
-llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 0.5 );
-
-// angular deflection 
-llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 1.0 );
-llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 2.0 );
-        
-// vertical attractor
-llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.9 );
-llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 2 );
-
-// banking
-llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, 1 );
-llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 0.7 );
-llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 2 );
-
-// default rotation of local frame
-llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, &#60;0, 0, 0, 1&#62; );
-
-// remove these flags 
-llRemoveVehicleFlags( VEHICLE_FLAG_NO_DEFLECTION_UP 
-                      | VEHICLE_FLAG_HOVER_WATER_ONLY 
-                      | VEHICLE_FLAG_HOVER_TERRAIN_ONLY 
-                      | VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT 
-                      | VEHICLE_FLAG_HOVER_UP_ONLY
-                      | VEHICLE_FLAG_LIMIT_MOTOR_UP );
-
-// set these flags 
-llSetVehicleFlags( VEHICLE_FLAG_LIMIT_ROLL_ONLY );
-        </PRE
-><P
-></P
-></DIV
-></DD
-><DT
->VEHICLE_TYPE_BALLOON</DT
-><DD
-><P
->Hover, and friction, but no deflection.</P
-><DIV
-CLASS="informalexample"
-><P
-></P
-><A
-NAME="AEN6321"
-></A
-><PRE
-CLASS="programlisting"
->&#13;// uniform linear friction
-llSetVehicleFloatParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, 5 );
-        
-// uniform angular friction
-llSetVehicleFloatParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, 10 );
-
-// linear motor
-llSetVehicleVectorParam( VEHICLE_LINEAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
-llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 5 );
-llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 60 );
-
-// angular motor
-llSetVehicleVectorParam( VEHICLE_ANGULAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
-llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 6 );
-llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 10 );
-
-// hover 
-llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 5 );
-llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY, 0.8 );
-llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 10 );
-llSetVehicleFloatParam( VEHICLE_BUOYANCY, 1 );
-
-// no linear deflection 
-llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0 );
-llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 5 );
-
-// no angular deflection 
-llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0 );
-llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 5 );
-        
-// no vertical attractor 
-llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 1 );
-llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 1000 );
-
-// no banking
-llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, 0 );
-llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 0.7 );
-llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 5 );
-
-// default rotation of local frame
-llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, &#60;0, 0, 0, 1&#62; );
-
-// remove all flags 
-llRemoveVehicleFlags( VEHICLE_FLAG_NO_DEFLECTION_UP 
-                      | VEHICLE_FLAG_HOVER_WATER_ONLY 
-                      | VEHICLE_FLAG_LIMIT_ROLL_ONLY 
-                      | VEHICLE_FLAG_HOVER_TERRAIN_ONLY 
-                      | VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT 
-                      | VEHICLE_FLAG_HOVER_UP_ONLY 
-                      | VEHICLE_FLAG_LIMIT_MOTOR_UP );
-        </PRE
-><P
-></P
-></DIV
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6323"
->C.27. Primitive Constants</A
-></H2
-><P
->These constants are used in calls to the <A
-HREF="#AEN4020"
->llSetPrimitiveParams</A
-> and <A
-HREF="#AEN2075"
->llGetPrimitiveParams</A
-> api to
-    specify parameters.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Primitive Parameters</B
-></P
-><DL
-><DT
->PRIM_TYPE</DT
-><DD
-><P
->This allows the various primitive shape parameters to be controlled.  PRIM_TYPE must be followed by
-	  appropriate arguments based on which type is selected.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->PRIM_TYPE Values</B
-></P
-><DL
-><DT
->PRIM_TYPE_BOX</DT
-><DD
-><P
->Sets the primitive to a box, followed by integer hole shape, vector cut, float hollow, vector twist, vector top size, and vector top shear.</P
-></DD
-><DT
->PRIM_TYPE_CYLINDER</DT
-><DD
-><P
->Sets the primitive to a cylinder, followed by integer hole shape, vector cut, float hollow, vector twist, vector top size, and vector top shear.</P
-></DD
-><DT
->PRIM_TYPE_PRISM</DT
-><DD
-><P
->Sets the primitive to a prism, followed by integer hole shape, vector cut, float hollow, vector twist, vector top size, and vector top shear.</P
-></DD
-><DT
->PRIM_TYPE_SPHERE</DT
-><DD
-><P
->Sets the primitive to a sphere, followed by integer hole shape, vector cut, float hollow, vector twist, and vector dimple.</P
-></DD
-><DT
->PRIM_TYPE_TORUS</DT
-><DD
-><P
->Sets the primitive to a torus, followed by integer hole shape, vector cut, float hollow, vector twist, vector hole size, vector top shear, vector advanced cut, vector taper, float revolutions, float radius offset, and float skew.</P
-></DD
-><DT
->PRIM_TYPE_TUBE</DT
-><DD
-><P
->Sets the primitive to a tube, followed by integer hole shape, vector cut, float hollow, vector twist, vector hole size, vector top shear, vector advanced cut, vector taper, float revolutions, float radius offset, and float skew.</P
-></DD
-><DT
->PRIM_TYPE_RING</DT
-><DD
-><P
->Sets the primitive to a ring, followed by integer hole shape, vector cut, float hollow, vector twist, vector hole size, vector top shear, vector advanced cut, vector taper, float revolutions, float radius offset, and float skew.</P
-></DD
-></DL
-></DIV
-><P
->Choose hole shape from one of PRIM_HOLE_DEFAULT, PRIM_HOLE_CIRCLE, PRIM_HOLE_SQUARE, or PRIM_HOLE_TRIANGLE.</P
-></DD
-><DT
->PRIM_MATERIAL</DT
-><DD
-><P
->Choose material from one of PRIM_MATERIAL_STONE, PRIM_MATERIAL_METAL, PRIM_MATERIAL_GLASS,
-	PRIM_MATERIAL_WOOD, PRIM_MATERIAL_FLESH, PRIM_MATERIAL_PLASTIC, PRIM_MATERIAL_RUBBER, or PRIM_MATERIAL_LIGHT.</P
-></DD
-><DT
->PRIM_PHYSICS</DT
-><DD
-><P
->Set physics to TRUE or FALSE.</P
-></DD
-><DT
->PRIM_TEMP_ON_REZ</DT
-><DD
-><P
->Set temporary on rez to TRUE or FALSE.</P
-></DD
-><DT
->PRIM_PHANTOM</DT
-><DD
-><P
->Set phantom to TRUE or FALSE.</P
-></DD
-><DT
->PRIM_POSITION</DT
-><DD
-><P
->Sets the position with a vector.</P
-></DD
-><DT
->PRIM_SIZE</DT
-><DD
-><P
->Sets the size with a vector.</P
-></DD
-><DT
->PRIM_ROTATION</DT
-><DD
-><P
->Sets the rotation with a rotation.</P
-></DD
-><DT
->PRIM_TEXTURE</DT
-><DD
-><P
->Followed by an integer face, key id, vector repeats, vector offsets, and float rotation in radians.</P
-></DD
-><DT
->PRIM_COLOR</DT
-><DD
-><P
->Followed by an integer face, vector color, and float alpha.</P
-></DD
-><DT
->PRIM_BUMP_SHINY</DT
-><DD
-><P
->Followed by an integer face, one of PRIM_SHINY_NONE, PRIM_SHINY_LOW, PRIM_SHINY_MEDIUM, or PRIM_SHINY_HIGH,
-	and one of PRIM_BUMP_NONE, PRIM_BUMP_BRIGHT, PRIM_BUMP_DARK, PRIM_BUMP_WOOD, PRIM_BUMP_BARK,
-	PRIM_BUMP_BRICKS, PRIM_BUMP_CHECKER, PRIM_BUMP_CONCRETE, PRIM_BUMP_TILE, PRIM_BUMP_STONE, PRIM_BUMP_DISKS,
-	PRIM_BUMP_GRAVEL, PRIM_BUMP_BLOBS, PRIM_BUMP_SIDING, PRIM_BUMP_LARGETILE, PRIM_BUMP_STUCCO, PRIM_BUMP_SUCTION,
-	or PRIM_BUMP_WEAVE.</P
-></DD
-><DT
->PRIM_GLOW</DT
-><DD
-><P
->Followed by an integer face and a float glow value (in range 0.0 to 1.0).</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6409"
->C.28. XML-RPC Constants</A
-></H2
-><P
->These constants are passed to the remote_data event: REMOTE_DATA_CHANNEL, REMOTE_DATA_REQUEST, and REMOTE_DATA_REPLY.</P
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6412"
->C.29. Permission Mask Constants</A
-></H2
-><P
->These MASK_* constants are used as arguments to <A
-HREF="#AEN2009"
->llGetObjectPermMask</A
-> and <A
-HREF="#AEN1801"
->llGetInventoryPermMask</A
->.  These functions return combinations of PERM_* constants.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Mask and Permission Constants</B
-></P
-><DL
-><DT
->MASK_BASE</DT
-><DD
-><P
->Specifies base permissions.  These permissions are identical to owner permissions except in the case that the object is locked.  When an object is locked, owner permissions are stripped of move/modify rights (thus, the 'locking').  On unlock, owner permissions revert back to base permissions.</P
-></DD
-><DT
->MASK_OWNER</DT
-><DD
-><P
->Specifies owner permissions.  These are never more permissive than base permissions.</P
-></DD
-><DT
->MASK_GROUP</DT
-><DD
-><P
->Specifies group permissions.  These are never more permissive than owner permissions.</P
-></DD
-><DT
->MASK_EVERYONE</DT
-><DD
-><P
->Specifies everyone permissions.  These are never more permissive than owner permissions.</P
-></DD
-><DT
->MASK_NEXT</DT
-><DD
-><P
->Specifies next owner permissions.  These are never more permissive than base permissions.</P
-></DD
-><DT
->PERM_MOVE</DT
-><DD
-><P
->Set if movement is allowed.</P
-></DD
-><DT
->PERM_MODIFY</DT
-><DD
-><P
->Set if modification is allowed.</P
-></DD
-><DT
->PERM_COPY</DT
-><DD
-><P
->Set if copying is allowed.</P
-></DD
-><DT
->PERM_TRANSFER</DT
-><DD
-><P
->Set if transfers are allowed.</P
-></DD
-><DT
->PERM_ALL</DT
-><DD
-><P
->This is returned if all other PERM_* are set.</P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6459"
->C.30. Parcel Media Constants</A
-></H2
-><P
->These constants are passed to the <A
-HREF="#AEN3031"
->llParcelMediaCommand</A
-> to control playback of movies and other multimedia within a land parcel.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Parcel Media Constants</B
-></P
-><DL
-><DT
->PARCEL_MEDIA_COMMAND_STOP</DT
-><DD
-><P
->Stop the media stream and go back to the first frame.</P
-></DD
-><DT
->PARCEL_MEDIA_COMMAND_PAUSE</DT
-><DD
-><P
->Pause the media stream (stop playing but stay on current frame).</P
-></DD
-><DT
->PARCEL_MEDIA_COMMAND_PLAY</DT
-><DD
-><P
->Start the media stream playing from the current frame and stop when the end is reached.</P
-></DD
-><DT
->PARCEL_MEDIA_COMMAND_LOOP_SET</DT
-><DD
-><P
->Used to get or set the parcel's media looping variable.
-        </P
-></DD
-><DT
->PARCEL_MEDIA_COMMAND_TEXTURE</DT
-><DD
-><P
->Use this to get or set the parcel's media texture.
-        </P
-></DD
-><DT
->PARCEL_MEDIA_COMMAND_URL</DT
-><DD
-><P
->Used to get or set the parcel's media url.
-        </P
-></DD
-><DT
->PARCEL_MEDIA_COMMAND_TYPE</DT
-><DD
-><P
->Used to get or set the parcel's media mimetype.
-        </P
-></DD
-><DT
->PARCEL_MEDIA_COMMAND_DESC</DT
-><DD
-><P
->Used to get or set the parcel's media description.
-        </P
-></DD
-><DT
->PARCEL_MEDIA_COMMAND_SIZE</DT
-><DD
-><P
->Used to get or set the parcel's media pixel size.
-        </P
-></DD
-><DT
->PARCEL_MEDIA_COMMAND_TIME</DT
-><DD
-><P
->Move a media stream to a specific time.
-        </P
-></DD
-><DT
->PARCEL_MEDIA_COMMAND_AGENT</DT
-><DD
-><P
->Applies the media command to the specified agent only.
-        </P
-></DD
-><DT
->PARCEL_MEDIA_COMMAND_UNLOAD</DT
-><DD
-><P
->Completely unloads the movie and restores the original texture.
-        </P
-></DD
-><DT
->PARCEL_MEDIA_COMMAND_AUTO_ALIGN</DT
-><DD
-><P
->Sets the parcel option 'Auto scale content'.
-        </P
-></DD
-><DT
->PARCEL_MEDIA_COMMAND_LOOP</DT
-><DD
-><P
->This command has been depricated in favor of the PARCEL_MEDIA_COMMAND_LOOP_SET above.
-        </P
-></DD
-></DL
-></DIV
-></DIV
-><DIV
-CLASS="section"
-><HR><H2
-CLASS="section"
-><A
-NAME="AEN6521"
->C.31. Click Action Constants</A
-></H2
-><P
->These constants are passed to <A
-HREF="#AEN3791"
->llSetClickAction</A
-> to define default behavior when a resident clicks upon a prim.</P
-><P
-></P
-><DIV
-CLASS="variablelist"
-><P
-><B
->Click Action Constants</B
-></P
-><DL
-><DT
->CLICK_ACTION_NONE</DT
-><DD
-><P
->Disables the click action for this prim.</P
-></DD
-><DT
->CLICK_ACTION_TOUCH</DT
-><DD
-><P
->Sets the click-action behavior of this prim to touch.</P
-></DD
-><DT
->CLICK_ACTION_SIT</DT
-><DD
-><P
->Sets the click-action behavior of this prim to sit.</P
-></DD
-><DT
->CLICK_ACTION_BUY</DT
-><DD
-><P
->Sets the click-action behavior of this prim to buy.</P
-></DD
-><DT
->CLICK_ACTION_PAY</DT
-><DD
-><P
->Sets the click-action behavior of this prim to pay.</P
-></DD
-><DT
->CLICK_ACTION_OPEN</DT
-><DD
-><P
->Sets the click-action behavior of this prim to open.</P
-></DD
-><DT
->CLICK_ACTION_PLAY</DT
-><DD
-><P
->Sets the click-action behavior of this prim to play.</P
-></DD
-><DT
->CLICK_ACTION_OPEN_MEDIA</DT
-><DD
-><P
->Sets the click-action behavior of this prim to open-media.</P
-></DD
-><DT
->CLICK_ACTION_SIT</DT
-><DD
-><P
->Sets the click-action behavior of this prim to sit.</P
-></DD
-><DT
->CLICK_ACTION_SIT</DT
-><DD
-><P
->Sets the click-action behavior of this prim to sit.</P
-></DD
-></DL
-></DIV
-></DIV
-></DIV
-></DIV
-></BODY
-></HTML
->
\ No newline at end of file
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index f232fdf..81f1a90 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -330,8 +330,15 @@ void LLPipeline::init()
 	mRenderDebugFeatureMask = 0xffffffff; // All debugging features on
 	mRenderDebugMask = 0;	// All debug starts off
 
+	// Don't turn on ground when this is set
+	// Mac Books with intel 950s need this
+	if(!gSavedSettings.getBOOL("RenderGround"))
+	{
+		toggleRenderType(RENDER_TYPE_GROUND);
+	}
+
 	mOldRenderDebugMask = mRenderDebugMask;
-	
+
 	mBackfaceCull = TRUE;
 
 	stop_glerror();
@@ -454,7 +461,7 @@ void LLPipeline::resizeScreenTexture()
 		}
 	
 		mScreen.release();
-		mScreen.allocate(resX, resY, GL_RGBA, TRUE, GL_TEXTURE_RECTANGLE_ARB);		
+		mScreen.allocate(resX, resY, GL_RGBA, TRUE, LLTexUnit::TT_RECT_TEXTURE);		
 
 		llinfos << "RESIZED SCREEN TEXTURE: " << resX << "x" << resY << llendl;
 	}
@@ -556,7 +563,7 @@ void LLPipeline::createGLBuffers()
 
 			for (U32 j = 0; j < 3; j++)
 			{
-				glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, mBlurCubeTexture[j]);
+				gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_CUBE_MAP, mBlurCubeTexture[j]);
 				glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 				glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 				glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@@ -583,10 +590,11 @@ void LLPipeline::createGLBuffers()
 			mGlow[i].allocate(512,glow_res,GL_RGBA,FALSE);
 		}
 		
+
 		GLuint resX = gViewerWindow->getWindowDisplayWidth();
 		GLuint resY = gViewerWindow->getWindowDisplayHeight();
-		
-		mScreen.allocate(resX, resY, GL_RGBA, TRUE, GL_TEXTURE_RECTANGLE_ARB);
+	
+		mScreen.allocate(resX, resY, GL_RGBA, TRUE, LLTexUnit::TT_RECT_TEXTURE);
 	}
 }
 
@@ -1212,7 +1220,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
 	LLVertexBuffer::unbind();
 	LLGLDisable blend(GL_BLEND);
 	LLGLDisable test(GL_ALPHA_TEST);
-	LLViewerImage::unbindTexture(0, GL_TEXTURE_2D);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	gGL.setColorMask(false, false);
 	LLGLDepthTest depth(GL_TRUE, GL_FALSE);
@@ -1357,7 +1365,7 @@ void LLPipeline::doOcclusion(LLCamera& camera)
 	}
 	LLGLDisable blend(GL_BLEND);
 	LLGLDisable test(GL_ALPHA_TEST);
-	LLViewerImage::unbindTexture(0, GL_TEXTURE_2D);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	LLGLDepthTest depth(GL_TRUE, GL_FALSE);
 
 	if (LLPipeline::sUseOcclusion > 1)
@@ -2368,7 +2376,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
 		sUnderWaterRender = FALSE;
 	}
 
-	LLViewerImage::sDefaultImagep->bind(0);
+	gGL.getTexUnit(0)->bind(LLViewerImage::sDefaultImagep);
 	LLViewerImage::sDefaultImagep->setClamp(FALSE, FALSE);
 	
 	//////////////////////////////////////////////
@@ -2604,11 +2612,11 @@ void LLPipeline::renderDebug()
 		// Debug composition layers
 		F32 x, y;
 
-		LLGLSNoTexture gls_no_texture;
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 		if (gAgent.getRegion())
 		{
-			gGL.begin(LLVertexBuffer::POINTS);
+			gGL.begin(LLRender::POINTS);
 			// Draw the composition layer for the region that I'm in.
 			for (x = 0; x <= 260; x++)
 			{
@@ -2654,6 +2662,7 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects, BOOL render
 
 	LLGLSDefault gls_default;
 	LLGLSObjectSelect gls_object_select;
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	LLGLDepthTest gls_depth(GL_TRUE,GL_TRUE);
 	disableLights();
 	
@@ -2665,6 +2674,18 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects, BOOL render
 	LLGLState::checkClientArrays();
 	U32 last_type = 0;
 	
+	// If we don't do this, we crash something on changing graphics settings
+	// from Medium -> Low, because we unload all the shaders and the 
+	// draw pools aren't aware.  I don't know if this has to be a separate
+	// loop before actual rendering. JC
+	for (pool_set_t::iterator iter = mPools.begin(); iter != mPools.end(); ++iter)
+	{
+		LLDrawPool *poolp = *iter;
+		if (poolp->isFacePool() && hasRenderType(poolp->getType()))
+		{
+			poolp->prerender();
+		}
+	}
 	for (pool_set_t::iterator iter = mPools.begin(); iter != mPools.end(); ++iter)
 	{
 		LLDrawPool *poolp = *iter;
@@ -3089,7 +3110,7 @@ void LLPipeline::setupAvatarLights(BOOL for_edit)
 		camera_rot.invert();
 		LLVector4 light_pos = light_pos_cam * camera_rot;
 		
-		light_pos.normVec();
+		light_pos.normalize();
 
 		mHWLightColors[1] = diffuse;
 		glLightfv(GL_LIGHT1, GL_DIFFUSE,  diffuse.mV);
@@ -3107,7 +3128,7 @@ void LLPipeline::setupAvatarLights(BOOL for_edit)
 		LLVector3 opposite_pos = -1.f * mSunDir;
 		LLVector3 orthog_light_pos = mSunDir % LLVector3::z_axis;
 		LLVector4 backlight_pos = LLVector4(lerp(opposite_pos, orthog_light_pos, 0.3f), 0.0f);
-		backlight_pos.normVec();
+		backlight_pos.normalize();
 			
 		LLColor4 light_diffuse = mSunDiffuse;
 		LLColor4 backlight_diffuse(1.f - light_diffuse.mV[VRED], 1.f - light_diffuse.mV[VGREEN], 1.f - light_diffuse.mV[VBLUE], 1.f);
@@ -3446,7 +3467,7 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
 			atten = x / (light_radius); // % of brightness at radius
 			quad = 0.0f;
 		}
-		//mHWLightColors[cur_light] = light_color;
+		mHWLightColors[2] = light_color;
 		S32 gllight = GL_LIGHT2;
 		glLightfv(gllight, GL_POSITION, light_pos_gl.mV);
 		glLightfv(gllight, GL_DIFFUSE,  light_color.mV);
@@ -3987,6 +4008,7 @@ BOOL LLPipeline::getRenderHighlights(void*)
 }
 
 LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector3& start, const LLVector3& end,
+														BOOL pick_transparent,												
 														S32* face_hit,
 														LLVector3* intersection,         // return the intersection point
 														LLVector2* tex_coord,            // return the texture coordinates of the intersection point
@@ -3996,6 +4018,10 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector3& start,
 {
 	LLDrawable* drawable = NULL;
 
+	LLVector3 local_end = end;
+
+	LLVector3 position;
+
 	for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); 
 			iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
 	{
@@ -4003,24 +4029,49 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector3& start,
 
 		for (U32 j = 0; j < LLViewerRegion::NUM_PARTITIONS; j++)
 		{
-			if ((j == LLViewerRegion::PARTITION_VOLUME) || (j == LLViewerRegion::PARTITION_BRIDGE))  // only check these partitions for now
+			if ((j == LLViewerRegion::PARTITION_VOLUME) || 
+				(j == LLViewerRegion::PARTITION_BRIDGE) || 
+				(j == LLViewerRegion::PARTITION_TERRAIN) ||
+				(j == LLViewerRegion::PARTITION_TREE) ||
+				(j == LLViewerRegion::PARTITION_GRASS))  // only check these partitions for now
 			{
 				LLSpatialPartition* part = region->getSpatialPartition(j);
-				if (part)
+				if (part && hasRenderType(part->mDrawableType))
 				{
-					LLDrawable* hit = part->lineSegmentIntersect(start, end, face_hit, intersection, tex_coord, normal, bi_normal);
+					LLDrawable* hit = part->lineSegmentIntersect(start, local_end, pick_transparent, face_hit, &position, tex_coord, normal, bi_normal);
 					if (hit)
 					{
 						drawable = hit;
+						local_end = position;						
 					}
 				}
 			}
 		}
 	}
+
+	//check all avatar nametags (silly, isn't it?)
+	for (std::vector< LLCharacter* >::iterator iter = LLCharacter::sInstances.begin();
+		iter != LLCharacter::sInstances.end();
+		++iter)
+	{
+		LLVOAvatar* av = (LLVOAvatar*) *iter;
+		if (av->mNameText.notNull() && av->mNameText->lineSegmentIntersect(start, local_end, position))
+		{
+			drawable = av->mDrawable;
+			local_end = position;
+		}
+	}
+
+	if (intersection)
+	{
+		*intersection = position;
+	}
+
 	return drawable ? drawable->getVObj().get() : NULL;
 }
 
 LLViewerObject* LLPipeline::lineSegmentIntersectInHUD(const LLVector3& start, const LLVector3& end,
+													  BOOL pick_transparent,													
 													  S32* face_hit,
 													  LLVector3* intersection,         // return the intersection point
 													  LLVector2* tex_coord,            // return the texture coordinates of the intersection point
@@ -4035,15 +4086,27 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInHUD(const LLVector3& start, co
 	{
 		LLViewerRegion* region = *iter;
 
+		BOOL toggle = FALSE;
+		if (!hasRenderType(LLPipeline::RENDER_TYPE_HUD))
+		{
+			toggleRenderType(LLPipeline::RENDER_TYPE_HUD);
+			toggle = TRUE;
+		}
+
 		LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_HUD);
 		if (part)
 		{
-			LLDrawable* hit = part->lineSegmentIntersect(start, end, face_hit, intersection, tex_coord, normal, bi_normal);
+			LLDrawable* hit = part->lineSegmentIntersect(start, end, pick_transparent, face_hit, intersection, tex_coord, normal, bi_normal);
 			if (hit)
 			{
 				drawable = hit;
 			}
 		}
+
+		if (toggle)
+		{
+			toggleRenderType(LLPipeline::RENDER_TYPE_HUD);
+		}
 	}
 	return drawable ? drawable->getVObj().get() : NULL;
 }
@@ -4197,7 +4260,8 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam)
 
 	LLPipeline::sReflectionRender = TRUE;
 
-	cube_map->bind();
+	gGL.getTexUnit(cube_map->getStage())->bind(cube_map);
+	gGL.getTexUnit(0)->activate();
 	GLint width;
 	glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, 0, GL_TEXTURE_WIDTH, &width);
 	if (width != res)
@@ -4209,8 +4273,10 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam)
 			glTexImage2D(gl_cube_face[i], 0, GL_RGBA, res, res, 0, GL_RGBA, GL_FLOAT, NULL); 
 		}
 	}
-	glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0);
-	cube_map->disable();
+	gGL.getTexUnit(cube_map->getStage())->unbind(LLTexUnit::TT_CUBE_MAP);
+	gGL.getTexUnit(cube_map->getStage())->disable();
+	gGL.getTexUnit(0)->activate();
+	gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
 
 	BOOL toggle_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI);
 	if (toggle_ui)
@@ -4254,7 +4320,7 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam)
 	gPipeline.calcNearbyLights(cube_cam);
 
 	stop_glerror();
-	LLViewerImage::unbindTexture(0, GL_TEXTURE_2D);
+	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mCubeFrameBuffer);
 	glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
 										GL_RENDERBUFFER_EXT, mCubeDepth);		
@@ -4410,7 +4476,8 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)
 	glPushMatrix();
 
 	cube_out->enableTexture(0);
-	cube_out->bind();
+	gGL.getTexUnit(cube_out->getStage())->bind(cube_out);
+	gGL.getTexUnit(0)->activate();
 	GLint width;
 	glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, 0, GL_TEXTURE_WIDTH, &width);
 	if (width != res)
@@ -4422,8 +4489,8 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)
 			glTexImage2D(gl_cube_face[i], 0, GL_RGBA, res, res, 0, GL_RGBA, GL_FLOAT, NULL); 
 		}
 	}
-	glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0);
-
+	gGL.getTexUnit(cube_out->getStage())->unbind(LLTexUnit::TT_CUBE_MAP);
+	gGL.getTexUnit(0)->activate();
 	glViewport(0, 0, res, res);
 	LLGLEnable blend(GL_BLEND);
 	
@@ -4451,16 +4518,17 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)
 
 		if (j == 0)
 		{
-			cube_in->bind();
+			gGL.getTexUnit(cube_in->getStage())->bind(cube_in);
 		}
 		else
 		{
-			glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, mBlurCubeTexture[j-1]);
+			gGL.getTexUnit(cube_in->getStage())->bindManual(LLTexUnit::TT_CUBE_MAP, mBlurCubeTexture[j-1]);
 		}
+		gGL.getTexUnit(0)->activate();
 
 		stop_glerror();
 
-		LLViewerImage::unbindTexture(0, GL_TEXTURE_2D);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mBlurCubeBuffer[j]);
 		stop_glerror();
 
@@ -4489,7 +4557,7 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)
 
 	stop_glerror();
 
-	glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0);
+	gGL.getTexUnit(cube_in->getStage())->unbind(LLTexUnit::TT_CUBE_MAP);
 	
 	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
 	gGL.setColorMask(true, false);
@@ -4498,7 +4566,8 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)
 	glMatrixMode(GL_MODELVIEW);
 	glPopMatrix();
 
-	cube_in->disableTexture();
+	gGL.getTexUnit(cube_in->getStage())->disable();
+	gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
 	gViewerWindow->setupViewport();
 	gGL.setSceneBlendType(LLRender::BT_ALPHA);
 
@@ -4566,7 +4635,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
 
 	if (for_snapshot)
 	{
-		mGlow[1].bindTexture();
+		gGL.getTexUnit(0)->bind(&mGlow[1]);
 		{
 			//LLGLEnable stencil(GL_STENCIL_TEST);
 			//glStencilFunc(GL_NOTEQUAL, 255, 0xFFFFFFFF);
@@ -4575,7 +4644,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
 			LLGLEnable blend(GL_BLEND);
 			gGL.setSceneBlendType(LLRender::BT_ADD);
 			tc2.setVec(1,1);				
-			gGL.begin(LLVertexBuffer::TRIANGLE_STRIP);
+			gGL.begin(LLRender::TRIANGLE_STRIP);
 			gGL.color4f(1,1,1,1);
 			gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
 			gGL.vertex2f(-1,-1);
@@ -4625,15 +4694,15 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
 		LLGLEnable test(GL_ALPHA_TEST);
 		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
 		gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
-		LLViewerImage::unbindTexture(0, GL_TEXTURE_2D);
 		
-		glDisable(GL_TEXTURE_2D);
-		glEnable(GL_TEXTURE_RECTANGLE_ARB);
-		mScreen.bindTexture();
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);		
+		gGL.getTexUnit(0)->disable();
+		gGL.getTexUnit(0)->enable(LLTexUnit::TT_RECT_TEXTURE);
+		gGL.getTexUnit(0)->bind(&mScreen);
 
 		gGL.color4f(1,1,1,1);
 		gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
-		gGL.begin(LLVertexBuffer::TRIANGLE_STRIP);
+		gGL.begin(LLRender::TRIANGLE_STRIP);
 		gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
 		gGL.vertex2f(-1,-1);
 		
@@ -4647,8 +4716,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
 		gGL.vertex2f(1,1);
 		gGL.end();
 		
-		glEnable(GL_TEXTURE_2D);
-		glDisable(GL_TEXTURE_RECTANGLE_ARB);
+		gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
 
 		mGlow[2].flush();
 	}
@@ -4678,7 +4746,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
 
 	for (S32 i = 0; i < kernel; i++)
 	{
-		LLViewerImage::unbindTexture(0, GL_TEXTURE_2D);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		{
 			LLFastTimer ftm(LLFastTimer::FTM_RENDER_BLOOM_FBO);
 			mGlow[i%2].bindTarget();
@@ -4687,11 +4755,11 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
 			
 		if (i == 0)
 		{
-			mGlow[2].bindTexture();
+			gGL.getTexUnit(0)->bind(&mGlow[2]);
 		}
 		else
 		{
-			mGlow[(i-1)%2].bindTexture();
+			gGL.getTexUnit(0)->bind(&mGlow[(i-1)%2]);
 		}
 
 		if (i%2 == 0)
@@ -4703,7 +4771,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
 			gGlowProgram.uniform2f("glowDelta", 0, delta);
 		}
 
-		gGL.begin(LLVertexBuffer::TRIANGLE_STRIP);
+		gGL.begin(LLRender::TRIANGLE_STRIP);
 		gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
 		gGL.vertex2f(-1,-1);
 		
@@ -4768,8 +4836,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
 		LLGLEnable blend(GL_BLEND);
 		gGL.blendFunc(GL_ONE, GL_ONE);
 
-		glDisable(GL_TEXTURE_2D);
-		glEnable(GL_TEXTURE_RECTANGLE_ARB);
+		gGL.getTexUnit(0)->disable();
+		gGL.getTexUnit(0)->enable(LLTexUnit::TT_RECT_TEXTURE);
 		mScreen.bindTexture();
 		
 		gGL.begin(LLVertexBuffer::TRIANGLE_STRIP);
@@ -4789,8 +4857,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
 
 		gGL.flush();
 		
-		glEnable(GL_TEXTURE_2D);
-		glDisable(GL_TEXTURE_RECTANGLE_ARB);
+		gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
 
 		gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 	}*/
@@ -4835,12 +4902,12 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
 
 		//tex unit 0
 		gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR);
-		
-		mGlow[1].bindTexture();
+	
+		gGL.getTexUnit(0)->bind(&mGlow[1]);
 		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 		glTexCoordPointer(2, GL_FLOAT, 0, uv0);
 		gGL.getTexUnit(1)->activate();
-		glEnable(GL_TEXTURE_RECTANGLE_ARB);
+		gGL.getTexUnit(1)->enable(LLTexUnit::TT_RECT_TEXTURE);
 		
 		//tex unit 1
 		gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
@@ -4851,14 +4918,16 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
 
 		glVertexPointer(2, GL_FLOAT, 0, v);
 		
-		mScreen.bindTexture();
+		gGL.getTexUnit(1)->bind(&mScreen);
+		gGL.getTexUnit(1)->activate();
 		
 		LLGLEnable multisample(GL_MULTISAMPLE_ARB);
 		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
 		
-		glDisable(GL_TEXTURE_RECTANGLE_ARB);
+		gGL.getTexUnit(1)->disable();
 		glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 		gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);
+
 		glClientActiveTextureARB(GL_TEXTURE0_ARB);
 		gGL.getTexUnit(0)->activate();
 		glDisableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -4936,7 +5005,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 
 		if (!LLViewerCamera::getInstance()->cameraUnderWater())
 		{	//generate planar reflection map
-			LLViewerImage::unbindTexture(0, GL_TEXTURE_2D);
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			glClearColor(0,0,0,0);
 			gGL.setColorMask(true, true);
 			mWaterRef.bindTarget();
@@ -5041,7 +5110,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 			}
 			LLViewerCamera::updateFrustumPlanes(camera);
 
-			LLViewerImage::unbindTexture(0, GL_TEXTURE_2D);
+			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 			LLColor4& col = LLDrawPoolWater::sWaterFogColor;
 			glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f);
 			gGL.setColorMask(true, true);
@@ -5173,11 +5242,11 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
 
 	LLVector3 left = camera.getLeftAxis();
 	left *= left;
-	left.normVec();
+	left.normalize();
 
 	LLVector3 up = camera.getUpAxis();
 	up *= up;
-	up.normVec();
+	up.normalize();
 
 	tdim.mV[0] = fabsf(half_height * left);
 	tdim.mV[1] = fabsf(half_height * up);
@@ -5218,10 +5287,10 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
 		resY != avatar->mImpostor.getHeight())
 	{
 		avatar->mImpostor.allocate(resX,resY,GL_RGBA,TRUE);
-		avatar->mImpostor.bindTexture();
+		gGL.getTexUnit(0)->bind(&avatar->mImpostor);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-		LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 	}
 
 	{
@@ -5258,13 +5327,13 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
 		}
 		
 		gGL.setSceneBlendType(LLRender::BT_ADD);
-		LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
+		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 		LLGLDepthTest depth(GL_FALSE, GL_FALSE);
 
 		gGL.color4f(1,1,1,1);
 		gGL.color4ub(64,64,64,255);
-		gGL.begin(LLVertexBuffer::QUADS);
+		gGL.begin(LLRender::QUADS);
 		gGL.vertex3fv((pos+left-up).mV);
 		gGL.vertex3fv((pos-left-up).mV);
 		gGL.vertex3fv((pos-left+up).mV);
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 5f94e37..c795283 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -131,6 +131,7 @@ public:
 		
 	//get the object between start and end that's closest to start.
 	LLViewerObject* lineSegmentIntersectInWorld(const LLVector3& start, const LLVector3& end,
+												BOOL pick_transparent,
 												S32* face_hit,                          // return the face hit
 												LLVector3* intersection = NULL,         // return the intersection point
 												LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point
@@ -138,6 +139,7 @@ public:
 												LLVector3* bi_normal = NULL             // return the surface bi-normal at the intersection point  
 		);
 	LLViewerObject* lineSegmentIntersectInHUD(const LLVector3& start, const LLVector3& end,
+											  BOOL pick_transparent,
 											  S32* face_hit,                          // return the face hit
 											  LLVector3* intersection = NULL,         // return the intersection point
 											  LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point
@@ -317,7 +319,6 @@ public:
 // 		RENDER_DEBUG_FEATURE_HW_LIGHTING		= 0x0010,
 		RENDER_DEBUG_FEATURE_FLEXIBLE			= 0x0010,
 		RENDER_DEBUG_FEATURE_FOG				= 0x0020,
-		RENDER_DEBUG_FEATURE_PALETTE			= 0x0040,
 		RENDER_DEBUG_FEATURE_FR_INFO			= 0x0080,
 		RENDER_DEBUG_FEATURE_FOOT_SHADOWS		= 0x0100,
 	};
diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc
index a39bb9f..8df0c57 100644
--- a/indra/newview/res/viewerRes.rc
+++ b/indra/newview/res/viewerRes.rc
@@ -231,8 +231,8 @@ TOOLMEDIAOPEN           CURSOR                  "toolmediaopen.cur"
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,20,9,87416
- PRODUCTVERSION 1,20,9,87416
+ FILEVERSION 1,20,15,97417
+ PRODUCTVERSION 1,20,15,97417
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -249,12 +249,12 @@ BEGIN
         BEGIN
             VALUE "CompanyName", "Linden Lab"
             VALUE "FileDescription", "Second Life"
-            VALUE "FileVersion", "1.20.9.87416"
+            VALUE "FileVersion", "1.20.15.97417"
             VALUE "InternalName", "Second Life"
             VALUE "LegalCopyright", "Copyright © 2001-2008, Linden Research, Inc."
             VALUE "OriginalFilename", "SecondLife.exe"
             VALUE "ProductName", "Second Life"
-            VALUE "ProductVersion", "1.20.9.87416"
+            VALUE "ProductVersion", "1.20.15.97417"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/indra/newview/secondlife setup build dazzle.bat b/indra/newview/secondlife setup build dazzle.bat
deleted file mode 100644
index f09f657..0000000
--- a/indra/newview/secondlife setup build dazzle.bat	
+++ /dev/null
@@ -1,4 +0,0 @@
- at rem Invoke the script which preps then runs the installer.
- at rem This batch file is customized per grid.
-
-@"secondlife setup build.bat" --channel="Second Life First Look Dazzle"
diff --git a/indra/newview/skins/default/xui/de/alerts.xml b/indra/newview/skins/default/xui/de/alerts.xml
index ab72b30..57a5a4b 100644
--- a/indra/newview/skins/default/xui/de/alerts.xml
+++ b/indra/newview/skins/default/xui/de/alerts.xml
@@ -735,13 +735,8 @@ Sie benötigen ein Benutzerkonto, um [SECOND_LIFE] betreten zu können. Möchten
 	</alert>
 	<alert name="AddClassified">
 		<message name="message">
-			Anzeigen erscheinen für eine Woche unter &apos;Anzeigen&apos;
-im Suchverzeichnis.
-Füllen Sie Ihre Anzeige aus und klicken Sie auf &apos;Veröffentlichen...&apos;, um sie zum
-Verzeichnis hinzuzufügen.
-Sie werden gebeten, einen Preis zu bezahlen, wenn Sie auf &apos;Veröffentlichen&apos; klicken.
-Wenn Sie mehr bezahlen oder ein Benutzer nach Ihren Suchbegriffen sucht,
-erscheint Ihre Anzeige weiter oben in der Liste.
+			Anzeigen erscheinen für eine Woche unter &apos;Anzeigen&apos; im Suchverzeichnis. Füllen Sie Ihre Anzeige aus und klicken Sie auf &apos;Veröffentlichen...&apos;, um sie zum Verzeichnis hinzuzufügen.
+Sie werden gebeten, einen Preis zu bezahlen, wenn Sie auf &apos;Veröffentlichen&apos; klicken. Wenn Sie mehr bezahlen oder ein Benutzer nach Ihren Suchbegriffen sucht, erscheint Ihre Anzeige weiter oben in der Liste.
 		</message>
 		<option name="OK">
 			OK
@@ -881,8 +876,7 @@ Hinweis: Der Cache wird dabei gelöscht/geleert.
 	</alert>
 	<alert name="GoToAuctionPage">
 		<message name="message">
-			Zur [SECOND_LIFE]-Webseite, um Auktionen anzuzeigen oder
-ein Gebot abzugeben?
+			Zur [SECOND_LIFE]-Webseite, um Auktionen anzuzeigen oder ein Gebot abzugeben?
 		</message>
 		<option name="GotoPage">
 			OK
diff --git a/indra/newview/skins/default/xui/de/floater_inventory.xml b/indra/newview/skins/default/xui/de/floater_inventory.xml
index d731d00..c8c6724 100644
--- a/indra/newview/skins/default/xui/de/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/de/floater_inventory.xml
@@ -2,8 +2,8 @@
 <floater name="Inventory" title="Inventar">
 	<search_editor label="Suchanfrage hier eintippen" name="inventory search editor" />
 	<tab_container name="inventory filter tabs">
-		<inventory_panel label="All Items" name="All Items" />
-		<inventory_panel label="Recent Items" name="Recent Items" />
+		<inventory_panel label="Alle Objekte" name="All Items" />
+		<inventory_panel label="Letzte Objekte" name="Recent Items" />
 	</tab_container>
 	<menu_bar name="Inventory Menu">
 		<menu label="Datei" name="File">
diff --git a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
index 1477cdb..2b63a90 100644
--- a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
@@ -49,17 +49,17 @@
 	</text>
 	<check_box label="Mit Gruppe teilen" name="CheckShareWithGroup" />
 	<check_box label="Kopieren allen erlauben" name="CheckEveryoneCopy" />
-	<text name="NextOwnerLabel">
+	<text name="NextOwnerLabel" width="150">
 		Nächster Eigentümer kann:
 	</text>
 	<check_box label="Bearbeiten" name="CheckNextOwnerModify" />
-	<check_box label="Kopieren" name="CheckNextOwnerCopy" />
+	<check_box label="Kopieren" name="CheckNextOwnerCopy" left_delta="85" />
 	<check_box label="Verkaufen/Weggeben" name="CheckNextOwnerTransfer" />
 	<text name="SaleLabel">
 		Objekt markieren:
 	</text>
 	<check_box label="Zum Verkauf" name="CheckPurchase" />
-	<radio_group name="RadioSaleType">
+	<radio_group name="RadioSaleType" left_delta="85"  width="245" >
 		<radio_item name="radio">
 			Original
 		</radio_item>
diff --git a/indra/newview/skins/default/xui/de/floater_lsl_guide.xml b/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
index 9fb400d..3f4a623 100644
--- a/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
@@ -3,5 +3,5 @@
 	<check_box label="Cursor folgen" name="lock_check" />
 	<combo_box label="Sperren" name="history_combo" />
 	<button label="Zurück" name="back_btn" />
-	<button label="Weiterleiten" name="fwd_btn" />
+	<button label="Weiterleiten" name="fwd_btn" width="82" />
 </floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
index 72b8bd8..7b6a693 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
@@ -30,12 +30,14 @@
 	<text name="steps_label">
 		Schritte:
 	</text>
+	<!-- Revert translations as interim fix to VWR-9985 while the code is not properly internationalized
 	<scroll_list name="library_list">
 		Animation
 Ton
 Chat
 Warten
 	</scroll_list>
+	-->
 	<button label="Hinzufügen &gt;&gt;" name="add_btn"/>
 	<button label="Nach oben" name="up_btn"/>
 	<button label="Nach unten" name="down_btn"/>
diff --git a/indra/newview/skins/default/xui/de/floater_snapshot.xml b/indra/newview/skins/default/xui/de/floater_snapshot.xml
index f2de810..c7a366a 100644
--- a/indra/newview/skins/default/xui/de/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/de/floater_snapshot.xml
@@ -112,10 +112,10 @@
 	<spinner label="Höhe" name="snapshot_height"/>
 	<check_box label="Seitenverhältnis beibehalten" name="keep_aspect_check"/>
 	<slider label="Bildqualität" name="image_quality_slider"/>
-	<text name="layer_type_label">
+	<text name="layer_type_label" width="63">
 		Aufnehmen:
 	</text>
-	<combo_box label="Bildlayer" name="layer_types">
+	<combo_box label="Bildlayer" name="layer_types" width="132" left="73">
 		<combo_item name="Colors">
 			Farben
 		</combo_item>
diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml
index 03401ce..a04851c 100644
--- a/indra/newview/skins/default/xui/de/floater_tools.xml
+++ b/indra/newview/skins/default/xui/de/floater_tools.xml
@@ -168,9 +168,9 @@
 			<text name="label click action">
 				Bei Linksklicken:
 			</text>
-			<combo_box name="clickaction">
+			<combo_box name="clickaction" width="178">
 				<combo_item name="Touch/grab(default)">
-					Berühren/greifen (Standard)
+					Berühren/Greifen (Standard)
 				</combo_item>
 				<combo_item name="Sitonobject">
 					Auf Objekt sitzen
@@ -590,13 +590,13 @@
 		<text name="label_area">
 			Fläche: [AREA] m2
 		</text>
-		<button label="Land kaufen..." label_selected="Land kaufen..." name="button buy land" />
-		<button label="Land aufgeben..." label_selected="Land aufgeben..."
+		<button label="Land kaufen..." label_selected="Land kaufen..." name="button buy land"  width="110" />
+		<button label="Land aufgeben..." label_selected="Land aufgeben..."  width="110"
 		     name="button abandon land" />
-		<button label="Unterteilen..." label_selected="Unterteilen..."
+		<button label="Unterteilen..." label_selected="Unterteilen..." width="110"
 		     name="button subdivide land" />
-		<button label="Zusammenlegen" label_selected="Zusammenlegen" name="button join land" />
-		<button label="Info zu Land..." label_selected="Info zu Land..."
+		<button label="Zusammenlegen" label_selected="Zusammenlegen" name="button join land" width="110" />
+		<button label="Info zu Land..." label_selected="Info zu Land..."  width="110"
 		     name="button about land" />
 	</panel>
 	<text name="status_rotate">
@@ -606,7 +606,7 @@
 		Klicken und ziehen, um die ausgewählte Seite zu dehnen
 	</text>
 	<text name="status_move">
-		Maus verschiebt, Shift-Taste und Maus kopiert
+		Maus verschiebt, Umschalt-Taste und Maus kopiert
 	</text>
 	<text name="status_modifyland">
 		Klicken und halten, um das Land zu bearbeiten
@@ -615,10 +615,10 @@
 		Klicken und ziehen, um die Ansicht zu ändern
 	</text>
 	<text name="status_grab">
-		Objekt new positionierern
+		Objekt neu positionieren
 	</text>
 	<text name="status_place">
-		Mausklick erstellt, Shift-Mausklick wählt aus
+		Mausklick erstellt, Umschalt-Mausklick wählt aus
 	</text>
 	<text name="status_selectland">
 		Klicken und ziehen, um Land auszuwählen
diff --git a/indra/newview/skins/default/xui/de/panel_avatar_classified.xml b/indra/newview/skins/default/xui/de/panel_avatar_classified.xml
index 237fe27..b8bd700 100644
--- a/indra/newview/skins/default/xui/de/panel_avatar_classified.xml
+++ b/indra/newview/skins/default/xui/de/panel_avatar_classified.xml
@@ -10,7 +10,7 @@
 	<combo_box label="" name="classified_category_combo" />
 	<check_box label="Ab 18" name="classified_mature_check">
 		<combo_item name="select_mature">
-			- Jugendfreigabe wählen -
+			- Jugendfreigabe -
 		</combo_item>
 		<combo_item name="mature">
 			Ab-18-Inhalt
diff --git a/indra/newview/skins/default/xui/de/panel_group_general.xml b/indra/newview/skins/default/xui/de/panel_group_general.xml
index 0a32de2..d232bfa 100644
--- a/indra/newview/skins/default/xui/de/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_general.xml
@@ -38,9 +38,9 @@ Bewegen Sie die Maus über die Optionen, um weitere Informationen anzuzeigen.
 		(Eigentümer werden fettgedruckt angezeigt)
 	</text>
 	<name_list name="visible_members">
-		<column label="Member Name" name="name" />
-		<column label="Title" name="title" />
-		<column label="Last Login" name="online" />
+		<column label="Mitgliedsname" name="name" relwidth="0.40" />
+		<column label="Titel" name="title" relwidth="0.25" />
+		<column label="Letzte Anmeldung" name="online" relwidth="0.35" />
 	</name_list>
 	<text name="incomplete_member_data_str">
 		Mitgliedsdaten werden abgerufen
@@ -83,8 +83,6 @@ Falls in den nächsten 48 Stunden niemand sonst dieser Gruppe beitritt, wird sie
 			<text name="active_title_label">
 				Mein aktiver Titel
 			</text>
-			<combo_box name="active_title"
-			     tool_tip="Sets the title that appears in your avatar&apos;s name tag   when this group is active." />
 		</panel>
 		<check_box label="Gruppenmitteilungen erhalten" name="receive_notices"
 		     tool_tip="Festlegen, ob Sie von dieser Gruppe Mitteilungen erhalten können.  Deaktivieren Sie diese Option, wenn Sie von der Gruppe Spam erhalten."
diff --git a/indra/newview/skins/default/xui/de/panel_group_land_money.xml b/indra/newview/skins/default/xui/de/panel_group_land_money.xml
index cf11e3c..77a9816 100644
--- a/indra/newview/skins/default/xui/de/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_land_money.xml
@@ -1,11 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel label="Land und L$" name="land_money_tab">
 	<text name="help_text">
-		Es werden Parzellen in Gruppenbesitz und 
-Beitragsdetails angezeigt. Solange der Wert für &apos;Insgesamt
-verwendet Land&apos; unter oder gleich dem Wert für
-&apos;Gesamtbeitrag&apos; ist, wird eine Warnung angezeigt. Die Registerkarten &apos;Planung&apos;, &apos;Details&apos; und &apos;Verkäufe&apos;
-enthalten Informationen über die Gruppenfinanzen.
+		Es werden Parzellen in Gruppenbesitz und Beitragsdetails angezeigt. Solange der Wert für &apos;Insgesamt verwendetes Land&apos; unter oder gleich dem Wert für &apos;Gesamtbeitrag&apos; ist, wird eine Warnung angezeigt. Die Registerkarten &apos;Planung&apos;, &apos;Details&apos; und &apos;Verkäufe&apos; enthalten Informationen über die Gruppenfinanzen.
 	</text>
 	<button label="?" name="help_button" />
 	<text name="cant_view_group_land_text">
@@ -21,9 +17,9 @@ enthalten Informationen über die Gruppenfinanzen.
 		Land in Gruppenbesitz
 	</text>
 	<scroll_list name="group_parcel_list">
-		<column label="Parcel Name" name="name" />
+		<column label="Parzellenname" name="name" />
 		<column label="Region" name="location" />
-		<column label="Area" name="area" />
+		<column label="Gebiet" name="area" />
 		<column label="" name="hidden" />
 	</scroll_list>
 	<button label="Auf Karte" label_selected="Auf Karte" name="map_button" />
@@ -55,10 +51,11 @@ enthalten Informationen über die Gruppenfinanzen.
 		Ihr Landbeitrag kann nicht festgelegt werden.
 	</string>
 	<text name="your_contribution_max_value">
-		Quadratmeter (max. [AMOUNT])
+		qm (max. [AMOUNT])
 	</text>
 	<text name="group_over_limit_text">
-		Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit das verwendete Land gehalten werden kann.
+		Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit
+das verwendete Land gehalten werden kann.
 	</text>
 	<text name="group_money_heading">
 		Gruppen-L$
diff --git a/indra/newview/skins/default/xui/de/panel_group_notices.xml b/indra/newview/skins/default/xui/de/panel_group_notices.xml
index 56a384b..53f5813 100644
--- a/indra/newview/skins/default/xui/de/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_notices.xml
@@ -22,9 +22,9 @@ Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich.
 	</text>
 	<scroll_list name="notice_list">
 		<column label="" name="icon" />
-		<column label="Subject" name="subject" />
-		<column label="From" name="from" />
-		<column label="Date" name="date" />
+		<column label="Thema" name="subject" />
+		<column label="Von" name="from" />
+		<column label="Datum" name="date" />
 	</scroll_list>
 	<text name="notice_list_none_found">
 		Nicht gefunden.
diff --git a/indra/newview/skins/default/xui/de/panel_group_roles.xml b/indra/newview/skins/default/xui/de/panel_group_roles.xml
index 9a478f1..204759f 100644
--- a/indra/newview/skins/default/xui/de/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_roles.xml
@@ -46,13 +46,13 @@ Mitglieder diese Fähigkeit haben.
 		</text>
 	</panel>
 	<tab_container name="roles_tab_container">
-		<panel label="Mitglieder" name="members_sub_tab" tool_tip="Members">
+		<panel label="Mitglieder" name="members_sub_tab" tool_tip="Mitglieder">
 			<button label="Suchen" name="search_button" />
 			<button label="Alle anzeigen" name="show_all_button" />
 			<name_list name="member_list">
-				<column label="Member Name" name="name" />
-				<column label="Donated Tier" name="donated" />
-				<column label="Last Login" name="online" />
+				<column label="Mitgliedsname" name="name" />
+				<column name="donated" />
+				<column label="Letzte Anmeldung" name="online" />
 			</name_list>
 			<button label="Neue Person einladen..." name="member_invite" />
 			<button label="Aus Gruppe werfen" name="member_eject" />
@@ -66,9 +66,9 @@ um mehrere Mitglieder auszuwählen.
 			<button label="Suchen" name="search_button" />
 			<button label="Alle anzeigen" name="show_all_button" />
 			<scroll_list name="role_list">
-				<column label="Role Name" name="name" />
-				<column label="Title" name="title" />
-				<column label="Members" name="members" />
+				<column name="name" />
+				<column label="Titel" name="title" />
+				<column label="Mitglieder" name="members" />
 			</scroll_list>
 			<button label="Neue Rolle erstellen..." name="role_create" />
 			<button label="Rolle löschen" name="role_delete" />
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
index 88fbfd4..feeb528 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
@@ -3,7 +3,7 @@
 	<text length="1" name="text_box" type="string">
 		Chat-Schriftgröße:
 	</text>
-	<radio_group name="chat font size">
+	<radio_group name="chat_font_size">
 		<radio_item length="1" name="radio" type="string">
 			Klein
 		</radio_item>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_input.xml b/indra/newview/skins/default/xui/de/panel_preferences_input.xml
index 5d57975..5bb83ad 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_input.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_input.xml
@@ -6,11 +6,11 @@
 	<text length="1" name=" Mouse Sensitivity:" type="string">
 		Mausempfindlichkeit:
 	</text>
-	<check_box label="Maus umkehren" name="invert mouse"/>
+	<check_box label="Maus umkehren" name="invert_mouse"/>
 	<text length="1" name=" Auto Fly Options:" type="string">
 		Auto-Flug-Optionen:
 	</text>
-	<check_box label="Zum Fliegen/Landen nach oben/unten halten" name="automatic fly"/>
+	<check_box label="Zum Fliegen/Landen nach oben/unten halten" name="automatic_fly"/>
 	<text length="1" name=" Camera Options:" type="string">
 		Kameraoptionen:
 	</text>
@@ -26,14 +26,14 @@
 	<text name="Camera Smoothing:">
 		Bewegungsglättung:
 	</text>
-	<check_box label="Automatischer Kameraschwenk im Bearbeiten-Modus" name="edit camera movement" tool_tip="Automatische Kamerapositionierung bei Wechsel in und aus dem Bearbeitungsmodus verwenden"/>
-	<check_box label="Automatischer Kameraschwenk im Aussehen-Modus" name="appearance camera movement" tool_tip="Automatische Kamerapositionierung im Bearbeitenmodus verwenden"/>
+	<check_box label="Automatischer Kameraschwenk im Bearbeiten-Modus" name="edit_camera_movement" tool_tip="Automatische Kamerapositionierung bei Wechsel in und aus dem Bearbeitungsmodus verwenden"/>
+	<check_box label="Automatischer Kameraschwenk im Aussehen-Modus" name="appearance_camera_movement" tool_tip="Automatische Kamerapositionierung im Bearbeitenmodus verwenden"/>
 	<text name="text2">
 		Avatar-Anzeigeoptionen:
 	</text>
-	<check_box label="Avatar in Mouselook anzeigen" name="avfp"/>
+	<check_box label="Avatar in Mouselook anzeigen" name="first_person_avatar_visible"/>
 	<text name="text5">
 		Joystick-Optionen:
 	</text>
-	<button label="Joystick-Einrichtung" name="joystic_setup_button"/>
+	<button label="Joystick-Einrichtung" name="joystick_setup_button"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index c644ece..56cc756 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -435,9 +435,9 @@
 	</string>
 	<!-- Chat -->
 	<string name="whisper">
-		Flüstert:
+		flüstert:
 	</string>
 	<string name="shout">
-		Ruft:
+		ruft:
 	</string>
 </strings>
diff --git a/indra/newview/skins/default/xui/en-us/alerts.xml b/indra/newview/skins/default/xui/en-us/alerts.xml
index 20b04db..44b9141 100644
--- a/indra/newview/skins/default/xui/en-us/alerts.xml
+++ b/indra/newview/skins/default/xui/en-us/alerts.xml
@@ -473,7 +473,7 @@ Do you wish to proceed?
 	<alert modal="true" name="JoinGroupCannotAfford">
 		<message name="message">
 			Joining this group costs L$[COST].
-You do not have a sufficient balance to join this group.
+You do not have enough L$ to join this group.
 		</message>
 	</alert>
 	<alert modal="true" name="LandBuyPass">
@@ -725,21 +725,13 @@ The outfit folder contains no clothing, body parts, or attachments.
 			You can not wear that item because it has not yet loaded. Please try again in a minute.
 		</message>
 	</alert>
-	<alert modal="true" name="MustHaveAccountToLogInNoLinks">
-		<message name="message">
-			You must have an account to connect to [SECOND_LIFE].
-		</message>
-		<option name="OK">
-			Close
-		</option>
-	</alert>
 	<alert modal="true" name="MustHaveAccountToLogIn">
 		<message name="message">
 Oops! Something was left blank.
 You need to enter both the First and Last name of your avatar.
 
 You need an account to enter [SECOND_LIFE]. Would you like to create one now?
-</message>
+		</message>
 		<option name="OK">
 			Create a new account
 		</option>
@@ -1592,12 +1584,12 @@ Expected [VALIDS]
 	</alert>
 	<alert modal="true" name="InsufficientFundsToUploadFile">
 		<message name="message">
-			Insufficient L$ to upload file: the price is L$[COST], your balance is L$[BALANCE]
+			Not enough L$ to upload file: the price is L$[COST], your balance is L$[BALANCE]
 		</message>
 	</alert>
 	<alert modal="true" name="InsufficientFundsToFinishUpload">
 		<message name="message">
-			Insufficient L$ to finish uploading [FILE]: the price is L$[COST], your balance is L$[BALANCE]
+			Not enough L$ to finish uploading [FILE]: the price is L$[COST], your balance is L$[BALANCE]
 		</message>
 	</alert>
 	<alert modal="true" name="CannotUploadReason">
@@ -2559,7 +2551,7 @@ You can change your mind later.
 	</alert>
 	<alert modal="true" name="NotEnoughCurrency">
 		<message name="message">
-			[NAME] L$ [PRICE] You don&apos;t have enough currency to do that.
+			[NAME] L$ [PRICE] You don&apos;t have enough L$ to do that.
 		</message>
 	</alert>
 	<alert modal="true" name="GrantedModifyRights">
@@ -2986,6 +2978,20 @@ Download to your Applications folder?
 			Cancel
 		</option>
 	</alert>
+	<alert modal="true" name="WebLaunchReleaseNotes">
+		<message name="message">
+			View the [SECOND_LIFE] Release Notes?
+		</message>
+		<ignore name="ignore">
+			When launching web browser to view the Release Notes
+		</ignore>
+		<option name="Gotopage">
+			OK
+		</option>
+		<option name="Cancel">
+			Cancel
+		</option>
+	</alert>
 	<alert modal="true" name="ReturnToOwner">
 		<message name="message">
 			Are you sure you want to return the selected
@@ -4262,9 +4268,9 @@ http://secondlife.com/corporate/cs.php
 
 All reported abuses of the Terms of Service and Community Standards 
 are investigated and resolved. You can view the incident 
-resolution on the Police Blotter at:
+resolution on the on the Incident Report at:
 
-http://secondlife.com/community/blotter.php
+http://secondlife.com/support/incidentreport.php
 		</message>
 	</alert>
 	<alert modal="true" name="HelpReportAbuseEmailEO">
@@ -4359,7 +4365,7 @@ Entering an accurate description helps us file and process bug reports.
 	<alert modal="true" name="HelpReportAbuseContainsCopyright">
 		<message name="message">
 			Dear Resident,
-
+ 
 You appear to be reporting intellectual property infringement. Please make sure you are reporting it correctly:
 
 (1) The Abuse Process. You may submit an abuse report if you believe a Resident is exploiting the Second Life permissions system, for example, by using CopyBot or similar copying tools, to infringe intellectual property rights. The Abuse Team investigates and issues appropriate disciplinary action for behavior that violates the Second Life Community Standards or Terms of Service. However, the Abuse Team does not handle and will not respond to requests to remove content from the Second Life world.
@@ -4369,8 +4375,9 @@ You appear to be reporting intellectual property infringement. Please make sure
 If you still wish to continue with the abuse process, please close this window and finish submitting your report.  You may need to select the specific category 'CopyBot or Permissions Exploit'.
 
 Thank you,
-
-Linden Lab</message>
+ 
+Linden Lab
+		</message>
 	</alert>
 	<alert modal="true" name="FailedRequirementsCheck">
 		<message name="message">
diff --git a/indra/newview/skins/default/xui/en-us/floater_about.xml b/indra/newview/skins/default/xui/en-us/floater_about.xml
index 91e0f00..f50d1ad 100644
--- a/indra/newview/skins/default/xui/en-us/floater_about.xml
+++ b/indra/newview/skins/default/xui/en-us/floater_about.xml
@@ -14,6 +14,7 @@
   3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
   APR Copyright (C) 2000-2004 The Apache Software Foundation
   cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel at 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, The FreeType Project (www.freetype.org).
   GL Copyright (C) 1999-2004 Brian Paul.
diff --git a/indra/newview/skins/default/xui/en-us/floater_about_land.xml b/indra/newview/skins/default/xui/en-us/floater_about_land.xml
index fc1b747..0b4b37c 100644
--- a/indra/newview/skins/default/xui/en-us/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en-us/floater_about_land.xml
@@ -481,13 +481,17 @@ Go to World menu > About Land or select another parcel to show its details.
 			</text>
 			<check_box bottom="-40" enabled="true" follows="left|top" font="SansSerifSmall"
 			     height="16" initial_value="false" label="Edit Terrain" left="14"
-			     mouse_opaque="true" name="edit land check" radio_style="false" width="268" />
+			     mouse_opaque="true" name="edit land check" radio_style="false"
+                             tool_tip="If checked, anyone can terraform your land. It is best to leave this unchecked, as you can always edit your own land."
+                             width="268" />
 			<check_box bottom="-60" enabled="true" follows="left|top" font="SansSerifSmall"
 			     height="16" initial_value="false" label="Create Landmarks" left="14"
 			     mouse_opaque="true" name="check landmark" radio_style="false" width="268" />
 			<check_box bottom="-80" enabled="true" follows="left|top" font="SansSerifSmall"
 			     height="16" initial_value="false" label="Fly" left="14" mouse_opaque="true"
-			     name="check fly" radio_style="false" width="268" />
+			     name="check fly" radio_style="false"
+                             tool_tip="If checked, Residents can fly on your land. If unchecked, they can only fly into and over your land."
+                             width="268" />
 			<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
 			     bottom="-40" drop_shadow_visible="true" enabled="true" follows="left|top"
 			     font="SansSerifSmall" h_pad="0" halign="left" height="16" left="178"
@@ -538,11 +542,13 @@ Go to World menu > About Land or select another parcel to show its details.
 			</text>
 			<check_box bottom="-120" enabled="true" follows="left|top" font="SansSerifSmall"
 			     height="16" initial_value="false" label="Safe (no damage)" left="14"
-			     mouse_opaque="true" name="check safe" radio_style="false" width="268" />
+			     mouse_opaque="true" name="check safe" radio_style="false"
+                             tool_tip="If checked, sets the land to Safe, disabling damage combat. If cleared, damage combat is enabled."
+                             width="268" />
 			<check_box bottom="-120" enabled="true" follows="left|top" font="SansSerifSmall"
-			     height="16" initial_value="false" label="Restrict Pushing" left="178"
+			     height="16" initial_value="false" label="No Pushing" left="178"
 			     mouse_opaque="true" name="PushRestrictCheck" radio_style="false"
-			     tool_tip="llPushObject will only work through parcel owner scripts or on scripts where the pushee is the script owner."
+			     tool_tip="Prevents scripts from pushing. Checking this option may be useful for preventing disruptive behavior on your land."
 			     width="119" />
 			<check_box bottom="-140" enabled="true" follows="left|top" font="SansSerifSmall"
 			     height="16" initial_value="false"
@@ -622,7 +628,7 @@ Go to World menu > About Land or select another parcel to show its details.
 			<button bottom="-303" enabled="true" follows="left|top" font="SansSerifSmall"
 			     halign="center" height="16" label="Set" label_selected="Set" left="236"
 			     mouse_opaque="true" name="Set" scale_image="true"
-			     tool_tip="Set the landing point to your avatar&apos;s location. It must be inside this land parcel."
+			     tool_tip="Sets the landing point where visitors arrive. Sets to your avatar&apos;s location inside this parcel."
 			     width="50" />
 			<button bottom="-303" enabled="true" follows="left|top" font="SansSerifSmall"
 			     halign="center" height="16" label="Clear" label_selected="Clear" left="291"
@@ -650,10 +656,10 @@ Go to World menu > About Land or select another parcel to show its details.
 				</combo_item>
 			</combo_box>
 			<string name="push_restrict_text">
-				Restrict Pushing
+				No Pushing
 			</string>
 			<string name="push_restrict_region_text">
-				Restrict Pushing (Region Override)
+				No Pushing (Region Override)
 			</string>
 		</panel>
 		<panel border="true" bottom="-349" enabled="true" follows="left|top|right|bottom"
diff --git a/indra/newview/skins/default/xui/en-us/floater_beacons.xml b/indra/newview/skins/default/xui/en-us/floater_beacons.xml
new file mode 100644
index 0000000..0fb1aaf
--- /dev/null
+++ b/indra/newview/skins/default/xui/en-us/floater_beacons.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater can_close="true" can_drag_on_left="false" can_minimize="true" can_resize="false"
+     width="250" height="225"
+     name="beacons" title="Beacons"
+     rect_control="FloaterBeaconsRect" control_name="BeaconAlwaysOn">
+	<panel bottom="10" follows="left|top|right|bottom" left="10" width="230" height="200" name="beacons_panel">
+  	<check_box bottom_delta="-33" follows="left|top" left="0" name="touch_only" label="Scripted Objects with Touch Only" control_name="scripttouchbeacon" />
+    <check_box bottom_delta="-20" follows="left|top" left="0" name="scripted" label="Scripted Objects" control_name="scriptsbeacon" />
+    <check_box bottom_delta="-20" follows="left|top" left="0" name="physical" label="Physical Objects" control_name="physicalbeacon" />
+    <check_box bottom_delta="-20" follows="left|top" left="0" name="sounds" label="Sound Sources" control_name="soundsbeacon" />
+    <check_box bottom_delta="-20" follows="left|top" left="0" name="particles" label="Particle Sources" control_name="particlesbeacon" />
+    <check_box bottom_delta="-20" follows="left|top" left="0" name="highlights" label="Render Highlights" control_name="renderhighlights" />
+    <check_box bottom_delta="-20" follows="left|top" left="0" name="beacons" label="Render Beacons" control_name="renderbeacons" />
+  	<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
+  	     bottom_delta="-30" drop_shadow_visible="true" enabled="true" follows="left|top"
+  	     font="SansSerifSmall" h_pad="0" halign="left" height="12" left="5"
+  	     mouse_opaque="true" name="beacon_width_label" v_pad="0" width="128">
+  		Beacon Width:
+  	</text>
+  	<slider bottom_delta="-20" can_edit_text="false" enabled="true" width="185" height="16" mouse_opaque="true"
+  	     decimal_digits="0" increment="1" initial_val="1" left="30" min_val="1.0" max_val="16.0"
+  	     name="beacon_width" show_text="true" value="1" control_name="DebugBeaconLineWidth"/>    
+	</panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/en-us/floater_chat_history.xml b/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
index 6bd4424..4be65b6 100644
--- a/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
+++ b/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
@@ -46,14 +46,16 @@
 			     bottom="28" embedded_items="false" enabled="false"
 			     follows="left|top|right|bottom" font="SansSerif" height="74" left="5"
 			     max_length="2147483647" mouse_opaque="true" name="Chat History Editor"
+           track_bottom="true" 
 			     text_color="ChatHistoryTextColor"
 			     text_readonly_color="ChatHistoryTextColor" width="299" word_wrap="true" />
-			<text_editor type="string" length="1" bg_readonly_color="ChatHistoryBgColor" bg_writeable_color="ChatHistoryBgColor"
+      <text_editor type="string" length="1" bg_readonly_color="ChatHistoryBgColor" bg_writeable_color="ChatHistoryBgColor"
 			     bottom="28" embedded_items="false" enabled="false"
 			     follows="left|top|right|bottom" font="SansSerif" height="74" left="5"
 			     max_length="2147483647" mouse_opaque="true"
 			     name="Chat History Editor with mute" text_color="ChatHistoryTextColor"
-			     text_readonly_color="ChatHistoryTextColor" width="300" word_wrap="true" />
+           track_bottom="true" 
+			     text_readonly_color="ChatHistoryTextColor" width="300" word_wrap="true"/>
 			<panel bottom="5" follows="left|right|bottom" left="5" name="chat_panel" right="-5"
 			     tab_group="1" top="25">
         <string name="gesture_label">Gestures</string>
@@ -72,6 +74,9 @@
 					<flyout_button_item value="say" name="say_item">
 						Say
 					</flyout_button_item>
+					<flyout_button_item value="whisper" name="whisper_item">
+						Whisper
+					</flyout_button_item>
 				</flyout_button>
 			</panel>
 		</layout_panel>
diff --git a/indra/newview/skins/default/xui/en-us/floater_instant_message.xml b/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
index cce06b5..37eb644 100644
--- a/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
+++ b/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
@@ -56,6 +56,7 @@
 	     follows="left|top|right|bottom" font="SansSerif" height="221" left="5"
 	     max_length="2147483647" mouse_opaque="true" name="im_history"
 	     text_color="ChatHistoryTextColor"
+       track_bottom="true" 
 	     text_readonly_color="ChatHistoryTextColor" width="487" word_wrap="true" />
 	<line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="7"
 	     follows="left|right|bottom" font="SansSerif" height="20"
diff --git a/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc.xml b/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc.xml
index eea285c..54e4cee 100644
--- a/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc.xml
+++ b/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc.xml
@@ -48,6 +48,7 @@
 			     bottom="-265" embedded_items="false" enabled="false"
 			     follows="left|top|right|bottom" font="SansSerif" height="239" left="5"
 			     max_length="2147483647" mouse_opaque="true" name="im_history"
+           track_bottom="true" 
 			     text_color="ChatHistoryTextColor"
 			     text_readonly_color="ChatHistoryTextColor" width="490" word_wrap="true" />
 			<line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="7"
diff --git a/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml b/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml
index be18c7e..45504e1 100644
--- a/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml
+++ b/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml
@@ -64,6 +64,7 @@
 			     follows="left|top|right|bottom" font="SansSerif" left="4"
 			     max_length="2147483647" mouse_opaque="true" name="im_history"
 			     text_color="ChatHistoryTextColor"
+           track_bottom="true" 
 			     text_readonly_color="ChatHistoryTextColor" top="104" width="170"
 			     word_wrap="true" />
 			<line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="7"
diff --git a/indra/newview/skins/default/xui/en-us/menu_pie_object.xml b/indra/newview/skins/default/xui/en-us/menu_pie_object.xml
index c5a04ce..df9b2a0 100644
--- a/indra/newview/skins/default/xui/en-us/menu_pie_object.xml
+++ b/indra/newview/skins/default/xui/en-us/menu_pie_object.xml
@@ -53,11 +53,11 @@
 			</menu_item_call>
 			<menu_item_separator />
 			<menu_item_separator />
-			<menu_item_separator />
 			<menu_item_call enabled="false" label="Mute" mouse_opaque="true" name="Object Mute">
 				<on_click function="Object.Mute" />
 				<on_enable function="Object.EnableMute" />
 			</menu_item_call>
+			<menu_item_separator />
 			<menu_item_call enabled="true" label="Inspect" mouse_opaque="true" name="Object Inspect">
 				<on_click function="Object.Inspect" />
 				<on_enable function="Object.EnableInspect" />
diff --git a/indra/newview/skins/default/xui/en-us/menu_viewer.xml b/indra/newview/skins/default/xui/en-us/menu_viewer.xml
index bbe9fbd..2728962 100644
--- a/indra/newview/skins/default/xui/en-us/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en-us/menu_viewer.xml
@@ -262,13 +262,11 @@
 		</menu_item_check>
 		<menu_item_check bottom="-132" enabled="true" height="19" label="Local Chat" left="0"
 		     mouse_opaque="true" name="Chat History" shortcut="control|H" width="211">
-			<on_click function="ShowFloater" userdata="chat history" />
-			<on_check function="FloaterVisible" userdata="chat history" />
+                     <on_click function="View.Communicate"/>
 		</menu_item_check>
 		<menu_item_check bottom="-151" enabled="true" height="19" label="Communicate" left="0"
 		     mouse_opaque="true" name="Instant Message" shortcut="control|T" width="211">
-			<on_click function="ShowFloater" userdata="im" />
-			<on_check function="FloaterVisible" userdata="im" />
+			<on_click function="View.Communicate"/>
 		</menu_item_check>
 		<menu_item_call bottom="-170" enabled="true" height="19" label="Inventory" left="0"
 		     mouse_opaque="true" name="Inventory" shortcut="control|I" width="211">
@@ -356,87 +354,19 @@
 			<on_click function="View.HighlightTransparent" userdata="" />
 			<on_check function="View.CheckHighlightTransparent" />
 		</menu_item_check>
-		<menu_item_check bottom="-384" enabled="true" height="19" label="Beacons Always On" left="0"
-		     mouse_opaque="true" name="Beacons Always On"
-		     width="211">
-			<on_click function="ToggleControl" userdata="BeaconAlwaysOn" />
-			<on_check control="BeaconAlwaysOn" />
-		</menu_item_check>
-		<menu bottom="-554" create_jump_keys="true" drop_shadow="true" enabled="true"
-		     height="117" label="Beacons" left="0" mouse_opaque="false" name="Beacons"
-		     opaque="true" tear_off="true" width="129">
-			<menu_item_check bottom="-29" enabled="true" height="19"
-			     label="Scripted Objects with Touch Only" left="0" mouse_opaque="true"
-			     name="Scripted Objects With Touch Only" width="129">
-				<on_click function="View.ToggleBeacon" userdata="scripttouchbeacon" />
-				<on_check function="View.CheckBeaconEnabled" userdata="scripttouchbeacon" />
-			</menu_item_check>
-			<menu_item_check bottom="-48" enabled="true" height="19" label="Scripted Objects" left="0"
-			     mouse_opaque="true" name="Scripted Objects" width="129">
-				<on_click function="View.ToggleBeacon" userdata="scriptsbeacon" />
-				<on_check function="View.CheckBeaconEnabled" userdata="scriptsbeacon" />
-			</menu_item_check>
-			<menu_item_check bottom="-67" enabled="true" height="19" label="Physical Objects" left="0"
-			     mouse_opaque="true" name="Physical Objects" width="129">
-				<on_click function="View.ToggleBeacon" userdata="physicalbeacon" />
-				<on_check function="View.CheckBeaconEnabled" userdata="physicalbeacon" />
-			</menu_item_check>
-			<menu_item_check bottom="-86" enabled="true" height="19" label="Sound Sources" left="0"
-			     mouse_opaque="true" name="Sound Sources" width="129">
-				<on_click function="View.ToggleBeacon" userdata="soundsbeacon" />
-				<on_check function="View.CheckBeaconEnabled" userdata="soundsbeacon" />
-			</menu_item_check>
-			<menu_item_check bottom="-105" enabled="true" height="19" label="Particle Sources" left="0"
-			     mouse_opaque="true" name="Particle Sources" width="129">
-				<on_click function="View.ToggleBeacon" userdata="particlesbeacon" />
-				<on_check function="View.CheckBeaconEnabled" userdata="particlesbeacon" />
-			</menu_item_check>
-			<menu_item_separator bottom="-113" enabled="true" height="8" label="-----------" left="0"
-			     mouse_opaque="true" name="separator" width="129" />
-			<menu_item_check bottom="-121" enabled="true" height="19" label="Render Highlights" left="0"
-			     mouse_opaque="true" name="Render Highlights" width="129">
-				<on_click function="View.ToggleBeacon" userdata="renderhighlights" />
-				<on_check function="View.CheckBeaconEnabled" userdata="renderhighlights" />
-			</menu_item_check>
-			<menu_item_check bottom="-140" enabled="true" height="19" label="Render Beacons" left="0"
-			     mouse_opaque="true" name="Render Beacons" width="129">
-				<on_click function="View.ToggleBeacon" userdata="renderbeacons" />
-				<on_check function="View.CheckBeaconEnabled" userdata="renderbeacons" />
-			</menu_item_check>
-			<menu_item_separator bottom="-159" enabled="true" height="8" label="-----------" left="0"
-			     mouse_opaque="true" name="separator2" width="129" />
-			<menu_item_check bottom="-167" enabled="true" height="19" label="Hide Particles" left="0"
-			     mouse_opaque="true" name="Hide Particles" width="129">
-				<on_click function="View.ToggleRenderType" userdata="hideparticles" />
-				<on_check function="View.CheckRenderType" userdata="hideparticles" />
-			</menu_item_check>
-			<menu_item_separator bottom="-186" enabled="true" height="8" label="-----------" left="0"
-			     mouse_opaque="true" name="separator3" width="129" />
-			<menu bottom="-205" color="0 0 0 1" create_jump_keys="true" drop_shadow="true"
-			     enabled="true" height="117" label="Beacon Width" left="0"
-			     mouse_opaque="false" name="Beacon Width" opaque="true" tear_off="true"
-			     width="129">
-				<menu_item_call bottom="-19" enabled="true" height="19" label="1" left="0" mouse_opaque="true"
-				     name="Beacon Width 1" width="188">
-					<on_click function="View.BeaconWidth" userdata="1" />
-				</menu_item_call>
-				<menu_item_call bottom="-19" enabled="true" height="19" label="4" left="0" mouse_opaque="true"
-				     name="Beacon Width 4" width="188">
-					<on_click function="View.BeaconWidth" userdata="4" />
-				</menu_item_call>
-				<menu_item_call bottom="-19" enabled="true" height="19" label="16" left="0" mouse_opaque="true"
-				     name="Beacon Width 16" width="188">
-					<on_click function="View.BeaconWidth" userdata="16" />
-				</menu_item_call>
-				<menu_item_call bottom="-19" enabled="true" height="19" label="32" left="0" mouse_opaque="true"
-				     name="Beacon Width 32" width="188">
-					<on_click function="View.BeaconWidth" userdata="32" />
-				</menu_item_call>
-			</menu>
-		</menu>
-		<menu_item_check bottom="-441" enabled="true" height="19" label="Show HUD Attachments" left="0"
-		     mouse_opaque="true" name="Show HUD Attachments" shortcut="alt|shift|H"
-		     width="211">
+    <menu_item_check bottom="-384" enabled="true" height="19" label="Beacons" left="0"
+       mouse_opaque="true" name="beacons" width="211" shortcut="control|alt|shift|N">
+      <on_click function="ShowFloater" userdata="beacons" />
+      <on_check function="FloaterVisible" userdata="beacons" />
+    </menu_item_check>
+    <menu_item_check bottom="-384" enabled="true" height="19" label="Hide Particles" left="0"
+          mouse_opaque="true" name="Hide Particles" width="129" shortcut="control|alt|shift|=">
+        <on_click function="View.ToggleRenderType" userdata="hideparticles" />
+        <on_check function="View.CheckRenderType" userdata="hideparticles" />
+    </menu_item_check>
+    <menu_item_check bottom="-441" enabled="true" height="19" label="Show HUD Attachments" left="0"
+       mouse_opaque="true" name="Show HUD Attachments" shortcut="alt|shift|H"
+       width="211">
 			<on_click function="View.ShowHUDAttachments" userdata="" />
 			<on_check function="View.CheckHUDAttachments" />
 		</menu_item_check>
@@ -792,10 +722,6 @@
 		</menu_item_call>
 		<menu_item_separator bottom="-102" enabled="true" height="8" label="-----------" left="0"
 		     mouse_opaque="true" name="separator2" width="166" />
-		<menu_item_call bottom="-121" enabled="true" height="19" label="Scripting Guide..." left="0"
-		     mouse_opaque="true" name="Scripting Guide..." width="166">
-			<on_click function="PromptShowFile" userdata="WebLaunchLSLGuide,lsl_guide.html" />
-		</menu_item_call>
 		<menu_item_call bottom="-140" enabled="true" height="19" label="Scripting Portal..." left="0"
 		     mouse_opaque="true" name="Scripting Portal..." width="166">
 			<on_click function="PromptShowURL"
diff --git a/indra/newview/skins/default/xui/en-us/notify.xml b/indra/newview/skins/default/xui/en-us/notify.xml
index 6af19ee..63396af 100644
--- a/indra/newview/skins/default/xui/en-us/notify.xml
+++ b/indra/newview/skins/default/xui/en-us/notify.xml
@@ -374,7 +374,7 @@ You cannot fly here.
 	</notify>
 	<notify name="PushRestricted" tip="false" unique="true">
 		<message name="message">
-			This land is &apos;llPushObject Restricted&apos;.
+			This land is &apos;No Pushing&apos;.
 You cannot push others here unless you own the land.
 		</message>
 	</notify>
diff --git a/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml b/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml
index 95604ff..ce6d35b 100644
--- a/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml
@@ -17,15 +17,20 @@
 	<flyout_button bottom="-23" follows="right|bottom" height="20" label="Say" left_delta="110"
 	     list_position="above" mouse_opaque="true" name="Say" tool_tip="(Enter)"
 	     width="80">
+		<flyout_button_item value="shout" name="shout_item">
+			Shout
+		</flyout_button_item>
 		<flyout_button_item value="say" name="say_item">
 			Say
 		</flyout_button_item>
-		<flyout_button_item value="shout" name="shout_item">
-			Shout
+		<flyout_button_item value="whisper" name="whisper_item">
+			Whisper
 		</flyout_button_item>
 	</flyout_button>
 	<combo_box allow_text_entry="false" bottom="-23" follows="right|bottom" height="20"
 	     label="Gestures" left_delta="85" max_chars="20" name="Gesture" width="90">
+		<combo_item name="Gestures">
+			Gestures
+		</combo_item>
 	</combo_box>
-  <string name="gesture_label">Gestures</string>
 </panel>
diff --git a/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml
index b2bb65f..24753d1 100644
--- a/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml
@@ -8,9 +8,9 @@
 	     mouse_opaque="false" name="text_box" v_pad="0" width="128">
 		Chat Font Size:
 	</text>
-	<radio_group bottom="-40" control_name="ChatFontSize" draw_border="true" enabled="true"
+	<radio_group bottom="-40" draw_border="true" enabled="true"
 	     follows="left|top" height="30" left="148" mouse_opaque="true"
-	     name="chat font size" width="331">
+	     name="chat_font_size" width="331">
 		<radio_item type="string" length="1" bottom="-24" enabled="true" height="16" left="0" mouse_opaque="true"
 		     name="radio" width="98">
 			Small
@@ -39,12 +39,12 @@
 	     enabled="true" follows="left|top" height="56" label="Others" left_delta="48"
 	     mouse_opaque="true" name="agent" width="44" />
 	<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-108"
-	     can_apply_immediately="true" color="0.6 0.6 1 1" control_name="IMChatColor"
+	     can_apply_immediately="true" color="0.6 0.6 1 1"
 	     enabled="true" follows="left|top" height="56" label="IM" left_delta="48"
 	     mouse_opaque="true" name="im" width="44" />
 	<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-108"
 	     can_apply_immediately="true" color="0.8 1 1 1"
-	     control_name="SystemChatColor" enabled="true" follows="left|top"
+	     enabled="true" follows="left|top"
 	     height="56" label="System" left_delta="48" mouse_opaque="true"
 	     name="system" width="44" />
 	<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-108"
@@ -59,17 +59,17 @@
 	     name="objects" width="44" />
 	<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-165"
 	     can_apply_immediately="true" color="0.7 0.9 0.7 1"
-	     control_name="llOwnerSayChatColor" enabled="true" follows="left|top"
+	     enabled="true" follows="left|top"
 	     height="56" label="Owner" left_delta="48" mouse_opaque="true" name="owner"
 	     width="44" />
 	<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-165"
 	     can_apply_immediately="true" color="0 0 0 1"
-	     control_name="BackgroundChatColor" enabled="true" follows="left|top"
+	     enabled="true" follows="left|top"
 	     height="56" label="Bubble" left_delta="48" mouse_opaque="true"
 	     name="background" width="44" />
 	<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-165"
 	     can_apply_immediately="true" color="0.6 0.6 1 1"
-	     control_name="HTMLLinkColor" enabled="true" follows="left|top" height="56"
+	     enabled="true" follows="left|top" height="56"
 	     label="URLs" left_delta="48" mouse_opaque="true" name="links" width="44" />
 	<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
 	     bottom="-185" drop_shadow_visible="true" enabled="true" follows="left|top"
@@ -100,7 +100,7 @@
 	     width="80">
 		(seconds)
 	</text>
-	<spinner bottom_delta="-6" control_name="ConsoleMaxLines" decimal_digits="0"
+	<spinner bottom_delta="-6" decimal_digits="0"
 	     enabled="true" follows="left|top" height="16" increment="1"
 	     initial_val="10" left="340" max_val="50" min_val="1" mouse_opaque="true"
 	     name="max_chat_count" width="60" />
@@ -127,20 +127,20 @@
 	     mouse_opaque="false" name="text_box6" v_pad="0" width="135">
 		Chat Options:
 	</text>
-	<check_box bottom_delta="-10" control_name="CloseChatOnReturn" enabled="true"
+	<check_box bottom_delta="-10" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
 	     label="Close chat bar after hitting return" left="148" mouse_opaque="true"
 	     name="close_chat_on_return_check" radio_style="false" width="237" />
-	<check_box bottom_delta="-20" control_name="ArrowKeysMoveAvatar" enabled="true"
+	<check_box bottom_delta="-20" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
 	     label="Arrow keys always move avatar when chatting" left="148"
 	     mouse_opaque="true" name="arrow_keys_move_avatar_check" radio_style="false"
 	     width="237" />
-	<check_box bottom_delta="-20" control_name="ChatShowTimestamps" enabled="true"
+	<check_box bottom_delta="-20" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
 	     label="Show timestamps in Local Chat" left="148" mouse_opaque="true"
 	     name="show_timestamps_check" radio_style="false" width="237" />
-	<check_box bottom_delta="-20" control_name="PlayTypingAnim" enabled="true"
+	<check_box bottom_delta="-20" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
 	     label="Play typing animation when chatting" left="148" mouse_opaque="true"
 	     name="play_typing_animation" radio_style="false" width="237" />
diff --git a/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml b/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
index 67d3307..3648ce6 100644
--- a/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
@@ -2,20 +2,21 @@
 <panel border="true" bottom="-409" enabled="true" follows="left|top|right|bottom"
      height="408" label="General" left="102" mouse_opaque="true"
      name="general_panel" width="517">
-	<combo_box allow_text_entry="true" bottom="-24" enabled="true" follows="left|bottom"
-	     height="16" left="155" max_chars="128" mouse_opaque="true"
-	     name="location_combobox" width="146">
-		<combo_item name="MyHome" value="My Home">
-			My Home
-		</combo_item>
-		<combo_item name="MyLastLocation" value="My Last Location">
-			My Last Location
-		</combo_item>
-	</combo_box>
-	<check_box bottom="-44" control_name="ShowStartLocation" enabled="true" follows="left|top"
-	     font="SansSerifSmall" height="16" initial_value="true"
-	     label="Show Start Location on Login Screen" left="151" mouse_opaque="true"
-	     name="show_location_checkbox" radio_style="false" width="256" />
+  <radio_group bottom="-45" draw_border="false" follows="left|bottom" height="40" left="151"
+	     name="default_start_location" width="220">
+    <radio_item bottom="-20" height="20" left="0" name="MyHome" width="50"
+		  tool_tip="Log into my home location by default.">
+      My Home
+    </radio_item>
+    <radio_item bottom="-20" height="20" left="100" name="MyLastLocation" width="50"
+		  tool_tip="Log into my last location by default.">
+      My Last Location
+    </radio_item>
+  </radio_group>
+  <check_box bottom="-44" enabled="true" follows="left|top"
+       font="SansSerifSmall" height="16" initial_value="true"
+       label="Show Start Location on Login Screen" left="151" mouse_opaque="true"
+       name="show_location_checkbox" radio_style="false" width="256" />
 	<combo_box bottom_delta="-25" follows="left|top" height="18" left="155"
 	     mouse_opaque="true" name="fade_out_combobox" width="146">
 		<combo_item name="Never" value="Never">
@@ -28,11 +29,11 @@
 			Always
 		</combo_item>
 	</combo_box>
-	<check_box bottom_delta="-25" control_name="SmallAvatarNames" follows="left|top"
+	<check_box bottom_delta="-25" follows="left|top"
 	     font="SansSerifSmall" height="16" initial_value="true"
 	     label="Small Avatar Names" left="151" name="small_avatar_names_checkbox"
 	     width="200" />
-	<check_box bottom_delta="-18" control_name="RenderNameHideSelf" follows="left|top"
+	<check_box bottom_delta="-18" follows="left|top"
 	     font="SansSerifSmall" height="16" initial_value="false"
 	     label="Hide My Name On My Screen" left="151" name="show_my_name_checkbox"
 	     width="200" />
@@ -41,16 +42,16 @@
 	     width="394">
 		Group Titles:
 	</text>
-	<check_box bottom_delta="0" control_name="RenderHideGroupTitleAll" follows="left|top"
+	<check_box bottom_delta="0" follows="left|top"
 	     font="SansSerifSmall" height="16" initial_value="false"
 	     label="Hide All Group Titles" left="151" mouse_opaque="true"
 	     name="show_all_title_checkbox" radio_style="false" width="256" />
-	<check_box bottom_delta="-18" control_name="RenderHideGroupTitle" follows="left|top"
+	<check_box bottom_delta="-18" follows="left|top"
 	     font="SansSerifSmall" height="16" initial_value="false"
 	     label="Hide My Group Title" left="151" name="show_my_title_checkbox"
 	     radio_style="false" width="256" />
 	<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-210"
-	     can_apply_immediately="false" color="1 1 1 1" control_name="EffectColor"
+	     can_apply_immediately="false" color="1 1 1 1"
 	     enabled="true" follows="left|top" height="48" label="" left="153"
 	     mouse_opaque="true" name="effect_color_swatch"
 	     tool_tip="Click to open Color Picker" width="32" />
@@ -60,34 +61,34 @@
 	     mouse_opaque="true" name="UI Size:" v_pad="0" width="128">
 		UI Size:
 	</text>
-	<slider bottom="-217" can_edit_text="true" control_name="UIScaleFactor"
+	<slider bottom="-217" can_edit_text="true"
 	     decimal_digits="3" enabled="true" height="16" increment="0.025"
 	     initial_val="1" left="148" max_val="1.4" min_val="0.75" mouse_opaque="true"
-	     name="UI Scale" show_text="true" value="1" width="256" />
-	<check_box bottom="-236" control_name="UIAutoScale" enabled="true" follows="left|top"
+	     name="ui_scale_slider" show_text="true" value="1" width="256" />
+	<check_box bottom="-236" enabled="true" follows="left|top"
 	     font="SansSerifSmall" height="16" initial_value="false"
 	     label="Use resolution independent scale" left="151" mouse_opaque="true"
 	     name="ui_auto_scale" radio_style="false" width="256" />
-	<spinner bottom="-260" control_name="AFKTimeout" decimal_digits="0" enabled="true"
+	<spinner bottom="-260" decimal_digits="0" enabled="true"
 	     follows="left|top" height="16" increment="1" initial_val="300"
 	     label="Away Timeout:" label_width="141" left="10" max_val="600"
 	     min_val="30" mouse_opaque="true" name="afk_timeout_spinner" width="202" />
-	<check_box bottom="-286" control_name="MiniMapRotate" enabled="true" follows="left|top"
+	<check_box bottom="-286" enabled="true" follows="left|top"
 	     font="SansSerifSmall" height="16" initial_value="false"
 	     label="Rotate Mini-Map" left="151" mouse_opaque="true"
 	     name="rotate_mini_map_checkbox" radio_style="false" width="256" />
-	<check_box bottom="-304" control_name="NotifyMoneyChange" enabled="true"
+	<check_box bottom="-304" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
 	     label="Notify when Linden dollars (L$) spent or received" left="151"
 	     mouse_opaque="true" name="notify_money_change_checkbox" radio_style="false"
 	     width="256" />
-	<check_box bottom="-322" control_name="UseDefaultColorPicker" enabled="true"
+	<check_box bottom="-322" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
 	     label="Use default system color picker" left="151" mouse_opaque="true"
 	     name="use_system_color_picker_checkbox" radio_style="false"
 	     tool_tip="Use the default system color picker instead of the one built into Second Life."
 	     width="256" />
-	<check_box bottom="-340" control_name="ShowSearchBar" enabled="true" follows="left|top"
+	<check_box bottom="-340" enabled="true" follows="left|top"
 	     font="SansSerifSmall" height="16" initial_value="false"
 	     label="Show search panel in overlay bar" left="151" mouse_opaque="true"
 	     name="show_search_panel" radio_style="false"
@@ -151,7 +152,7 @@
 			Never send
 		</combo_item>
 	</combo_box>
-	<combo_box allow_text_entry="true" bottom="-382" control_name="Language" enabled="true"
+	<combo_box allow_text_entry="true" bottom="-382" enabled="true"
 	     follows="left|bottom" height="16" left="153" max_chars="135"
 	     mouse_opaque="true" name="language_combobox" width="146">
 		<combo_item type="string" length="1" enabled="true" name="System Default Language" value="default">
@@ -182,7 +183,7 @@
 			Español (Spanish) - Beta
 		</combo_item>
 	</combo_box>
-	<check_box bottom="-400" control_name="LanguageIsPublic" enabled="true"
+	<check_box bottom="-400" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" hidden="false"
 	     initial_value="false" label="Share language with objects" left="151"
 	     mouse_opaque="true" name="language_is_public"
diff --git a/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml b/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
index d3174af..add894b 100644
--- a/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
+++ b/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
@@ -26,15 +26,15 @@
 	     height="16" initial_value="false" label="Send IM to Email ([EMAIL])"
 	     left="148" mouse_opaque="true" name="send_im_to_email" radio_style="false"
 	     width="350" />
-	<check_box bottom="-65" control_name="IMInChatHistory" enabled="true" follows="left|top"
+	<check_box bottom="-65" enabled="true" follows="left|top"
 	     font="SansSerifSmall" height="16" initial_value="false"
 	     label="Include IM in Local Chat" left="148" mouse_opaque="true"
 	     name="include_im_in_chat_history" radio_style="false" width="237" />
-	<check_box bottom="-85" control_name="IMShowTimestamps" enabled="true" follows="left|top"
+	<check_box bottom="-85" enabled="true" follows="left|top"
 	     font="SansSerifSmall" height="16" initial_value="false"
 	     label="Show timestamps in IM" left="148" mouse_opaque="true"
 	     name="show_timestamps_check" radio_style="false" width="237" />
-    <check_box bottom="-105" control_name="ChatOnlineNotification" enabled="true"
+    <check_box bottom="-105" enabled="true"
          follows="left|top" font="SansSerifSmall" height="16"
          initial_value="false" label="Show online Friend notifications" left="148"
          mouse_opaque="true" name="friends_online_notify_checkbox"
@@ -54,33 +54,33 @@
 	     mouse_opaque="false" name="text_box4" v_pad="0" width="128">
 		Logging Options:
 	</text>
-	<check_box bottom="-225" control_name="LogInstantMessages" enabled="true"
+	<check_box bottom="-225" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16"
 	     initial_value="false" label="Save a log of IM on my computer" left="148"
 	     mouse_opaque="true" name="log_instant_messages" radio_style="false"
 	     width="237" />
-	<check_box bottom="-245" control_name="IMLogTimestamp" enabled="true"
+	<check_box bottom="-245" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16"
 	     initial_value="false" label="Show timestamps in IM log" left="168"
 	     mouse_opaque="true" name="log_instant_messages_timestamp" radio_style="false"
 	     width="217" />
-	<check_box bottom="-265" control_name="LogShowHistory" enabled="true" follows="left|top"
+	<check_box bottom="-265" enabled="true" follows="left|top"
 	     font="SansSerifSmall" height="16" initial_value="false"
 	     label="Show the end of last IM conversation" left="168" mouse_opaque="true"
 	     name="log_show_history" radio_style="false" width="217" />
-	<check_box bottom="-285" control_name="LogChat" enabled="true" follows="left|top"
+	<check_box bottom="-285" enabled="true" follows="left|top"
 	     font="SansSerifSmall" height="16" initial_value="false" label="Save a log of Local Chat on my computer"
 	     left="148" mouse_opaque="true" name="log_chat" radio_style="false"
 	     width="237" />
-	<check_box bottom="-305" control_name="LogChatTimestamp" enabled="true" follows="left|top"
+	<check_box bottom="-305" enabled="true" follows="left|top"
 	     font="SansSerifSmall" height="16" initial_value="false"
 	     label="Show timestamps in Local Chat log" left="168" mouse_opaque="true"
 	     name="log_chat_timestamp" radio_style="false" width="217" />
-	<check_box bottom="-325" control_name="LogChatIM" enabled="true" follows="left|top"
+	<check_box bottom="-325" enabled="true" follows="left|top"
 	     font="SansSerifSmall" height="16" initial_value="false"
 	     label="Show incoming IM in Local Chat log" left="168" mouse_opaque="true"
 	     name="log_chat_IM" radio_style="false" width="217" />
-	<check_box bottom="-345" control_name="LogTimestampDate" enabled="true" follows="left|top"
+	<check_box bottom="-345" enabled="true" follows="left|top"
 	     font="SansSerifSmall" height="16" initial_value="false"
 	     label="Include date with timestamps" left="148" mouse_opaque="true"
 	     name="log_date_timestamp" radio_style="false" width="237" />
diff --git a/indra/newview/skins/default/xui/en-us/panel_preferences_input.xml b/indra/newview/skins/default/xui/en-us/panel_preferences_input.xml
index 23e357f..a2114af 100644
--- a/indra/newview/skins/default/xui/en-us/panel_preferences_input.xml
+++ b/indra/newview/skins/default/xui/en-us/panel_preferences_input.xml
@@ -14,21 +14,21 @@
 	     mouse_opaque="true" name=" Mouse Sensitivity:" v_pad="0" width="128">
 		Mouse Sensitivity:
 	</text>
-	<slider_bar bottom="-26" control_name="MouseSensitivity" enabled="true" follows="left|top"
+	<slider_bar bottom="-26" enabled="true" follows="left|top"
 	     height="16" increment="0.25" initial_val="2" left="276" max_val="15"
-	     min_val="0" mouse_opaque="true" name="Mouse Sensitivity" width="128" />
-	<check_box bottom="-44" control_name="InvertMouse" enabled="true" follows="left|top"
+	     min_val="0" mouse_opaque="true" name="mouse_sensitivity" width="128" />
+	<check_box bottom="-44" enabled="true" follows="left|top"
 	     font="SansSerifSmall" height="16" label="Invert Mouse" left="148"
-	     mouse_opaque="true" name="invert mouse" radio_style="false" width="128" />
+	     mouse_opaque="true" name="invert_mouse" radio_style="false" width="128" />
 	<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
 	     bottom="-74" drop_shadow_visible="true" enabled="true" follows="left|top"
 	     font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
 	     mouse_opaque="true" name=" Auto Fly Options:" v_pad="0" width="266">
 		Auto Fly Options:
 	</text>
-	<check_box bottom="-80" control_name="AutomaticFly" enabled="true" follows="left|top"
+	<check_box bottom="-80" enabled="true" follows="left|top"
 	     font="SansSerifSmall" height="16" label="Fly/land on holding up/down"
-	     left="148" mouse_opaque="true" name="automatic fly" radio_style="false"
+	     left="148" mouse_opaque="true" name="automatic_fly" radio_style="false"
 	     width="178" />
 	<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
 	     bottom="-110" drop_shadow_visible="true" enabled="true" follows="left|top"
@@ -42,10 +42,10 @@
 	     mouse_opaque="true" name="Camera Follow Distance:" v_pad="0" width="128">
 		Camera Follow Distance:
 	</text>
-	<slider bottom="-116" can_edit_text="true" control_name="DynamicCameraStrength"
+	<slider bottom="-116" can_edit_text="true"
 	     decimal_digits="0" enabled="true" follows="left|top" height="16"
 	     increment="1" initial_val="2" left="276" max_val="10" min_val="0"
-	     mouse_opaque="true" name="DynamicCameraStrength" show_text="true" value="2"
+	     mouse_opaque="true" name="dynamic_camera_strength" show_text="true" value="2"
 	     width="128" />
 	<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
 	     bottom="-134" drop_shadow_visible="true" enabled="true" follows="left|top"
@@ -53,31 +53,31 @@
 	     mouse_opaque="true" name="Camera Transition Time:" v_pad="0" width="128">
 		Camera Transition Time:
 	</text>
-	<slider bottom="-140" can_edit_text="true" control_name="ZoomTime" decimal_digits="1"
+	<slider bottom="-140" can_edit_text="true" decimal_digits="1"
 	     enabled="true" follows="left|top" height="16" increment="0.1"
 	     initial_val="0.4" left="276" max_val="4" min_val="0" mouse_opaque="true"
-	     name="ZoomTime" show_text="true" value="2" width="128" />
+	     name="zoom_time" show_text="true" value="2" width="128" />
 	<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
 	     bottom="-158" drop_shadow_visible="true" enabled="true" follows="left|top"
 	     font="SansSerifSmall" h_pad="0" halign="left" height="10" left="148"
 	     mouse_opaque="true" name="Camera Smoothing:" v_pad="0" width="128">
 		Camera Smoothing:
 	</text>
-	<slider bottom="-164" can_edit_text="true" control_name="CameraPositionSmoothing"
+	<slider bottom="-164" can_edit_text="true"
 	     decimal_digits="1" enabled="true" follows="left|top" height="16"
 	     increment="0.1" initial_val="1" left="276" max_val="9" min_val="0"
-	     mouse_opaque="true" name="CameraPositionSmoothing" show_text="true" value="2"
+	     mouse_opaque="true" name="camera_position_smoothing" show_text="true" value="2"
 	     width="128" />
-	<check_box bottom="-188" control_name="EditCameraMovement" enabled="true"
+	<check_box bottom="-188" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
 	     label="Automatic Edit Camera Movement" left="148" mouse_opaque="true"
-	     name="edit camera movement" radio_style="false"
+	     name="edit_camera_movement" radio_style="false"
 	     tool_tip="Use automatic camera positioning when entering and exiting edit mode"
 	     width="201" />
-	<check_box bottom="-206" control_name="AppearanceCameraMovement" enabled="true"
+	<check_box bottom="-206" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
 	     label="Automatic Appearance Camera Movement" left="148" mouse_opaque="true"
-	     name="appearance camera movement" radio_style="false"
+	     name="appearance_camera_movement" radio_style="false"
 	     tool_tip="Use automatic camera positioning while in edit mode" width="242" />
 	<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
 	     bottom="-228" drop_shadow_visible="true" enabled="true" follows="left|top"
@@ -85,9 +85,9 @@
 	     mouse_opaque="true" name="text2" v_pad="0" width="128">
 		Avatar Display Options:
 	</text>
-	<check_box bottom="-232" control_name="FirstPersonAvatarVisible" enabled="true"
+	<check_box bottom="-232" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
-	     label="Show Avatar in Mouselook" left="148" mouse_opaque="true" name="avfp"
+	     label="Show Avatar in Mouselook" left="148" mouse_opaque="true" name="first_person_avatar_visible"
 	     radio_style="false" width="256" />
 	<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
 	     bottom="-264" drop_shadow_visible="true" enabled="true" follows="left|top"
@@ -97,5 +97,5 @@
 	</text>
 	<button bottom_delta="-4" follows="left|top" font="SansSerif" height="20"
 	     label="Joystick Setup" left="148" mouse_opaque="true"
-	     name="joystic_setup_button" width="155" />
+	     name="joystick_setup_button" width="155" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml b/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml
index a0f0936..48da432 100644
--- a/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml
+++ b/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml
@@ -8,7 +8,7 @@
 	     mouse_opaque="false" name="text_box" v_pad="0" width="200">
 		Maximum Bandwidth:
 	</text>
-	<slider bottom_delta="-25" can_edit_text="true" control_name="ThrottleBandwidthKBPS"
+	<slider bottom_delta="-25" can_edit_text="true"
 	     decimal_digits="0" enabled="true" follows="left|top" height="15"
 	     increment="10" initial_val="50" left_delta="0" max_val="1500" min_val="50"
 	     mouse_opaque="true" name="max_bandwidth" show_text="true" value="500"
@@ -27,7 +27,7 @@
 	     v_pad="0" width="200">
 		Disk Cache Size:
 	</text>
-	<slider bottom_delta="-25" can_edit_text="true" control_name="CacheSize"
+	<slider bottom_delta="-25" can_edit_text="true"
 	     decimal_digits="0" enabled="true" follows="left|top" height="15"
 	     increment="10" initial_val="50" left_delta="0" max_val="1000" min_val="10"
 	     mouse_opaque="true" name="cache_size" show_text="true" width="180" />
@@ -61,12 +61,12 @@
 	     font="SansSerif" halign="center" height="22" label="Reset"
 	     label_selected="Set" left_delta="103" mouse_opaque="true"
 	     name="reset_cache" scale_image="true" width="100" />
-	<check_box bottom="-173" bottom_delta="-35" control_name="ConnectionPortEnabled"
+	<check_box bottom="-173" bottom_delta="-35"
 	     enabled="true" follows="left|top" font="SansSerifSmall" height="16"
 	     initial_value="false" label="Custom Port Connection" left="12"
 	     mouse_opaque="true" name="connection_port_enabled" radio_style="false"
 	     width="256" />
-	<spinner bottom="-193" bottom_delta="-20" control_name="ConnectionPort"
+	<spinner bottom="-193" bottom_delta="-20"
 	     decimal_digits="0" enabled="true" follows="left|top" height="16"
 	     increment="1" initial_val="13000" label="Port Number:" label_width="75"
 	     left_delta="20" max_val="13050" min_val="13000" mouse_opaque="true"
diff --git a/indra/newview/skins/default/xui/en-us/panel_preferences_popups.xml b/indra/newview/skins/default/xui/en-us/panel_preferences_popups.xml
index 11d15f4..65734d6 100644
--- a/indra/newview/skins/default/xui/en-us/panel_preferences_popups.xml
+++ b/indra/newview/skins/default/xui/en-us/panel_preferences_popups.xml
@@ -27,11 +27,11 @@
 	     width="270">
 		Offers of notecards, textures and landmarks:
 	</text>
-	<check_box bottom_delta="-25" control_name="AutoAcceptNewInventory" enabled="true"
+	<check_box bottom_delta="-25" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
 	     label="Automatically accept" left="40" mouse_opaque="true"
 	     name="accept_new_inventory" radio_style="false" width="270" />
-	<check_box bottom_delta="-20" control_name="ShowNewInventory" enabled="true"
+	<check_box bottom_delta="-20" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
 	     label="Automatically view after accepting" left="40" mouse_opaque="true"
 	     name="show_new_inventory" radio_style="false" width="270" />
diff --git a/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml b/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml
index 2d36853..4b9ec5c 100644
--- a/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml
+++ b/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml
@@ -9,7 +9,7 @@
 	     name="voice_unavailable" tab_stop="false" width="450" word_wrap="true">
 		Voice Chat Is Not Available
 	</text_editor>
-	<check_box bottom_delta="0" control_name="EnableVoiceChat" enabled="true"
+	<check_box bottom_delta="0" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
 	     label="Enable voice chat" left="8" mouse_opaque="true"
 	     name="enable_voice_check" radio_style="false" width="200" />
@@ -36,7 +36,7 @@
 	     name="voice_chat_description" tab_stop="false" width="450" word_wrap="true">
 		Push-to-Talk mode lets you control when your voice is transmitted. When in toggle mode, press and release the push-to-talk trigger to switch your microphone on and off. When not in toggle mode, the microphone is active only when the trigger is held down.
 	</text_editor>
-	<check_box bottom_delta="-20" control_name="PushToTalkToggle" enabled="true"
+	<check_box bottom_delta="-20" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
 	     label="Use Push-to-Talk in toggle mode" left_delta="0" mouse_opaque="true"
 	     name="push_to_talk_toggle_check" radio_style="false" width="200" />
@@ -48,7 +48,7 @@
 		Push-to-Talk trigger:
 	</text>
 	<line_editor border_drop_shadow_visible="false" border_visible="false" bottom_delta="-20"
-	     control_name="PushToTalkButton" drop_shadow_visible="true" enabled="false"
+	     drop_shadow_visible="true" enabled="false"
 	     follows="top|left" font="SansSerifSmall" halign="right" height="19"
 	     left_delta="0" max_length="254" mouse_opaque="false" name="modifier_combo"
 	     width="280" />
@@ -63,7 +63,7 @@
 	     left="28" name="privacy_heading" width="445">
 		Privacy Options
 	</text>
-	<check_box bottom_delta="-20" control_name="VoiceCallsFriendsOnly" enabled="true"
+	<check_box bottom_delta="-20" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
 	     label="Only accept voice calls from people on My Friends list"
 	     left_delta="20" mouse_opaque="true" name="voice_call_friends_only_check"
@@ -76,6 +76,6 @@
 	     font="SansSerifSmall" height="35" hide_border="true" hide_scrollbar="true"
 	     left="28" max_length="65535" mouse_opaque="true"
 	     name="device_settings_text" tab_stop="false" width="450" word_wrap="true">
-		NOTE: Running the Device Settings will temporarily disconnect you from Voice Chat.
+		NOTE: Running the Device Settings will temporarily disconnect you from Voice Chat, and changes you make will be immediately applied.
 	</text_editor>
 </panel>
diff --git a/indra/newview/skins/default/xui/en-us/panel_preferences_web.xml b/indra/newview/skins/default/xui/en-us/panel_preferences_web.xml
index b708bf3..ed13e8f 100644
--- a/indra/newview/skins/default/xui/en-us/panel_preferences_web.xml
+++ b/indra/newview/skins/default/xui/en-us/panel_preferences_web.xml
@@ -30,8 +30,8 @@
 	     width="128">
 		Cookies:
 	</text>
-	<check_box bottom_delta="-7" control_name="CookiesEnabled" enabled="true"
-	     follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
+	<check_box bottom_delta="-7" enabled="true" follows="left|top" 
+		 font="SansSerifSmall" height="16" initial_value="false"
 	     label="Accept cookies from sites" left="140" mouse_opaque="true"
 	     name="cookies_enabled" radio_style="false" width="256" />
 	<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
@@ -41,7 +41,7 @@
 	     width="128">
 		Web Proxy:
 	</text>
-	<check_box bottom_delta="-7" control_name="BrowserProxyEnabled" enabled="true"
+	<check_box bottom_delta="-7" enabled="true"
 	     follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
 	     label="Enable Web Proxy" left="140" mouse_opaque="true"
 	     name="web_proxy_enabled" radio_style="false" width="256" />
@@ -56,7 +56,7 @@
 	     height="20" left="217" name="web_proxy_editor"
 	     tool_tip="The name or IP address of the proxy you would like to use"
 	     width="200" />
-	<spinner bottom_delta="-25" control_name="BrowserProxyPort" decimal_digits="0"
+	<spinner bottom_delta="-25" decimal_digits="0"
 	     enabled="true" follows="left|top" height="16" increment="1"
 	     initial_val="80" label="Port Number:" label_width="75" left="140"
 	     max_val="12000" min_val="10" mouse_opaque="true" name="web_proxy_port"
diff --git a/indra/newview/skins/default/xui/en-us/panel_status_bar.xml b/indra/newview/skins/default/xui/en-us/panel_status_bar.xml
index 614f1f9..63d2ca3 100644
--- a/indra/newview/skins/default/xui/en-us/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en-us/panel_status_bar.xml
@@ -75,7 +75,7 @@
 	     halign="center" height="18" image_selected="status_no_push.tga"
 	     image_unselected="status_no_push.tga" label="" label_selected="" left="521"
 	     mouse_opaque="true" name="restrictpush" scale_image="false"
-	     tool_tip="llPushObject restricted" visible="false" width="24" />
+	     tool_tip="No Pushing" visible="false" width="24" />
 	<button bottom="-22" enabled="true" follows="right|bottom" font="SansSerif"
 	     halign="center" height="18" image_selected="status_no_voice.tga"
 	     image_unselected="status_no_voice.tga" label="" label_selected=""
diff --git a/indra/newview/skins/default/xui/es/alerts.xml b/indra/newview/skins/default/xui/es/alerts.xml
index 5579436..f60881b 100644
--- a/indra/newview/skins/default/xui/es/alerts.xml
+++ b/indra/newview/skins/default/xui/es/alerts.xml
@@ -1643,7 +1643,7 @@ Intente seleccionar una área menor.
 			Este local puede reproducir música en streaming. 
  
 Música requiere una conexión con internet
-de 768 Kbps o más rápida.
+de 768 kbps o más rápida.
  
 ¿Reproducir música cuando disponible?
 		</message>
@@ -1658,7 +1658,7 @@ de 768 Kbps o más rápida.
 		<message name="message">
 			Este local puede reproducir vídeo en streaming. 
 Vídeo en streaming requiere una conexión con internet
-de 768 Kbps o más rápida.
+de 768 kbps o más rápida.
  
 ¿Reproducir vídeo en streaming cuando disponible?
  
@@ -3978,31 +3978,6 @@ para ver los detalles de la transacción?
 			Cancelar
 		</option>
 	</alert>
-	<alert name="HelpReportAbuse">
-		<message name="message">
-			Use this tool to report violations of the Terms of Service and Community Standards. See: 
-http://secondlife.com/corporate/tos.php 
-http://secondlife.com/corporate/cs.php 
- 
-All reported abuses of the Terms of Service and Community Standards 
-are investigated and resolved. You will receive an email informing you
-of the resolution when it occurs. 
-You can also view the incident resolution on the Police Blotter at: 
- 
-http://secondlife.com/community/blotter.php
-		</message>
-	</alert>
-	<alert name="HelpReportBug">
-		<message name="message">
-			Use this tool to report technical features that do not perform 
-as described or expected. All bug reports are investigated and 
-resolved. No email response will be sent, you may reply to the 
-auto-response email to add more details to your report. 
-If you are having a technical difficulty, please contact Support at: 
- 
-http://secondlife.com/community/support.php
-		</message>
-	</alert>
 	<alert name="HelpReportAbuseSelectCategory">
 		<message name="message">
 			Por favor, seleccione una categoría para este relato de abuso.
diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml
index 1411093..ce401c1 100644
--- a/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -132,54 +132,33 @@
 			<text type="string" length="1" name="Simulator primitive usage:">
 				Simulador de primitiva usado:
 			</text>
-			<text type="string" length="1" name="0 out of 0 available">
-				0 de 14055 (14055 disponible)
-			</text>
 			<text type="string" length="1" name="Primitives parcel supports:">
 				Primitivas en la parcela soportan:
 			</text>
-			<text type="string" length="1" name="object_contrib_text">
-				926
-			</text>
 			<text type="string" length="1" name="Primitives on parcel:">
 				Primitivas en la parcela:
 			</text>
-			<text type="string" length="1" name="total_objects_text">
-				0
-			</text>
 			<text type="string" length="1" name="Owned by parcel owner:">
 				Pertenecientes al propietario de la parcela:
 			</text>
-			<text type="string" length="1" name="owner_objects_text">
-				0
-			</text>
 			<button label="Mostrar" label_selected="Mostrar" name="ShowOwner" />
 			<button label="Retornar..." label_selected="Retornar..." name="ReturnOwner..."
 			     tool_tip="Devolver objetos para sus propietarios." />
 			<text type="string" length="1" name="Set to group:">
 				Definido para el grupo:
 			</text>
-			<text type="string" length="1" name="group_objects_text">
-				0
-			</text>
 			<button label="Mostrar" label_selected="Mostrar" name="ShowGroup" />
 			<button label="Retornar..." label_selected="Retornar..." name="ReturnGroup..."
 			     tool_tip="Devolver objetos para sus propietarios." />
 			<text type="string" length="1" name="Owned by others:">
 				Pertenecientes a otros:
 			</text>
-			<text type="string" length="1" name="other_objects_text">
-				0
-			</text>
 			<button label="Mostrar" label_selected="Mostrar" name="ShowOther" />
 			<button label="Retornar..." label_selected="Retornar..." name="ReturnOther..."
 			     tool_tip="Devolver objetos para sus propietarios." />
 			<text type="string" length="1" name="Selected / sat upon:">
 				Seleccionado / puesto en:
 			</text>
-			<text type="string" length="1" name="selected_objects_text">
-				0
-			</text>
 			<text type="string" length="1" name="Autoreturn other resident&amp;apos;s objects (minutes, 0 for off):">
 				Autoretornar objetos de otros residentes (minutos, 0 para desligar):
 			</text>
diff --git a/indra/newview/skins/default/xui/fr/alerts.xml b/indra/newview/skins/default/xui/fr/alerts.xml
index ea9fab3..1fd3bba 100644
--- a/indra/newview/skins/default/xui/fr/alerts.xml
+++ b/indra/newview/skins/default/xui/fr/alerts.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <alerts>
 	<global name="skipnexttime">
 		Ne plus afficher
@@ -8,7 +8,7 @@
 	</global>
 	<alert name="MissingAlert">
 		<message name="message">
-			[ALERT_NAME] est absent de alerts.xml!
+			[ALERT_NAME] n&apos;est pas dans le fichier alerts.xml.
 		</message>
 		<option name="OK">
 			OK
@@ -16,7 +16,7 @@
 	</alert>
 	<alert name="FloaterNotFound">
 		<message name="message">
-			Erreur de floater : Impossible de trouver les contrôles suivants :
+			Erreur floater : impossible de trouver les contrôles suivants :
  
 [CONTROLS]
 		</message>
@@ -55,10 +55,10 @@
 	</alert>
 	<alert name="ConnectTimeout">
 		<message name="message">
-			Connexion impossible à [SECOND_LIFE]
-Le service est peut-être interrompu.
-Veuillez réessayer d&apos;ici quelques minutes, ou cliquez sur Aide
-pour des conseils et un lien vers la page web d&apos;état du service.
+			Connexion à [SECOND_LIFE] impossible.
+le service est peut-être interrompu.
+
+Veuillez réessayer dans quelques minutes, ou cliquez sur Aide pour obtenir des conseils et un lien vers la page web d&apos;état du service.
 		</message>
 		<option name="OK">
 			OK
@@ -83,28 +83,28 @@ pour des conseils et un lien vers la page web d&apos;état du service.
 	</alert>
 	<alert name="CompileQueueSaveText">
 		<message name="message">
-			Problème lors de l&apos;upload du texte pour un script : [REASON]. Veuillez réessayer ultérieurement.
+			Une erreur est survenue lors du chargement du texte pour un script, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement.
 		</message>
 	</alert>
 	<alert name="CompileQueueSaveBytecode">
 		<message name="message">
-			Problème lors de l&apos;upload du script compilé : [REASON]. Veuillez réessayer ultérieurement.
+			Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement.
 		</message>
 	</alert>
 	<alert name="WriteAnimationFail">
 		<message name="message">
-			Echec d&apos;écriture des données d&apos;animation.
+			Une erreur est survenue lors de l&apos;écriture des données d&apos;animation. Veuillez réessayer ultérieurement.
 		</message>
 	</alert>
 	<alert name="UploadAuctionSnapshotFail">
 		<message name="message">
-			Problème lors de l&apos;upload d&apos;un instantané d&apos;enchères : [REASON]
+			Un problème est survenu lors du chargement du script compilé, suite au problème suivant : [REASON]
 		</message>
 	</alert>
 	<alert name="UnableToViewContentsMoreThanOne">
 		<message name="message">
-			Impossible d&apos;afficher le contenu de plus d&apos;un objet à la fois.
-Veuillez sélectionner un seul objet et réessayez.
+			Impossible d&apos;afficher les contenus de plus d&apos;un objet à la fois.
+Veuillez ne sélectionner qu&apos;un seul objet.
 		</message>
 	</alert>
 	<alert name="MustSupplyVoteProposal">
@@ -120,14 +120,14 @@ Entrez une brève description des objectifs du groupe.
 	</alert>
 	<alert name="CharacterSnapshotSaved">
 		<message name="message">
-			Un instantané de votre personnage a été sauvegardé.
+			Une photo de votre personnage a été sauvegardée.
  
-Visitez l&apos;exposition Webpage Studio pour le visualiser.
+Visitez l&apos;exposition Webpage Studio pour la voir.
 		</message>
 	</alert>
 	<alert name="SaveClothingBodyChanges">
 		<message name="message">
-			Enregistrer toutes les modifications des vêtements/parties du corps ?
+			Enregistrer tous les changements dans les habits/parties du corps ?
 		</message>
 		<option name="SaveAll">
 			Tout enregistrer
@@ -216,10 +216,10 @@ Souhaitez-vous accorder des droits d&apos;édition aux résidents selectionnés
 [WANT_APPLY_MESSAGE]
 		</message>
 		<option name="ApplyChanges">
-			Appliquer modifications
+			Appliquer les changements
 		</option>
 		<option name="IgnoreChanges">
-			Ignorer modifications
+			Ignorer les changements
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -249,7 +249,7 @@ Vous n&apos;avez pas assez d&apos;argent pour créer ce groupe.
 	</alert>
 	<alert name="GroupNameTooShort">
 		<message name="message">
-			Les noms de groupes doivent comporter quatre lettres minimum.
+			Les noms de groupes doivent comporter 4 lettres minimum.
 		</message>
 	</alert>
 	<alert name="GroupNameUsesReservedWord">
@@ -260,7 +260,7 @@ choisir un autre nom.
 	</alert>
 	<alert name="MustSpecifyGroupNoticeSubject">
 		<message name="message">
-			Vous devez préciser le sujet afin d&apos;envoyer une notification au groupe.
+			Pour envoyer une notification au groupe, vous devez indiquer un sujet.
 		</message>
 		<option name="OK">
 			OK
@@ -274,10 +274,10 @@ Entrez une brève description des objectifs du groupe.
 	</alert>
 	<alert name="AddGroupOwnerWarning">
 		<message name="message">
-			Vous vous apprêtez à ajouter des membres du groupe au rôle de [ROLE_NAME].
-Les membres ne peuvent pas être déchus de ce rôle.
-Ils devront quitter le rôle par eux-mêmes.
-Etes-vous sûr(e) de vouloir poursuivre?
+			Vous êtes sur le point d&apos;ajouter des membres du groupe dans le rôle de [ROLE_NAME].
+Les membres ne peuvent pas être destitués de ce rôle.
+Ils doivent donner eux-mêmes leur démission.
+Êtes-vous certain de vouloir continuer ?
 		</message>
 		<ignore name="ignore">
 			Lorsque vous donnez à des membres du groupe le rôle de « propriétaire »
@@ -291,13 +291,11 @@ Etes-vous sûr(e) de vouloir poursuivre?
 	</alert>
 	<alert name="AssignDangerousActionWarning">
 		<message name="message">
-			Vous vous apprêtez à ajouter la Faculté &apos;[ACTION_NAME]&apos; au 
-Rôle &apos;[ROLE_NAME]&apos;.
- 
- *AVERTISSEMENT*
-Tout membre disposant de cette Faculté peut s&apos;affecter lui-même --ainsi que tout autre Membre-- à des Rôles disposant de pouvoirs plus grands, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire. Assurez-vous de savoir ce que vous faites avant d&apos;attribuer cette Faculté.
+			Vous êtes sur le point d&apos;ajouter le pouvoir « [ACTION_NAME] » au rôle « [ROLE_NAME] ».
+ *Avertissement*
+ Tout membre disposant de ce pouvoir peut s&apos;affecter lui-même, ainsi que tout autre membre, à des rôles disposant de pouvoirs plus importants, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire. Assurez-vous de bien comprendre ce que vous faites avant d&apos;attribuer ce pouvoir.
  
-Ajouter cette Faculté à &apos;[ROLE_NAME]&apos;?
+Ajouter ce pouvoir à « [ROLE_NAME] » ?
 		</message>
 		<option name="Yes">
 			Oui
@@ -308,13 +306,13 @@ Ajouter cette Faculté à &apos;[ROLE_NAME]&apos;?
 	</alert>
 	<alert name="AssignDangerousAbilityWarning">
 		<message name="message">
-			Vous vous apprêtez à ajouter la Faculté &apos;[ACTION_NAME]&apos; au 
-Rôle &apos;[ROLE_NAME]&apos;.
+			Vous êtes sur le point d&apos;ajouter le pouvoir « [ACTION_NAME] » au 
+rôle « [ROLE_NAME] ».
  
- *AVERTISSEMENT*
-Tout membre disposant de cette Faculté peut s&apos;attribuer --ainsi qu&apos;à tout autre Membre-- toutes Facultés, et accéder à des pouvoirs proches de ceux d&apos;un propriétaire. 
+ *Avertissement*
+ Tout membre dans un rôle avec ce pouvoir peut s&apos;attribuer à lui-même, ainsi qu&apos;à tout autre membre, Tous les pouvoirs, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire.
  
-Ajouter cette Faculté à &apos;[ROLE_NAME]&apos;?
+Ajouter ce pouvoir à « [ROLE_NAME] » ?
 		</message>
 		<option name="Yes">
 			Oui
@@ -326,19 +324,18 @@ Ajouter cette Faculté à &apos;[ROLE_NAME]&apos;?
 	<alert name="ClickPublishHelpGroup">
 		<message name="message">
 			L&apos;option &quot;Publier sur le Web&quot; nous permet de publier
-le nom du groupe, son insigne, sa charte, ses titres, et ses fondateurs sur le
+le nom du groupe, son logo, sa charte, ses titres, et ses fondateurs sur le
 site [SECOND_LIFE]. Il est de votre responsabilité d&apos;indiquer si 
-tout ou partie du contenu ci-dessus est considéré comme Adulte au regard
-des règles de base de la Communauté.
+tout ou partie du contenu ci-dessus est considéré comme Adulte selon les règles de base de la Communauté.
 		</message>
 	</alert>
 	<alert name="ClickPublishHelpLand">
 		<message name="message">
-			L&apos;option &quot;Publier sur le Web&quot; nous permet de publier
-le nom, la description, l&apos;instantané et la localisation de cette parcelle
-sur le site [SECOND_LIFE]. Il est de votre responsabilité d&apos;indiquer si 
-tout ou partie du contenu ci-dessus est considéré comme Adulte au regard
-des règles de base de la Communauté.
+			Sélectionner l&apos;option Publier dans la recherche 
+En cochant cette case, votre parcelle apparaîtra :
+- dans les résultats de recherche ;
+- dans les objets publics ;
+- dans la recherche web.
 		</message>
 	</alert>
 	<alert name="ClickPublishHelpLandDisabled">
@@ -348,22 +345,23 @@ des règles de base de la Communauté.
 	</alert>
 	<alert name="ClickPublishHelpPostcard">
 		<message name="message">
-			L&apos;option &quot;Publier sur le Web&quot; nous permet de publier
+			L&apos;option Publier sur le Web nous permet de publier
 le nom du photographe dans [SECOND_LIFE], le sujet, le lieu, le message et
-l&apos;instantané sur le site [SECOND_LIFE]. Il est de votre responsabilité d&apos;indiquer si 
-tout ou partie du contenu des instantanés ci-dessus est considéré comme Adulte au regard
-des règles de base de la Communauté.
+la photo sur le site [SECOND_LIFE]. Vous devez indiquer indiquer si 
+les photos ci-dessus contiennent du contenu pour Adultes, conformément aux 
+règles de base de la Communauté.
 		</message>
 	</alert>
 	<alert name="ClickPublishHelpAvatar">
 		<message name="message">
-			L&apos;option &quot;Publier sur le Web&quot; nous permet de publier
-votre nom, image, et texte &apos;A propos&apos; sur le site [SECOND_LIFE].
+			Si vous sélectionnez Afficher dans la recherche :
+- votre profil apparaîtra dans les résultats de recherche ;
+- un lien vers votre profil apparaîtra dans les pages de groupe publiques.
 		</message>
 	</alert>
 	<alert name="ClickPartnerHelpAvatar">
 		<message name="message">
-			Vous pouvez proposer à un autre résident de dissoudre un partenariat existant par le biais du site de [SECOND_LIFE].
+			Vous pouvez proposer à un autre résident de devenir votre partenaire ou dissoudre un partenariat existant à partir du site de [SECOND_LIFE].
 
 Aller sur le site de Second Life pour avoir plus d&apos;informations sur les partenariats ?
 		</message>
@@ -374,16 +372,27 @@ Aller sur le site de Second Life pour avoir plus d&apos;informations sur les par
 			Annuler
 		</option>
 	</alert>
+	<alert name="ClickWebProfileHelpAvatar">
+		<message name="message">
+			Si ce résident a défini une URL de profil web, vous pouvez :
+ * cliquer sur Charger pour charger la page avec le navigateur web incorporé ;
+ * cliquer sur Charger &gt; Dans un navigateur externe, pour afficher la page dans un navigateur externe.
+ Pour retourner au profil web du résident, cliquez sur Charger &gt; URL du domicile.
+ 
+Lorsque vous êtes dans votre propre profil, vous pouvez définir n&apos;importe quelle URL comme profil web. Pour cela, saisissez l&apos;URL et cliquez sur OK.
+Les autres résidents peuvent visiter l&apos;URL que vous avez définie en regardant votre profil.
+		</message>
+	</alert>
 	<alert name="ReputationMinGreaterThanMax">
 		<message name="message">
 			La réputation minimum est supérieure au maximum.
-Abaissez le minimum ou augmentez le maximum.
+Veuillez aissez le minimum ou augmentez le maximum.
 		</message>
 	</alert>
 	<alert name="MoneyMinGreaterThanMax">
 		<message name="message">
 			Le minimum est supérieur au maximum.
-Veuillez abaisser le minimum ou augmenter le maximum.
+Veuillez baisser le minimum ou augmenter le maximum.
 		</message>
 	</alert>
 	<alert name="OfficerTitleTooLong">
@@ -429,11 +438,11 @@ Souhaitez-vous continuer ?
 	</alert>
 	<alert name="JoinGroupCanAfford">
 		<message name="message">
-			L&apos;inscription à ce groupe coûte L$[COST].
-Souhaitez-vous continuer ?
+			Rejoindre ce groupe coûte [COST] L$.
+Voulez-vous continuer ?
 		</message>
 		<option name="Join">
-			Fusionner
+			Rejoindre
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -441,14 +450,13 @@ Souhaitez-vous continuer ?
 	</alert>
 	<alert name="JoinGroupCannotAfford">
 		<message name="message">
-			L&apos;inscription à ce groupe coûte L$[COST].
-Vous ne disposez pas d&apos;un solde suffisant pour vous inscrire à ce groupe.
+			Rejoindre ce groupe coûte [COST] L$.
+Votre solde est insuffisant.
 		</message>
 	</alert>
 	<alert name="LandBuyPass">
 		<message name="message">
-			Pour L$[COST], vous pouvez accéder à ce terrain (&apos;[PARCEL_NAME]&apos;)
-pour [TIME] heure(s).  Acheter un laissez-passer ?
+			Pour [COST] L$ vous pouvez pénétrer sur ce terrain ([PARCEL_NAME]) et y rester [TIME] heures. Acheter un pass ?
 		</message>
 		<option name="OK">
 			OK
@@ -466,19 +474,17 @@ si vous êtes sûr(e) de vouloir démarrer des enchères.
 	</alert>
 	<alert name="SalePriceRestriction">
 		<message name="message">
-			Le prix de vente doit être &gt; L$0 si vous vendez à tout le monde.
-Veuillez choisir une personne pour lui vendre à L$0.
+			Pour rendre l&apos;annonce disponible à tous, le prix de vente doit être supérieur à 0 L$.
+Si le prix de vente est de 0 L$, vous devez choisir un acheteur spécifique.
 		</message>
 	</alert>
 	<alert name="ConfirmLandSaleChange">
 		<message name="message">
-			Le terrain sélectionné d&apos;une surface de [LAND_SIZE] m2 est mis en vente.
-Votre prix de vente sera de L$[SALE_PRICE], pour une acquisition par [NAME].
- 
-Voulez-vous poursuivre les modifications ?
+			Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente.
+Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME].
 		</message>
 		<option name="Continue">
-			Continuer
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -486,12 +492,12 @@ Voulez-vous poursuivre les modifications ?
 	</alert>
 	<alert name="ConfirmLandSaleToAnyoneChange">
 		<message name="message">
-			Attention : En cliquant sur Vendre à n&apos;importe qui, vous rendez votre
+			Attention : en cliquant sur Vendre à n&apos;importe qui, vous rendez votre
 terrain disponible à toute la communauté de Second Life, même aux personnes qui ne sont pas dans
 cette région.
 
 Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente.
-Votre prix de vente sera de [SALE_PRICE] $L et la vente sera disponible à [NAME].
+Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME].
 		</message>
 		<option name="Continue">
 			OK
@@ -502,17 +508,14 @@ Votre prix de vente sera de [SALE_PRICE] $L et la vente sera disponible à [NAME
 	</alert>
 	<alert name="ReturnObjectsDeededToGroup">
 		<message name="message">
-			Etes-vous sûr(e) de vouloir renvoyer tous les objets partagés
-avec le groupe &apos;[NAME]&apos; sur cette parcelle de terrain
-vers l&apos;inventaire de leurs propriétaires précédents?
+			Êtes-vous certain de vouloir renvoyer tous les objets partagés par le groupe [NAME] sur cette parcelle dans l&apos;inventaire du propriétaire précédent ?
  
-*AVERTISSEMENT* Ceci supprimera les objets non-cessibles
-transférés au groupe !
+*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés !
  
-Objets : [N]
+Objets : [N]
 		</message>
 		<option name="Return">
-			Retourner
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -520,14 +523,12 @@ Objets : [N]
 	</alert>
 	<alert name="ReturnObjectsOwnedByUser">
 		<message name="message">
-			Etes-vous sûr(e) de vouloir renvoyer tous les objets appartenant
-au résident &apos;[NAME]&apos; sur cette parcelle de terrain
-vers son inventaire ?
+			Etes-vous certain de vouloir renvoyer tous les objets que [NAME] possède sur cette parcelle dans son inventaire ?
  
-Objets : [N]
+Objets : [N]
 		</message>
 		<option name="Return">
-			Retourner
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -535,14 +536,12 @@ Objets : [N]
 	</alert>
 	<alert name="ReturnObjectsOwnedBySelf">
 		<message name="message">
-			Etes-vous sûr(e) de vouloir renvoyer tous les objets
-vous appartenant sur cette parcelle de terrain
-vers votre inventaire ?
+			Êtes-vous certain de vouloir renvoyer tous les objets que vous possédez sur cette parcelle dans votre inventaire ?
  
-Objets : [N]
+Objets : [N]
 		</message>
 		<option name="Return">
-			Retourner
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -550,17 +549,15 @@ Objets : [N]
 	</alert>
 	<alert name="ReturnObjectsNotOwnedBySelf">
 		<message name="message">
-			Etes-vous sûr(e) de vouloir renvoyer tous les objets ne vous appartenant PAS
-sur cette parcelle de terrain vers l&apos;inventaire de leur propriétaire ?
-Les objets cessibles transférés à des groupes seront
-renvoyés à leurs propriétaires précédents.
+			Êtes-vous certain de vouloir renvoyer tous les objets que vous ne possédez pas sur cette parcelle dans l&apos;inventaire de leur propriétaire ?
+Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents.
  
-*AVERTISSEMENT* Ceci supprimera les objets non-cessibles transférés au groupe !
+*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés !
  
-Objets : [N]
+Objets : [N]
 		</message>
 		<option name="Return">
-			Retourner
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -568,33 +565,37 @@ Objets : [N]
 	</alert>
 	<alert name="ReturnObjectsNotOwnedByUser">
 		<message name="message">
-			Etes-vous sûr(e) de vouloir renvoyer tous les objets n&apos;appartenant PAS
-à [NAME] sur cette parcelle de terrain vers l&apos;inventaire de leur propriétaire ?
-Les objets cessibles transférés à des groupes seront
-renvoyés à leurs propriétaires précédents.
+			Êtes-vous certain de vouloir renvoyer tous les objets que [NAME] ne possède pas sur cette parcelle dans l&apos;inventaire de leur propriétaire ?
+Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents.
  
-*AVERTISSEMENT* Ceci supprimera les objets non-cessibles transférés au groupe !
+*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés !
  
-Objets : [N]
+Objets : [N]
 		</message>
 		<option name="Return">
-			Retourner
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
 		</option>
 	</alert>
 	<alert name="ReturnAllTopObjects">
+		<message name="message">
+			Êtes-vous certain de vouloir renvoyer tous les objets de la liste dans l&apos;inventaire de leur propriétaire ?
+		</message>
 		<option name="Return">
-			Retourner
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
 		</option>
 	</alert>
 	<alert name="DisableAllTopObjects">
+		<message name="message">
+			Êtes-vous certain de vouloir désactiver tous les objets dans cette région ?
+		</message>
 		<option name="Disable">
-			Désactiver
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -602,14 +603,12 @@ Objets : [N]
 	</alert>
 	<alert name="ReturnObjectsNotOwnedByGroup">
 		<message name="message">
-			Renvoyer les objets sur cette parcelle de terrain
-qui ne sont PAS partagés avec le groupe [NAME]
-à leurs propriétaires ?
+			Renvoyer les objets de cette parcelle qui ne sont pas partagés avec le groupe [NAME] à leur propriétaire ?
  
-Objets : [N]
+Objets : [N]
 		</message>
 		<option name="Return">
-			Retourner
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -617,25 +616,24 @@ Objets : [N]
 	</alert>
 	<alert name="UnableToDisableOutsideScripts">
 		<message name="message">
-			Impossible de désactiver les scripts extérieurs.
-La région entière autorise les dégâts (not safe).
-Les scripts doivent être autorisés pour faire fonctionner les armes à feu.
+			Impossible de désactiver les scripts.
+Les dégâts sont autorisés dans toute la région.
+Pour que les armes fonctionnent, les scripts doivent être autorisés.
 		</message>
 	</alert>
 	<alert name="MustBeInParcel">
 		<message name="message">
-			Vous devez vous trouver à l&apos;intérieur de la parcelle de terrain
-pour définir le point d&apos;atterrissage.
+			Pour définir le point d&apos;atterrissage, vous devez vous trouver à l&apos;intérieur de la parcelle.
 		</message>
 	</alert>
 	<alert name="PromptRecipientEmail">
 		<message name="message">
-			Veuillez saisir l&apos;adresse mail du destinataire.
+			Veuillez saisir l&apos;adresse e-mail du destinataire.
 		</message>
 	</alert>
 	<alert name="PromptSelfEmail">
 		<message name="message">
-			Veuillez saisir votre adresse mail.
+			Veuillez saisir votre adresse e-mail.
 		</message>
 	</alert>
 	<alert name="PromptMissingSubjMsg">
@@ -651,78 +649,73 @@ pour définir le point d&apos;atterrissage.
 	</alert>
 	<alert name="ErrorProcessingSnapshot">
 		<message name="message">
-			Erreur dans le traitement des données de l&apos;instantané
+			Erreur dans le traitement des données de la photo
 		</message>
 	</alert>
 	<alert name="ErrorEncodingSnapshot">
 		<message name="message">
-			Erreur d&apos;encodage de l&apos;instantané !
+			Erreur d&apos;encodage de la photo.
 		</message>
 	</alert>
 	<alert name="ErrorUploadingPostcard">
 		<message name="message">
-			Problème lors de l&apos;upload d&apos;une carte postale : [REASON]
+			Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON]
 		</message>
 	</alert>
 	<alert name="ErrorUploadingReportScreenshot">
 		<message name="message">
-			Problème lors de l&apos;envoi d&apos;une capture d&apos;écran : [REASON]
+			Une erreur est survenue lors du chargement de la capture d&apos;écran destinée au rapport, suite au problème suivant : [REASON]
 		</message>
 	</alert>
 	<alert name="MustAgreeToLogIn">
 		<message name="message">
-			Vous devez accepter les Conditions Générales d&apos;Utilisation pour continuer à vous connecter à [SECOND_LIFE].
+			Pour vous connecter à [SECOND_LIFE], vous devez accepter les Conditions d&apos;utilisation.
 		</message>
 	</alert>
 	<alert name="CouldNotPutOnOutfit">
 		<message name="message">
-			Impossible de revêtir la tenue.
-Le dossier Tenues ne contient ni vêtements, ni éléments corporels, ni attachements.
+			Impossible de mettre cet ensemble.
+Ce dossier ne contient pas d&apos;habits, de parties du corps ni de pièces jointes.
 		</message>
 	</alert>
 	<alert name="CannotWearTrash">
 		<message name="message">
-			Impossible de porter des vêtements ou parties du corps se trouvant dans la corbeille.
+			Vous ne pouvez pas porter d&apos;habits ni de parties du corps se trouvant dans la corbeille.
 		</message>
 	</alert>
 	<alert name="CannotWearInfoNotComplete">
 		<message name="message">
-			Impossible de porter cet élément car ses informations ne sont pas encore disponibles.
-Veuillez réessayer dans une minute.
+			Vous ne pouvez pas porter cet article car il n&apos;a pas encore été chargé. Veuillez réessayer dans une minute.
 		</message>
 	</alert>
 	<alert name="MustHaveAccountToLogInNoLinks">
 		<message name="message">
-			Vous devez disposer d&apos;un compte pour vous connecter à [SECOND_LIFE].
+			Pour vous connecter sur [SECOND_LIFE], vous devez avoir un compte.
 		</message>
 		<option name="OK">
-			OK
+			Fermer
 		</option>
 	</alert>
 	<alert name="MustHaveAccountToLogIn">
 		<message name="message">
-			Vous devez disposer d&apos;un compte pour vous connecter à [SECOND_LIFE].
- 
-Vous rendre sur www.secondlife.com pour créer un nouveau compte ?
+			Oups! Vous avez oublié de fournir certaines informations.
+Vous devez saisir le nom et le prénom de votre avatar.
+
+Pour entrer dans [SECOND_LIFE], vous devez avoir un compte. Voulez-vous en créer un maintenant ?
 		</message>
 		<option name="OK">
-			OK
+			Créer un compte
 		</option>
 		<option name="Cancel">
-			Annuler
+			Réessayer
 		</option>
 	</alert>
 	<alert name="AddClassified">
 		<message name="message">
-			Les petites annonces sont publiées dans la section &apos;Annonces&apos;
-du module de recherche, pour une durée d&apos;une semaine.
- 
-Rédigez votre annonce, puis cliquez sur &apos;Publier...&apos; pour
-l&apos;ajouter à la liste des annonces.
- 
-Vous devrez payer des frais d&apos;insertion au moment de cliquer sur &apos;Publier&apos;.
-Plus vous payez, plus votre annonce apparaîtra en haut de liste.
-Ceci est également valable pour les résultats de recherche de mots-clé.
+			Les petites annonces sont publiées dans la section Petites annonces sous Recherche, pour une durée d&apos;une semaine.
+Rédigez votre annonce, puis cliquez sur Publier...pour l&apos;ajouter à la liste des annonces.
+Au moment de cliquer sur Publier, vous serez invité à payer des frais.
+Plus vous payez cher, plus votre annonce est visible dans la liste ainsi que dans les résultats de recherche de mots-clés.
 		</message>
 		<option name="OK">
 			OK
@@ -736,11 +729,11 @@ Ceci est également valable pour les résultats de recherche de mots-clé.
 	</alert>
 	<alert name="DeleteClassified">
 		<message name="message">
-			Supprimer l&apos;annonce &apos;[NAME]&apos;?
-Les frais d&apos;insertion sont non remboursables.
+			Supprimer l&apos;annonce [NAME] ?
+Une fois payés, les frais ne sont pas remboursables.
 		</message>
 		<option name="Delete">
-			Supprimer
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -762,10 +755,10 @@ Les frais d&apos;insertion sont non remboursables.
 	</alert>
 	<alert name="DeleteAvatarPick">
 		<message name="message">
-			Supprimer [PICK] des lieux favoris ?
+			Supprimer le favori [PICK] ?
 		</message>
 		<option name="Delete">
-			Supprimer
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -788,10 +781,10 @@ Veuillez appliquer vos modifications et quitter
 	</alert>
 	<alert name="PromptGoToEventsPage">
 		<message name="message">
-			Aller sur la page des événements [SECOND_LIFE] ?
+			Aller à la page web de [SECOND_LIFE] réservée aux événements ?
 		</message>
 		<option name="GotoPage">
-			Aller à la Page
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -809,17 +802,17 @@ Veuillez appliquer vos modifications et quitter
 	</alert>
 	<alert name="SelectProposalToView">
 		<message name="message">
-			Veuillez choisir une proposition à afficher.
+			Veuillez sélectionner une proposition.
 		</message>
 	</alert>
 	<alert name="SelectHistoryItemToView">
 		<message name="message">
-			Veuillez choisir un elément de l&apos;historique à afficher.
+			Veuillez sélectionner un historique.
 		</message>
 	</alert>
 	<alert name="ResetShowNextTimeDialogs">
 		<message name="message">
-			Réinitialiser tous les dialogues &apos;Afficher la prochaine fois&apos; ?
+			Souhaitez-vous réactiver tous les pop-ups que vous aviez désactivés ?
 		</message>
 		<option name="OK">
 			OK
@@ -841,7 +834,7 @@ Veuillez appliquer vos modifications et quitter
 	</alert>
 	<alert name="CacheWillClear">
 		<message name="message">
-			Le cache sera vidé au redémarrage de [SECOND_LIFE].
+			Le cache sera vidé après le redémarrage de [SECOND_LIFE].
 		</message>
 	</alert>
 	<alert name="CacheWillBeMoved">
@@ -862,11 +855,10 @@ Remarque : cela videra le cache.
 	</alert>
 	<alert name="GoToAuctionPage">
 		<message name="message">
-			Aller sur la page [SECOND_LIFE] pour afficher le détail des enchères
-ou enchérir ?
+			Aller à la page web de [SECOND_LIFE] pour voir le détail des enchères ou enchérir ?
 		</message>
 		<option name="GotoPage">
-			Aller à la Page
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -874,7 +866,7 @@ ou enchérir ?
 	</alert>
 	<alert name="SaveChanges">
 		<message name="message">
-			Enregistrer les modifications ?
+			Enregistrer les changements ?
 		</message>
 		<option name="Save">
 			Enregistrer
@@ -888,76 +880,76 @@ ou enchérir ?
 	</alert>
 	<alert name="GestureSaveFailedTooManySteps">
 		<message name="message">
-			Echec de la sauvegarde du geste.
-Ce geste comporte trop d&apos;étapes.
-Essayer de retirer quelques étapes, puis enregistrez à nouveau.
+			L&apos;enregistrement du geste a échoué.
+Il y a trop d&apos;étapes dans ce geste.
+Essayez d&apos;en supprimer quelques-unes.
 		</message>
 	</alert>
 	<alert name="GestureSaveFailedTryAgain">
 		<message name="message">
-			Echec de la sauvegarde du geste. Veuillez réessayer dans une minute.
+			L&apos;enregistrement du geste a échoué. Veuillez réessayer dans une minute.
 		</message>
 	</alert>
 	<alert name="GestureSaveFailedObjectNotFound">
 		<message name="message">
-			Impossible d&apos;enregistrer le geste car l&apos;objet ou son inventaire associé est introuvable.
-L&apos;objet est peut-être hors de portée ou a été supprimé.
+			Le geste n&apos;a pas pu être enregistré car l&apos;objet ou l&apos;inventaire de l&apos;objet associé n&apos;a pas été trouvé.
+L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
 		</message>
 	</alert>
 	<alert name="GestureSaveFailedReason">
 		<message name="message">
-			Problème lors de la sauvegarde d&apos;un geste : [REASON].  Veuillez réessayer de sauvegarder le geste ultérieurement.
+			Une erreur est survenue lors de l&apos;enregistrement du geste, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre geste ultérieurement.
 		</message>
 	</alert>
 	<alert name="SaveNotecardFailObjectNotFound">
 		<message name="message">
-			Impossible d&apos;enregistrer la note car l&apos;objet ou son inventaire associé est introuvable.
-L&apos;objet est peut-être hors de portée ou a été supprimé.
+			La note n&apos;a pas pu être enregistrée car l&apos;objet ou l&apos;inventaire de l&apos;objet associé n&apos;a pas été trouvé.
+L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
 		</message>
 	</alert>
 	<alert name="SaveNotecardFailReason">
 		<message name="message">
-			Problème lors de la sauvegarde d&apos;une note : [REASON].  Veuillez réessayer de sauvegarder la note ultérieurement.
+			Une erreur est survenue lors de l&apos;enregistrement de la note, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre note ultérieurement.
 		</message>
 	</alert>
 	<alert name="ScriptCannotUndo">
 		<message name="message">
-			Impossible d&apos;annuler toutes les modifications dans votre version du script.
-Voulez-vous charger la dernière version enregistrée sur le serveur ?
-(Attention : cette opération est définitive.)
+			Impossible d&apos;annuler tous les changements dans votre version du script.
+Souhaitez-vous charger la dernière version enregistrée sur le serveur ?
+(**Attention** Cette opération est irréversible.)
 		</message>
 		<option name="Yes">
-			Oui
+			OK
 		</option>
 		<option name="No">
-			Non
+			Annuler
 		</option>
 	</alert>
 	<alert name="SaveScriptFailReason">
 		<message name="message">
-			Problème lors de la sauvegarde d&apos;un script : [REASON].  Veuillez réessayer de sauvegarder le script ultérieurement.
+			Une erreur est survenue lors de l&apos;enregistrement du script, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre script ultérieurement.
 		</message>
 	</alert>
 	<alert name="SaveScriptFailObjectNotFound">
 		<message name="message">
-			Impossible d&apos;enregistrer le script car l&apos;objet associé est introuvable.
-L&apos;objet est peut-être hors de portée ou a été supprimé.
+			Impossible d&apos;enregistrer le script car l&apos;objet qui le contient est introuvable.
+L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
 		</message>
 	</alert>
 	<alert name="SaveBytecodeFailReason">
 		<message name="message">
-			Problème lors de la sauvegarde d&apos;un script compilé : [REASON].  Veuillez réessayer de sauvegarder le script ultérieurement.
+			Une erreur est survenue lors de l&apos;enregistrement du script compilé, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre script ultérieurement.
 		</message>
 	</alert>
 	<alert name="CouldNotStartStopScript">
 		<message name="message">
-			Impossible de démarrer ou d&apos;arrêter le script car l&apos;objet associé est introuvable.
-L&apos;objet est peut-être hors de portée ou a été supprimé.
+			Impossible de lancer ou d&apos;arrêter le script car l&apos;objet qui le contient est introuvable.
+L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
 		</message>
 	</alert>
 	<alert name="CannotDownloadFile">
 		<message name="message">
-			Téléchargement du fichier impossible
+			Impossible de télécharger le fichier
 		</message>
 	</alert>
 	<alert name="CannotWriteEncode">
@@ -967,7 +959,7 @@ L&apos;objet est peut-être hors de portée ou a été supprimé.
 	</alert>
 	<alert name="CannotWriteFile">
 		<message name="message">
-			Ecriture du fichier [[FILE]] impossible
+			Impossible d&apos;écrire le fichier [[FILE]]
 		</message>
 	</alert>
 	<alert name="CannotLoadWearable">
@@ -989,7 +981,7 @@ Etes-vous sûr(e) de vouloir supprimer ces eléments ?
 	</alert>
 	<alert name="DisplaySettingsSafe">
 		<message name="message">
-			Les paramètres d&apos;affichage ont été définis ont été définis aux valeurs du mode sans échec 
+			Les paramètres d&apos;affichage ont été définis sur sécurisé 
 car vous avez activé le mode sans échec.
 		</message>
 	</alert>
@@ -1027,7 +1019,7 @@ Voulez-vous visiter [_URL] pour plus d&apos;informations ?
 	</alert>
 	<alert name="UnsupportedCPU">
 		<message name="message">
-			- Votre CPU ne remplit pas les conditions minimum requises.
+			- Votre processeur ne remplit pas les conditions minimum requises.
 		</message>
 	</alert>
 	<alert name="UnsupportedCPUAmount">
@@ -1125,7 +1117,7 @@ afin de signaler le problème.
 	</alert>
 	<alert name="CannotConnectVerificationError">
 		<message name="message">
-			Connexion impossible à [SECOND_LIFE].
+			Connexion à [SECOND_LIFE] impossible.
 Le serveur d&apos;identification a rencontré une erreur de connexion SSL.
 Si vous continuez à recevoir ce message d&apos;erreur, veuillez vous rendre
 à la rubrique Support de SecondLife.com pour
@@ -1134,20 +1126,20 @@ signaler ce problème.
 	</alert>
 	<alert name="CannotConnectUnknownErrorWindows">
 		<message name="message">
-			Connexion impossible à [SECOND_LIFE].
+			Connexion à [SECOND_LIFE] impossible.
 Malgré nos efforts, une erreur inattendue s&apos;est produite.
 Veuillez vous rendre à la rubrique Support du site SecondLife.com
-pour signaler ce problème.  Si possible, joignez votre fichier SecondLife.log
+pour signaler ce problème. Si possible, joignez votre fichier SecondLife.log
 qui se trouve à l&apos;emplacement suivant : C:\Documents and Settings\(nom)\Application Data\SecondLife\logs
 Merci.
 		</message>
 	</alert>
 	<alert name="CannotConnectUnknownErrorDarwin">
 		<message name="message">
-			Connexion impossible à [SECOND_LIFE].
+			Connexion à [SECOND_LIFE] impossible.
 Malgré nos efforts, une erreur inattendue s&apos;est produite.
 Veuillez vous rendre à la rubrique Support du site SecondLife.com
-pour signaler ce problème.  Si possible, joignez votre fichier SecondLife.log
+pour signaler ce problème. Si possible, joignez votre fichier SecondLife.log
 qui se trouve à l&apos;emplacement suivant : ~/Library/Application Support/SecondLife/logs
 Merci.
 		</message>
@@ -1155,7 +1147,7 @@ Merci.
 	<alert name="CannotResolveLoginToken">
 		<message name="message">
 			Un problème est survenu lors de la résolution
-de votre identification. Veuillez réessayer
+de votre authentification. Veuillez réessayer
 de vous connecter. Si vous continuez à recevoir ce message d&apos;erreur,
 veuillez vous rendre à la rubrique Support du site SecondLife.com.
 		</message>
@@ -1177,7 +1169,7 @@ pour des conseils et un lien vers la page web d&apos;état du service.
 	</alert>
 	<alert name="CannotConnectNoReplyFromLogin">
 		<message name="message">
-			Connexion impossible.  Pas de réponse de la base de données d&apos;identification.
+			Connexion impossible. Pas de réponse du sim.
  
 Veuillez réessayer d&apos;ici quelques minutes, ou cliquez sur Aide
 pour des conseils et un lien vers la page web d&apos;état du service.
@@ -1191,7 +1183,7 @@ pour des conseils et un lien vers la page web d&apos;état du service.
 	</alert>
 	<alert name="CannotConnectLoginTimeout">
 		<message name="message">
-			Temps d&apos;attente de connexion à votre localisation dépassé. Veuillez réessayer.
+			Temps d&apos;attente de connexion à votre emplacement dépassé. Veuillez réessayer.
 		</message>
 	</alert>
 	<alert name="FirstRunDialog">
@@ -1226,7 +1218,7 @@ Veuillez vérifier votre connexion.
 	</alert>
 	<alert name="WelcomeToSecondLife">
 		<message name="message">
-			Welcome to [SECOND_LIFE] ! 
+			Bienvenue sur [SECOND_LIFE] ! 
  
 Utilisez les touches de direction pour vous déplacer.
  
@@ -1257,17 +1249,12 @@ Veuillez choisir le sexe de votre personnage.
 	</alert>
 	<alert name="RegionNoTerraforming">
 		<message name="message">
-			La région [REGION] n&apos;autorise pas le terraforming.
-Vous devrez acquérir du terrain dans une autre partie du monde
-pour le terraformer.
+			Le terraformage est interdit dans la région [REGION].
 		</message>
 	</alert>
 	<alert name="CannotCopyWarning">
 		<message name="message">
-			Vous n&apos;êtes pas autorisé(e) à copier
-cet élément. Il disparaîtra de votre
-inventaire si vous le donnez. Voulez-vous
-vraiment offrir cet élément?
+			Vous n&apos;êtes pas autorisé à copier cet objet et il disparaîtra de votre inventaire si vous le donnez. Souhaitez-vous vraiment offrir cet objet ?
 		</message>
 		<option name="Yes">
 			Oui
@@ -1278,7 +1265,7 @@ vraiment offrir cet élément?
 	</alert>
 	<alert name="CannotGiveItem">
 		<message name="message">
-			Impossible d&apos;offrir l&apos;élément d&apos;inventaire.
+			Impossible de donner l&apos;objet de l&apos;inventaire.
 		</message>
 	</alert>
 	<alert name="TransactionCancelled">
@@ -1288,20 +1275,18 @@ vraiment offrir cet élément?
 	</alert>
 	<alert name="TooManyItems">
 		<message name="message">
-			Impossible d&apos;offrir autant d&apos;éléments en un seul transfert d&apos;inventaire.
+			Impossible de donner plus de 42 objets au cours d&apos;un seul transfert d&apos;inventaire.
 		</message>
 	</alert>
 	<alert name="NoItems">
 		<message name="message">
-			Aucun élément cessible.
+			Vous n&apos;êtes pas autorisé à transférer les objets sélectionnés.
 		</message>
 	</alert>
 	<alert name="CannotCopyCountItems">
 		<message name="message">
-			Vous n&apos;êtes pas autorisé(e) à copier [COUNT] des
-éléments sélectionnés. Ces éléments disparaîtront
-de votre inventaire.
-Souhaitez-vous réellement donner ces éléments ?
+			Vous n&apos;êtes pas autorisé à copier [COUNT] des objets sélectionnés. Ces objets disparaîtront de votre inventaire.
+Souhaitez-vous vraiment donner ces objets ?
 		</message>
 		<option name="Yes">
 			Oui
@@ -1312,20 +1297,19 @@ Souhaitez-vous réellement donner ces éléments ?
 	</alert>
 	<alert name="CannotGiveCategory">
 		<message name="message">
-			Impossible d&apos;offrir la catégorie d&apos;inventaire.
+			Vous n&apos;êtes pas autorisé à transférer le dossier sélectionné.
 		</message>
 	</alert>
 	<alert name="FreezeAvatar">
 		<message name="message">
-			Bloquer cet avatar?
-Il ou elle sera momentanément incapable de bouger, 
-chatter, ou interagir avec le monde.
+			Geler cet avatar ?
+Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le Monde.
 		</message>
 		<option name="Freeze">
-			Figer
+			Geler
 		</option>
 		<option name="Unfreeze">
-			Débloquer
+			Dégeler
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -1348,13 +1332,13 @@ Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le M
 	</alert>
 	<alert name="EjectAvatar">
 		<message name="message">
-			Ejecter cet avatar de votre terrain ?
+			Expulser cet avatar de votre terrain ?
 		</message>
 		<option name="Eject">
-			Ejecter
+			Expulser
 		</option>
 		<option name="EjectandBan">
-			Ejecter et bannir
+			Expulser et bannir
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -1368,7 +1352,7 @@ Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le M
 			Expulser
 		</option>
 		<option name="EjectandBan">
-			Expulser et interdire
+			Expulser et bannir
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -1376,19 +1360,18 @@ Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le M
 	</alert>
 	<alert name="InvalidUUID">
 		<message name="message">
-			uuid invalide
+			UUID invalide
 		</message>
 	</alert>
 	<alert name="AcquireErrorTooManyObjects">
 		<message name="message">
-			ERREUR D&apos;ACQUISITION : trop d&apos;objets sélectionnés.
+			Erreur d&apos;acquisition : trop d&apos;objets sélectionnés.
 		</message>
 	</alert>
 	<alert name="AcquireErrorObjectSpan">
 		<message name="message">
-			ERREUR D&apos;ACQUISITION : les objets sont répartis sur plus d&apos;une région.
-Veuillez déplacer tous les objets à acquérir dans la
-même région.
+			Erreur d&apos;acquisition : les objets sont répartis dans plus d&apos;une région.
+Veuillez mettre tous les objets que vous souhaitez acquérir dans la même région.
 		</message>
 	</alert>
 	<alert name="TakeLockedOrNotOwnedBy">
@@ -1411,12 +1394,11 @@ Etes-vous sûr(e) de vouloir prendre ces eléments ?
 	<alert name="PromptGoToCurrencyPage">
 		<message name="message">
 			[EXTRA]
- 
- 
-Aller à [URL] pour en savoir plus sur l&apos;achat de devises ?
+
+Aller sur [URL] pour obtenir des informations sur l&apos;achat de devises ?
 		</message>
 		<option name="GotoPage">
-			Aller à la Page
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -1426,38 +1408,38 @@ Aller à [URL] pour en savoir plus sur l&apos;achat de devises ?
 		<message name="message">
 			Impossible de lier ces [COUNT] objets.
 Vous pouvez lier un maximum de [MAX] objets.
-Veuillez sélectionner moins d&apos;objets.
 		</message>
 	</alert>
 	<alert name="CannotLinkIncompleteSet">
 		<message name="message">
-			Vous ne pouvez lier que des séries complètes d&apos;objets, et devez
-sélectionner plus d&apos;un objet.
+			Vous ne pouvez lier que des ensembles d&apos;objets complets et vous devez choisir un minimum de deux objets.
 		</message>
 	</alert>
 	<alert name="CannotLinkModify">
 		<message name="message">
-			Liaison impossible car vous ne disposez pas des autorisations de modification
-pour tous les objets.  Assurez-vous qu&apos;ils soient tous déverrouillés, et
-qu&apos;ils vous appartiennent tous.
+			Impossible de lier car vous n&apos;avez pas la permission de modifier tous les objets. 
+
+Assurez-vous que vous êtes le propriétaire de tous les objets et qu&apos;aucun d&apos;eux n&apos;est verrouillé.
 		</message>
 	</alert>
 	<alert name="CannotLinkDifferentOwners">
 		<message name="message">
-			Liaison impossible car tous les objets n&apos;ont pas le même
-propriétaire. Veuillez vous assurer que tous les objets sélectionnés vous appartiennent.
+			Impossible de lier car les objets n&apos;ont pas tous le même propriétaire. 
+
+Assurez-vous que vous êtes le propriétaire de tous les objets sélectionnés.
 		</message>
 	</alert>
 	<alert name="NoFileExtension">
 		<message name="message">
-			Le fichier &apos;[FILE]&apos; n&apos;a pas d&apos;extension.
-Veuillez vous assurer que le fichier a une extension valide.
+			Pas d&apos;extension pour le fichier suivant : &apos;[FILE]&apos;
+
+Assurez-vous que le fichier a l&apos;extension correcte.
 		</message>
 	</alert>
 	<alert name="InvalidFileExtension">
 		<message name="message">
-			Extension de fichier invalide : [EXTENSION]
-Requise : [VALIDS]
+			Extension de fichier [EXTENSION] invalide 
+[VALIDS] attendu
 		</message>
 		<option name="OK">
 			OK
@@ -1465,87 +1447,87 @@ Requise : [VALIDS]
 	</alert>
 	<alert name="CannotUploadSoundFile">
 		<message name="message">
-			Impossible de lire le fichier son uploadé :
+			Impossible de lire le fichier son chargé :
 [FILE]
 		</message>
 	</alert>
 	<alert name="SoundFileNotRIFF">
 		<message name="message">
-			Le fichier n&apos;est pas un fichier de type RIFF WAVE : 
+			Il semble que le fichier ne soit pas un fichier RIFF WAVE : 
 [FILE]
 		</message>
 	</alert>
 	<alert name="SoundFileNotPCM">
 		<message name="message">
-			Le fichier n&apos;est pas un fichier audio de type PCM WAVE : 
+			Il semble que le fichier ne soit pas un fichier audio PCM WAVE : 
 [FILE]
 		</message>
 	</alert>
 	<alert name="SoundFileInvalidChannelCount">
 		<message name="message">
-			Le fichier a un nombre de canaux invalide (doit être mono ou stereo) : 
+			Le fichier contient un nombre de canaux invalide (doit être mono ou stéréo) : 
 [FILE]
 		</message>
 	</alert>
 	<alert name="SoundFileInvalidSampleRate">
 		<message name="message">
-			Le fichier a un taux d&apos;échantillonage non supporté (doit être en 44.1kHz) : 
+			Le fichier ne semble pas être pris en charge (doit être 44,1 k) : 
 [FILE]
 		</message>
 	</alert>
 	<alert name="SoundFileInvalidWordSize">
 		<message name="message">
-			Le fichier a une longueur de mots non supportée (doit être en 8 ou 16-bit) : 
+			Le fichier ne semble pas être pris en charge (doit faire 8 ou 16 bit) : 
 [FILE]
 		</message>
 	</alert>
 	<alert name="SoundFileInvalidHeader">
 		<message name="message">
-			Segment &apos;données&apos; introuvable dans l&apos;en-tête WAV : 
+			Impossible de trouver les données dans l&apos;en-tête WAV : 
 [FILE]
 		</message>
 	</alert>
 	<alert name="SoundFileInvalidTooLong">
 		<message name="message">
-			Le fichier audio est trop long (10 secondes max.) : 
+			Le fichier audio est trop long (10 secondes maximum) : 
 [FILE]
 		</message>
 	</alert>
 	<alert name="ProblemWithFile">
 		<message name="message">
-			Erreur du fichier [FILE]:
+			Problème avec le fichier [FILE] :
  
 [ERROR]
 		</message>
 	</alert>
 	<alert name="CannotOpenTemporarySoundFile">
 		<message name="message">
-			Impossible d&apos;ouvrir le fichier son compressé temporaire à écrire : [FILE]
+			Impossible d&apos;ouvrir le fichier son compressé temporaire : [FILE]
 		</message>
 	</alert>
 	<alert name="UnknownVorbisEncodeFailure">
 		<message name="message">
-			Erreur d&apos;encodage vorbis inconnue du fichier : [FILE]
+			Échec d&apos;encodage Vorbis inconnu sur : [FILE]
 		</message>
 	</alert>
 	<alert name="CorruptResourceFile">
 		<message name="message">
-			fichier ressource corrompu : [FILE]
+			Fichier ressource corrompu : [FILE]
 		</message>
 	</alert>
 	<alert name="UnknownResourceFileVersion">
 		<message name="message">
-			version de fichier ressource linden inconnue : [FILE]
+			Version de fichier ressource Linden inconnu : [FILE]
 		</message>
 	</alert>
 	<alert name="UnableToCreateOutputFile">
 		<message name="message">
-			Impossible de créer le fichier : [FILE]
+			Impossible de créer le fichier de sortie : [FILE]
 		</message>
 	</alert>
 	<alert name="DoNotSupportBulkAnimationUpload">
 		<message name="message">
-			L&apos;upload de fichiers d&apos;animation par lots n&apos;est pas encore possible.
+			Actuellement, nous ne prenons pas en charge le chargement de lots de fichiers d&apos;animation.
 		</message>
 	</alert>
 	<alert name="CannotAccessOutputFile">
@@ -1560,55 +1542,52 @@ Requise : [VALIDS]
 	</alert>
 	<alert name="InsufficientFundsToFinishUpload">
 		<message name="message">
-			Fonds insuffisants pour terminer l&apos;upload de [FILE] : il vous faut L$[COST], votre solde est de L$[BALANCE]
+			Fonds insuffisants pour terminer le téléchargement de [FILE] : il vous faut L$[COST] et votre solde est de L$[BALANCE]
 		</message>
 	</alert>
 	<alert name="CannotUploadReason">
 		<message name="message">
-			Upload du fichier [FILE] impossible : [REASON]
+			Impossible de charger [FILE] suite au problème suivant : [REASON]
 Veuillez réessayer ultérieurement.
 		</message>
 	</alert>
 	<alert name="CannotCreateLandmarkNotOwner">
 		<message name="message">
-			Vous ne pouvez créer un repère ici
-car le propriétaire du terrain ne l&apos;autorise pas.
-Essayez de vous déplacer de quelques mètres.
+			Vous ne pouvez pas créer de repère ici car le propriétaire du terrain ne l&apos;autorise pas.
 		</message>
 	</alert>
 	<alert name="CannotRecompileSelectObjectsNoScripts">
 		<message name="message">
-			Recompilation impossible.
-Sélectionnez des objets dont les scripts
-sont valides.
+			Impossible d&apos;effectuer les recompilations.
+Sélectionnez un objet avec un script.
 		</message>
 	</alert>
 	<alert name="CannotRecompileSelectObjectsNoPermission">
 		<message name="message">
-			Recompilation impossible.
-Sélectionnez des objets dont vous êtes
-autorisé(e) à modifier les scripts.
+			Impossible d&apos;effectuer les recompilations.
+
+Sélectionnez des objets qui ont des scripts et que vous pouvez modifier.
 		</message>
 	</alert>
 	<alert name="CannotResetSelectObjectsNoScripts">
 		<message name="message">
-			Réinitialisation impossible.
-Sélectionnez des objets dont les scripts
-sont valides.
+			Impossible d&apos;effectuer la réinitialisation.
+
+Veuillez sélectionner des objets avec des scripts.
 		</message>
 	</alert>
 	<alert name="CannotResetSelectObjectsNoPermission">
 		<message name="message">
-			Réinitialisation impossible.
-Sélectionnez des objets dont vous êtes
-autorisé(e) à modifier les scripts.
+			Impossible d&apos;effectuer la réinitialisation.
+
+Sélectionnez des objets qui ont des scripts et que vous pouvez modifier.
 		</message>
 	</alert>
 	<alert name="CannotSetRunningSelectObjectsNoScripts">
 		<message name="message">
-			Impossible de commander le démarrage de scripts.
-Sélectionnez des objets dont les scripts
-sont valides.
+			Impossible de définir les scripts sur « exécution ».
+
+Veuillez sélectionner des objets avec des scripts.
 		</message>
 	</alert>
 	<alert name="CannotSetRunningSelectObjectsNoPermission">
@@ -1620,9 +1599,9 @@ autorisé(e) à modifier les scripts.
 	</alert>
 	<alert name="CannotSetRunningNotSelectObjectsNoScripts">
 		<message name="message">
-			Impossible de commander l&apos;arrêt de scripts.
-Sélectionnez des objets dont les scripts
-sont valides.
+			Impossible de définir les scripts sur « non-exécution ».
+
+Veuillez sélectionner des objets avec des scripts.
 		</message>
 	</alert>
 	<alert name="CannotSetRunningNotSelectObjectsNoPermission">
@@ -1634,7 +1613,7 @@ autorisé(e) à modifier les scripts.
 	</alert>
 	<alert name="NoFrontmostFloater">
 		<message name="message">
-			No frontmost floater to save
+			Aucun floater frontmost à sauvegarder.
 		</message>
 	</alert>
 	<alert name="SeachFilteredOnShortWords">
@@ -1656,7 +1635,7 @@ Recherche effectuée : [FINALQUERY]
 	</alert>
 	<alert name="ColladaExportFailedInvalidPermissions">
 		<message name="message">
-			Erreur d&apos;export Collada : Autorisations non valables ou objet verrouillé !
+			Erreur d&apos;export Collada : autorisations non valables ou objet verrouillé !
 		</message>
 	</alert>
 	<alert name="ColladaExportFailedUnknownError">
@@ -1681,30 +1660,27 @@ Recherche effectuée : [FINALQUERY]
 	</alert>
 	<alert name="CouldNotTeleportReason">
 		<message name="message">
-			Téléportation impossible.
+			Impossible de téléporter.
 [REASON]
 		</message>
 	</alert>
 	<alert name="CannotSetLandOwnerNothingSelected">
 		<message name="message">
-			Impossible de définir le propriétaire :
-Sélection vide.
+			Impossible de définir le propriétaire foncier :
+aucune parcelle sélectionnée.
 		</message>
 	</alert>
 	<alert name="CannotSetLandOwnerMultipleRegions">
 		<message name="message">
-			Impossible de forcer la propriété du terrain car la sélection couvre plusieurs
-régions. Veuillez sélectionner une zone plus petite et réessayez.
+			Impossible d&apos;imposer la propriété car la sélection couvre plusieurs régions. Veuillez sélectionner une zone plus petite et réessayer.
 		</message>
 	</alert>
 	<alert name="ForceOwnerAuctionWarning">
 		<message name="message">
-			Cette parcelle a été mise aux enchères. Forcer la propriété
-annulera les enchères, ce qui peut mécontenter certains résidents
-si les enchères ont débuté. Forcer la propriété ?
+			Cette parcelle est mise aux enchères. Imposer la propriété annulerait les enchères, ce qui pourrait être gênant pour certains résidents si ces dernières ont commencé. Imposer la propriété ?
 		</message>
 		<option name="Force">
-			Forcer
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -1712,32 +1688,32 @@ si les enchères ont débuté. Forcer la propriété ?
 	</alert>
 	<alert name="CannotContentifyNothingSelected">
 		<message name="message">
-			Ajout de contenu impossible :
-Sélection vide.
+			Problème :
+Aucune parcelle sélectionnée.
 		</message>
 	</alert>
 	<alert name="CannotContentifyNoRegion">
 		<message name="message">
-			Ajout de contenu impossible :
-Aucune région.
+			Problème :
+Aucune région sélectionnée.
 		</message>
 	</alert>
 	<alert name="CannotReleaseLandNothingSelected">
 		<message name="message">
-			Impossible de céder le terrain :
-Sélection vide.
+			Impossible d&apos;abandonner le terrain :
+aucune parcelle sélectionnée.
 		</message>
 	</alert>
 	<alert name="CannotReleaseLandNoRegion">
 		<message name="message">
-			Impossible de céder le terrain :
-région introuvable.
+			Impossible d&apos;abandonner le terrain :
+la région est introuvable.
 		</message>
 	</alert>
 	<alert name="CannotBuyLandNothingSelected">
 		<message name="message">
 			Impossible d&apos;acheter le terrain :
-Sélection vide.
+aucune parcelle sélectionnée.
 		</message>
 	</alert>
 	<alert name="CannotBuyLandNoRegion">
@@ -1753,28 +1729,29 @@ la région dans laquelle il est situé est introuvable.
 	</alert>
 	<alert name="CannotDeedLandNothingSelected">
 		<message name="message">
-			Transfert du terrain impossible :
-Sélection vide.
+			Cession du terrain impossible :
+aucune parcelle sélectionnée.
 		</message>
 	</alert>
 	<alert name="CannotDeedLandNoGroup">
 		<message name="message">
-			Transfert du terrain impossible :
-Aucun groupe.
+			Cession du terrain impossible :
+aucun groupe sélectionné.
 		</message>
 	</alert>
 	<alert name="CannotDeedLandNoRegion">
 		<message name="message">
-			Transfert du terrain impossible :
-La région contenant ce terrain est introuvable.
-Veuillez utiliser Aide -&gt; Signaler un bug pour envoyer un rapport.
+			Cession du terrain impossible :
+la région dans laquelle il est situé est introuvable.
+Veuillez utiliser Aide &gt; Signaler des bugs pour signaler le problème.
 		</message>
 	</alert>
 	<alert name="CannotDeedLandMultipleSelected">
 		<message name="message">
-			Transfert du terrain impossible :
-Plusieurs parcelles distinctes sélectionnées.
-Essayez de sélectionner une surface plus petite.
+			Cession du terrain impossible :
+plusieurs parcelles sélectionnées.
+
+Essayez de ne sélectionner qu&apos;une seule parcelle.
 		</message>
 	</alert>
 	<alert name="RegionNotFound">
@@ -1784,18 +1761,14 @@ Essayez de sélectionner une surface plus petite.
 	</alert>
 	<alert name="ParcelCanPlayMedia">
 		<message name="message">
-			Cet endroit peut diffuser un flux vidéo. 
- 
-Le flux vidéo requiert une connexion internet 
-d&apos;un débit de 768 kbps ou plus .
+			Cette parcelle propose des flux de média. 
+Pour jouer des flux de média, il faut avoir une connexion internet rapide.
  
-Lire le flux vidéo lorsque disponible ?
- 
-(Vous pouvez modifier cette option à tout moment dans
-Préferences &gt; Audio &amp; Vidéo.)
+Jouer les flux de média lorsqu&apos;ils sont disponibles ?
+(Vous pourrez modifier cette option ultérieurement sous Préférences &gt; Audio et Vidéo.)
 		</message>
 		<option name="PlayMedia">
-			Lire le media
+			Jouer le média
 		</option>
 		<option name="Disable">
 			Désactiver
@@ -1803,69 +1776,72 @@ Préferences &gt; Audio &amp; Vidéo.)
 	</alert>
 	<alert name="CannotDeedLandWaitingForServer">
 		<message name="message">
-			Transfert du terrain impossible :
-Données de propriété en attente du serveur.
-Réessayez d&apos;ici quelques secondes.
+			Cession du terrain impossible :
+rapport de propriété sur le point d&apos;être envoyé par le serveur.
+
+Merci de réessayer.
 		</message>
 	</alert>
 	<alert name="CannotDeedLandNoTransfer">
 		<message name="message">
-			Transfert du terrain impossible :
-La région [REGION] n&apos;autorise pas le transfert de terrain.
+			Cession du terrain impossible :
+la cession de terrain est interdite dans la région [REGION].
 		</message>
 	</alert>
 	<alert name="CannotReleaseLandWatingForServer">
 		<message name="message">
-			Impossible de céder le terrain :
-En attente du serveur pour le calcul du coût.
-Veuillez réessayer d&apos;ici quelques secondes.
+			Impossible d&apos;abandonner le terrain :
+mise à jour des informations sur la parcelle sur le point d&apos;être envoyée par le serveur.
+
+Veuillez réessayer dans quelques secondes.
 		</message>
 	</alert>
 	<alert name="CannotReleaseLandSelected">
 		<message name="message">
-			Impossible de céder le terrain :
-plusieurs parcelles distinctes sélectionnées.
-Essayez de sélectionner une surface plus petite.
+			Impossible d&apos;abandonner le terrain :
+vous n&apos;êtes pas le propriétaire des parcelles sélectionnées.
+
+Veuillez sélectionner une seule parcelle.
 		</message>
 	</alert>
 	<alert name="CannotReleaseLandDontOwn">
 		<message name="message">
-			Impossible de céder le terrain :
-Vous n&apos;êtes pas autorisé(e) à libérer cette parcelle.
-Les parcelles vous appartenant sont affichées en vert.
+			Impossible d&apos;abandonner le terrain :
+vous n&apos;avez pas la permission de libérer cette parcelle.
+Les parcelles qui vous appartiennent sont en vert.
 		</message>
 	</alert>
 	<alert name="CannotReleaseLandRegionNotFound">
 		<message name="message">
-			Impossible de céder le terrain :
+			Impossible d&apos;abandonner le terrain :
 la région dans laquelle il est situé est introuvable.
-Utilisez Aide -&gt; Signaler un bug pour envoyer un rapport.
+
+Veuillez utiliser Aide &gt; Signaler un bug pour signaler le problème.
 		</message>
 	</alert>
 	<alert name="CannotReleaseLandNoTransfer">
 		<message name="message">
-			Impossible de céder le terrain :
-La région [REGION] n&apos;autorise pas la cession de terrain.
+			Impossible d&apos;abandonner le terrain :
+le transfert de terrain est interdit dans la région [REGION].
 		</message>
 	</alert>
 	<alert name="CannotReleaseLandPartialSelection">
 		<message name="message">
-			Impossible de céder le terrain :
-Vous devez sélectionner une parcelle entière pour la libérer.
-Essayez de double-cliquer pour sélectionner une parcelle entière, ou
-divisez votre parcelle au préalable.
+			Impossible d&apos;abandonner le terrain :
+vous devez sélectionner une parcelle entière pour la libérer.
+
+Sélectionnez toute la parcelle ou divisez-la d&apos;abord.
 		</message>
 	</alert>
 	<alert name="ReleaseLandWarning">
 		<message name="message">
-			Vous vous apprêtez à libérer [AREA] m2 de terrain.
-Cette parcelle sera retirée de vos possessions de terrain,
-mais ne vous rapportera aucun L$.
- 
-Libérer ce terrain ?
+			Vous vous apprêtez à libérer [AREA] m² de terrain.
+Si vous libérez cette parcelle, elle sera supprimée de votre patrimoine, mais vous ne recevrez pas de L$.
+
+Libérer ce terrain ?
 		</message>
 		<option name="Release">
-			Relâcher
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -1874,27 +1850,26 @@ Libérer ce terrain ?
 	<alert name="CannotDivideLandNothingSelected">
 		<message name="message">
 			Division du terrain impossible :
-Sélection vide.
+
+aucune parcelle sélectionnée.
 		</message>
 	</alert>
 	<alert name="CannotDivideLandPartialSelection">
 		<message name="message">
 			Division du terrain impossible :
-Vous avez sélectionné une parcelle entière.
-Essayez de sélectionner une surface plus petite
-en cliquant/glissant.
+
+vous devez sélectionner toute la parcelle.
+Essayez de sélectionner une partie de la parcelle.
 		</message>
 	</alert>
 	<alert name="LandDivideWarning">
 		<message name="message">
-			Diviser ce terrain séparera la parcelle en deux,
-chaque parcelle pouvant disposer de réglages spécifiques. Certains réglages
-seront réinitialisés à l&apos;issue de cette opération.
+			Si vous divisez ce terrain, cette parcelle sera partagée en deux et chaque parcelle pourra avoir ses propres paramètres. Après cette opération, certains paramètres reviendront aux paramètres par défaut.
  
-Diviser le terrain ?
+Diviser le terrain ?
 		</message>
 		<option name="Divide">
-			Diviser
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -1903,51 +1878,50 @@ Diviser le terrain ?
 	<alert name="CannotDivideLandNoRegion">
 		<message name="message">
 			Division du terrain impossible :
-La région dans laquelle il est situé est introuvable.
-Veuillez utiliser Aide -&gt; Signaler un bug pour envoyer un rapport.
+la région dans laquelle il est situé est introuvable.
+
+Veuillez utiliser Aide &gt; Signaler un bug pour signaler le problème.
 		</message>
 	</alert>
 	<alert name="CannotJoinLandNoRegion">
 		<message name="message">
 			Impossible de fusionner le terrain :
-La région dans laquelle il est situé est introuvable.
-Veuillez utiliser Aide -&gt; Signaler un bug pour envoyer un rapport.
+la région dans laquelle il est situé est introuvable.
+
+Veuillez utiliser Aide &gt; Signaler un bug pour signaler le problème.
 		</message>
 	</alert>
 	<alert name="CannotJoinLandNothingSelected">
 		<message name="message">
 			Impossible de fusionner le terrain :
-Sélection vide.
+aucune parcelle sélectionnée.
 		</message>
 	</alert>
 	<alert name="CannotJoinLandEntireParcelSelected">
 		<message name="message">
 			Impossible de fusionner le terrain :
-Vous avez sélectionné une parcelle entière.
-Essayez de sélectionner une surface plus grande
-en cliquant/glissant.
+vous avez sélectionné une seule parcelle.
+
+Sélectionnez le terrain sur les deux parcelles.
 		</message>
 	</alert>
 	<alert name="CannotJoinLandSelection">
 		<message name="message">
 			Impossible de fusionner le terrain :
-Vous devez sélectionner plus d&apos;une parcelle.
-Essayez de sélectionner une surface plus grande
-en cliquant/glissant.
+vous devez sélectionner au moins deux parcelles.
+
+Sélectionnez le terrain sur les deux parcelles.
 		</message>
 	</alert>
 	<alert name="JoinLandWarning">
 		<message name="message">
-			Fusionner ce terrain créera une grande parcelle
-à partir de toutes les parcelles présentes dans le rectangle de sélection.
- 
-Vous devrez réinitialiser le nom et les options
-de la nouvelle parcelle. 
+			En fusionnant ce terrain, vous créerez une grande parcelle composée de toutes les parcelles se trouvant dans le rectangle sélectionné. 
+Vous devrez réinitialiser le nom et les options de la nouvelle parcelle.
  
-Fusionner le terrain ?
+Fusionner le terrain ?
 		</message>
 		<option name="Join">
-			Fusionner
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -1966,7 +1940,7 @@ Fusionner le terrain ?
 	</alert>
 	<alert name="ConfirmLandmarkCopy">
 		<message name="message">
-			Copier cet élément vers votre inventaire ?
+			Copier ce repère dans votre inventaire ?
 		</message>
 		<option name="Copy">
 			Copie
@@ -1977,10 +1951,10 @@ Fusionner le terrain ?
 	</alert>
 	<alert name="ConfirmItemCopy">
 		<message name="message">
-			Copier cet élément vers votre inventaire ?
+			Copier cet objet dans votre inventaire ?
 		</message>
 		<option name="Copy">
-			Copie
+			Copier
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -1988,34 +1962,30 @@ Fusionner le terrain ?
 	</alert>
 	<alert name="ResolutionSwitchFail">
 		<message name="message">
-			Impossible de changer la résolution en [RESX] par [RESY]
+			Échec du changement de résolution (à [RESX], de [RESY])
 		</message>
 	</alert>
 	<alert name="ErrorUndefinedGrasses">
 		<message name="message">
-			Erreur : Pelouses indéfinies : [SPECIES]
+			Erreur : herbes non identifiées  : [SPECIES]
 		</message>
 	</alert>
 	<alert name="ErrorUndefinedTrees">
 		<message name="message">
-			Erreur : Arbres indéfinis : [SPECIES]
+			Erreur : arbres non identifiés : [SPECIES]
 		</message>
 	</alert>
 	<alert name="CannotSaveWearableOutOfSpace">
 		<message name="message">
-			Impossible de sauvegarder le fichier endossable &apos;[NAME]&apos;. Vous devez
-libérer de l&apos;espace disque sur votre ordinateur et
-sauvegarder le fichier à nouveau.
+			Impossible de sauvegarder [NAME]. Pour pouvoir sauvegarder ce fichier, vous devez d&apos;abord libérer de la mémoire sur votre ordinateur.
 		</message>
 	</alert>
 	<alert name="CannotSaveToAssetStore">
 		<message name="message">
 			Impossible de sauvegarder le fichier [NAME] dans la base de données centrale.
-Cette erreur est généralement temporaire. Veuillez
-éditer et sauvegarder l&apos;élément endossable à nouveau
-d&apos;ici quelques minutes. Si le problème persiste, veuillez
-cliquer sur &apos;Aide | Signaler un bug&apos; dans le menu déroulant
-en indiquant les paramètres de votre réseau.
+Cette erreur est généralement temporaire. Veuillez éditer et sauvegarder l&apos;élément endossable à nouveau d&apos;ici quelques minutes. 
+
+Si le problème persiste, veuillez cliquer sur Aide | Signaler un bug dans le menu déroulant en indiquant les détails de votre connexion.
 		</message>
 	</alert>
 	<alert name="AppEarlyExit">
@@ -2033,16 +2003,12 @@ www.secondlife.com/support.
 	</alert>
 	<alert name="YouHaveBeenLoggedOut">
 		<message name="message">
-			Vous avez été déconnecté(e) de [SECOND_LIFE]:
- 
-[MESSAGE]
- 
-Cliquez sur Continuer pour afficher les IM et le chat.
-Vous ne pourrez pas effectuer d&apos;autres opérations.
-Cliquez sur Quitter pour quitter [SECOND_LIFE] maintenant.
+			Vous avez été déconnecté(e) de [SECOND_LIFE] :
+            [MESSAGE]
+Vous pouvez afficher vos messages instantanés et votre chat en cliquant sur Afficher IM et chat. Sinon, cliquez sur Quitter pour quitter immédiatement [SECOND_LIFE].
 		</message>
 		<option name="Continue">
-			Continuer
+			Afficher IM et chat
 		</option>
 		<option name="Quit">
 			Quitter
@@ -2050,32 +2016,29 @@ Cliquez sur Quitter pour quitter [SECOND_LIFE] maintenant.
 	</alert>
 	<alert name="OnlyOfficerCanBuyLand">
 		<message name="message">
-			Impossible d&apos;acheter le terrain pour le groupe :
-Vous n&apos;êtes pas autorisé(e) à acheter du terrain pour votre groupe actif.
-Veuillez activer un autre groupe dans Edition -&gt; Groupes…
+			Impossible d&apos;acheter du terrain pour le groupe :
+Vous n&apos;avez pas la permission d&apos;acheter de terrain pour votre groupe.
 		</message>
 	</alert>
-	<alert name="AddFriend" title="Ajouter comme ami(e)">
+	<alert name="AddFriend" title="Devenir amis">
 		<message name="message">
-			Les amis peuvent se localiser sur la carte et 
-reçoivent des notifications de présence. 
- 
-Proposer à [NAME] de devenir votre ami(e)?
+			Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu&apos;ils se connectent.
+
+Proposer à [NAME] de devenir votre ami(e) ?
 		</message>
 		<option name="Offer">
-			Offrir
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
 		</option>
 		Voulez-vous être mon ami ?
 	</alert>
-	<alert name="AddFriendWithMessage" title="Ajouter comme ami">
+	<alert name="AddFriendWithMessage" title="Devenir amis">
 		<message name="message">
-			Vous pouvez suivre les déplacements de vos
-amis sur la carte et voir lorsqu&apos;ils se connectent.
+			Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu&apos;ils se connectent.
 
-Proposer à [NAME] de devenir votre ami ?
+Proposer à [NAME] de devenir votre ami(e) ?
 		</message>
 		<editline name="editline">
 			Voulez-vous être mon ami(e) ?
@@ -2089,10 +2052,10 @@ Proposer à [NAME] de devenir votre ami ?
 	</alert>
 	<alert name="RemoveFromFriends">
 		<message name="message">
-			Souhaitez-vous retirer [FIRST_NAME] [LAST_NAME] de votre liste d&apos;amis ?
+			Voulez-vous supprimer [FIRST_NAME] [LAST_NAME] de votre liste d&apos;amis ?
 		</message>
 		<option name="Remove">
-			Retirer
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -2100,7 +2063,7 @@ Proposer à [NAME] de devenir votre ami ?
 	</alert>
 	<alert name="RemoveMultipleFromFriends">
 		<message name="message">
-			Voulez-vous supprimer plusieurs personnes de votre liste d&apos;amis ?
+			Voulez-vous supprimer plusieurs résidents de votre liste d&apos;amis ?
 		</message>
 		<option name="Remove">
 			OK
@@ -2111,14 +2074,10 @@ Proposer à [NAME] de devenir votre ami ?
 	</alert>
 	<alert name="GodDeleteAllScriptedPublicObjectsByUser">
 		<message name="message">
-			Etes-vous sûr(e) de vouloir supprimer tous les objets scriptés appartenant à
- 
-** [AVATAR_NAME] **
- 
-sur tous les autres terrains de ce sim?
+			Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains des autres résidents dans ce sim ?
 		</message>
 		<option name="DELETE!!">
-			SUPPRIMER !!
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -2126,14 +2085,10 @@ sur tous les autres terrains de ce sim?
 	</alert>
 	<alert name="GodDeleteAllScriptedObjectsByUser">
 		<message name="message">
-			Etes-vous sûr(e) de vouloir SUPPRIMER TOUS les objets scriptés appartenant à
- 
-** [AVATAR_NAME] **
- 
-sur L&apos;ENSEMBLE DU TERRAIN de ce sim ?
+			Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains de ce sim ?
 		</message>
 		<option name="!!DELETEALL!!">
-			!!TOUT SUPPRIMER!!
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -2141,15 +2096,10 @@ sur L&apos;ENSEMBLE DU TERRAIN de ce sim ?
 	</alert>
 	<alert name="GodDeleteAllObjectsByUser">
 		<message name="message">
-			Etes-vous sûr(e) de vouloir SUPPRIMER TOUS les objets (scriptés ou non) 
-appartenant à
- 
-** [AVATAR_NAME] **
- 
-sur L&apos;ENSEMBLE DU TERRAIN de ce sim ?
+			Êtes-vous certain de vouloir supprimer tous les objets (scriptés ou pas) appartenant à ** [AVATAR_NAME] ** sur tous les terrains de ce sim ?
 		</message>
 		<option name="!!DELETEALL!!">
-			!!TOUT SUPPRIMER!!
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -2158,22 +2108,22 @@ sur L&apos;ENSEMBLE DU TERRAIN de ce sim ?
 	<alert name="PublishGroupInfoToWeb">
 		<message name="message">
 			L&apos;option &quot;Publier sur le Web&quot; nous permet de publier
-le nom du groupe, son insigne, sa charte, ses titres, et ses fondateurs sur le
+le nom du groupe, son logo, sa charte, ses titres et ses fondateurs sur le
 site [SECOND_LIFE]. Il est de votre responsabilité d&apos;indiquer si 
-tout ou partie du contenu ci-dessus est considéré comme Adulte au regard
-des règles de base de la Communauté.
+tout ou partie du contenu ci-dessus est considéré comme Adulte selon
+les règles de base de la Communauté.
 		</message>
 	</alert>
 	<alert name="BlankClassifiedName">
 		<message name="message">
-			Vous devez remplir le champ &quot;nom&quot; de votre petite annonce.
+			Vous devez choisir un nom pour votre petite annonce.
 		</message>
 	</alert>
 	<alert name="MinClassifiedPrice">
 		<message name="message">
-			Les frais d&apos;insertion minimum sont de L$[MIN_PRICE].
+			Le coût de l&apos;annonce doit être de [MIN_PRICE] L$ minimum.
  
-Veuillez entrer une somme plus importante.
+Veuillez saisir un montant plus élevé.
 		</message>
 	</alert>
 	<alert name="CantLoadVertexShaders">
@@ -2183,166 +2133,160 @@ Veuillez entrer une somme plus importante.
 	</alert>
 	<alert name="ConfirmObjectDeleteLock">
 		<message name="message">
-			Au moins un objet est verrouillé.
-Vous pouvez toutefois supprimer la sélection en cours.
-Etes-vous sûr(e) de vouloir supprimer ces eléments ?
+			Au moins un des objets que vous avez sélectionnés est verrouillé.
+
+Êtes-vous certain de vouloir supprimer ces objets ?
 		</message>
 		<option name="Yes">
-			Oui
+			OK
 		</option>
 		<option name="No">
-			Non
+			Annuler
 		</option>
 	</alert>
 	<alert name="ConfirmObjectDeleteNoCopy">
 		<message name="message">
-			Au moins un objet est verrouillé.
-Vous pouvez toutefois supprimer la sélection en cours.
-Etes-vous sûr(e) de vouloir supprimer ces eléments ?
+			Au moins un des objets que vous avez sélectionnés n&apos;est pas reproductible.
+
+Êtes-vous certain de vouloir supprimer ces objets ?
 		</message>
 		<option name="Yes">
-			Oui
+			OK
 		</option>
 		<option name="No">
-			Non
+			Annuler
 		</option>
 	</alert>
 	<alert name="ConfirmObjectDeleteNoOwn">
 		<message name="message">
-			Au moins un objet ne vous appartient pas.
-Vous pouvez toutefois supprimer la sélection.
-Etes-vous sûr(e) de vouloir supprimer ces eléments ?
+			Au moins un des objets que vous avez sélectionnés ne vous appartient pas.
+
+Êtes-vous certain de vouloir supprimer ces objets ?
 		</message>
 		<option name="Yes">
-			Oui
+			OK
 		</option>
 		<option name="No">
-			Non
+			Annuler
 		</option>
 	</alert>
 	<alert name="ConfirmObjectDeleteLockNoCopy">
 		<message name="message">
-			Au moins un objet est verrouillé.
-Au moins un objet est non copiable.
-Vous pouvez toutefois supprimer la sélection en cours.
-Etes-vous sûr(e) de vouloir supprimer ces éléments ?
+			Au moins un des objets est verrouillé.
+Au moins un des objets n&apos;est pas reproductible.
+
+Êtes-vous certain de vouloir supprimer ces objets ?
 		</message>
 		<option name="Yes">
-			Oui
+			OK
 		</option>
 		<option name="No">
-			Non
+			Annuler
 		</option>
 	</alert>
 	<alert name="ConfirmObjectDeleteLockNoOwn">
 		<message name="message">
-			Au moins un objet est verrouillé.
-Au moins un objet ne vous appartient pas.
-Vous pouvez toutefois supprimer la sélection en cours.
-Etes-vous sûr(e) de vouloir supprimer ces eléments ?
+			Au moins un des objets est verrouillé.
+Au moins un des objets ne vous appartient pas.
+
+Êtes-vous certain de vouloir supprimer ces objets ?
 		</message>
 		<option name="Yes">
-			Oui
+			OK
 		</option>
 		<option name="No">
-			Non
+			Annuler
 		</option>
 	</alert>
 	<alert name="ConfirmObjectDeleteNoCopyNoOwn">
 		<message name="message">
-			Au moins un objet est non copiable.
-Au moins un objet ne vous appartient pas.
-Vous pouvez toutefois supprimer la sélection en cours.
-Etes-vous sûr(e) de vouloir supprimer ces eléments ?
+			Au moins un des objets n&apos;est pas reproductible.
+Au moins un des objets ne vous appartient pas.
+
+Êtes-vous certain de vouloir supprimer ces objets ?
 		</message>
 		<option name="Yes">
-			Oui
+			OK
 		</option>
 		<option name="No">
-			Non
+			Annuler
 		</option>
 	</alert>
 	<alert name="ConfirmObjectDeleteLockNoCopyNoOwn">
 		<message name="message">
-			Au moins un objet est verrouillé.
-Au moins un objet est non copiable.
-Au moins un objet ne vous appartient pas.
-Vous pouvez toutefois supprimer la sélection en cours.
-Etes-vous sûr(e) de vouloir supprimer ces éléments ?
+			Au moins un des objets est verrouillé.
+Au moins un des objets n&apos;est pas reproductible.
+Au moins un des objets ne vous appartient pas.
+
+Êtes-vous certain de vouloir supprimer ces objets ?
 		</message>
 		<option name="Yes">
-			Oui
+			OK
 		</option>
 		<option name="No">
-			Non
+			annuler
 		</option>
 	</alert>
 	<alert name="ConfirmObjectTakeLock">
 		<message name="message">
-			Au moins un objet est verrouillé.
-Vous pouvez toutefois prendre la sélection en cours.
-Etes-vous sûr(e) de vouloir prendre ces éléments ?
+			Au moins un des objets est verrouillé.
+
+Êtes-vous certain de vouloir prendre ces objets ?
 		</message>
 		<option name="Yes">
-			Oui
+			OK
 		</option>
 		<option name="No">
-			Non
+			Annuler
 		</option>
 	</alert>
 	<alert name="ConfirmObjectTakeNoOwn">
 		<message name="message">
-			Vous n&apos;êtes pas propriétaire de tous les objets que vous prenez.
-Si vous continuez, de nouvelles autorisations de propriété
-seront appliquées aux objets, pouvant restreindre votre
-capacité à les modifier ou les copier à l&apos;avenir.
-Vous pouvez toutefois prendre la sélection en cours.
-Etes-vous sûr(e) de vouloir prendre ces éléments?
+			Vous n&apos;êtes pas le propriétaire de tous les objets que vous prenez.
+Si vous continuez, les permissions accordées au prochain propriétaire entreront en vigueur et vous risquez de ne plus pouvoir modifier ou copier les objets.
+
+Êtes-vous certain de vouloir prendre ces objets ?
 		</message>
 		<option name="Yes">
-			Oui
+			OK
 		</option>
 		<option name="No">
-			Non
+			Annuler
 		</option>
 	</alert>
 	<alert name="ConfirmObjectTakeLockNoOwn">
 		<message name="message">
-			Au moins un objet est verrouillé.
-Vous n&apos;êtes pas propriétaire de tous les objets sélectionnés.
-Si vous poursuivez, de nouvelles autorisations de propriété
-seront appliquées aux objets, pouvant restreindre
-votre capacité à les modifier ou les copier à l&apos;avenir.
-Vous pouvez toutefois prendre la sélection.
-Etes-vous sûr(e) de vouloir prendre ces eléments ?
+			Au moins un des objets est verrouillé.
+Vous n&apos;êtes pas le propriétaire de tous les objets que vous prenez.
+Si vous continuez, les permissions accordées au prochain propriétaire entreront en vigueur et vous risquez de ne plus pouvoir modifier ou copier les objets.
+Par contre, vous pouvez prendre les objets sélectionnés.
+
+Êtes-vous certain de vouloir prendre ces objets ?
 		</message>
 		<option name="Yes">
-			Oui
+			OK
 		</option>
 		<option name="No">
-			Non
+			Annuler
 		</option>
 	</alert>
 	<alert name="CantBuyLandAcrossMultipleRegions">
 		<message name="message">
-			Impossible d&apos;acheter le terrain car la sélection s&apos;étend sur plusieurs régions.
-Veuillez sélectionner une surface plus petite et recommencez.
+			Impossible d&apos;acheter le terrain car la sélection couvre plusieurs régions.
+
+Veuillez sélectionner une zone plus petite et réessayer.
 		</message>
 	</alert>
 	<alert name="DeedLandToGroup">
 		<message name="message">
-			En transférant cette parcelle, le groupe devra
-posséder et maintenir des crédits terrain suffisants. 
- 
-Le prix d&apos;achat du terrain n&apos;est pas remboursé
-au propriétaire. A la vente d&apos;une parcelle transférée, le prix
-de vente est divisé équitablement entre les membres du groupe. 
- 
-Transférer les [AREA] m2 de terrain au groupe
-&apos;[GROUP_NAME]&apos; ?
+			Si vous cédez ce terrain, le groupe devra
+avoir les moyens de le prendre en charge.
+Le prix de la vente du terrain n&apos;est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe.
+
+Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ?
 		</message>
 		<option name="Deed">
-			Transférer
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -2350,21 +2294,15 @@ Transférer les [AREA] m2 de terrain au groupe
 	</alert>
 	<alert name="DeedLandToGroupWithContribution">
 		<message name="message">
-			En transférant cette parcelle, le groupe devra
-posséder et maintenir des crédits terrain suffisants. 
- 
-Ce transfert incluera une contribution de terrain
-simultanée au groupe de la part de &apos;[FIRST_NAME] [LAST_NAME]&apos;.
+			Si vous cédez ce terrain, le groupe devra
+avoir les moyens de le prendre en charge.
+La cession incluera une contribution de terrain simultanée au groupe de [FIRST_NAME] [LAST_NAME].
+Le prix de la vente du terrain n&apos;est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe.
  
-Le prix d&apos;achat du terrain n&apos;est pas remboursé
-au propriétaire. A la vente d&apos;une parcelle transférée, le prix
-de vente est divisé équitablement entre les membres du groupe. 
- 
-Transférer les [AREA] m2 de terrain au groupe
-&apos;[GROUP_NAME]&apos; ?
+Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ?
 		</message>
 		<option name="Deed">
-			Transférer
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -2372,14 +2310,12 @@ Transférer les [AREA] m2 de terrain au groupe
 	</alert>
 	<alert name="DisplaySetToSafe">
 		<message name="message">
-			Les paramètres d&apos;affichage ont été définis ont été définis aux valeurs du mode sans échec 
-car vous avez activé le mode sans échec.
+			Les paramètres d&apos;affichage sont au niveau le plus sûr, comme vous l&apos;aviez indiqué.
 		</message>
 	</alert>
 	<alert name="DisplaySetToRecommended">
 		<message name="message">
-			Les paramètres d&apos;affichage ont été définis aux valeurs recommandées
-d&apos;après votre configuration matérielle.
+			Le niveau de sécurité de vos paramètres d&apos;affichage dépend de votre configuration système.
 		</message>
 	</alert>
 	<alert name="UnableToConnect">
@@ -2412,7 +2348,7 @@ Connexion impossible à [IP_ADDRESS]
 	</alert>
 	<alert name="SystemMayBeDown">
 		<message name="message">
-			Connexion impossible à [SECOND_LIFE]
+			Connexion à [SECOND_LIFE] impossible
 Le service est peut-être interrompu.
 Veuillez réessayer d&apos;ici quelques minutes, ou cliquez sur Aide
 pour des conseils et un lien vers la page web d&apos;état du service.
@@ -2429,11 +2365,16 @@ pour des conseils et un lien vers la page web d&apos;état du service.
 			[ERROR_MESSAGE]
 		</message>
 	</alert>
+	<alert name="AvatarMoved">
+		<message name="message">
+			L&apos;emplacement [TYPE] n&apos;est pas disponible actuellement. [HELP] 
+Vous avez été déplacé dans une région voisine.
+		</message>
+	</alert>
 	<alert name="ClothingLoading">
 		<message name="message">
-			Vos vêtements sont en cours de téléchargement.
-Vous pouvez utiliser le monde normalement, les autres utilisateurs
-vous verront correctement.
+			Vos habits sont toujours en train d&apos;être téléchargés. 
+Vous pouvez utiliser [SECOND_LIFE] sans problème, les autres résidents vous voient normalement.
 		</message>
 		<ignore name="ignore">
 			Lorsque les habits prennent longtemps à télécharger
@@ -2442,14 +2383,12 @@ vous verront correctement.
 	<alert name="FirstRun">
 		<message name="message">
 			L&apos;installation de [SECOND_LIFE] est terminée.
- 
-Si vous utilisez [SECOND_LIFE] pour la première fois, vous devez ouvrir un compte
-avant de pouvoir vous connecter. 
- 
-Retourner sur www.secondlife.com pour ouvrir un nouveau compte ?
+
+S&apos;il s&apos;agit de la première fois que vous utilisez [SECOND_LIFE], vous devrez créer un compte avant de pouvoir vous connecter.
+Retourner sur www.secondlife.com pour créer un nouveau compte ?
 		</message>
 		<option name="NewAccount...">
-			Nouveau Compte...
+			Nouveau compte...
 		</option>
 		<option name="Continue">
 			Continuer
@@ -2464,11 +2403,9 @@ Veuillez vérifier votre connexion.
 	</alert>
 	<alert name="LoginPacketNeverReceived">
 		<message name="message">
-			Connexion impossible.  Identification non reçue
-par le serveur.
- 
-Veuillez réessayer d&apos;ici quelques minutes, ou cliquez sur Aide
-pour des conseils et un lien vers la page web d&apos;état du service.
+			Vous avez des problèmes à vous connecter. Il peut s&apos;agir d&apos;un problème avec votre connexion internet ou les serveurs de Second Life.
+
+Nous vous conseillons de vérifier votre connexion Internet et de réessayer dans quelques minutes, de cliquer sur Aide, ou bien de cliquer sur Téléporter pour être téléporté vers votre domicile.
 		</message>
 		<option name="OK">
 			OK
@@ -2482,36 +2419,31 @@ pour des conseils et un lien vers la page web d&apos;état du service.
 	</alert>
 	<alert name="WelcomeNoClothes">
 		<message name="message">
-			Votre personnage apparaîtra d&apos;ici quelques instants.
- 
-Utilisez les touches de direction pour marcher.
- 
-Appuyez sur la touche F1 pour obtenir de l&apos;aide
-ou en savoir plus sur [SECOND_LIFE].
+			Votre personnage va apparaître dans un moment.
+
+Pour marcher, utilisez les flèches de direction.
+Appuyez sur F1 pour obtenir de l&apos;aide ou en savoir plus sur [SECOND_LIFE].
 		</message>
 	</alert>
 	<alert name="WelcomeChooseSex">
 		<message name="message">
-			Votre personnage apparaîtra d&apos;ici quelques instants.
- 
-Utilisez les touches de direction pour marcher.
- 
-Appuyez sur la touche F1 pour obtenir de l&apos;aide
-ou en savoir plus sur [SECOND_LIFE].
- 
-Veuillez choisir le sexe de votre personnage.
-Vous pourrez le modifier ultérieurement.
+			Votre personnage va apparaître dans un moment.
+
+Pour marcher, utilisez les flèches de direction.
+Appuyez sur F1 pour obtenir de l&apos;aide ou en savoir plus sur [SECOND_LIFE].
+Choisissez un avatar homme ou femme.
+Vous pourrez revenir sur votre décision plus tard.
 		</message>
 		<option name="Male">
-			Masculin
+			Homme
 		</option>
 		<option name="Female">
-			Féminin
+			Femme
 		</option>
 	</alert>
 	<alert name="NotEnoughCurrency">
 		<message name="message">
-			[NAME] L$ [PRICE] Votre solde est insuffisant.
+			[NAME]  [PRICE] L$ Vous n&apos;avez pas suffisamment d&apos;argent pour cela.
 		</message>
 	</alert>
 	<alert name="GrantedModifyRights">
@@ -2526,12 +2458,9 @@ Vous pourrez le modifier ultérieurement.
 	</alert>
 	<alert name="FlushMapVisibilityCaches">
 		<message name="message">
-			Ceci videra le cache cartographique de la région.
- 
-Cette option n&apos;est réellement utile que pour le débogage. 
- 
-(Si vous êtes en production, attendez 5 minutes, les cartes de chacun
-seront mises à jour après redémarrage.)
+			Cela videra le cache cartographique de cette région.
+Cela n&apos;est vraiment utile que pour faire du débugage. 
+(En production, attendez 5 minutes. Les cartes seront mises à jour après reconnexion.)
 		</message>
 		<option name="OK">
 			OK
@@ -2542,8 +2471,8 @@ seront mises à jour après redémarrage.)
 	</alert>
 	<alert name="OnlyCopyContentsOfSingleItem">
 		<message name="message">
-			Impossible de copier le contenu de plus d&apos;un objet à la fois.
-Veuillez sélectionner un seul objet et recommencez.
+			Impossible de copier les contenus de plus d&apos;un objet à la fois.
+Veuillez ne sélectionner qu&apos;un seul objet.
 		</message>
 		<option name="OK">
 			OK
@@ -2554,7 +2483,7 @@ Veuillez sélectionner un seul objet et recommencez.
 	</alert>
 	<alert name="KickUsersFromRegion">
 		<message name="message">
-			Téléporter tous les utilisateurs présents dans la région vers leurs domiciles ?
+			Téléporter tous les résidents de cette région chez eux ?
 		</message>
 		<option name="OK">
 			OK
@@ -2592,18 +2521,18 @@ Remplacer la texture [TEXTURE_NUM] avec une image de 24 bits, 512 X 512, ou plus
 	</alert>
 	<alert name="RawUploadStarted">
 		<message name="message">
-			Upload en cours. Celui-ci peut prendre jusqu&apos;à 2 mn, 
-en fonction de votre vitesse de connexion.
+			Le chargement a commencé. Cela va prendre une à deux minutes, 
+suivant votre vitesse de connexion.
 		</message>
 	</alert>
 	<alert name="ConfirmBakeTerrain">
 		<message name="message">
 			Etes-vous sûr(e) de vouloir figer le relief actuel, 
-en faire le point central des limites de réhaussement/abaissement de relief
-et la valeur par défaut pour l&apos;outil &apos;Terrain par défaut&apos; ?
+en faire le point central des limites d&apos;élévation/abaissement de relief
+et la valeur par défaut du bouton Annuler modification ?
 		</message>
 		<option name="Bake">
-			Figer
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -2611,12 +2540,12 @@ et la valeur par défaut pour l&apos;outil &apos;Terrain par défaut&apos; ?
 	</alert>
 	<alert name="MaxAllowedAgentOnRegion">
 		<message name="message">
-			Nombre maximum de résidents autorisés : [MAX_AGENTS]
+			Vous ne pouvez pas autoriser plus de [MAX_AGENTS] résidents.
 		</message>
 	</alert>
 	<alert name="MaxBannedAgentsOnRegion">
 		<message name="message">
-			Nombre maximum de résidents bannis : [MAX_BANNED]
+			Vous ne pouvez pas bannir plus de [MAX_BANNED] résidents.
 		</message>
 	</alert>
 	<alert name="MaxAgentOnRegionBatch">
@@ -2627,7 +2556,7 @@ Dépasse la limite fixée à [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS].
 	</alert>
 	<alert name="MaxAllowedGroupsOnRegion">
 		<message name="message">
-			Nombre maximum de groupes autorisés : [MAX_GROUPS]
+			Vous ne pouvez pas avoir plus que [MAX_GROUPS] groupes autorisés.
 		</message>
 		<option name="Bake">
 			Figer
@@ -2638,35 +2567,34 @@ Dépasse la limite fixée à [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS].
 	</alert>
 	<alert name="MaxManagersOnRegion">
 		<message name="message">
-			Nombre maximum de résidents bannis : [MAX_MANAGER]
+			Vous ne pouvez avoir que [MAX_MANAGER] gérants de domaine.
 		</message>
 	</alert>
 	<alert name="OwnerCanNotBeDenied">
 		<message name="message">
-			Impossible d&apos;ajouter le propriétaire du domaine à la liste noire du domaine.
+			Impossible d&apos;ajouter le propriétaire du domaine à la liste des résidents bannis.
 		</message>
 	</alert>
 	<alert name="CanNotChangeAppearanceUntilLoaded">
 		<message name="message">
-			Impossible de modifier son apparence tant que les vêtements et silhouettes ne sont pas chargés.
+			Impossible de changer d&apos;apparence jusqu&apos;à ce que les habits et la silhouette soient chargés.
 		</message>
 	</alert>
 	<alert name="ClassifiedMustBeAlphanumeric">
 		<message name="message">
-			Le nom de votre annonce doit commencer 
-par une lettre ou un chiffre (pas de ponctuations).
+			Le nom de votre petite annonce doit commencer par un chiffre ou une lettre (A à Z). La ponctuation n&apos;est pas autorisée.
 		</message>
 	</alert>
 	<alert name="CantSetBuyObject">
 		<message name="message">
-			Impossible de définir &quot;Acheter objet&quot;, car l&apos;objet n&apos;est pas à vendre. 
-Veuillez mettre l&apos;objet en vente et réessayez.
+			Cet objet n&apos;est pas à vendre. 
+Veuillez choisir un objet à vendre et réessayer.
 		</message>
 	</alert>
 	<alert name="FinishedRawDownload">
 		<message name="message">
-			Téléchargement du fichier relief RAW terminé : 
-[DOWNLOAD_PATH]
+			Chargement du fichier de terrain raw effectué vers : 
+[DOWNLOAD_PATH].
 		</message>
 	</alert>
 	<alert name="DownloadWindowsMandatory">
@@ -2755,14 +2683,14 @@ Télécharger vers le dossier Applications ?
 	</alert>
 	<alert name="DeedObjectToGroup">
 		<message name="message">
-			Le transfert de cet objet permettra au groupe de :
-* Recevoir l&apos;argent payé à l&apos;objet
+			Si vous cédez cet objet, le groupe :
+* recevra les L$ versés pour l&apos;objet ;
 		</message>
 		<ignore name="ignore">
-			Lors du transfert d&apos;objets au groupe
+			Lors de la cession d&apos;objets au groupe
 		</ignore>
 		<option name="Deed">
-			Transférer
+			Céder
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -2806,7 +2734,7 @@ Télécharger vers le dossier Applications ?
 	</alert>
 	<alert name="WebLaunchSupportWiki">
 		<message name="message">
-			Visitez le blog officiel des Linden pour les dernières nouvelles et informations.
+			Visitez le blog officiel des Lindens pour les dernières nouvelles et informations.
 		</message>
 		<option name="Gotopage">
 			Aller à la page
@@ -2817,13 +2745,13 @@ Télécharger vers le dossier Applications ?
 	</alert>
 	<alert name="WebLaunchLSLGuide">
 		<message name="message">
-			Consulter le Manuel LSL pour de l&apos;aide sur les scripts ?
+			Consulter le Guide guide pour l&apos;écriture de scripts pour obtenir de l&apos;aide ?
 		</message>
 		<ignore name="ignore">
-			Lors de l&apos;ouverture du navigateur web pour voir le Guide de scripting
+			Lors de l&apos;ouverture du navigateur web pour voir le Guide pour l&apos;écriture de scripts
 		</ignore>
 		<option name="Gotopage">
-			Aller à la page
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -2842,18 +2770,15 @@ Télécharger vers le dossier Applications ?
 	</alert>
 	<alert name="ReturnToOwner">
 		<message name="message">
-			Etes-vous sûr(e) de vouloir renvoyer les objets
-sélectionnés à leurs propriétaires ? Les objets cessibles transférés
-seront renvoyés à leurs propriétaires précédents.
-(Tous les objets renvoyés seront replacés dans leur dernier dossier.)
- 
-*AVERTISSEMENT* Les objets non cessibles transférés seront supprimés !
+			Êtes-vous certain de vouloir renvoyer les objets sélectionnés à leur propriétaire ? Les objets donnés transférables seront renvoyés à leur ancien propriétaire.
+
+*Avertissement* Les objets non transférables seront supprimés !
 		</message>
 		<ignore name="ignore">
 			Lors du renvoi d&apos;objets à leurs propriétaires
 		</ignore>
 		<option name="Return">
-			Retourner
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -2861,7 +2786,7 @@ seront renvoyés à leurs propriétaires précédents.
 	</alert>
 	<alert name="GroupLeaveConfirmOfficer">
 		<message name="message">
-			Vous êtes actuellement officier du groupe [GROUP].
+			Vous êtes actuellement officier dans le groupe [GROUP].
 Quitter le groupe ?
 		</message>
 		<option name="Leave">
@@ -2874,10 +2799,10 @@ Quitter le groupe ?
 	<alert name="GroupLeaveConfirmMember">
 		<message name="message">
 			Vous êtes actuellement membre du groupe [GROUP].
-Quitter le groupe ?
+Quitter le groupe ?
 		</message>
 		<option name="Leave">
-			Partir
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -2885,10 +2810,10 @@ Quitter le groupe ?
 	</alert>
 	<alert name="ConfirmKick">
 		<message name="message">
-			Souhaitez-vous REELLEMENT dégager tous les utilisateurs de la grille ?
+			Souhaitez-vous vraiment éjecter tous les utilisateurs de la grille ?
 		</message>
 		<option name="Kick">
-			Vider Tous
+			Éjecter tous
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -2896,15 +2821,15 @@ Quitter le groupe ?
 	</alert>
 	<alert name="MuteLinden">
 		<message name="message">
-			Désolés, mais vous ne pouvez ignorer un Linden.
+			Désolé, vous ne pouvez pas ignorer un Linden.
 		</message>
 		<option name="OK">
 			OK
 		</option>
 	</alert>
-	<alert name="MuteByNameFailed" title="L&apos;objet n&apos;a pu être ignoré">
+	<alert name="MuteByNameFailed" title="Échec de la fonction Ignorer les objets par nom">
 		<message name="message">
-			Vous avez déjà ignoré ce nom.
+			Vous ignorez déjà ce résident.
 		</message>
 		<option name="OK">
 			OK
@@ -2912,14 +2837,13 @@ Quitter le groupe ?
 	</alert>
 	<alert name="RemoveItemWarn">
 		<message name="message">
-			Bien qu&apos;autorisée, la suppression d&apos;inventaire peut endommager
-l&apos;objet. Souhaitez-vous supprimer cet elément d&apos;inventaire ?
+			Si vous supprimez des contenus, vous risquez d&apos;endommager l&apos;objet. Souhaitez-vous supprimer cet objet ?
 		</message>
 		<option name="Yes">
-			Oui
+			OK
 		</option>
 		<option name="No">
-			Non
+			Annuler
 		</option>
 	</alert>
 	<alert name="CantRateOwnedByGroup">
@@ -2932,7 +2856,7 @@ l&apos;objet. Souhaitez-vous supprimer cet elément d&apos;inventaire ?
 	</alert>
 	<alert name="CantOfferCallingCard">
 		<message name="message">
-			Impossible d&apos;offrir votre carte de visite actuellement. Veuillez réessayer dans un moment.
+			Impossible d&apos;offrir une carte de visite actuellement. Veuillez réessayer dans un moment.
 		</message>
 		<option name="OK">
 			OK
@@ -2940,7 +2864,7 @@ l&apos;objet. Souhaitez-vous supprimer cet elément d&apos;inventaire ?
 	</alert>
 	<alert name="CantOfferFriendship">
 		<message name="message">
-			Impossible de proposer de devenir votre ami(e). Veuillez réessayer dans quelques instants.
+			Impossible de proposer votre amitié actuellement. Veuillez réessayer dans un moment.
 		</message>
 		<option name="OK">
 			OK
@@ -2957,10 +2881,8 @@ Votre domicile doit se trouver sur un terrain vous appartenant ou appartenant à
 	</alert>
 	<alert name="BusyModeSet">
 		<message name="message">
-			Vous êtes en mode occupé.
-Le chat et les messages instantanés seront cachés. Les IM
-retourneront un message d&apos;occupation. Toutes les offres de téléportation
-et d&apos;inventaire seront déclinées.
+			Mode occupé activé.
+Les chats et les messages instantanés ne s&apos;afficheront pas. Les messages instantanés génèreront la réponse en mode occupé que vous avez créée. Toutes les offres de téléportation seront refusées. Toutes les offres d&apos;inventaire iront dans la corbeille.
 		</message>
 		<ignore name="ignore">
 			Lors de l&apos;utilisation du mode Occupé
@@ -2988,19 +2910,16 @@ peuvent être joints aux notes.
 	</alert>
 	<alert name="JoinedTooManyGroupsMember">
 		<message name="message">
-			Vous appartenez à trop de groupes pour vous inscrire
-à un nouveau. Veuillez quitter au moins un groupe
-avant de vous inscrire, ou déclinez l&apos;invitation.
-Pour quitter un groupe, sélectionnez l&apos;option &apos;Mes Groupes&apos;
-dans le menu &apos;Edition&apos;.
-[NAME] vous invite à devenir membre du groupe.
+			Vous appartenez déjà à un nombre élevé de groupes et nous ne pouvez pas en rejoindre un nouveau. Avant de pouvoir rejoindre ce groupe, vous devez en quitter un ou refuser cette offre.
+Pour quitter un groupe, sélectionnez l&apos;option Groupe dans le menu Éditer.
+[NAME] vous invite à rejoindre un groupe.
 [INVITE]
 		</message>
 		<option name="Join">
-			Fusionner
+			Rejoindre
 		</option>
 		<option name="Decline">
-			Décliner
+			Refuser
 		</option>
 	</alert>
 	<alert name="JoinedTooManyGroupsOfficer">
@@ -3022,10 +2941,10 @@ dans le menu &apos;Edition&apos;.
 	</alert>
 	<alert name="KickUser">
 		<message name="message">
-			Dégager cet utilisateur avec quel message ?
+			Éjecter cet utilisateur avec quel message ?
 		</message>
 		<editline name="editline">
-			Vous avez été déconnecté par un administrateur.
+			Un administrateur vous a déconnecté.
 		</editline>
 		<option name="OK">
 			OK
@@ -3036,10 +2955,10 @@ dans le menu &apos;Edition&apos;.
 	</alert>
 	<alert name="KickAllUsers">
 		<message name="message">
-			Dégager tous les utilisateurs actuellement présents sur la grille avec quel message ?
+			Éjecter tous les résidents actuellement en ligne avec quel message ?
 		</message>
 		<editline name="editline">
-			Vous avez été déconnecté par un administrateur.
+			Un administrateur vous a déconnecté.
 		</editline>
 		<option name="OK">
 			OK
@@ -3050,10 +2969,10 @@ dans le menu &apos;Edition&apos;.
 	</alert>
 	<alert name="FreezeUser">
 		<message name="message">
-			Bloquer cet utilisateur avec quel message ?
+			Geler cet utilisateur avec quel message ?
 		</message>
 		<editline name="editline">
-			Vous avez été bloqué. Vous ne pouvez ni vous déplacer, ni chatter. Un administrateur va vous contacter via message instantané (IM).
+			Vous avez été gelé. Vous ne pouvez ni bouger ni chatter. Un administrateur va vous envoyer un message instantané (IM).
 		</editline>
 		<option name="OK">
 			OK
@@ -3064,10 +2983,10 @@ dans le menu &apos;Edition&apos;.
 	</alert>
 	<alert name="UnFreezeUser">
 		<message name="message">
-			Débloquer cet utilisateur avec quel message ?
+			Dégeler cet utilisateur avec quel message ?
 		</message>
 		<editline name="editline">
-			Vous n&apos;êtes plus bloqué.
+			Vous n&apos;êtes plus gelé.
 		</editline>
 		<option name="OK">
 			OK
@@ -3078,7 +2997,7 @@ dans le menu &apos;Edition&apos;.
 	</alert>
 	<alert name="ExpungeUser">
 		<message name="message">
-			Entrez l&apos;id d&apos;un avatar à expulser
+			Entrez l&apos;id de l&apos;avatar à éjecter
 		</message>
 		<option name="OK">
 			OK
@@ -3089,10 +3008,10 @@ dans le menu &apos;Edition&apos;.
 	</alert>
 	<alert name="OfferTeleport">
 		<message name="message">
-			Proposer de téléporter la personne avec le message suivant ?
+			Proposez une téléportation avec le message suivant ?
 		</message>
 		<editline name="editline">
-			Rejoins-moi à [REGION]
+			On se rejoint à [REGION] ?
 		</editline>
 		<option name="OK">
 			OK
@@ -3103,10 +3022,10 @@ dans le menu &apos;Edition&apos;.
 	</alert>
 	<alert name="OfferTeleportFromGod">
 		<message name="message">
-			Super-invoquer l&apos;utilisateur ici ?
+			Demander au résident de venir vous rejoindre ?
 		</message>
 		<editline name="editline">
-			Rejoins-moi à [REGION]
+			On se rejoint à [REGION] ?
 		</editline>
 		<option name="OK">
 			OK
@@ -3117,7 +3036,7 @@ dans le menu &apos;Edition&apos;.
 	</alert>
 	<alert name="TeleportFromLandmark">
 		<message name="message">
-			Etes-vous certain de vouloir être téléporté ?
+			Êtes-vous certain de vouloir être téléporté ?
 		</message>
 		<ignore name="ignore">
 			Lors de la téléportation depuis un repère de l&apos;inventaire
@@ -3129,11 +3048,9 @@ dans le menu &apos;Edition&apos;.
 			Annuler
 		</option>
 	</alert>
-	<alert name="MessageEstate"
-	     title="Envoyez un message à tout le monde dans votre domaine">
+	<alert name="MessageEstate" title="Envoyer un message à tout le monde dans votre domaine">
 		<message name="message">
-			Composez une brève annonce qui sera
-envoyée à toutes les personnes présentes sur votre domaine.
+			Saisissez un message court qui sera envoyé à tous les résidents se trouvant actuellement sur votre domaine.
 		</message>
 		<option name="OK">
 			OK
@@ -3142,150 +3059,143 @@ envoyée à toutes les personnes présentes sur votre domaine.
 			Annuler
 		</option>
 	</alert>
-	<alert name="ChangeLindenEstate" title="Modifier domaine Linden">
+	<alert name="ChangeLindenEstate" title="Modifier un domaine Linden">
 		<message name="message">
-			Vous vous apprêtez à modifier un domaine appartenant aux Linden
-(continent, grille ado, orientation, etc.). 
- 
-Ceci est EXTREMEMENT DANGEREUX car cela peut fondamentalement 
-affecter l&apos;expérience des utilisateurs. Sur le continent, cela modifiera 
-des milliers de régions et provoquera l&apos;instabilité du serveur principal.
+			Vous vous apprêtez à modifier un domaine appartenant aux Lindens (continent, zone réservée aux ados, orientation etc.). 
+
+Cela est extrêmement délicat car l&apos;expérience des résidents est en jeu. Sur le continent, cela modifiera 
+des milliers de régions et sera difficile à digérer pour le serveur.
  
-Continuer ?
+Continuer ?
 		</message>
 		<option name="ChangeEstate">
-			Changer de domaine
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
 		</option>
 	</alert>
-	<alert name="ChangeLindenAccess" title="Modifier l&apos;accès au domaine Linden">
+	<alert name="ChangeLindenAccess" title="Modifier l&apos;accès à un domaine Linden">
 		<message name="message">
-			Vous vous apprêtez à modifier la liste d&apos;accès d&apos;un domaine appartenant aux Linden
-(continent, grille ado, orientation, etc.). 
- 
-Ceci est DANGEREUX et ne doit être utilisé que pour invoquer le hack
-permettant le transfert d&apos;objets ou d&apos;argent depuis ou vers la grille. 
- 
-Cela modifie des milliers de régions et provoque l&apos;instabilité du serveur principal.
- 
-Continuer ?
+			Vous vous apprêtez à modifier la liste d&apos;accès à un domaine appartenant aux Linden (continent, zone réservée aux ados, orientation etc.). 
+
+Cette action est délicate et ne doit être effectuée que pour appeler le hack autorisant des objets/L$ à être transférés à l&apos;intérieur/extérieur de la grille.  
+Cette action modifiera des milliers de régions et sera difficile à digérer pour le serveur.
 		</message>
 		<option name="ChangeEstate">
-			Changer de domaine
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
 		</option>
 	</alert>
-	<alert name="EstateAllowedAgentAdd" title="Sélectionner domaine">
+	<alert name="EstateAllowedAgentAdd" title="Choisir le domaine">
 		<message name="message">
-			Ajouter à la liste d&apos;accès de ce domaine seulement ou [ALL_ESTATES] ?
+			Ajouter à la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
 		</message>
 		<option name="ThisEstate">
-			Ce domaine
+			ce domaine
 		</option>
 		<option name="AllEstates">
-			Tous domaines
+			tous les domaines
 		</option>
 		<option name="Cancel">
 			Annuler
 		</option>
 	</alert>
-	<alert name="EstateAllowedAgentRemove" title="Sélectionner domaine">
+	<alert name="EstateAllowedAgentRemove" title="Choisir le domaine">
 		<message name="message">
-			Retirer de la liste d&apos;accès pour ce domaine seulement ou pour [ALL_ESTATES] ?
+			Supprimer de la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
 		</message>
 		<option name="ThisEstate">
-			Ce domaine
+			ce domaine
 		</option>
 		<option name="AllEstates">
-			Tous domaines
+			tous les domaines
 		</option>
 		<option name="Cancel">
 			Annuler
 		</option>
 	</alert>
-	<alert name="EstateAllowedGroupAdd" title="Sélectionner domaine">
+	<alert name="EstateAllowedGroupAdd" title="Choisir le domaine">
 		<message name="message">
-			Ajouter à la liste des groupes admis pour ce domaine seulement ou [ALL_ESTATES] ?
+			Ajouter à la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
 		</message>
 		<option name="ThisEstate">
-			Ce domaine
+			ce domaine
 		</option>
 		<option name="AllEstates">
-			Tous domaines
+			tous les domaines
 		</option>
 		<option name="Cancel">
 			Annuler
 		</option>
 	</alert>
-	<alert name="EstateAllowedGroupRemove" title="Sélectionner domaine">
+	<alert name="EstateAllowedGroupRemove" title="Choisir le domaine">
 		<message name="message">
-			Retirer de la liste des groupes admis pour ce domaine seulement ou pour [ALL_ESTATES] ?
+			Supprimer de la liste des groupes autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
 		</message>
 		<option name="ThisEstate">
-			Ce domaine
+			ce domaine
 		</option>
 		<option name="AllEstates">
-			Tous domaines
+			tous les domaines
 		</option>
 		<option name="Cancel">
 			Annuler
 		</option>
 	</alert>
-	<alert name="EstateBannedAgentAdd" title="Sélectionner domaine">
+	<alert name="EstateBannedAgentAdd" title="Choisir le domaine">
 		<message name="message">
-			Refuser l&apos;accès à ce domaine seulement ou à [ALL_ESTATES] ?
+			Refuser l&apos;accès à ce domaine uniquement ou à [ALL_ESTATES] ?
 		</message>
 		<option name="ThisEstate">
-			Ce domaine
+			ce domaine
 		</option>
 		<option name="AllEstates">
-			Tous domaines
+			tous les domaines
 		</option>
 		<option name="Cancel">
 			Annuler
 		</option>
 	</alert>
-	<alert name="EstateBannedAgentRemove" title="Sélectionner domaine">
+	<alert name="EstateBannedAgentRemove" title="Choisir le domaine">
 		<message name="message">
-			Cesser de refuser l&apos;accès à ce domaine ou à [ALL_ESTATES] ?
+			Supprimer ce résident de la liste des résidents bannis pour ce domaine uniquement ou pour [ALL_ESTATES] ?
 		</message>
 		<option name="ThisEstate">
-			Ce domaine
+			ce domaine
 		</option>
 		<option name="AllEstates">
-			Tous domaines
+			tous les domaines
 		</option>
 		<option name="Cancel">
 			Annuler
 		</option>
 	</alert>
-	<alert name="EstateManagerAdd" title="Sélectionner domaine">
+	<alert name="EstateManagerAdd" title="Choisir le domaine">
 		<message name="message">
-			Ajouter un administrateur de propriété pour cette propriété seulement ou pour l&apos;ensemble de vos propriétés ?
+			Ajouter un gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ?
 		</message>
 		<option name="ThisEstate">
-			Ce domaine
+			ce domaine
 		</option>
 		<option name="AllEstates">
-			Tous domaines
+			tous les domaines
 		</option>
 		<option name="Cancel">
 			Annuler
 		</option>
 	</alert>
-	<alert name="EstateManagerRemove" title="Sélectionner domaine">
+	<alert name="EstateManagerRemove" title="Choisir le domaine">
 		<message name="message">
-			Retirer l&apos;administrateur pour ce domaine seulement ou pour tous vos domaines?
+			Supprimer le gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ?
 		</message>
 		<option name="ThisEstate">
-			Ce domaine
+			ce domaine
 		</option>
 		<option name="AllEstates">
-			Tous domaines
+			cous les domaines
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -3293,24 +3203,24 @@ Continuer ?
 	</alert>
 	<alert name="EstateCovenantChange" title="Sélectionner domaine">
 		<message name="message">
-			Modifier le message de la clause de sauvegarde pour ce domaine seulement ou pour [ALL_ESTATES] ?
+			Modifier le message du règlement pour ce domaine uniquement ou pour [ALL_ESTATES] ?
 		</message>
 		<option name="ThisEstate">
-			Ce domaine
+			ce domaine
 		</option>
 		<option name="AllEstates">
-			Tous domaines
+			tous les domaines
 		</option>
 		<option name="Cancel">
 			Annuler
 		</option>
 	</alert>
-	<alert name="EstateKickUser" title="Confirmer Dégager">
+	<alert name="EstateKickUser" title="Confirmer">
 		<message name="message">
-			Dégager [EVIL_USER] de ce domaine ?
+			Éjecter [EVIL_USER] de ce domaine ?
 		</message>
 		<option name="Kick">
-			Dégager
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -3318,10 +3228,10 @@ Continuer ?
 	</alert>
 	<alert name="EstateChangeCovenant">
 		<message name="message">
-			Etes-vous sûr(e) de vouloir modifier la clause de sauvegarde du domaine ?
+			Êtes-vous certain de vouloir modifier le règlement du domaine ?
 		</message>
 		<option name="Change">
-			Changer
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -3329,7 +3239,7 @@ Continuer ?
 	</alert>
 	<alert name="ProblemImportingEstateCovenant">
 		<message name="message">
-			Erreur d&apos;importation de la clause de sauvegarde du domaine.
+			Problème lors de l&apos;importation du règlement du domaine.
 		</message>
 		<option name="OK">
 			OK
@@ -3347,7 +3257,7 @@ Continuer ?
 	</alert>
 	<alert name="UnableToLoadNotecard">
 		<message name="message">
-			Impossible de charger ressource de la note pour le moment.
+			Impossible de lire les données de la note actuellement.
 		</message>
 		<option name="OK">
 			OK
@@ -3355,7 +3265,7 @@ Continuer ?
 	</alert>
 	<alert name="NotAllowedToViewNotecard">
 		<message name="message">
-			Autorisations insuffisantes pour afficher la note associée à l&apos;ID de ressource demandée.
+			Permissions pour afficher la note insuffisantes.
 		</message>
 		<option name="OK">
 			OK
@@ -3363,7 +3273,7 @@ Continuer ?
 	</alert>
 	<alert name="MissingNotecardAssetID">
 		<message name="message">
-			ID de ressource de la note absent de la base de données.
+			Les références de la note ne se trouvent pas dans la base de données.
 		</message>
 		<option name="OK">
 			OK
@@ -3371,12 +3281,12 @@ Continuer ?
 	</alert>
 	<alert name="PublishClassified">
 		<message name="message">
-			Attention : les frais d&apos;insertion sont non remboursables.
- 
-Publier cette annonce maintenant pour L$[AMOUNT]?
+			Rappel : les frais pour passer des petites annonces ne sont pas remboursables.
+
+Publier cette petite annonce maintenant pour [AMOUNT] L$ ?
 		</message>
 		<option name="Publish">
-			Publier
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -3410,22 +3320,20 @@ Publier cette annonce maintenant pour L$[AMOUNT]?
 			Annuler
 		</option>
 	</alert>
-	<alert name="ConfirmRestart" title="Confirmer redémarrage">
+	<alert name="ConfirmRestart" title="Confirmer le redémarrage">
 		<message name="message">
-			Etes-vous sûr(e) de vouloir redémarrer cette région dans 2 minutes?
+			Souhaitez-vous vraiment redémarrer cette région dans 2 minutes ?
 		</message>
 		<option name="Restart">
-			Redémarrer
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
 		</option>
 	</alert>
-	<alert name="MessageRegion"
-	     title="Envoyez un message à tout le monde dans la région">
+	<alert name="MessageRegion" title="Envoyer un message à tout le monde dans cette région">
 		<message name="message">
-			Composez une brève annonce qui sera
-envoyée à toutes les personnes présentes dans cette région.
+			Saisissez une message court qui sera envoyé à tous les résidents se trouvant actuellement dans cette région.
 		</message>
 		<option name="OK">
 			OK
@@ -3434,64 +3342,62 @@ envoyée à toutes les personnes présentes dans cette région.
 			Annuler
 		</option>
 	</alert>
-	<alert name="HelpRegionBlockTerraform" title="Interdire le terraforming">
+	<alert name="HelpRegionBlockTerraform" title="Bloquer le terraformage">
 		<message name="message">
-			Si cette option est cochée, les propriétaires terriens ne pourront pas terraformer
-leur terrain, indépendamment des réglages &apos;Modifier Relief&apos; de chaque parcelle.
- 
-Défaut : désactivé
+			Si vous cochez cette case, les propriétaires ne pourront plus terraformer leur terrain, quels que soient leurs paramètres à la section Modifier le terrain.
+
+Défaut : désactivé
 		</message>
 	</alert>
-	<alert name="HelpRegionBlockFly" title="Interdire vol">
+	<alert name="HelpRegionBlockFly" title="Interdire le vol">
 		<message name="message">
-			Si cette option est cochée, les personnes ne pourront pas voler dans cette région,
-indépendamment des réglages de &apos;Vol&apos; de chaque parcelle.
+			Si vous cochez cette case, les résidents ne pourront plus voler dans cette région, quels que soient leurs paramètres.
  
-Défaut : désactivé
+Défaut : désactivé
 		</message>
 	</alert>
-	<alert name="HelpRegionAllowDamage" title="Autoriser dégâts">
+	<alert name="HelpRegionAllowDamage" title="Autoriser les dégâts">
 		<message name="message">
-			Cette option active le système de santé sur toutes les parcelles
-indépendamment des réglages individuels des parcelles. Si elle est
-décochée, les propriétaires de parcelles individuelles pourront 
-activer le système de santé sur leurs parcelles.
+			Si vous cohez cette case, l&apos;alerte santé est désactivée sur toutes les parcelles quels que soient les paramètres individuels de la parcelle. Si la case n&apos;est pas cochée, les propriétaires de parcelles peuvent quand même activer l&apos;alerte santé de manière individuelle sur leurs parcelles.
  
-Défaut : désactivé
+Défaut : désactivé
 		</message>
 	</alert>
-	<alert name="HelpRegionAgentLimit" title="Limite d&apos;avatars">
+	<alert name="HelpRegionAgentLimit" title="Nombre limite d&apos;avatars">
 		<message name="message">
 			Définit le nombre maximum d&apos;avatars autorisés dans cette région.
-Plus il y a d&apos;avatars dans une région, plus les performances peuvent se dégrader. 
+La performance peut varier en fonction du nombre d&apos;avatars présents.
  
-Défaut : 30
+Défaut : 40
 		</message>
 	</alert>
-	<alert name="HelpRegionMaturity" title="Classification">
+	<alert name="HelpRegionObjectBonus" title="Bonus objet">
 		<message name="message">
-			Définit la classification de la région (M=Adulte, PG=Tout Public), affichée dans le coin supérieur droit
-de l&apos;écran ou sous forme de bulles d&apos;aide sur la carte. Cette classification
-affecte également les résultats de recherche - les résidents peuvent choisir d&apos;exclure
-le contenu situé dans les régions Adultes. 
+			Le bonus objet est le multiplicateur de prims autorisés sur une parcelle donnée. L&apos;échelle autorisée est comprise entre 1 et 10. Lorsque ce chiffre est de 1, chaque parcelle de 512 m² peut contenir 117 objets. S&apos;il est de 2, chaque parcelle peut contenir 234 objets, ou deux fois plus, et ainsi de suite. Le nombre maximum d&apos;objets autorisés dans une région est de 15 000, quel que soit le bonus objet. Attention : si vous définissez un bonus objet et décidez ensuite de le diminuer, cela peut entraîner la suppression ou le renvoi d&apos;objets. 
  
-Les bulles d&apos;aide de la carte ne seront pas modifiées avant 5 minutes, le système mettant périodiquement à jour les informations de la carte. 
+Défaut : 1.0
+		</message>
+	</alert>
+	<alert name="HelpRegionMaturity" title="Maturité">
+		<message name="message">
+			Définit le niveau de maturité de la région. Ce niveau s&apos;affiche
+			en haut de l&apos;écran et dans les pop-ups d&apos;astuces sur la carte. Ce paramètre influe aussi sur les résultats de recherche. Les résidents peuvent choisir de ne pas rechercher de contenu dans les régions Adultes.
  
-Défaut : PG (Tout public)
+Ce changement n&apos;apparaîtra pas immédiatement sur la carte.
+ 
+Défaut : Tout public
 		</message>
 	</alert>
-	<alert name="HelpRegionRestrictPushObject" title="Interdire de pousser">
+	<alert name="HelpRegionRestrictPushObject" title="Interdire les bousculades">
 		<message name="message">
-			Limite les autorisations de pousser sur la région entière.
-Les avatars ne peuvent se pousser qu&apos;entre eux, ou être poussés par des scripts
-appartenant au propriétaire de la parcelle ou attribués au groupe sur la parcelle,
-si celle-ci est attribuée à un groupe.
-Pousser est lié à la fonction llPushObject() du langage LSL.
+			Cette case permet de restreindre les bousculades dans toute une région.
+Lorsqu&apos;elle est cochée, les résidents ne peuvent être bousculés que par eux-mêmes ou par le propriétaire de la région.
+(Bousculer fait référence à la fonction LSL llPushObjet().)
  
-Défaut : Désactiver
+Défaut : Désactivé
 		</message>
 	</alert>
-	<alert name="HelpParcelChanges" title="Fusionner/subdiviser parcelle">
+	<alert name="HelpParcelChanges" title="Fusionner/Diviser des parcelles">
 		<message name="message">
 			Cette case permet de choisir si les parcelles n&apos;appartenant pas au gérant du domaine peuvent être fusionnées ou divisées ou pas. 
 Si cette case n&apos;est pas cochée :
@@ -3512,39 +3418,38 @@ Défaut : Cochée
 Défaut : Désactivé
 		</message>
 	</alert>
-	<alert name="HelpParcelSearch" title="Do Not Show In Search">
+	<alert name="HelpParcelSearch" title="Ne pas afficher dans la recherche">
 		<message name="message">
-			Checking this box will show:
-- this parcel in search results
-- this parcel&apos;s public objects
+			Si vous cochez cette option, votre parcelle apparaîtra :
+- dans les résultats de recherche ;
+- dans les objets publics de cette parcelle.
 		</message>
 	</alert>
-	<alert name="RegionMaturityChange" title="Classification de la Région modifiée.">
+	<alert name="RegionMaturityChange" title="Maturité de la région modifiée">
 		<message name="message">
-			La classification de cette région a été modifiée.
- 
-Cependant, la carte du monde ne sera pas modifiée avant 5 minutes, le système mettant périodiquement à jour les informations de la carte.
+			Le niveau de maturité de cette région a été mis à jour. 
+Ce changement n&apos;apparaîtra pas immédiatement sur la carte.
 		</message>
 	</alert>
 	<alert name="HelpRegionLandResell" title="Revente de terrain">
 		<message name="message">
-			Les propriétaires et administrateurs de domaines peuvent vendre tout terrain appartenant au propriétaire du domaine. 
-Si cette option est décochée, les acheteurs ne peuvent revendre leur terrain dans cette région. 
+			Les propriétaires et gérants de domaine peuvent vendre n&apos;importe quel terrain appartenant à un propriétaire de domaine. 
+Si cette option n&apos;est pas cochée, les acheteurs ne peuvent pas revendre leur terrain dans cette région. 
 Si cette option est cochée, les acheteurs peuvent revendre leur terrain dans cette région. 
  
-Défaut : Ne pas autoriser
+Défaut : Ne pas autoriser
 		</message>
 	</alert>
-	<alert name="HelpEstateCovenantID" title="ID de ressource de la clause de sauvegarde">
+	<alert name="HelpEstateCovenantID" title="ID de ressource du règlement">
 		<message name="message">
-			Définit l&apos;ID d&apos;élément de la note pour la Clause de sauvegarde de ce Domaine. 
+			Définit l&apos;ID de la note pour le règlement de ce domaine. 
  
 Défaut : 00000000-0000-0000-0000-000000000000 ou aucun
 		</message>
 	</alert>
 	<alert name="HelpRegionDisableScripts" title="Désactiver les scripts">
 		<message name="message">
-			Lorsque la performance d&apos;une sim est faible, cela vient peut-être d&apos;un script. Ouvrez la barre de statistiques (Ctrl-Maj-1). Consultez le Simulateur de propriétés physiques FPS.
+			Lorsque la performance d&apos;une sim est faible, cela vient peut-être d&apos;un script. Ouvrez la section Statistiques (Ctrl-Maj-1). Consultez le Simulateur de propriétés physiques FPS.
 S&apos;il est en dessous de 45, ouvrez le panel Heure situé en bas de la barre de statistiques. Si le script Heure indique 25mn ou moins, cliquez sur le bouton Afficher les scripts fréquemment utilisés. Vous verrez le nom et l&apos;emplacement des scripts qui sont peut-être à l&apos;origine du problème.
  
 Si vous cochez la case Désactiver les scripts et que vous appuyez sur Appliquer, tous les scripts de cette région seront temporairement désactivés. Vous devrez peut-être faire cela pour aller dans un endroit où se trouve un 
@@ -3554,7 +3459,7 @@ Décochez la case Désactiver le script, puis cliquez sur Appliquer pour réacti
 Défaut : désactivé
 		</message>
 	</alert>
-	<alert name="HelpRegionDisableCollisions" title="Désactiver collisions">
+	<alert name="HelpRegionDisableCollisions" title="Désactiver les collisions">
 		<message name="message">
 			Lorsque la performance d&apos;une sim est faible, cela vient peut-être des objets physiques. 
 Ouvrez la barre de statistiques (Ctrl-Maj-1). Consultez le Simulateur de propriétés physiques FPS. S&apos;il est en dessous de 45, ouvrez le panel Heure situé en bas de la barre de statistiques. Si le script Heure indique 25mn ou moins, cliquez sur le bouton Afficher les objets souvent responsables de collision. 
@@ -3567,74 +3472,59 @@ Décochez la case Désactiver les collision, puis cliquez sur Appliquer pour ré
 Défaut : désactivé
 		</message>
 	</alert>
-	<alert name="HelpRegionDisablePhysics" title="Désactiver Physiques">
+	<alert name="HelpRegionDisablePhysics" title="Désactiver les propriétés physiques">
 		<message name="message">
-			Désactiver Physiques est équivalent à Désactiver Collisions, à la différence 
-que toute simulation physique est désactivée.  Non seulement les objets
-cessent toute collision, mais les avatars sont également immobilisés. 
+			L&apos;option Désactiver les propriétés physiques est similaire à l&apos;option Désactiver les collisions sauf qu&apos;elle englobe toutes les simulations physiques.  Cela signifie que les objets n&apos;entreront plus en collision et que les avatars ne pourront plus bouger. 
  
-A n&apos;utiliser que lorsque Désactiver Collisions ne restitue pas
-assez de performances à la région pour analyser 
-un problème physique ou de &apos;Top Collider&apos;.
+Vous ne devriez utiliser cette option que lorsque l&apos;option Désactiver les collisions ne rend pas sufisamment de performance à la région pour résoudre un problème de physique ou trouver les objets souvent responsables de collisions.
  
-Assurez-vous de bien réactiver Physiques lorsque vous avez fini,
-sans quoi les avatars continueront à être immobilisés. 
+Une fois que vous avez fini, n&apos;oubliez pas de réactiver les propriétés physiques sinon vos avatars ne pourront pas bouger.  
  
-Défaut : décoché
+Défaut : désactivé
 		</message>
 	</alert>
-	<alert name="HelpRegionTopColliders" title="Top Colliders">
+	<alert name="HelpRegionTopColliders" title="Objets souvent responsables de collision">
 		<message name="message">
-			Affiche une liste d&apos;objets les plus exposés aux collisions potentielles entre objets. Ces objets peuvent
-ralentir la performance du sim.  Sélectionnez Afficher &gt; Barre de statistiques et
-vérifiez dans Simulateur &gt; Temps &gt; Temps du Sim (Physiques) si 
-plus de 20 ms sont consacrés à Physiques.
+			Montre une liste des objets qui ont le plus de chances d&apos;entrer en collision avec d&apos;autres objets. Ces objets peuvent ralentir votre performance. Sélectionnez Affichage &gt; Statistiques et regardez sous Simulator &gt; Time &gt; Sim Time (Physics) pour voir si les propriétés physiques prennent plus de 20 ms.
 		</message>
 	</alert>
-	<alert name="HelpRegionTopScripts" title="Top Scripts">
+	<alert name="HelpRegionTopScripts" title="Scripts souvent utilisés">
 		<message name="message">
-			Affiche une liste d&apos;objets les plus occupés à exécuter des scripts LSL. Ces objets peuvent
-ralentir la performance du sim.  Sélectionnez Afficher &gt; Barre de statistiques et
-vérifiez dans Simulateur &gt; Temps &gt; Temps de script si 
-plus de 25 ms sont consacrés aux scripts.
+			Dresse une liste des objets qui passent le plus de temps à exécuter des scripts LSL. Ces objets peuvent ralentir votre performance. 
+Sélectionnez Affichage &gt; Statistiques et regardez sous Simulator &gt; Time &gt; Script Time pour voir si les scripts prennent plus de 25 ms.
 		</message>
 	</alert>
-	<alert name="HelpRegionRestart" title="Redémarrer région">
+	<alert name="HelpRegionRestart" title="Redémarrer la région">
 		<message name="message">
-			Relancez le processus du serveur qui gère cette région
-après un avertissement de 2 minutes. Tous les résidents présents dans la région seront déconnectés.  Les données de la région seront sauvegardées, et celle-ci 
-sera à nouveau accessible d&apos;ici 90 secondes. 
+			Redémarre le serveur en charge de la région après un avertissement de deux minutes. Tous les résidents dans cette région seront déconnectés. Les données de la région seront sauvegardées et réapparaîtront au bout de 90 secondes. 
  
-Le redémarrage d&apos;une région ne règle pas la plupart des 
-problèmes de performance, et doit être utilisé seulement lorsque nécessaire.
+Le redémarrage la région ne permet pas de résoudre la plupart des problèmes de performance. Les redémarrages ne doivent avoir lieu que si cela est vraiment nécessaire.
 		</message>
 	</alert>
 	<alert name="HelpRegionWaterHeight" title="Niveau de l&apos;eau">
 		<message name="message">
-			Ceci est la hauteur en mètres du niveau d&apos;apparition de l&apos;eau. Si
-cette valeur est différente de 20 et que vous avez de l&apos;eau adjacente au bord du monde ou dans
-le &apos;vide&apos;, un espace sera visible. 
+			Il s&apos;agit de la hauteur de l&apos;eau en mètres. 
+Si ce paramètre est différent de 20 et que vous avez de l&apos;eau adjacente au bord du monde ou de l&apos;eau « vide », il y aura un espace vide visible.
+ 
  
-Défaut : 20
+Défaut : 20
 		</message>
 	</alert>
-	<alert name="HelpRegionTerrainRaise" title="Rehausser relief">
+	<alert name="HelpRegionTerrainRaise" title="Surélévation du terrain">
 		<message name="message">
-			Les propriétaires de parcelles peuvent élever le relief de cette distance
-par rapport à la hauteur par défaut du relief figé.
+			Il s&apos;agit de la distance (en mètres) à laquelle les propriétaires de parcelle peuvent surélever leur terrain, par rapport au terrain « figé » dont la hauteur est fixée par défaut.  
  
-Défaut : 4
+Défaut : 4
 		</message>
 	</alert>
-	<alert name="HelpRegionTerrainLower" title="Abaisser relief">
+	<alert name="HelpRegionTerrainLower" title="Abaisser le terrain">
 		<message name="message">
-			Les propriétaires de parcelles peuvent abaisser le relief de cette distance
-par rapport à la hauteur par défaut du relief figé.
+			Il s&apos;agit de la distance (en mètres) à laquelle les propriétaires de parcelle peuvent abaisser leur terrain, par rapport au terrain « figé » dont la hauteur est fixée par défaut.  
  
-Défaut : -4
+Défaut : -4
 		</message>
 	</alert>
-	<alert name="HelpRegionUploadRaw" title="Uploader relief au format RAW...">
+	<alert name="HelpRegionUploadRaw" title="Charger le terrain au format RAW">
 		<message name="message">
 			Ce bouton permet de charger un fichier .RAW dans la région où vous vous trouvez. 
 Ce fichier doit avoir les bonnes dimensions (RGB, 256 x 256) et 13 canaux. Le meilleur moyen de créer un fichier terrain est de télécharger le fichier RAW existant. Un bon moyen est de modifier le canal rouge (hauteur terrain) et de le charger. 
@@ -3644,113 +3534,77 @@ Le chargement peut prendre jusqu&apos;à 45 secondes. Veuillez noter que le char
 Pour en savoir plus sur la modification de la hauteur des terrains d&apos;une région, consultez l&apos;Aide F1.
 		</message>
 	</alert>
-	<alert name="HelpRegionDownloadRaw" title="Télécharger un relief au format RAW">
+	<alert name="HelpRegionDownloadRaw" title="Télécharger le terrain au format RAW">
 		<message name="message">
-			Ce bouton télécharge un fichier contenant les données de hauteur, 
-les dimensions de la parcelle, le statut de parcelles mises en vente et quelques 
-autorisations pour cette région. Si vous ouvrez ce fichier à l&apos;aide d&apos;un programme comme 
-Photoshop, vous devrez préciser les dimensions du document : 
-RVB, 256x256 avec 13 canaux. Ce fichier de relief ne peut
-être ouvert autrement. 
+			Ce bouton permet de télécharger un fichier contenant les données relatives à la hauteur du terrain, dimensions de la parcelle, les mises en vente ainsi que certaines permissions relatives à la parcelle pour cette région. Lorsque vous ouvrez le fichier avec un programme tel que Photoshop, vous devez indiquer les dimensions du document qui sont les suivantes : RGB, 256 x 256 avec 13 canaux. Le fichier terrain ne peut pas être ouvert différemment. 
  
-Pour plus d&apos;informations sur les champs de hauteur, allez sur : 
-http://secondlife.com/tiki/tiki-index.php?page=RawTerrainFile
+Pour en savoir plus sur la modification de la hauteur des terrains d&apos;une région, consultez l&apos;Aide F1.
 		</message>
 	</alert>
-	<alert name="HelpRegionUseEstateSun" title="Utiliser soleil du domaine">
+	<alert name="HelpRegionUseEstateSun" title="Utiliser le soleil du domaine">
 		<message name="message">
-			Cette option définit la position du soleil de votre région 
-sur celle du soleil dans le reste du domaine. 
+			Si vous cochez cette case, la position du soleil dans cette région sera la même que dans le reste du domaine. 
  
-Défaut : activé
+Défaut : activé
 		</message>
 	</alert>
 	<alert name="HelpRegionFixedSun" title="Soleil fixe">
 		<message name="message">
-			Cette option définit la position du soleil
-sur celle du curseur de Phase et fige le soleil. 
+			Si vous cochez cette case, la position du soleil se fixe sur celle du curseur Phase et le soleil arrête de bouger. 
  
-Défaut : désactivé
+Défaut : désactivé
 		</message>
 	</alert>
-	<alert name="HelpRegionBakeTerrain" title="Figer Relief">
+	<alert name="HelpRegionBakeTerrain" title="Figer le terrain">
 		<message name="message">
-			Ce bouton sauvegarde la forme actuelle du relief comme nouvelle valeur 
-par défaut pour la région. Une fois figé, le terrain peut être ramené
-à sa forme par défaut en utilisant l&apos;outil &quot;Annuler Modifications&quot; dans
-le menu Modifier Relief. Le relief figé est également le point central
-qui fixe les limites d&apos;abaissement/réhaussement du relief.
+			Ce bouton permet d&apos;enregistrer la forme actuelle du terrain comme nouvelle forme par défaut pour la région. Une fois figé, le terrain peut reprendre la forme enregistrée à partir de l&apos;option Rétablir le terrain à la section Modifer le terrain. Le terrain figé est aussi le point de référence pour les limites de surélévation et d&apos;abaissement.
 		</message>
 	</alert>
-	<alert name="HelpEstateEstateManager" title="Administrateurs du domaine">
+	<alert name="HelpEstateEstateManager" title="Gérants du domaine">
 		<message name="message">
-			Un administrateur de domaine est un résident à qui vous déléguez
-le contrôle de la région et le paramétrage du domaine.  Un administrateur de domaine
-peut modifier tous les paramètres à l&apos;aide de ces contrôles, sauf uploader, 
-télécharger, et fondre le relief.  Ils peuvent notamment
-autoriser ou bannir des résidents de votre domaine.  
+			Un gérant de domaine est un résident chargé du contrôle de la région et des paramètres du domaine. Un gérant de domaine peut modifier tous les paramètres, mais ne peut pas charger, télécharger ni figer de terrain. Un des pouvoirs principaux du gérant est de bannir ou d&apos;autoriser un résident sur votre domaine. 
  
-Les administrateurs de domaines ne peuvent être ajoutés ou retirés
-que par le propriétaire du domaine. Ne choisissez comme administrateurs que des
-résidents en qui vous avez totale confiance, car vous serez
-responsables de leurs actes.
+Seuls les propriétaires de domaine peuvent ajouter ou supprimer des gérants de domaine. Lorsque vous choisissez un gérant de domaine, prenez un résident en qui vous avez confiance car vous serez en quelque sorte responsable de ses actions.
 		</message>
 	</alert>
-	<alert name="HelpEstateUseGlobalTime" title="Utiliser l&apos;heure globale">
+	<alert name="HelpEstateUseGlobalTime" title="Utiliser le temps universel">
 		<message name="message">
-			Cette option cale la position du soleil de votre domaine 
-sur celle du soleil des domaines appartenant aux Linden&apos; 
-sur le &apos;continent&apos;. 
+			Cette case permet au soleil de votre domaine de suivre la position du soleil sur les domaines Linden du continent. 
  
-Défaut : activé
+Défaut : activé
 		</message>
 	</alert>
 	<alert name="HelpEstateFixedSun" title="Soleil fixe">
 		<message name="message">
-			Cette option définit la position du soleil
-sur celle du curseur de Phase et fige le soleil.
+			Si vous cochez cette case, la position du soleil se fixe sur celle du curseur Phase et le soleil arrête de bouger.
 		</message>
 	</alert>
-	<alert name="HelpEstateExternallyVisible" title="Visible depuis le continent">
+	<alert name="HelpEstateExternallyVisible" title="Accès public">
 		<message name="message">
-			Définit si les résidents qui se trouvent sur des domaines du Continent (appartenant aux Linden) 
-peuvent voir votre domaine sur la carte du monde. 
+			Cette option vous permet de choisir quels résidents d&apos;autres domaines peuvent pénétrer sur votre domaine sans devoir être ajoutés à la liste d&apos;accès.
  
-Défaut : activé
+Défaut : activé
 		</message>
 	</alert>
-	<alert name="HelpEstateAllowDirectTeleport" title="Autoriser téléportation directe">
+	<alert name="HelpEstateAllowDirectTeleport" title="Autoriser la téléportation directe">
 		<message name="message">
-			Activé, permet aux résidents de se téléporter directement vers n&apos;importe quel
-point de votre domaine.  Désactivé, les résidents se téléportent
-vers le téléport le plus proche. 
+			Lorsqu&apos;elle est cochée, cette option permet aux résidents d&apos;être téléporté à n&apos;importe quel endroit sur votre domaine.  Lorsque cette option n&apos;est pas cochée, les résidents sont téléportés au téléhub le plus proche. 
  
-Défaut : désactivé
+Défaut : désactivé
 		</message>
 	</alert>
 	<alert name="HelpEstateAllowResident" title="Autoriser l&apos;accès">
 		<message name="message">
-			Si un résident figure dans cette liste, l&apos;accès au domaine sera
-limité aux résidents de la liste et aux groupes affichés ci-dessous.
- 
-(Si le domaine est visible depuis le continent, l&apos;accès ne peut être 
-limité à une liste de résidents ou de groupes. Cette option sera 
-désactivée.  Seule la liste noire sera prise en compte.)
+			L&apos;accès à ce domaine sera réservé aux résidents figurant dans cette liste et aux groupes ci-dessous.
+ Cette option n&apos;est disponible que lorsque la case Accès public est décochée.
 		</message>
 	</alert>
-	<alert name="HelpEstateAllowGroup" title="Autoriser l&apos;accès au groupe">
+	<alert name="HelpEstateAllowGroup" title="Autoriser l&apos;accès de groupe">
 		<message name="message">
-			Si un groupe figure dans cette liste, l&apos;accès au domaine sera
-limité aux groupes de la liste et aux résidents nommément 
-autorisés ci-dessus. 
- 
-(Si le domaine est visible depuis le continent, l&apos;accès ne peut être 
-limité à une liste de résidents ou de groupes. Cette option sera 
-désactivée.  Seule la liste noire sera prise en compte.)
+			L&apos;accès à ce domaine sera réservé aux groupes figurant dans cette liste et aux résidents ci-dessous.  Cette option n&apos;est disponible que lorsque la case Accès public est décochée.
 		</message>
 	</alert>
-	<alert name="HelpEstateAbuseEmailAddress"
-	     title="Adresse e-mail où signaler une infraction">
+	<alert name="HelpEstateAbuseEmailAddress" title="Adresse e-mail où signaler une infraction">
 		<message name="message">
 			Si vous utilisez une adresse e-mail valide, les rapports d&apos;infraction de ce domaine iront à cette adresse. 
 Si vous laissez ce champ vide, les rapports d&apos;infraction seront envoyés à Linden Lab uniquement.
@@ -3758,11 +3612,7 @@ Si vous laissez ce champ vide, les rapports d&apos;infraction seront envoyés à
 	</alert>
 	<alert name="HelpEstateBanResident" title="Refuser l&apos;accès">
 		<message name="message">
-			Les résidents figurant sur cette liste n&apos;ont pas accès à votre domaine, 
-quels que soient les réglages d&apos;autorisations ou de groupe ci-dessus. 
- 
-Ajouter un résident à cette liste le retirera de
-la liste des personnes autorisées.
+			Les résidents figurant sur cette liste ne peuvent pas pénétrer sur votre domaine, quels que soient les autres paramètres.
 		</message>
 	</alert>
 	<alert name="HelpEstateVoiceChat" title="Autoriser les chats vocaux">
@@ -3777,7 +3627,7 @@ Défaut : désactivé
 			Cette version de Second Life n&apos;est pas compatible avec la fonctionnalité de chat vocal dans cette région. Vous devez mettre à jour Second Life pour que le chat vocal fonctionne correctement.
 		</message>
 	</alert>
-	<alert name="HelpEstateCovenant" title="Clause de sauvegarde du domaine">
+	<alert name="HelpEstateCovenant" title="Règlement du domaine">
 		<message name="message">
 			Définir un règlement pour le domaine vous permet de vendre les parcelles de ce domaine. S&apos;il n&apos;y a pas de règlement, vous ne pouvez pas vendre le terrain. Si vous ne souhaitez pas indiquer de règlement ou donner de conseils aux acheteurs, laissez la section relative au règlement vide. 
  
@@ -3792,22 +3642,22 @@ L&apos;acheteur est tenu  d&apos;accepter le règlement en cochant une case avan
 Veuillez sélectionner un seul objet et recommencez.
 		</message>
 	</alert>
-	<alert name="BuyObjectOneOwner" title="Achat des objets impossible">
+	<alert name="BuyObjectOneOwner" title="Impossible d&apos;acheter des objets">
 		<message name="message">
-			Vous ne pouvez acheter des objets à plusieurs personnes en même temps.
-Veuillez sélectionner un seul objet et réessayez.
+			Impossible d&apos;acheter simultanément des objets de propriétaires différents. 
+Veuillez ne sélectionner qu&apos;un seul objet.
 		</message>
 	</alert>
-	<alert name="BuyContentsOneOnly" title="Achat du contenu impossible">
+	<alert name="BuyContentsOneOnly" title="Impossible d&apos;acheter des contenus">
 		<message name="message">
-			Impossible d&apos;acheter le contenu de plus d&apos;un objet à la fois. 
-Veuillez sélectionner un seul objet et recommencez.
+			Impossible d&apos;acheter les contenus de plus d&apos;un objet à la fois. 
+Veuillez ne sélectionner qu&apos;un seul objet.
 		</message>
 	</alert>
-	<alert name="BuyContentsOneOwner" title="Achat du contenu impossible">
+	<alert name="BuyContentsOneOwner" title="Impossible d&apos;acheter des contenus">
 		<message name="message">
-			Vous ne pouvez acheter des objets à plusieurs personnes en même temps.
-Veuillez sélectionner un seul objet et réessayez.
+			Impossible d&apos;acheter simultanément des objets de propriétaires différents. 
+Veuillez ne sélectionner qu&apos;un seul objet.
 		</message>
 	</alert>
 	<alert name="PermYes">
@@ -3822,15 +3672,15 @@ Veuillez sélectionner un seul objet et réessayez.
 	</alert>
 	<alert name="BuyOriginal">
 		<message name="message">
-			Acheter objet original à [OWNER] pour L$[PRICE] ?
-Vous deviendrez propriétaire de l&apos;objet.
-Vous pourrez :
- Le modifier : [MODIFYPERM]
- Le copier : [COPYPERM]
- Le revendre ou le donner : [RESELLPERM]
+			Acheter l&apos;objet original pour [PRICE] L$ à [PRICE] ?
+Vous deviendrez le propriétaire de cet objet.
+Vous pourrez :
+ Modifier : [MODIFYPERM]
+ Copier : [COPYPERM]
+ Revendre ou donner : [RESELLPERM]
 		</message>
 		<option name="Buy">
-			Acheter
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -3838,15 +3688,15 @@ Vous pourrez :
 	</alert>
 	<alert name="BuyOriginalNoOwner">
 		<message name="message">
-			Acheter objet original pour L$[PRICE] ?
-Vous deviendrez propriétaire de l&apos;objet.
-Vous pourrez :
- Le modifier : [MODIFYPERM]
- Le copier : [COPYPERM]
- Le revendre ou le donner : [RESELLPERM]
+			Acheter l&apos;objet original pour [PRICE] L$ ?
+Vous deviendrez le propriétaire de cet objet.
+Vous pourrez :
+ Modifier : [MODIFYPERM]
+ Copier : [COPYPERM]
+ Revendre ou donner : [RESELLPERM]
 		</message>
 		<option name="Buy">
-			Acheter
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -3854,15 +3704,15 @@ Vous pourrez :
 	</alert>
 	<alert name="BuyCopy">
 		<message name="message">
-			Acheter une copie à [OWNER] pour L$[PRICE] ?
-L&apos;objet sera copié vers votre inventaire.
-Vous pourrez :
- Le modifier : [MODIFYPERM]
- Le copier : [COPYPERM]
- Le revendre ou le donner : [RESELLPERM]
+			Acheter une copie pour [PRICE] L$ à [OWNER] ?
+L&apos;objet sera copié dans votre inventaire.
+Vous pourrez :
+ Modifier : [MODIFYPERM]
+ Copier : [COPYPERM]
+ Revendre ou donner : [RESELLPERM]
 		</message>
 		<option name="Buy">
-			Acheter
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -3870,15 +3720,15 @@ Vous pourrez :
 	</alert>
 	<alert name="BuyCopyNoOwner">
 		<message name="message">
-			Acheter une copie pour L$[PRICE] ?
-L&apos;objet sera copié vers votre inventaire.
-Vous pourrez :
- Le modifier : [MODIFYPERM]
- Le copier : [COPYPERM]
- Le revendre ou le donner : [RESELLPERM]
+			Acheter une copie pour [PRICE] L$ ?
+L&apos;objet sera copié dans votre inventaire.
+Vous pourrez :
+ Modifier : [MODIFYPERM]
+ Copier : [COPYPERM]
+ Revendre ou donner : [RESELLPERM]
 		</message>
 		<option name="Buy">
-			Acheter
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -3886,11 +3736,11 @@ Vous pourrez :
 	</alert>
 	<alert name="BuyContents">
 		<message name="message">
-			Acheter le contenu à [OWNER] pour L$[PRICE] ?
-Il sera copié vers votre inventaire.
+			Acheter des contenus pour [PRICE] L$ à [OWNER] ?
+Ils seront copiés dans votre inventaire.
 		</message>
 		<option name="Buy">
-			Acheter
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -3898,11 +3748,11 @@ Il sera copié vers votre inventaire.
 	</alert>
 	<alert name="BuyContentsNoOwner">
 		<message name="message">
-			Acheter le contenu pour L$[PRICE] ?
-Il sera copié vers votre inventaire.
+			Acheter des contenus pour [PRICE] L$ ?
+Ils seront copiés dans votre inventaire.
 		</message>
 		<option name="Buy">
-			Acheter
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -3910,14 +3760,13 @@ Il sera copié vers votre inventaire.
 	</alert>
 	<alert name="ConfirmPurchase">
 		<message name="message">
-			Cette transaction entraînera :
- 
+			Suite à cette transaction, vous allez :
 [ACTION]
  
-Etes-vous sûr(e) de vouloir poursuivre cet achat ?
+Êtes-vous certain de vouloir effectuer cette transaction ?
 		</message>
 		<option name="Confirm">
-			Confirmer
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -3925,15 +3774,14 @@ Etes-vous sûr(e) de vouloir poursuivre cet achat ?
 	</alert>
 	<alert name="ConfirmPurchasePassword">
 		<message name="message">
-			Cette transaction entraînera :
- 
+			Suite à cette transaction, vous allez :
 [ACTION]
  
-Etes-vous sûr(e) de vouloir poursuivre cet achat ?
-Veuillez saisir à nouveau votre mot de passe et cliquez sur &apos;Confirmer&apos;.
+Êtes-vous certain de vouloir effectuer cette transaction ?
+Veuillez saisir à nouveau votre mot de passe et cliquer sur OK.
 		</message>
 		<option name="ConfirmPurchase">
-			Confirmer votre achat
+			OK
 		</option>
 		<option name="Cancel">
 			Annuler
@@ -3941,10 +3789,8 @@ Veuillez saisir à nouveau votre mot de passe et cliquez sur &apos;Confirmer&apo
 	</alert>
 	<alert name="SetPickLocation">
 		<message name="message">
-			Note :
-Vous avez mis à jour la position
-de ce lieu mais les autres détails
-conserveront leurs valeurs initiales.
+			Remarque :
+Vous avez mis à jour l&apos;emplacement de ce favori mais les autres détails resteront inchangés.
 		</message>
 		<option name="OK">
 			OK
@@ -3952,47 +3798,42 @@ conserveront leurs valeurs initiales.
 	</alert>
 	<alert name="MoveInventoryFromObject">
 		<message name="message">
-			Vous avez sélectionné des éléments d&apos;inventaire non copiables.
-Ces éléments seront déplacés vers votre inventaire, et non copiés.
+			Vous avez sélectionné des objets de l&apos;inventaire qui ne peuvent pas être copiés.
+Ces objets seront déplacés vers votre inventaire, et non pas copiés.
  
-Déplacer l(es) élément(s)?
+Déplacer les objets de l&apos;inventaire ?
 		</message>
 		<ignore name="ignore">
 			Lors du transfert d&apos;un inventaire non reproductible depuis des objets
 		</ignore>
 		<option name="Move">
-			Se déplacer
+			OK
 		</option>
 		<option name="Don&apos;tMove">
-			Ne pas bouger
+			Annuler
 		</option>
 	</alert>
 	<alert name="MoveInventoryFromScriptedObject">
 		<message name="message">
-			Vous avez sélectionné des éléments d&apos;inventaire non copiables.  Ces éléments
-seront déplacés vers votre inventaire, et non copiés.
+			Vous avez sélectionné des objets de l&apos;inventaire qui ne peuvent pas être copiés. Ces objets seront déplacés vers votre inventaire, et non pas copiés.
+Étant donné que l&apos;objet est
+scripté, déplacer ces objets vers votre inventaire risque de causer des problèmes au niveau du script. 
  
-Cet objet étant scripté, le déplacement de ces éléments vers
-votre inventaire risque de perturber le fonctionnement du script. 
- 
-Déplacer l(es) élément(s) d&apos;inventaire ?
+Déplacer les objets de l&apos;inventaire ?
 		</message>
 		<ignore name="ignore">
 			Lors du transfert d&apos;un inventaire non reproductible depuis des objets scriptés
 		</ignore>
 		<option name="Move">
-			Se déplacer
+			OK
 		</option>
 		<option name="Don&apos;tMove">
-			Ne pas bouger
+			Annuler
 		</option>
 	</alert>
 	<alert name="ClickActionNotPayable">
 		<message name="message">
-			Avertissement : l&apos;action &quot;Payer Objet&quot; a été définie, mais elle
-ne fonctionnera que si un script de transaction money() y est ajouté, 
-car les résidents s&apos;attendent à ce que les objets 
-réagissent lorsqu&apos;un paiement est effectué.
+			Avertissement : l&apos;action du clic Payer l&apos;objet a été défini mais ne fonctionnera que si un script est ajouté avec l&apos;event money().
 		</message>
 		<ignore name="ignore">
 			Lors du paramétrage de la fonction Payer sur des objets sans événement monétaire
@@ -4000,7 +3841,7 @@ réagissent lorsqu&apos;un paiement est effectué.
 	</alert>
 	<alert name="OpenObjectCannotCopy">
 		<message name="message">
-			Cet objet ne contient aucun élément copiable.
+			Vous n&apos;êtes autorisé à copier aucun élément dans cet objet.
 		</message>
 	</alert>
 	<alert name="ClickOpenF1Help">
@@ -4033,7 +3874,7 @@ réagissent lorsqu&apos;un paiement est effectué.
 	</alert>
 	<alert name="ConfirmQuit">
 		<message name="message">
-			Etes-vous sûr(e) de vouloir quitter?
+			Êtes-vous certain de vouloir continuer ?
 		</message>
 		<ignore name="ignore">
 			Lorsque vous quittez Second Life
@@ -4059,7 +3900,7 @@ http://secondlife.com/community/blotter.php
 	</alert>
 	<alert name="HelpReportAbuseEmailEO">
 		<message name="message">
-			Important : Ce rapport ira au propriétaire de la 
+			Important : ce rapport ira au propriétaire de la 
 région dans laquelle vous êtes et non à Linden Lab.
 
 Pour aider les résidents et les visiteurs, le propriétaire de 
@@ -4078,64 +3919,68 @@ ne sera pas affecté par les résultats de cette enquête. Seul Linden Lab peut
 interdire l&apos;accès à l&apos;ensemble de Second Life.
 		</message>
 	</alert>
+	<alert name="HelpReportBug">
+		<message name="message">
+			N&apos;utilisez cet outil que pour signaler des problèmes techniques et soyez aussi précis que possible.
+Vous pouvez répondre à l&apos;e-mail automatique pour ajouter des détails à votre rapport.
+
+Tous les bugs signalés sont reproduits et évalués. Aucune réponse ne sera envoyée par e-mail.
+
+Si vous avez un problème technique, veuillez contacter le service clientèle à : 
+
+http://secondlife.com/community/support.php
+
+Remarque : les rapports incomplets ne feront pas l&apos;objet d&apos;une enquête.
+		</message>
+	</alert>
 	<alert name="HelpReportAbuseSelectCategory">
 		<message name="message">
-			Veuillez choisir une catégorie pour ce rapport d&apos;abus.
- 
-Le choix d&apos;une catégorie nous permet de classer et traiter efficacement les rapports d&apos;abus.
+			Veuillez choisir une catégorie pour ce rapport d&apos;infraction.
+Le choix d&apos;une catégorie nous permet de traiter les rapports d&apos;infraction plus rapidement.
 		</message>
 	</alert>
 	<alert name="HelpReportBugSelectCategory">
 		<message name="message">
 			Veuillez choisir une catégorie pour ce bug.
- 
-Le choix d&apos;une catégorie nous permet de classer et traiter efficacement les rapports de bugs.
+Le choix d&apos;une catégorie nous permet de traiter les bugs plus rapidement.
 		</message>
 	</alert>
 	<alert name="HelpReportAbuseAbuserNameEmpty">
 		<message name="message">
-			Veuillez saisir le nom de la personne responsable de l&apos;abus.
- 
-La précision des données nous permet de classer et traiter efficacement les rapports d&apos;abus.
+			Veuillez saisir le nom du contrevenant.
+Lorsque nous avons le nom du contrevenant, nous sommes en mesure de traiter les rapports plus rapidement.
 		</message>
 	</alert>
 	<alert name="HelpReportAbuseAbuserLocationEmpty">
 		<message name="message">
-			Veuillez saisir le lieu où s&apos;est produit l&apos;abus constaté.
- 
-La précision des données nous permet de classer et traiter efficacement les rapports d&apos;abus.
+			Veuillez indiquer l&apos;endroit où l&apos;infraction a eu lieu.
+Les informations précises et exactes nous permettent de traiter les rapports plus rapidement.
 		</message>
 	</alert>
 	<alert name="HelpReportAbuseSummaryEmpty">
 		<message name="message">
-			Veuillez saisir un résumé de l&apos;abus constaté.
- 
-Un résumé précis nous permet de classer et traiter efficacement les rapports d&apos;abus.
+			Veuillez saisir un récapitulatif de l&apos;infraction.
+Les récapitulatifs précis nous permettent de traiter les rapports plus rapidement.
 		</message>
 	</alert>
 	<alert name="HelpReportBugSummaryEmpty">
 		<message name="message">
-			Veuillez saisir un résumé du bug constaté.
- 
-Un résumé précis nous permet de classer et traiter efficacement les rapports de bugs.
+			Veuillez saisir un récapitulatif du bug.
+Les récapitulatifs précis nous permettent de résoudre les bugs plus rapidement.
 		</message>
 	</alert>
 	<alert name="HelpReportAbuseDetailsEmpty">
 		<message name="message">
-			Veuillez saisir une description précise de l&apos;abus constaté.
-Soyez aussi précis(e) que possible, en indiquant les noms et les détails
-de l&apos;incident.
- 
-Une description précise nous permet de classer et traiter efficacement les rapports d&apos;abus.
+			Veuillez saisir une description détaillée de l&apos;infraction.
+Soyez aussi précis que possible et essayez de fournir des noms ainsi que des détails sur l&apos;incident que vous signalez.
+Les descriptions précises nous permettent de traiter les rapports plus rapidement.
 		</message>
 	</alert>
 	<alert name="HelpReportBugDetailsEmpty">
 		<message name="message">
 			Veuillez saisir une description détaillée du bug.
-Soyez aussi précis(e) que possible, en indiquant les étapes pour reproduire le bug
-si possible.
- 
-Une description précise nous permet de classer et traiter efficacement les rapports de bugs.
+Soyez aussi spécifique que possible et essayez d&apos;indiquer les étapes à suivre pour reproduire le bug.
+Les descriptions précises nous permettent de résoudre les bugs plus rapidement.
 		</message>
 	</alert>
 	<alert name="HelpReportAbuseContainsCopyright">
@@ -4157,50 +4002,47 @@ Linden Lab
 	</alert>
 	<alert name="FailedRequirementsCheck">
 		<message name="message">
-			Les composants nécessaires suivants sont absents de [FLOATER] :
+			Les composantes requises suivantes ne se trouvent pas dans [FLOATER]:
 [COMPONENTS]
 		</message>
 	</alert>
-	<alert name="ReplaceAttachment" title="Remplacer attachement existant">
+	<alert name="ReplaceAttachment" title="Remplacer la pièce-jointe existante">
 		<message name="message">
-			Il y a déjà un objet attaché à cette partie du corps.
-Voulez-vous le remplacer par l&apos;objet sélectionné ?
+			Vous avez déjà un objet sur cette partie du corps.
+Voulez-vous le remplacer par l&apos;objet sélectionné ?
 		</message>
 		<ignore name="ignore">
 			Lors du remplacement de pièces-jointes existantes
 		</ignore>
-		<option name="Yes">
-			Oui
+		<option ignore="Remplacer automatiquement" name="Yes">
+			OK
 		</option>
-		<option name="No">
-			Non
+		<option ignore="Ne jamais remplacer" name="No">
+			Annuler
 		</option>
 	</alert>
-	<alert name="BusyModePay" title="Avertissement de mode occupé">
+	<alert name="BusyModePay" title="Réponse si occupé(e)">
 		<message name="message">
-			Vous êtes en mode Occupé, ce qui signifie que vous
-ne recevrez aucun objet en échange de
-ce paiement.
+			Vous êtes en mode occupé et vous ne recevrez donc aucun objet en échange de ce paiement.
  
-Voulez-vous quitter le mode Occupé avant
-de finaliser cette transaction ?
+Souhaitez-vous quitter le mode occupé avant de terminer cette transaction ?
 		</message>
 		<ignore name="ignore">
 			Lorsque vous envoyez de l&apos;argent à une personne en mode Occupé
 		</ignore>
-		<option name="Yes">
-			Oui
+		<option ignore="Toujours quitter le mode occupé" name="Yes">
+			OK
 		</option>
-		<option name="No">
-			Non
+		<option ignore="Ne jamais quitter le mode occupé" name="No">
+			Annuler
 		</option>
 	</alert>
 	<alert name="ConfirmEmptyTrash">
 		<message name="message">
-			Etes-vous certain de vouloir supprimer le contenu de votre poubelle de manière permanente  ?
+			Êtes-vous certain de vouloir supprimer le contenu de votre corbeille de manière permanente  ?
 		</message>
 		<ignore name="ignore">
-			Lorsque vous videz la poubelle de l&apos;inventaire
+			Lorsque vous videz la corbeille de l&apos;inventaire
 		</ignore>
 		<option name="Yes">
 			OK
@@ -4211,7 +4053,7 @@ de finaliser cette transaction ?
 	</alert>
 	<alert name="ConfirmClearBrowserCache">
 		<message name="message">
-			Etes-vous certain de vouloir vider le cache de votre navigateur ?
+			Êtes-vous certain de vouloir vider le cache de votre navigateur ?
 		</message>
 		<option name="Yes">
 			Oui
@@ -4222,7 +4064,7 @@ de finaliser cette transaction ?
 	</alert>
 	<alert name="ConfirmClearCookies">
 		<message name="message">
-			Etes-vous certain de vouloir supprimer vos cookies ?
+			Êtes-vous certain de vouloir supprimer vos cookies ?
 		</message>
 		<option name="Yes">
 			Oui
@@ -4233,7 +4075,7 @@ de finaliser cette transaction ?
 	</alert>
 	<alert name="ConfirmClearMediaUrlList">
 		<message name="message">
-			Etes-vous certain de vouloir supprimer la liste des URL enregistrées ?
+			Êtes-vous certain de vouloir supprimer la liste des URL enregistrées ?
 		</message>
 		<option name="Yes">
 			Oui
@@ -4244,7 +4086,7 @@ de finaliser cette transaction ?
 	</alert>
 	<alert name="ConfirmEmptyLostAndFound">
 		<message name="message">
-			Etes-vous certain de vouloir supprimer le contenu de votre dossier Objets trouvés de manière permanente ?
+			Êtes-vous certain de vouloir supprimer le contenu de votre dossier Objets trouvés de manière permanente ?
 		</message>
 		<ignore name="ignore">
 			Losque vous videz le dossier Objets trouvés dans vote inventaire
@@ -4258,36 +4100,36 @@ de finaliser cette transaction ?
 	</alert>
 	<alert name="CopySLURL">
 		<message name="message">
-			La SLURL suivante a été copiée sur votre presse-papier :
+			La SLURL suivante a été copiée dans votre presse-papier :
  [SLURL] 
 
-Mettez-la dans une page web pour permettre aux autres utilisateurs d&apos;accéder facilement à cet endroit ou bien collez-la dans la barre d&apos;adresse de votre navigateur.
+Mettez-la dans une page web pour permettre aux autres résidents d&apos;accéder facilement à cet endroit ou bien collez-la dans la barre d&apos;adresse de votre navigateur.
 		</message>
 		<ignore name="ignore">
-			Lorsque vous copiez une SLURL sur votre presse-papier
+			Lorsque vous copiez une SLURL dans votre presse-papier
 		</ignore>
 	</alert>
 	<alert name="GraphicsPreferencesHelp">
 		<message name="message">
-			Ce panel contrôle la taille de la fenêtre et la résolution, ainsi que la qualité des graphiques client.  Les préférences de l&apos;interface graphique vous permettent de choisir entre 4 niveaux de graphiques : Faible, Moyen, Élevé et Ultra. Personnalisez vos options graphiques en cliquant sur le bouton Personnaliser et en changeant les paramètres suivants :
+			Ce menu permet de contrôler la taille de la fenêtre et la résolution, ainsi que la qualité des graphiques client. Les préférences de l&apos;interface graphique vous permettent de choisir entre 4 niveaux de graphiques : Faible, Moyen, Élevé et Ultra. Personnalisez vos options graphiques en cliquant sur le bouton Personnaliser et en changeant les paramètres suivants :
 
-Shaders : active ou désactive les différents types de shaders pixels. 
+Effets : active ou désactive les différents types de shaders pixels. 
 
-Détails des reflets : définit le type d&apos;objets reflétés dans l&apos;eau.
+Objets reflétés : définit le type d&apos;objets reflétés dans l&apos;eau.
 
-Rendu de l&apos;avatar : définit les options qui impactent la manière dont le client rend les avatars.
+Rendu de l&apos;avatar : définit les options qui influent sur la manière dont le client rend les avatars.
 
-Distance d&apos;affichage : la distance à laquelle vous voyez les objets s&apos;afficher dans la scène.
+Limite d&apos;affichage : la distance à laquelle vous voyez les objets s&apos;afficher dans la scène.
 
 Nombre de particules max. : définit le nombre maximum de particules que vous pouvez voir à la fois sur votre écran.
 
 Qualité post-traitement : définit la résolution du rayonnement. 
 
-Détails du maillage : définit le niveau de détail ou le nombre de triangles utilisés dans le rendu de certains objets. Une valeur plus élevée prendra plus de temps pour apparaître, mais permettra d&apos;avoir des objets plus détaillés.
+Détails des rendus : définit le niveau de détail ou le nombre de polygones utilisés dans le rendu de certains objets. Une valeur plus élevée prendra plus de temps pour apparaître, mais permettra d&apos;avoir des objets plus détaillés.
 
-Détails de la lumière : définit les types de lumières que vous souhaitez faire apparaître.
+Sources lumineuses : définit les types de lumières que vous souhaitez faire apparaître.
 
-Détails du terrain : définit le niveau de détail que vous souhaitez utiliser dans la texture du terrain.
+Rendu du terrain : définit le niveau de détail que vous souhaitez utiliser dans la texture du terrain.
 		</message>
 	</alert>
 	<alert name="WLSavePresetAlert">
@@ -4335,7 +4177,7 @@ Détails du terrain : définit le niveau de détail que vous souhaitez utiliser
 	</alert>
 	<alert name="HelpEditSky">
 		<message name="message">
-			Pour créer et sauvegarder plusieurs ciels, modifiez les curseurs WindLight.
+			Pour créer et sauvegarder plusieurs ciels, utilisez les curseurs WindLight.
 		</message>
 	</alert>
 	<alert name="HelpEditDayCycle">
@@ -4345,7 +4187,7 @@ Détails du terrain : définit le niveau de détail que vous souhaitez utiliser
 	</alert>
 	<alert name="EnvSettingsHelpButton">
 		<message name="message">
-			Ces paramètres permettent de modifier l&apos;environnement local sur votre ordinateur. Pour que vous ayez accès à tous les paramètres, votre carte graphique doit prendre en charge les shaders atmosphériques.
+			Ces paramètres permettent de modifier l&apos;environnement local sur votre ordinateur. Pour que vous ayez accès à tous les paramètres, votre carte graphique doit prendre en charge les effets atmosphériques.
  
 Pour changer les différentes phases de la journée sur votre visualisateur, utilisez le curseur Heure de la journée.
  
@@ -4390,7 +4232,7 @@ Il permet de simuler de nombreux paramètres d&apos;exposition, tels que les voi
 	</alert>
 	<alert name="HelpBlueDensity">
 		<message name="message">
-			La Densité du bleu affecte la saturation générale des couleurs du ciel et du brouillard. Si vous déplacez le curseur Intensité (I) vers la droite, les couleurs deviennent plus vives et plus vibrantes. Si vous vous le déplacez complètement à gauche, les couleurs deviennent plus fades, puis finalement noires et blanches. Pour paramétrer avec précision la couleur du ciel, vous pouvez contrôler chacun des éléments de la saturation à l&apos;aide des curseurs Rouge/Vert/Bleu (RVB).
+			La Densité du bleu affecte la saturation générale des couleurs du ciel et du brouillard. Si vous déplacez le curseur Intensité (I) vers la droite, les couleurs deviennent plus vives et plus vibrantes. Si vous le déplacez complètement à gauche, les couleurs deviennent plus fades, puis finalement noires et blanches. Pour paramétrer avec précision la couleur du ciel, vous pouvez contrôler chacun des éléments de la saturation à l&apos;aide des curseurs Rouge/Vert/Bleu (RVB).
 		</message>
 	</alert>
 	<alert name="HelpHazeDensity">
@@ -4412,7 +4254,7 @@ Les valeurs supérieures à 1 simulent des distances plus importantes pour des e
 	</alert>
 	<alert name="HelpMaxAltitude">
 		<message name="message">
-			L&apos;Altitude max. ajuste les calculs de WindLight lors de la computation de la lumière atmosphérique. Quand la fin de la journée approche, il est utile pour ajuster la  « profondeur » du coucher de soleil.
+			L&apos;Altitude max. ajuste les calculs de WindLight lors de la computation de la lumière atmosphérique. Quand la fin de la journée approche, il est utile pour ajuster la « profondeur » du coucher de soleil.
 		</message>
 	</alert>
 	<alert name="HelpSunlightColor">
@@ -4422,7 +4264,7 @@ Les valeurs supérieures à 1 simulent des distances plus importantes pour des e
 	</alert>
 	<alert name="HelpSunAmbient">
 		<message name="message">
-			Ajuste la couleur et l&apos;intensité de la lumière atmosphérique ambiante de la scène.
+			Ajuste la couleur et l&apos;intensité de la lumière atmosphérique ambiante.
 		</message>
 	</alert>
 	<alert name="HelpSunGlow">
@@ -4633,8 +4475,7 @@ Même chose que l&apos;azimut.
 			Les objets qui font partie d&apos;une pièce-jointe ne peuvent pas être achetés.
 		</message>
 	</alert>
-	<alert name="DebitPermissionDetails"
-	     title="À propos des requêtes pour les permissions de débit">
+	<alert name="DebitPermissionDetails" title="À propos des requêtes pour les permissions de débit">
 		<message name="message">
 			Accepter cette requête donne au script la permission de prélever des dollars Linden (L$) sur votre compte de manière continue. Pour révoquer cette permission, le propriétaire de l&apos;objet doit supprimer l&apos;objet ou bien réinitialiser les scripts dans l&apos;objet.
 		</message>
diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml
index 31b4c95..3f6d47c 100644
--- a/indra/newview/skins/default/xui/fr/floater_about.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="floater_about" title="A propos de Second Life">
 	<text_editor name="credits_editor">
 		Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ et de nombreuses autres personnes.
@@ -26,7 +26,7 @@
   Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
 
 
-  On ne peut pas voir très loin devant nous, mais l&apos;on peut déjà y voir qu&apos;il y a beaucoup à faire. --Alan Turing
+  On ne peut pas voir très loin devant nous, mais l&apos;on peut déjà y voir qu&apos;il y a beaucoup à faire. -Alan Turing
 	</text_editor>
 	<string name="you_are_at">
 		Votre position : [POSITION]
diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml
index 50ce466..736bf90 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -1,85 +1,72 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="floaterland" title="À propos du terrain">
 	<tab_container name="landtab">
 		<panel label="Général" name="land_general_panel">
-			<text type="string" length="1" name="Name:">
+			<text length="1" name="Name:" type="string">
 				Nom :
 			</text>
-			<text type="string" length="1" name="Description:">
+			<text length="1" name="Description:" type="string">
 				Description :
 			</text>
-			<text type="string" length="1" name="Owner:">
+			<text length="1" name="Owner:" type="string">
 				Propriétaire :
 			</text>
-			<text type="string" length="1" name="OwnerText">
+			<text length="1" name="OwnerText" type="string">
 				Leyla Linden
 			</text>
-			<button label="Profil..." label_selected="Profil..." name="Profile..." />
-			<text type="string" length="1" name="Group:">
+			<button label="Profil..." label_selected="Profil..." name="Profile..."/>
+			<text length="1" name="Group:" type="string">
 				Groupe :
 			</text>
-			<button label="Définir..." label_selected="Définir..." name="Set..." />
-			<check_box label="Autoriser le transfert au groupe" name="check deed"
-			     tool_tip="Un officier peut transférer ce terrain au groupe. Il viendra alors s&apos;ajouter au patrimoine du groupe." />
-			<button label="Transférer..." label_selected="Transférer..." name="Deed..."
-			     tool_tip="Vous ne pouvez transférer le terrain que si vous avez un rôle d&apos;officier dans le groupe sélectionné." />
-			<check_box label="Le propriétaire contribue par transfert" name="check contib"
-			     tool_tip="Lorsque le terrain est transféré au groupe, la contribution du précédent propriétaire suffit à l&apos;entretenir." />
-			<check_box label="Le propriétaire contribue par une donation" name="check contrib"
-			     tool_tip="Lorsqu&apos;un titre de propriété est transféré au groupe, l&apos;ancien propriétaire fait également un don de terrain suffisant." />
-			<text type="string" length="1" name="For Sale:">
+			<button label="Définir..." label_selected="Définir..." name="Set..."/>
+			<check_box label="Autoriser la cession au groupe" name="check deed" tool_tip="Un officier peut céder ce terrain au groupe. Il viendra alors s&apos;ajouter au patrimoine du groupe."/>
+			<button label="Céder..." label_selected="Céder..." name="Deed..." tool_tip="Vous ne pouvez céder le terrain que si vous avez un rôle d&apos;officier dans le groupe sélectionné."/>
+			<check_box label="Le propriétaire contribue en cédant du terrain" name="check contib" tool_tip="Lorsque le terrain est cédé au groupe, la contribution du précédent propriétaire suffit à l&apos;entretenir."/>
+			<check_box label="Le propriétaire contribue en cédant du terrain" name="check contrib" tool_tip="Lorsqu&apos;un terrain est cédé au groupe, l&apos;ancien propriétaire fait également un don de terrain suffisant."/>
+			<text length="1" name="For Sale:" type="string">
 				À vendre :
 			</text>
-			<text type="string" length="1" name="Not for sale.">
+			<text length="1" name="Not for sale." type="string">
 				Pas à vendre.
 			</text>
-			<text type="string" length="1" name="For Sale: Price L$[PRICE].">
-				Prix : [PRICE] $L.
+			<text length="1" name="For Sale: Price L$[PRICE]." type="string">
+				Prix : [PRICE] L$.
 			</text>
-			<button label="Vendre le terrain..." label_selected="Vendre le terrain..."
-			     name="Sell Land..." />
-			<text type="string" length="1" name="For sale to">
+			<button label="Vendre le terrain..." label_selected="Vendre le terrain..." name="Sell Land..."/>
+			<text length="1" name="For sale to" type="string">
 				À vendre à : [BUYER]
 			</text>
-			<text type="string" length="1" name="Sell with landowners objects in parcel.">
+			<text length="1" name="Sell with landowners objects in parcel." type="string">
 				Objets inclus dans la vente.
 			</text>
-			<text type="string" length="1" name="Selling with no objects in parcel.">
+			<text length="1" name="Selling with no objects in parcel." type="string">
 				Objets non inclus dans la vente.
 			</text>
-			<button label="Annuler la vente du terrain"
-			     label_selected="Annuler la vente du terrain" name="Cancel Land Sale" />
-			<text type="string" length="1" name="Claimed:">
+			<button label="Annuler la vente du terrain" label_selected="Annuler la vente du terrain" name="Cancel Land Sale"/>
+			<text length="1" name="Claimed:" type="string">
 				Réclamée :
 			</text>
-			<text type="string" length="1" name="DateClaimText">
+			<text length="1" name="DateClaimText" type="string">
 				Tue Aug 15 13:47:25 2006
 			</text>
-			<text type="string" length="1" name="PriceLabel">
+			<text length="1" name="PriceLabel" type="string">
 				Surface :
 			</text>
-			<text type="string" length="1" name="PriceText">
+			<text length="1" name="PriceText" type="string">
 				4048 m²
 			</text>
-			<text type="string" length="1" name="Traffic:">
+			<text length="1" name="Traffic:" type="string">
 				Trafic :
 			</text>
-			<text type="string" length="1" name="DwellText">
+			<text length="1" name="DwellText" type="string">
 				0
 			</text>
-			<button label="Acheter le terrain..." label_selected="Acheter le terrain..."
-			     name="Buy Land..." />
-			<button label="Acheter pour le groupe..." label_selected="Acheter pour le groupe..."
-			     name="Buy For Group..." />
-			<button label="Acheter un passe..." label_selected="Acheter un passe..."
-			     name="Buy Pass..."
-			     tool_tip="Un passe vous donne un accès temporaire à ce terrain." />
-			<button label="Céder le terrain..." label_selected="Céder le terrain..."
-			     name="Abandon Land..." />
-			<button label="Récupérer le terrain…" label_selected="Récupérer le terrain…"
-			     name="Reclaim Land..." />
-			<button label="Vente Linden..." label_selected="Vente Linden..." name="Linden Sale..."
-			     tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères." />
+			<button label="Acheter le terrain..." label_selected="Acheter le terrain..." name="Buy Land..."/>
+			<button label="Acheter pour le groupe..." label_selected="Acheter pour le groupe..." name="Buy For Group..."/>
+			<button label="Acheter un pass..." label_selected="Acheter un pass..." name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain."/>
+			<button label="Abandonner le terrain..." label_selected="Abandonner le terrain..." name="Abandon Land..."/>
+			<button label="Redemander le terrain…" label_selected="Redemander le terrain…" name="Reclaim Land..."/>
+			<button label="Vente Linden..." label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
 			<text name="new users only">
 				Nouveaux utilisateurs uniquement
 			</text>
@@ -122,34 +109,34 @@ Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre pa
 			</string>
 		</panel>
 		<panel label="Règlement" name="land_covenant_panel">
-			<text type="string" length="1" name="covenant_timestamp_text">
+			<text length="1" name="covenant_timestamp_text" type="string">
 				Last Modified Wed Dec 31 16:00:00 1969
 			</text>
-			<text type="string" length="1" name="region_name_lbl">
+			<text length="1" name="region_name_lbl" type="string">
 				Région :
 			</text>
-			<text type="string" length="1" name="region_name_text">
+			<text length="1" name="region_name_text" type="string">
 				leyla
 			</text>
-			<text type="string" length="1" name="estate_name_lbl">
+			<text length="1" name="estate_name_lbl" type="string">
 				Domaine :
 			</text>
-			<text type="string" length="1" name="estate_name_text">
+			<text length="1" name="estate_name_text" type="string">
 				continent
 			</text>
-			<text type="string" length="1" name="estate_owner_lbl">
+			<text length="1" name="estate_owner_lbl" type="string">
 				Propriétaire :
 			</text>
-			<text type="string" length="1" name="estate_owner_text">
+			<text length="1" name="estate_owner_text" type="string">
 				(aucun)
 			</text>
-			<text type="string" length="1" name="resellable_clause">
+			<text length="1" name="resellable_clause" type="string">
 				Le terrain acheté dans cette région ne peut être revendu.
 			</text>
-			<text type="string" length="1" name="changeable_clause">
+			<text length="1" name="changeable_clause" type="string">
 				Le terrain acheté dans cette région ne peut être revendu/divisé.
 			</text>
-			<text_editor type="string" length="1" name="covenant_editor">
+			<text_editor length="1" name="covenant_editor" type="string">
 				Il n&apos;y a aucun règlement pour ce domaine.
 			</text_editor>
 			<text name="can_resell">
@@ -169,14 +156,11 @@ Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre pa
 			<text name="parcel_object_bonus">
 				Facteur Bonus Objets : [BONUS]
 			</text>
-			<text type="string" length="1" name="Simulator primitive usage:">
+			<text length="1" name="Simulator primitive usage:" type="string">
 				Prims utilisés sur le sim :
 			</text>
-			<text type="string" length="1" name="0 out of 0 available">
-				0 sur 14055 (14055 disponibles)
-			</text>
 			<text name="objects_available">
-				[COUNT] sur [COUNT] ([COUNT] disponibles)
+				[COUNT] sur [MAX] ([AVAILABLE] disponibles)
 			</text>
 			<string name="objects_available_text">
 				[COUNT] sur [MAX] ([AVAILABLE] disponibles)
@@ -184,110 +168,102 @@ Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre pa
 			<string name="objects_deleted_text">
 				[COUNT] sur [MAX] ([DELETED] seront supprimés)
 			</string>
-			<text type="string" length="1" name="Primitives parcel supports:">
+			<text length="1" name="Primitives parcel supports:" type="string">
 				Prims max. sur la parcelle :
 			</text>
-			<text type="string" length="1" name="object_contrib_text">
+			<text length="1" name="object_contrib_text" type="string">
 				[COUNT]
 			</text>
-			<text type="string" length="1" name="Primitives on parcel:">
+			<text length="1" name="Primitives on parcel:" type="string">
 				Prims sur la parcelle :
 			</text>
-			<text type="string" length="1" name="total_objects_text">
+			<text length="1" name="total_objects_text" type="string">
 				[COUNT]
 			</text>
-			<text type="string" length="1" name="Owned by parcel owner:">
+			<text length="1" name="Owned by parcel owner:" type="string">
 				Appartenant au propriétaire :
 			</text>
-			<text type="string" length="1" name="owner_objects_text">
+			<text length="1" name="owner_objects_text" type="string">
 				[COUNT]
 			</text>
-			<button label="Afficher" label_selected="Afficher" name="ShowOwner" />
-			<button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOwner..."
-			     tool_tip="Renvoyer les objets à leurs propriétaires." />
-			<text type="string" length="1" name="Set to group:">
+			<button label="Afficher" label_selected="Afficher" name="ShowOwner"/>
+			<button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOwner..." tool_tip="Renvoyer les objets à leurs propriétaires."/>
+			<text length="1" name="Set to group:" type="string">
 				Donnés au groupe :
 			</text>
-			<text type="string" length="1" name="group_objects_text">
-				0
+			<text length="1" name="group_objects_text" type="string">
+				[COUNT]
 			</text>
-			<button label="Afficher" label_selected="Afficher" name="ShowGroup" />
-			<button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnGroup..."
-			     tool_tip="Renvoyer les objets à leurs propriétaires." />
-			<text type="string" length="1" name="Owned by others:">
+			<button label="Afficher" label_selected="Afficher" name="ShowGroup"/>
+			<button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnGroup..." tool_tip="Renvoyer les objets à leurs propriétaires."/>
+			<text length="1" name="Owned by others:" type="string">
 				Appartenant à d&apos;autres :
 			</text>
-			<text type="string" length="1" name="other_objects_text">
-				0
+			<text length="1" name="other_objects_text" type="string">
+				[COUNT]
 			</text>
-			<button label="Afficher" label_selected="Afficher" name="ShowOther" />
-			<button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOther..."
-			     tool_tip="Renvoyer les objets à leurs propriétaires." />
-			<text type="string" length="1" name="Selected / sat upon:">
+			<button label="Afficher" label_selected="Afficher" name="ShowOther"/>
+			<button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOther..." tool_tip="Renvoyer les objets à leurs propriétaires."/>
+			<text length="1" name="Selected / sat upon:" type="string">
 				Sélectionnés/où quelqu&apos;un est assis :
 			</text>
-			<text type="string" length="1" name="selected_objects_text">
-				0
+			<text length="1" name="selected_objects_text" type="string">
+				[COUNT]
 			</text>
-			<text type="string" length="1" name="Autoreturn other resident&amp;apos;s objects (minutes, 0 for off):">
+			<text length="1" name="Autoreturn other resident&amp;apos;s objects (minutes, 0 for off):" type="string">
 				Renvoi automatique des objets appartenant aux autres résidents (minutes, 0 pour désactiver):
 			</text>
 			<text name="Autoreturn">
 				Renvoi automatique des objets d&apos;autres résidents (minutes, 0 pour désactiver) :
 			</text>
-			<text type="string" length="1" name="Object Owners:">
+			<text length="1" name="Object Owners:" type="string">
 				Propriétaires :
 			</text>
-			<button label="Rafraîchir la liste" label_selected="Rafraîchir la liste"
-			     name="Refresh List" />
-			<button label="Renvoyer les objets..." label_selected="Renvoyer les objets..."
-			     name="Return objects..." />
-			<button label="" label_selected="" name="Type" tool_tip="Trier par type" />
-			<button label="Nom" label_selected="Nom" name="Name" tool_tip="Trier par nom" />
-			<button label="Trafic" label_selected="Trafic" name="Count" tool_tip="Trier par trafic" />
+			<button label="Rafraîchir la liste" label_selected="Rafraîchir la liste" name="Refresh List"/>
+			<button label="Renvoyer les objets..." label_selected="Renvoyer les objets..." name="Return objects..."/>
+			<button label="" label_selected="" name="Type" tool_tip="Trier par type"/>
+			<button label="Nom" label_selected="Nom" name="Name" tool_tip="Trier par nom"/>
+			<button label="Trafic" label_selected="Trafic" name="Count" tool_tip="Trier par trafic"/>
 			<name_list label="Plus récents" name="owner list">
-				<column label="Type" name="type" />
-				<column label="Nom" name="name" />
-				<column label="Nombre" name="count" />
+				<column label="Type" name="type"/>
+				<column label="Nom" name="name"/>
+				<column label="Nombre" name="count"/>
 			</name_list>
 		</panel>
 		<panel label="Options" name="land_options_panel">
-			<text type="string" length="1" name="allow_label">
+			<text length="1" name="allow_label" type="string">
 				Autoriser les autres résidents à :
 			</text>
 			<text name="allow_label2">
 				Créer des objets :
 			</text>
-			<check_box label="Tous les résidents" name="edit objects check" />
-			<check_box label="Modifier le terrain" name="edit land check" />
-			<check_box label="Créer des repères" name="check landmark" />
-			<check_box label="Groupe" name="edit group objects check" />
+			<check_box label="Tous les résidents" name="edit objects check"/>
+			<check_box label="Modifier le terrain" name="edit land check"/>
+			<check_box label="Créer des repères" name="check landmark"/>
+			<check_box label="Groupe" name="edit group objects check"/>
 			<text name="allow_label3">
-				Apporter des objets :
+				Laisser entrer des objets :
 			</text>
-			<check_box label="Tous les résidents" name="all object entry check" />
-			<check_box label="Groupe" name="group object entry check" />
+			<check_box label="Tous les résidents" name="all object entry check"/>
+			<check_box label="Groupe" name="group object entry check"/>
 			<text name="allow_label4">
 				Exécuter des scripts :
 			</text>
-			<check_box label="Groupe" name="check group scripts" />
-			<check_box label="Voler" name="check fly" />
-			<check_box label="Tous les résidents" name="check other scripts" />
-			<text type="string" length="1" name="land_options_label">
+			<check_box label="Groupe" name="check group scripts"/>
+			<check_box label="Voler" name="check fly"/>
+			<check_box label="Tous les résidents" name="check other scripts"/>
+			<text length="1" name="land_options_label" type="string">
 				Options du terrain :
 			</text>
-			<check_box label="Sécurisé (pas de dégâts)" name="check safe" />
-			<check_box label="Interdire les bousculades" name="PushRestrictCheck"
-			     tool_tip="llPushObject ne fonctionne que sur les scripts du propriétaire de la parcelle ou sur les scripts où la personne qui bouscule est aussi la propriétaire du script." />
-			<check_box label="Afficher dans la recherche (30 $L/semaine) sous"
-			     name="ShowDirectoryCheck"
-			     tool_tip="Afficher la parcelle dans les résultats de recherche" />
+			<check_box label="Sécurisé (pas de dégâts)" name="check safe"/>
+			<check_box label="Interdire les bousculades" name="PushRestrictCheck" tool_tip="llPushObject ne fonctionne que sur les scripts du propriétaire de la parcelle ou sur les scripts où la personne qui bouscule est aussi la propriétaire du script."/>
+			<check_box label="Afficher dans la recherche (30 L$/semaine) sous" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/>
 			<combo_box name="land category">
 				<combo_item name="AnyCategory">
 					Toute catégorie
 				</combo_item>
 				<combo_item name="LindenLocation">
-					Emplacement Linden
+					Lindens
 				</combo_item>
 				<combo_item name="Adult">
 					Adultes
@@ -323,16 +299,14 @@ Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre pa
 					Autre
 				</combo_item>
 			</combo_box>
-			<check_box label="Publier liste sur le web" name="PublishCheck"
-			     tool_tip="Publiez vos informations de parcelle sur le web." />
-			<check_box label="Contenu pour adultes" name="MatureCheck"
-			     tool_tip="Les infos sur votre parcelle, ou le contenu de cette dernière, sont à caractère adulte." />
-			<button label="?" label_selected="?" name="?" />
-			<text type="string" length="1" name="Snapshot:">
+			<check_box label="Publier liste sur le web" name="PublishCheck" tool_tip="Publiez vos informations de parcelle sur le web."/>
+			<check_box label="Contenu pour adultes" name="MatureCheck" tool_tip="Les infos sur votre parcelle, ou le contenu de cette dernière, sont à caractère adulte."/>
+			<button label="?" label_selected="?" name="?"/>
+			<text length="1" name="Snapshot:" type="string">
 				Photo :
 			</text>
-			<texture_picker label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image" />
-			<text type="string" length="1" name="Landing Point: (none)">
+			<texture_picker label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/>
+			<text length="1" name="Landing Point: (none)" type="string">
 				Point d&apos;atterrissage : (aucun)
 			</text>
 			<text name="landing_point">
@@ -341,22 +315,19 @@ Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre pa
 			<string name="landing_point_none">
 				(aucun)
 			</string>
-			<button label="Définir" label_selected="Définir" name="Set"
-			     tool_tip="Définir le lieu d&apos;arrivée de l&apos;avatar sur votre position actuelle. ll doit se trouver sur cette parcelle de terrain." />
-			<button label="Annuler" label_selected="Annuler" name="Clear"
-			     tool_tip="Dégager le lieu d&apos;arrivée." />
-			<text type="string" length="1" name="Teleport Routing: ">
-				Options de téléportation :
-			</text>
-			<combo_box name="landing type"
-			     tool_tip="Vous permet de paramétrer les téléportations sur votre terrain.">
-				<combo_item type="string" length="1" name="Blocked">
+			<button label="Définir" label_selected="Définir" name="Set" tool_tip="Définir le lieu d&apos;arrivée de l&apos;avatar sur votre position actuelle. ll doit se trouver sur cette parcelle."/>
+			<button label="Annuler" label_selected="Annuler" name="Clear" tool_tip="Libérer le lieu d&apos;arrivée."/>
+			<text length="1" name="Teleport Routing: " type="string">
+				Règles de téléportation :
+			</text>
+			<combo_box name="landing type" tool_tip="Vous permet de paramétrer les téléportations sur votre terrain.">
+				<combo_item length="1" name="Blocked" type="string">
 					Bloquée
 				</combo_item>
-				<combo_item type="string" length="1" name="LandingPoint">
+				<combo_item length="1" name="LandingPoint" type="string">
 					Lieu d&apos;arrivée défini
 				</combo_item>
-				<combo_item type="string" length="1" name="Anywhere">
+				<combo_item length="1" name="Anywhere" type="string">
 					Lieu d&apos;arrivée indéfini
 				</combo_item>
 			</combo_box>
@@ -371,17 +342,15 @@ Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre pa
 			<text name="with media:">
 				Type de média :
 			</text>
-			<combo_box name="media type"
-			     tool_tip="Indiquez s&apos;il s&apos;agit de l&apos;URL d&apos;un film, d&apos;une page web ou autre" />
+			<combo_box name="media type" tool_tip="Indiquez s&apos;il s&apos;agit de l&apos;URL d&apos;un film, d&apos;une page web ou autre"/>
 			<text name="at URL:">
 				URL du média :
 			</text>
-			<button label="Définir..." label_selected="Définir..." name="set_media_url" />
+			<button label="Définir..." label_selected="Définir..." name="set_media_url"/>
 			<text name="Description:">
 				Description :
 			</text>
-			<line_editor name="url_description"
-			     tool_tip="Texte affiché à côté du bouton Jouer/Charger" />
+			<line_editor name="url_description" tool_tip="Texte affiché à côté du bouton Jouer/Charger"/>
 			<text name="replace_texture_help">
 				(Les objets avec cette texture affichent le film ou 
 la page web quand vous cliquez sur la flèche Jouer).
@@ -390,20 +359,14 @@ la page web quand vous cliquez sur la flèche Jouer).
 				Options
 média :
 			</text>
-			<check_box label="Média en boucle" name="media_loop"
-			     tool_tip="Jouer le média en boucle. Lorsque le média aura fini de jouer, il recommencera." />
-			<check_box label="Masquer l&apos;URL du média" name="hide_media_url"
-			     tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL du média. Cette option n&apos;est pas disponible pour les fichiers HTML." />
-			<check_box label="Masquer l&apos;URL de la musique" name="hide_music_url"
-			     tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL de la musique." />
-			<text name="media_size"
-			     tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut.">
+			<check_box label="Média en boucle" name="media_loop" tool_tip="Jouer le média en boucle. Lorsque le média aura fini de jouer, il recommencera."/>
+			<check_box label="Masquer l&apos;URL du média" name="hide_media_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL du média. Cette option n&apos;est pas disponible pour les fichiers HTML."/>
+			<check_box label="Masquer l&apos;URL de la musique" name="hide_music_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL de la musique."/>
+			<text name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut.">
 				Taille du média :
 			</text>
-			<spinner name="media_size_width"
-			     tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut." />
-			<spinner name="media_size_height"
-			     tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut." />
+			<spinner name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
+			<spinner name="media_size_height" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
 			<text name="pixels">
 				pixels
 			</text>
@@ -413,23 +376,22 @@ média :
 			<text name="Sound:">
 				Son :
 			</text>
-			<check_box label="Limiter le son spatial à cette parcelle" name="check sound local" />
-			<text type="string" length="1" name="Music URL:">
+			<check_box label="Limiter le son spatial à cette parcelle" name="check sound local"/>
+			<text length="1" name="Music URL:" type="string">
 				URL du flux :
 			</text>
-			<text type="string" length="1" name="Media texture:">
+			<text length="1" name="Media texture:" type="string">
 				Remplacer
 la texture :
 			</text>
-			<text type="string" length="1" name="Replace this texture:">
+			<text length="1" name="Replace this texture:" type="string">
 				Remplacer cette texture :
 			</text>
-			<texture_picker label="" name="media texture" tool_tip="Cliquez pour sélectionner une image" />
-			<text type="string" length="1" name="with content from this URL:">
+			<texture_picker label="" name="media texture" tool_tip="Cliquez pour sélectionner une image"/>
+			<text length="1" name="with content from this URL:" type="string">
 				par du contenu situé à l&apos;URL suivante :
 			</text>
-			<check_box label="Échelle automatique" name="media_auto_scale"
-			     tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l&apos;échelle. La qualité visuelle sera peut-être amoindrie mais vous n&apos;aurez à faire aucune autre mise à l&apos;échelle ou alignement." />
+			<check_box label="Échelle automatique" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l&apos;échelle. La qualité visuelle sera peut-être amoindrie mais vous n&apos;aurez à faire aucune autre mise à l&apos;échelle ou alignement."/>
 			<text name="Voice settings:">
 				Voix :
 			</text>
@@ -446,29 +408,23 @@ la texture :
 			</radio_group>
 		</panel>
 		<panel label="Accès" name="land_access_panel">
-			<text type="string" length="1" name="Limit access to this parcel to:">
+			<text length="1" name="Limit access to this parcel to:" type="string">
 				Accès à cette parcelle
 			</text>
-			<check_box label="Autoriser l&apos;accès public" name="public_access" />
+			<check_box label="Autoriser l&apos;accès public" name="public_access"/>
 			<text name="Only Allow">
 				Bloquer l&apos;accès :
 			</text>
-			<check_box
-			     label="Aux résidents qui n&apos;ont pas fourni leurs informations de paiement à Linden Lab"
-			     name="limit_payment" tool_tip="Aux résidents non identifés" />
-			<check_box label="Aux résidents dont l&apos;âge n&apos;a pas été vérifié"
-			     name="limit_age_verified"
-			     tool_tip="Aux résidents dont l&apos;âge n&apos;a pas été vérifié. Pour plus d&apos;infos, consultez la page support.secondlife.com." />
+			<check_box label="Aux résidents qui n&apos;ont pas fourni leurs informations de paiement à Linden Lab" name="limit_payment" tool_tip="Aux résidents non identifés"/>
+			<check_box label="Aux résidents dont l&apos;âge n&apos;a pas été vérifié" name="limit_age_verified" tool_tip="Aux résidents dont l&apos;âge n&apos;a pas été vérifié. Pour plus d&apos;infos, consultez la page support.secondlife.com."/>
 			<string name="estate_override">
 				Au moins une de ces options est définie au niveau du domaine.
 			</string>
-			<check_box label="Autoriser l&apos;accès au groupe : [GROUP]" name="GroupCheck"
-			     tool_tip="Définir le groupe à l&apos;onglet Général." />
-			<check_box label="Avatars : (0 dans la liste, 300 max)" name="AccessCheck" />
-			<button label="Ajouter..." label_selected="Ajouter..." name="Add..." />
-			<button label="Retirer" label_selected="Retirer" name="Remove" />
-			<check_box label="Vendre des passes à :" name="PassCheck"
-			     tool_tip="Autoriser un accès temporaire à cette parcelle" />
+			<check_box label="Autoriser l&apos;accès au groupe : [GROUP]" name="GroupCheck" tool_tip="Définir le groupe à l&apos;onglet Général."/>
+			<check_box label="Avatars : (0 dans la liste, 300 max)" name="AccessCheck"/>
+			<button label="Ajouter..." label_selected="Ajouter..." name="Add..."/>
+			<button label="Retirer" label_selected="Retirer" name="Remove"/>
+			<check_box label="Vendre des pass à :" name="PassCheck" tool_tip="Autoriser un accès temporaire à cette parcelle"/>
 			<combo_box name="pass_combo">
 				<combo_item name="Anyone">
 					N&apos;importe qui
@@ -477,32 +433,31 @@ la texture :
 					Groupe
 				</combo_item>
 			</combo_box>
-			<spinner label="Prix en $L :" name="PriceSpin" />
-			<spinner label="Heures d&apos;accès :" name="HoursSpin" />
+			<spinner label="Prix en L$ :" name="PriceSpin"/>
+			<spinner label="Heures d&apos;accès :" name="HoursSpin"/>
 			<text label="Toujours autoriser" name="AllowedText">
 				Résidents autorisés
 			</text>
-			<name_list name="AccessList" tool_tip="([LISTED] listés, [MAX] max)" />
-			<button label="Ajouter..." label_selected="Ajouter..." name="add_allowed" />
-			<button label="Supprimer" label_selected="Supprimer" name="remove_allowed" />
-			<text label="Interdire" name="BanCheck">
-				Résidents interdits
+			<name_list name="AccessList" tool_tip="([LISTED] listés, [MAX] max)"/>
+			<button label="Ajouter..." label_selected="Ajouter..." name="add_allowed"/>
+			<button label="Supprimer" label_selected="Supprimer" name="remove_allowed"/>
+			<text label="Bannir" name="BanCheck">
+				Résidents bannis
 			</text>
-			<name_list name="BannedList" tool_tip="([LISTED] listés, [MAX] max)" />
-			<button label="Ajouter..." label_selected="Ajouter..." name="add_banned" />
-			<button label="Supprimer" label_selected="Supprimer" name="remove_banned" />
+			<name_list name="BannedList" tool_tip="([LISTED] listés, [MAX] max)"/>
+			<button label="Ajouter..." label_selected="Ajouter..." name="add_banned"/>
+			<button label="Supprimer" label_selected="Supprimer" name="remove_banned"/>
 		</panel>
 		<panel label="Bannir" name="land_ban_panel">
-			<check_box label="Bannir les avatars suivants : (0 dans la liste, 300 max)"
-			     name="LandBanCheck" />
-			<button label="Ajouter..." label_selected="Ajouter..." name="Add..." />
-			<button label="Retirer" label_selected="Retirer" name="Remove" />
-			<text type="string" length="1" name="Deny by Payment Status:">
+			<check_box label="Bannir les avatars suivants : (0 dans la liste, 300 max)" name="LandBanCheck"/>
+			<button label="Ajouter..." label_selected="Ajouter..." name="Add..."/>
+			<button label="Retirer" label_selected="Retirer" name="Remove"/>
+			<text length="1" name="Deny by Payment Status:" type="string">
 				Refuser selon les infos de paiement :
 			</text>
-			<check_box label="Refuser sans infos de paiement enregistrées" name="DenyAnonymousCheck" />
-			<check_box label="Refuser avec infos de paiement enregistrées" name="DenyIdentifiedCheck" />
-			<check_box label="Refuser avec infos de paiement utilisées" name="DenyTransactedCheck" />
+			<check_box label="Refuser sans infos de paiement enregistrées" name="DenyAnonymousCheck"/>
+			<check_box label="Refuser avec infos de paiement enregistrées" name="DenyIdentifiedCheck"/>
+			<check_box label="Refuser avec infos de paiement utilisées" name="DenyTransactedCheck"/>
 		</panel>
 	</tab_container>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_active_speakers.xml b/indra/newview/skins/default/xui/fr/floater_active_speakers.xml
index 4c39f36..6fe853f 100644
--- a/indra/newview/skins/default/xui/fr/floater_active_speakers.xml
+++ b/indra/newview/skins/default/xui/fr/floater_active_speakers.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="active_speakers" title="Intervenants actifs">
 	<panel name="active_speakers_panel">
 		<scroll_list name="speakers_list">
-			<column label="Nom" name="speaker_name" />
+			<column label="Nom" name="speaker_name"/>
 		</scroll_list>
 		<panel name="volume_container">
-			<button name="mute_btn" tool_tip="Rendre ce résident muet" />
+			<button name="mute_btn" tool_tip="Ignorer ce résident"/>
 		</panel>
 	</panel>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
index 8614cd0..a38fd12 100644
--- a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="Animation Preview" title="">
 	<text name="name_label">
 		Nom :
@@ -6,13 +6,11 @@
 	<text name="description_label">
 		Description :
 	</text>
-	<spinner label="Priorité" name="priority"
-	     tool_tip="Contrôle quelles animations peuvent êtres écrasées par cette animation." />
+	<spinner label="Priorité" name="priority" tool_tip="Contrôle quelles animations peuvent êtres écrasées par cette animation."/>
 	<text name="preview_label">
 		Prévisualiser pendant
 	</text>
-	<combo_box label="" name="preview_base_anim"
-	     tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales.">
+	<combo_box label="" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales.">
 		<combo_item name="Standing">
 			Debout
 		</combo_item>
@@ -26,16 +24,13 @@
 			En train de voler
 		</combo_item>
 	</combo_box>
-	<check_box label="Boucle" name="loop_check" tool_tip="Joue cette animation en boucle." />
-	<spinner label="Début (%)" name="loop_in_point"
-	     tool_tip="Définit le moment de l&apos;animation où la boucle repart." />
-	<spinner label="Fin (%)" name="loop_out_point"
-	     tool_tip="Définit le moment de l&apos;animation où la boucle finit." />
+	<check_box label="Boucle" name="loop_check" tool_tip="Joue cette animation en boucle."/>
+	<spinner label="Début (%)" name="loop_in_point" tool_tip="Définit le moment de l&apos;animation où la boucle repart."/>
+	<spinner label="Fin (%)" name="loop_out_point" tool_tip="Définit le moment de l&apos;animation où la boucle finit."/>
 	<text name="hand_label">
 		Mouvement de main
 	</text>
-	<combo_box label="" name="hand_pose_combo"
-	     tool_tip="Contrôle le mouvement des mains au cours de lanimation">
+	<combo_box label="" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l&apos;animation">
 		<combo_item name="Spread">
 			Doigts écartés
 		</combo_item>
@@ -73,14 +68,13 @@
 			Taper
 		</combo_item>
 		<combo_item name="PeaceRight">
-			Peace (droite)
+			Paix (main droite)
 		</combo_item>
 	</combo_box>
 	<text name="emote_label">
 		Expression
 	</text>
-	<combo_box label="" name="emote_combo"
-	     tool_tip="Contrôle l&apos;expression du visage au cours de l&apos;animation.">
+	<combo_box label="" name="emote_combo" tool_tip="Contrôle l&apos;expression du visage au cours de l&apos;animation.">
 		<combo_item name="[None]">
 			[None]
 		</combo_item>
@@ -142,20 +136,18 @@
 			Soucis
 		</combo_item>
 	</combo_box>
-	<spinner label="Transition début (s)" name="ease_in_time"
-	     tool_tip="Durée (en secondes) pendant laquelle l&apos;animation s&apos;intègre au mouvement." />
-	<spinner label="Transition fin (s)" name="ease_out_time"
-	     tool_tip="Durée (en secondes) pendant laquelle l&apos;animation disparaît du mouvement." />
-	<button label="" name="play_btn" tool_tip="Jouer/Pauser votre animation." />
-	<button label="" name="stop_btn" tool_tip="Arrêter le playback" />
-	<slider label="" name="playback_slider" />
+	<spinner label="Transition début (s)" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation s&apos;intègre au mouvement."/>
+	<spinner label="Transition fin (s)" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation disparaît du mouvement."/>
+	<button label="" name="play_btn" tool_tip="Jouer/Pauser votre animation."/>
+	<button label="" name="stop_btn" tool_tip="Arrêter le playback"/>
+	<slider label="" name="playback_slider"/>
 	<text name="bad_animation_text">
 		Impossible de lire le fichier d&apos;animation.
 
 Nous recommandons les fichiers BVH extraits de Poser 4.
 	</text>
-	<button label="Annuler" name="cancel_btn" />
-	<button label="Charger ([AMOUNT] $L)" name="ok_btn" />
+	<button label="Annuler" name="cancel_btn"/>
+	<button label="Charger ([AMOUNT] L$)" name="ok_btn"/>
 	<string name="failed_to_initialize">
 		Echec de l&apos;initialisation du mouvement
 	</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
index 91e30a9..d98cb5a 100644
--- a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="avatarpicker" title="Choisir le résident">
 	<text name="Type part of the person&apos;s name:">
 		Entrez les premières lettres du nom de la personne :
@@ -6,15 +6,15 @@
 	<text name="instruct_search_resident_name">
 		Saisissez une partie du nom du résident :
 	</text>
-	<button label="Trouver" label_selected="Trouver" name="Find" />
+	<button label="Chercher" label_selected="Chercher" name="Find"/>
 	<text name="Or select a calling card:">
 		Ou sélectionnez une carte de visite :
 	</text>
 	<text name="Or select their calling card:">
-		Ou choisissez une carte de visite :
+		Ou sélectionnez une carte de visite :
 	</text>
-	<button label="Sélectionner" label_selected="Sélectionner" name="Select" />
-	<button label="Fermer" label_selected="Fermer" name="Close" />
+	<button label="Sélectionner" label_selected="Sélectionner" name="Select"/>
+	<button label="Fermer" label_selected="Fermer" name="Close"/>
 	<text name="NotFound">
 		&apos;[TEXT]&apos; introuvable
 	</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_contents.xml b/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
index a008f33..a305c30 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="floater_buy_contents" title="Acheter des contenus">
 	<text name="contains_text">
 		[NAME] contient :
 	</text>
 	<text name="buy_text">
-		Acheter [AMOUNT] $L à [NAME] ?
+		Acheter [AMOUNT] L$ à [NAME] ?
 	</text>
-	<button label="Annuler" label_selected="Annuler" name="cancel_btn" />
-	<button label="Acheter" label_selected="Acheter" name="buy_btn" />
-	<check_box label="Porter maintenant" name="wear_check" />
+	<button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
+	<button label="Acheter" label_selected="Acheter" name="buy_btn"/>
+	<check_box label="Porter maintenant" name="wear_check"/>
 	<string name="no_copy_text">
 		(pas de copie)
 	</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
index 91fa5a3..f6c7455 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="buy currency" title="Acheter des devises">
 	<text left="5" name="info_buying">
 		Achat de devises :
@@ -12,24 +12,24 @@
 	<text name="error_message">
 		Quelque chose ne va pas.
 	</text>
-	<button label="Aller sur le site" name="error_web" />
+	<button label="Aller sur le site" name="error_web"/>
 	<text name="contacting">
-		En train de contacter Lindex...
+		En train de contacter le Lindex...
 	</text>
 	<text name="buy_action_unknown" right="-5">
-		Acheter des $L sur le marché des changes du LindeX
+		Acheter des L$ sur le marché des changes du LindeX
 	</text>
 	<text name="buy_action">
-		[NAME] $L [PRICE]
+		[NAME] L$ [PRICE]
 	</text>
 	<text name="currency_action">
-		Acheter des $L
+		Acheter des L$
 	</text>
 	<line_editor name="currency_amt">
 		1234
 	</line_editor>
 	<text name="currency_est" width="138">
-		pour environ [USD] $US
+		pour environ [USD] US$
 	</text>
 	<text name="getting_data" width="138">
 		Obtention des données...
@@ -38,19 +38,19 @@
 		Actuellement, vous avez
 	</text>
 	<text name="balance_amount">
-		[AMT] $L
+		[AMT] L$
 	</text>
 	<text name="buying_label">
 		Vous achetez
 	</text>
 	<text name="buying_amount">
-		[AMT] $L
+		[AMT] L$
 	</text>
 	<text name="total_label">
 		Votre solde sera de
 	</text>
 	<text name="total_amount">
-		[AMT] $L
+		[AMT] L$
 	</text>
 	<text name="purchase_warning_repurchase">
 		En confirmant cette transaction, vous achetez uniquement les devises.
@@ -60,9 +60,9 @@ Vous devrez recommencer cette opération.
 		Vous n&apos;achetez pas assez de devises.
 Veuillez saisir un montant plus élevé.
 	</text>
-	<button label="Acheter" name="buy_btn" />
-	<button label="Annuler" name="cancel_btn" />
+	<button label="Acheter" name="buy_btn"/>
+	<button label="Annuler" name="cancel_btn"/>
 	<string name="buy_currency">
-		Acheter [LINDENS] $L pour environ [USD] $US
+		Acheter [LINDENS] L$ pour environ [USD] US$
 	</string>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_land.xml b/indra/newview/skins/default/xui/fr/floater_buy_land.xml
index 9cdb3ad..a8a88df 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_land.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="buy land" title="Acheter le terrain">
 	<text name="region_name_label">
 		Région :
@@ -33,7 +33,7 @@
 	<text_editor name="covenant_editor">
 		Chargement en cours...
 	</text_editor>
-	<check_box label="J&apos;accepte le règlement ci-dessus." name="agree_covenant" />
+	<check_box label="J&apos;accepte le règlement ci-dessus." name="agree_covenant"/>
 	<text name="info_parcel_label">
 		Parcelle :
 	</text>
@@ -50,7 +50,7 @@
 		Prix :
 	</text>
 	<text name="info_price">
-		1500 $L, objets inclus
+		1500 L$, objets inclus
 	</text>
 	<text name="info_action">
 		Si vous achetez ce terrain :
@@ -58,7 +58,7 @@
 	<text name="error_message">
 		Quelque chose ne va pas.
 	</text>
-	<button label="Aller sur le site" name="error_web" />
+	<button label="Aller sur le site" name="error_web"/>
 	<text name="account_action">
 		Vous passerez à un compte Premium.
 	</text>
@@ -67,44 +67,43 @@
 	</text>
 	<combo_box name="account_level">
 		<combo_item name="US$9.95/month,billedmonthly">
-			9,95 $US/mois, facturation mensuelle
+			9,95 US$/mois, facturation mensuelle
 		</combo_item>
 		<combo_item name="US$7.50/month,billedquarterly">
-			7,50 $US/mois, facturation trimestrielle
+			7,50 US$/mois, facturation trimestrielle
 		</combo_item>
 		<combo_item name="US$6.00/month,billedannually">
-			6,00 $US/mois, facturation annuelle
+			6,00 US$/mois, facturation annuelle
 		</combo_item>
 	</combo_box>
 	<text name="land_use_action">
-		Augmentez vos frais d&apos;occupation de terrain à 40 $US/mois.
+		Augmentez vos frais d&apos;occupation de terrain à 40 US$/mois.
 	</text>
 	<text name="land_use_reason">
 		Vous possédez un terrain de 1,309 mètres carrés. 
 Cette parcelle fait 512 mètres carrés.
 	</text>
 	<text name="purchase_action">
-		Payez au résident X 4 000 $L pour le terrain
+		Payez au résident X 4 000 L$ pour le terrain
 	</text>
 	<text name="currency_reason">
-		Vous avez 2 100 $L.
+		Vous avez 2 100 L$.
 	</text>
 	<text name="currency_action">
-		Acheter des $L
+		Acheter des L$
 	</text>
 	<line_editor name="currency_amt">
 		1000
 	</line_editor>
 	<text name="currency_est">
-		pour environ [AMOUNT2] $US
+		pour environ [AMOUNT2] US$
 	</text>
 	<text name="currency_balance">
-		Vous avez 2 100 $L.
+		Vous avez 2 100 L$.
 	</text>
-	<check_box label="Supprimer [AMOUNT] mètres carrés de votre contribution au groupe."
-	     name="remove_contribution" />
-	<button label="Acheter" name="buy_btn" />
-	<button label="Annuler" name="cancel_btn" />
+	<check_box label="Supprimer [AMOUNT] mètres carrés de votre contribution au groupe." name="remove_contribution"/>
+	<button label="Acheter" name="buy_btn"/>
+	<button label="Annuler" name="cancel_btn"/>
 	<text name="can_resell">
 		Peut être revendu.
 	</text>
@@ -184,20 +183,20 @@ et la seule fois où vous pouvez acheter une parcelle &apos;Premier Terrain&apos
 	</text>
 	<text name="first_time_but_not_first_land">
 		Ceci est votre première acquisition de terrain, mais cette
-parcelle n&apos;est pas réservée aux nouveaux acheteurs.  Vous devriez
-peut-être chercher une parcelle &apos;Premier Terrain&apos; moins chère.
+parcelle n&apos;est pas réservée aux nouveaux acheteurs. Vous devriez
+peut-être chercher une parcelle Premier Terrain moins chère.
 	</text>
 	<text name="land_holdings">
-		Vous possédez un terrain de [BUYER] mètres carrés.
+		Vous possédez un terrain de [BUYER] m².
 	</text>
 	<text name="pay_to_for_land">
-		Payez [AMOUNT] $L à [SELLER] pour ce terrain
+		Payez [AMOUNT] L$ à [SELLER] pour ce terrain
 	</text>
 	<text name="buy_for_US">
-		Acheter [AMOUNT] $L pour environ [AMOUNT2] $US,
+		Acheter [AMOUNT] L$ pour environ [AMOUNT2] US$,
 	</text>
 	<text name="parcel_meters">
-		Cette parcelle fait [AMOUNT] mètres carrés.
+		Cette parcelle fait [AMOUNT] m².
 	</text>
 	<text name="premium_land">
 		Ce terrain est premium et les frais associés sont de [AMOUNT]/m².
@@ -215,21 +214,21 @@ peut-être chercher une parcelle &apos;Premier Terrain&apos; moins chère.
 		Ce groupe, [GROUP], aura besoin de suffisamment de crédit pour payer les frais d&apos;occupation de terrain avant que l&apos;achat de cette parcelle ne soit finalisé.
 	</text>
 	<text name="have_enough_lindens">
-		Vous avez [AMOUNT]$L, ce qui est suffisant pour acheter ce terrain.
+		Vous avez [AMOUNT]L$, ce qui est suffisant pour acheter ce terrain.
 	</text>
 	<text name="not_enough_lindens">
-		Vous n&apos;avez que [AMOUNT] $L et vous avez besoin de [AMOUNT2] $L de plus.
+		Vous n&apos;avez que [AMOUNT] L$ et vous avez besoin de [AMOUNT2] L$ de plus.
 	</text>
 	<text name="balance_left">
-		Après cet achat, il vous restera [AMOUNT] $L.
+		Après cet achat, il vous restera [AMOUNT] L$.
 	</text>
 	<text name="balance_needed">
-		Pour avoir les moyens d&apos;acquérir ce terrain, vous devez acheter au moins [AMOUNT] $L.
+		Pour avoir les moyens d&apos;acquérir ce terrain, vous devez acheter au moins [AMOUNT] L$.
 	</text>
 	<string name="no_parcel_selected">
 		(aucune parcelle sélectionnée)
 	</string>
 	<string name="buy_currency">
-		Acheter [LINDENS] $L pour environ [USD] $US
+		Acheter [LINDENS] L$ pour environ [USD] US$
 	</string>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_object.xml b/indra/newview/skins/default/xui/fr/floater_buy_object.xml
index 9cdb72e..2bbbbc9 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_object.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="contents" title="Acheter une copie de l&apos;objet">
 	<text name="contents_text">
 		et ses contenus :
 	</text>
 	<text name="buy_text">
-		Acheter pour [AMOUNT] $L à [NAME] ?
+		Acheter pour [AMOUNT] L$ à [NAME] ?
 	</text>
-	<button label="Annuler" label_selected="Annuler" name="cancel_btn" />
-	<button label="Acheter" label_selected="Acheter" name="buy_btn" />
+	<button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
+	<button label="Acheter" label_selected="Acheter" name="buy_btn"/>
 	<string name="title_buy_text">
 		Acheter
 	</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_chat_history.xml b/indra/newview/skins/default/xui/fr/floater_chat_history.xml
index 0f6633c..705bf97 100644
--- a/indra/newview/skins/default/xui/fr/floater_chat_history.xml
+++ b/indra/newview/skins/default/xui/fr/floater_chat_history.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="chat floater" title="Chat local">
 	<string name="ringing">
 		Connexion au chat vocal du Monde en cours…
@@ -10,16 +10,16 @@
 		Voix non disponible à l&apos;endroit où vous êtes
 	</string>
 	<string name="hang_up">
-		Déconnecté du chat vocal du Monde
+		Déconnecté du chat vocal
 	</string>
 	<string name="voice_icon">
 		icn_voice-localchat.tga
 	</string>
 	<string name="IM_logging_string">
-		-- Connexion de messagerie instantanée activée --
+		-- Archivage des IM activé --
 	</string>
 	<string name="IM_end_log_string">
-		- Fin da la connexion --
+		- Fin de l&apos;archivage --
 	</string>
 	<layout_stack name="panels">
 		<layout_panel name="im_contents_panel">
@@ -28,14 +28,13 @@
 					Gestes
 				</combo_item>
 			</combo_box>
-			<check_box label="Afficher le texte ignoré" name="show mutes" />
-			<button label="&lt; &lt;" label_selected="&gt; &gt;" name="toggle_active_speakers_btn"
-			     tool_tip="Cliquez ici pour voir la liste des intervenants actifs dans cette session IM." />
+			<check_box label="Afficher le texte ignoré" name="show mutes"/>
+			<button label="&lt; &lt;" label_selected="&gt; &gt;" name="toggle_active_speakers_btn" tool_tip="Affichez/masquez la liste des intervenants actifs dans cette session IM."/>
 			<panel name="chat_panel">
 				<string name="gesture_label">
 					Gestes
 				</string>
-				<line_editor label="Cliquez ici pour chatter." name="Chat Editor" />
+				<line_editor label="Cliquez ici pour chatter." name="Chat Editor"/>
 				<flyout_button label="Dire" name="Say" tool_tip="(Entrée)">
 					<flyout_button_item name="shout_item">
 						Crier
diff --git a/indra/newview/skins/default/xui/fr/floater_color_picker.xml b/indra/newview/skins/default/xui/fr/floater_color_picker.xml
index b21e1b3..f6c210c 100644
--- a/indra/newview/skins/default/xui/fr/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/fr/floater_color_picker.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="ColorPicker" title="Sélecteur de couleurs">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="ColorPicker" title="Choix de texture et de couleur">
 	<text name="r_val_text">
 		Rouge :
 	</text>
@@ -18,14 +18,14 @@
 	<text name="l_val_text">
 		Lum :
 	</text>
-	<check_box label="Appliquer immédiatement" name="apply_immediate" left="4" width="108"/>
-	<button label="" label_selected="" name="color_pipette" left_delta="138"/>
-	<button label="Annuler" label_selected="Annuler" name="cancel_btn" />
-	<button label="Sélectionner" label_selected="Sélectionner" name="select_btn" />
-	<text name="Current color:" left="8">
+	<check_box label="Application auto" left="4" name="apply_immediate" width="108"/>
+	<button label="" label_selected="" left_delta="138" name="color_pipette"/>
+	<button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
+	<button label="Sélectionner" label_selected="Sélectionner" name="select_btn"/>
+	<text left="8" name="Current color:">
 		Couleur actuelle :
 	</text>
-	<text name="(Drag below to save.)" left="8" width="114">
+	<text left="8" name="(Drag below to save.)" width="114">
 		(Faire glisser dessous
 pour enregistrer.)
 	</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_customize.xml b/indra/newview/skins/default/xui/fr/floater_customize.xml
index 24b5054..9985a17 100644
--- a/indra/newview/skins/default/xui/fr/floater_customize.xml
+++ b/indra/newview/skins/default/xui/fr/floater_customize.xml
@@ -1,525 +1,449 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="floater customize" title="Apparence" width="511">
 	<tab_container name="customize tab container" tab_min_width="113" width="509">
-		<panel label="Parties du corps" />
-		<panel label="Parties du corps" name="body_parts_placeholder" />
+		<panel label="Parties du corps"/>
+		<panel label="Parties du corps" name="body_parts_placeholder"/>
 		<panel label="Silhouette" left="119" name="Shape" width="389">
-			<button label="Créer une silhouette" label_selected="Créer une silhouette"
-			     name="Create New" width="140" />
-			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" />
-			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save"
-			     width="82" />
-			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188"
-			     name="Save As" width="105" />
-			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
-			     width="82" />
-			<button label="Corps" label_selected="Corps" name="Body" />
-			<button label="Tête" label_selected="Tête" name="Head" />
-			<button label="Yeux" label_selected="Yeux" name="Eyes" />
-			<button label="Oreilles" label_selected="Oreilles" name="Ears" />
-			<button label="Nez" label_selected="Nez" name="Nose" />
-			<button label="Bouche" label_selected="Bouche" name="Mouth" />
-			<button label="Menton" label_selected="Menton" name="Chin" />
-			<button label="Torse" label_selected="Torse" name="Torso" />
-			<button label="Jambes" label_selected="Jambes" name="Legs" />
-			<button label="Aléatoire" label_selected="Aléatoire" name="Randomize" />
-			<text type="string" length="1" name="title">
+			<button label="Créer une silhouette" label_selected="Créer une silhouette" name="Create New" width="140"/>
+			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
+			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
+			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
+			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
+			<button label="Corps" label_selected="Corps" name="Body"/>
+			<button label="Tête" label_selected="Tête" name="Head"/>
+			<button label="Yeux" label_selected="Yeux" name="Eyes"/>
+			<button label="Oreilles" label_selected="Oreilles" name="Ears"/>
+			<button label="Nez" label_selected="Nez" name="Nose"/>
+			<button label="Bouche" label_selected="Bouche" name="Mouth"/>
+			<button label="Menton" label_selected="Menton" name="Chin"/>
+			<button label="Torse" label_selected="Torse" name="Torso"/>
+			<button label="Jambes" label_selected="Jambes" name="Legs"/>
+			<button label="Aléatoire" label_selected="Aléatoire" name="Randomize"/>
+			<text length="1" name="title" type="string">
 				[DESC]
 			</text>
-			<text type="string" length="1" name="title_no_modify">
+			<text length="1" name="title_no_modify" type="string">
 				[DESC]: impossible de modifier
 			</text>
-			<text type="string" length="1" name="title_loading">
+			<text length="1" name="title_loading" type="string">
 				[DESC]: en cours de chargement...
 			</text>
-			<text type="string" length="1" name="title_not_worn">
+			<text length="1" name="title_not_worn" type="string">
 				[DESC]: non portée
 			</text>
-			<text type="string" length="1" name="path">
+			<text length="1" name="path" type="string">
 				Emplacement : [PATH]
 			</text>
-			<text type="string" length="1" name="not worn instructions">
+			<text length="1" name="not worn instructions" type="string">
 				Pour changer de silhouette, faites-en glisser une à partir de votre
-inventaire. jusqu&apos;à votre avatar. L&apos;autre possibilité est d&apos;en créer
+inventaire jusqu&apos;à votre avatar. Vous pouvez aussi en créer une nouvelle et la porter.
 une nouvelle et de la porter.
 			</text>
-			<text type="string" length="1" name="no modify instructions">
+			<text length="1" name="no modify instructions" type="string">
 				Vous n&apos;avez pas la permission de modifier cet objet.
 			</text>
 			<radio_group name="sex radio">
-				<radio_item type="string" length="1" name="radio">
+				<radio_item length="1" name="radio" type="string">
 					Femme
 				</radio_item>
-				<radio_item type="string" length="1" name="radio2">
+				<radio_item length="1" name="radio2" type="string">
 					Homme
 				</radio_item>
 			</radio_group>
 		</panel>
 		<panel label="Peau" name="Skin">
-			<button label="Créer une peau" label_selected="Créer une peau" name="Create New" />
-			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" />
-			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save"
-			     width="82" />
-			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188"
-			     name="Save As" width="105" />
-			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
-			     width="82" />
-			<button label="Couleur" label_selected="Couleur" name="Skin Color" width="84" />
-			<button label="Détails visage" label_selected="Détails visage" name="Face Detail"
-			     width="84" />
-			<button label="Maquillage" label_selected="Maquillage" name="Makeup" width="84" />
-			<button label="Détails corps" label_selected="Détails corps" name="Body Detail"
-			     width="84" />
-			<button label="Aléatoire" label_selected="Aléatoire" name="Randomize" width="84" />
-			<text type="string" length="1" name="title">
+			<button label="Créer une peau" label_selected="Créer une peau" name="Create New"/>
+			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
+			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
+			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
+			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
+			<button label="Couleur" label_selected="Couleur" name="Skin Color" width="84"/>
+			<button label="Détails visage" label_selected="Détails visage" name="Face Detail" width="84"/>
+			<button label="Maquillage" label_selected="Maquillage" name="Makeup" width="84"/>
+			<button label="Détails corps" label_selected="Détails corps" name="Body Detail" width="84"/>
+			<button label="Aléatoire" label_selected="Aléatoire" name="Randomize" width="84"/>
+			<text length="1" name="title" type="string">
 				[DESC]
 			</text>
-			<text type="string" length="1" name="title_no_modify">
+			<text length="1" name="title_no_modify" type="string">
 				[DESC]: impossible de modifier
 			</text>
-			<text type="string" length="1" name="title_loading">
+			<text length="1" name="title_loading" type="string">
 				[DESC]: en cours de chargement...
 			</text>
-			<text type="string" length="1" name="title_not_worn">
+			<text length="1" name="title_not_worn" type="string">
 				[DESC]: non portée
 			</text>
-			<text type="string" length="1" name="path">
+			<text length="1" name="path" type="string">
 				Emplacement : [PATH]
 			</text>
-			<text type="string" length="1" name="not worn instructions">
+			<text length="1" name="not worn instructions" type="string">
 				Pour changer de peau, faites-en glisser une à partir de votre inventaire.
-L&apos;autre possibilité est d&apos;en créer une nouvelle et de la porter.
+Vous pouvez aussi en créer une nouvelle et la porter.
 			</text>
-			<text type="string" length="1" name="no modify instructions">
+			<text length="1" name="no modify instructions" type="string">
 				Vous n&apos;avez pas la permission de modifier cet objet.
 			</text>
-			<texture_picker label="Tatouages tête" name="Head Tattoos"
-			     tool_tip="Cliquez pour sélectionner une image" width="78" />
-			<texture_picker label="Tatouages haut" name="Upper Tattoos"
-			     tool_tip="Cliquez pour sélectionner une image" width="78" />
-			<texture_picker label="Tatouages bas" name="Lower Tattoos"
-			     tool_tip="Cliquez pour sélectionner une image" width="78" />
+			<texture_picker label="Tatouages tête" name="Head Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
+			<texture_picker label="Tatouages haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
+			<texture_picker label="Tatouages bas" name="Lower Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
 		</panel>
 		<panel label="Cheveux" name="Hair">
-			<button label="Créer des cheveux" label_selected="Créer des cheveux"
-			     name="Create New" />
-			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" />
-			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save"
-			     width="82" />
-			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188"
-			     name="Save As" width="105" />
-			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
-			     width="82" />
-			<button label="Couleur" label_selected="Couleur" name="Color" />
-			<button label="Style" label_selected="Style" name="Style" />
-			<button label="Sourcils" label_selected="Sourcils" name="Eyebrows" />
-			<button label="Pilosité" label_selected="Pilosité" name="Facial" />
-			<button label="Aléatoire" label_selected="Aléatoire" name="Randomize" />
-			<text type="string" length="1" name="title">
+			<button label="Créer des cheveux" label_selected="Créer des cheveux" name="Create New"/>
+			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
+			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
+			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
+			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
+			<button label="Couleur" label_selected="Couleur" name="Color"/>
+			<button label="Style" label_selected="Style" name="Style"/>
+			<button label="Sourcils" label_selected="Sourcils" name="Eyebrows"/>
+			<button label="Pilosité" label_selected="Pilosité" name="Facial"/>
+			<button label="Aléatoire" label_selected="Aléatoire" name="Randomize"/>
+			<text length="1" name="title" type="string">
 				[DESC]
 			</text>
-			<text type="string" length="1" name="title_no_modify">
+			<text length="1" name="title_no_modify" type="string">
 				[DESC]: impossible de modifier
 			</text>
-			<text type="string" length="1" name="title_loading">
+			<text length="1" name="title_loading" type="string">
 				[DESC]: en cours de chargement...
 			</text>
-			<text type="string" length="1" name="title_not_worn">
+			<text length="1" name="title_not_worn" type="string">
 				[DESC]: non portés
 			</text>
-			<text type="string" length="1" name="path">
+			<text length="1" name="path" type="string">
 				Emplacement : [PATH]
 			</text>
-			<text type="string" length="1" name="not worn instructions">
+			<text length="1" name="not worn instructions" type="string">
 				Pour changer de chevelure, faites-en glisser une de votre inventaire
-jusqu&apos;à votre avatar. L&apos;autre possibilité est d&apos;en créer une
-nouvelle et de la porter.
+jusqu&apos;à votre avatar. Vous pouvez aussi en créer une
+nouvelle et la porter.
 			</text>
-			<text type="string" length="1" name="no modify instructions">
+			<text length="1" name="no modify instructions" type="string">
 				Vous n&apos;avez pas la permission de modifier cet objet.
 			</text>
-			<texture_picker label="Texture" name="Texture" tool_tip="Cliquez pour sélectionner une image" />
+			<texture_picker label="Texture" name="Texture" tool_tip="Cliquez pour sélectionner une image"/>
 		</panel>
 		<panel label="Yeux" name="Eyes">
-			<button label="Créer des yeux" label_selected="Créer des yeux" name="Create New" />
-			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" />
-			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save"
-			     width="82" />
-			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188"
-			     name="Save As" width="105" />
-			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
-			     width="82" />
-			<button label="Aléatoire" label_selected="Aléatoire" name="Randomize" />
-			<text type="string" length="1" name="title">
+			<button label="Créer des yeux" label_selected="Créer des yeux" name="Create New"/>
+			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
+			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
+			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
+			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
+			<button label="Aléatoire" label_selected="Aléatoire" name="Randomize"/>
+			<text length="1" name="title" type="string">
 				[DESC]
 			</text>
-			<text type="string" length="1" name="title_no_modify">
+			<text length="1" name="title_no_modify" type="string">
 				[DESC]: impossible de modifier
 			</text>
-			<text type="string" length="1" name="title_loading">
+			<text length="1" name="title_loading" type="string">
 				[DESC]: en cours de chargement...
 			</text>
-			<text type="string" length="1" name="title_not_worn">
+			<text length="1" name="title_not_worn" type="string">
 				[DESC]: non portés
 			</text>
-			<text type="string" length="1" name="path">
+			<text length="1" name="path" type="string">
 				Emplacement : [PATH]
 			</text>
-			<text type="string" length="1" name="not worn instructions">
+			<text length="1" name="not worn instructions" type="string">
 				Pour changer vos yeux, faites-les glisser de votre inventaire
-jusqu&apos;à votre avatar. L&apos;autre possibilité est
-d&apos;en créer de nouveaux et de les porter.
+jusqu&apos;à votre avatar. Vous pouvez aussi en créer de nouveaux et les porter.
 			</text>
-			<text type="string" length="1" name="no modify instructions">
+			<text length="1" name="no modify instructions" type="string">
 				Vous n&apos;avez pas la permission de modifier cet objet.
 			</text>
-			<texture_picker label="Iris" name="Iris" tool_tip="Cliquez pour sélectionner une image" />
+			<texture_picker label="Iris" name="Iris" tool_tip="Cliquez pour sélectionner une image"/>
 		</panel>
-		<panel label="Vêtements" />
-		<panel label="Habits" name="clothes_placeholder" />
+		<panel label="Vêtements"/>
+		<panel label="Habits" name="clothes_placeholder"/>
 		<panel label="Chemise" name="Shirt">
-			<button label="Créer une chemise" label_selected="Créer une chemise"
-			     name="Create New" />
-			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" />
-			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save"
-			     width="82" />
-			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188"
-			     name="Save As" width="105" />
-			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
-			     width="82" />
-			<text type="string" length="1" name="title">
+			<button label="Créer une chemise" label_selected="Créer une chemise" name="Create New"/>
+			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
+			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
+			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
+			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
+			<text length="1" name="title" type="string">
 				[DESC]
 			</text>
-			<text type="string" length="1" name="title_no_modify">
+			<text length="1" name="title_no_modify" type="string">
 				[DESC]: impossible de modifier
 			</text>
-			<text type="string" length="1" name="title_loading">
+			<text length="1" name="title_loading" type="string">
 				[DESC]: en cours de chargement...
 			</text>
-			<text type="string" length="1" name="title_not_worn">
-				[DESC]: non porté
+			<text length="1" name="title_not_worn" type="string">
+				[DESC]: non portée
 			</text>
-			<text type="string" length="1" name="path">
+			<text length="1" name="path" type="string">
 				Emplacement : [PATH]
 			</text>
-			<text type="string" length="1" name="not worn instructions">
+			<text length="1" name="not worn instructions" type="string">
 				Pour changer de chemise, faites-en glisser une de votre inventaire
-jusqu&apos;à votre avatar. L&apos;autre possibilité est
-d&apos;en créer une nouvelle et de la porter.
+jusqu&apos;à votre avatar. Vous pouvez aussi en créer une nouvelle et la porter.
 			</text>
-			<text type="string" length="1" name="no modify instructions">
+			<text length="1" name="no modify instructions" type="string">
 				Vous n&apos;avez pas la permission de modifier cet objet.
 			</text>
-			<color_swatch label="Couleur/Teinte" name="Color/Tint"
-			     tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" />
-			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
-			     width="74" />
+			<color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
+			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
 		</panel>
 		<panel label="Pantalon" name="Pants">
-			<button label="Créer un pantalon" label_selected="Créer un pantalon"
-			     name="Create New" />
-			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" />
-			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save"
-			     width="82" />
-			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188"
-			     name="Save As" width="105" />
-			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
-			     width="82" />
-			<text type="string" length="1" name="title">
+			<button label="Créer un pantalon" label_selected="Créer un pantalon" name="Create New"/>
+			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
+			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
+			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
+			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
+			<text length="1" name="title" type="string">
 				[DESC]
 			</text>
-			<text type="string" length="1" name="title_no_modify">
+			<text length="1" name="title_no_modify" type="string">
 				[DESC]: impossible de modifier
 			</text>
-			<text type="string" length="1" name="title_loading">
+			<text length="1" name="title_loading" type="string">
 				[DESC]: en cours de chargement...
 			</text>
-			<text type="string" length="1" name="title_not_worn">
+			<text length="1" name="title_not_worn" type="string">
 				[DESC]: non porté
 			</text>
-			<text type="string" length="1" name="path">
+			<text length="1" name="path" type="string">
 				Emplacement : [PATH]
 			</text>
-			<text type="string" length="1" name="not worn instructions">
+			<text length="1" name="not worn instructions" type="string">
 				Pour changer de pantalon, faites-en glisser un de votre inventaire
-jusqu&apos;à votre avatar. L&apos;autre possibilité est
-d&apos;en créer un nouveau et de le porter.
+jusqu&apos;à votre avatar. Vous pouvez aussi en créer un nouveau et le porter.
 			</text>
-			<text type="string" length="1" name="no modify instructions">
+			<text length="1" name="no modify instructions" type="string">
 				Vous n&apos;avez pas la permission de modifier cet objet.
 			</text>
-			<color_swatch label="Couleur/Teinte" name="Color/Tint"
-			     tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" />
-			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
-			     width="74" />
+			<color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
+			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
 		</panel>
 		<panel label="Chaussures" name="Shoes">
-			<button label="Créer des chaussures" label_selected="Créer des chaussures"
-			     name="Create New" width="140" />
-			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" />
-			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save"
-			     width="82" />
-			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188"
-			     name="Save As" width="105" />
-			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
-			     width="82" />
-			<text type="string" length="1" name="title">
+			<button label="Créer des chaussures" label_selected="Créer des chaussures" name="Create New" width="140"/>
+			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
+			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
+			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
+			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
+			<text length="1" name="title" type="string">
 				[DESC]
 			</text>
-			<text type="string" length="1" name="title_no_modify">
+			<text length="1" name="title_no_modify" type="string">
 				[DESC]: impossible de modifier
 			</text>
-			<text type="string" length="1" name="title_loading">
+			<text length="1" name="title_loading" type="string">
 				[DESC]: en cours de chargement...
 			</text>
-			<text type="string" length="1" name="title_not_worn">
+			<text length="1" name="title_not_worn" type="string">
 				[DESC]: non portées
 			</text>
-			<text type="string" length="1" name="path">
+			<text length="1" name="path" type="string">
 				Emplacement : [PATH]
 			</text>
-			<text type="string" length="1" name="not worn instructions">
+			<text length="1" name="not worn instructions" type="string">
 				Pour changer de chaussures, faites-en glisser une paire de votre
-inventaire jusqu&apos;à votre avatar. L&apos;autre possibilité est d&apos;en créer une
-nouvelle paire et de la porter.
+inventaire jusqu&apos;à votre avatar. Vous pouvez aussi en créer une
+nouvelle paire et la porter.
 			</text>
-			<text type="string" length="1" name="no modify instructions">
+			<text length="1" name="no modify instructions" type="string">
 				Vous n&apos;avez pas la permission de modifier cet objet.
 			</text>
-			<color_swatch label="Couleur/Teinte" name="Color/Tint"
-			     tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" />
-			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
-			     width="74" />
+			<color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
+			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
 		</panel>
 		<panel label="Chaussettes" name="Socks">
-			<button label="Créer des chaussettes" label_selected="Créer des chaussettes"
-			     name="Create New" width="140" />
-			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" />
-			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save"
-			     width="82" />
-			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188"
-			     name="Save As" width="105" />
-			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
-			     width="82" />
-			<text type="string" length="1" name="title">
+			<button label="Créer des chaussettes" label_selected="Créer des chaussettes" name="Create New" width="140"/>
+			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
+			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
+			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
+			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
+			<text length="1" name="title" type="string">
 				[DESC]
 			</text>
-			<text type="string" length="1" name="title_no_modify">
+			<text length="1" name="title_no_modify" type="string">
 				[DESC]: impossible de modifier
 			</text>
-			<text type="string" length="1" name="title_loading">
+			<text length="1" name="title_loading" type="string">
 				[DESC]: en cours de chargement...
 			</text>
-			<text type="string" length="1" name="title_not_worn">
+			<text length="1" name="title_not_worn" type="string">
 				[DESC]: non portées
 			</text>
-			<text type="string" length="1" name="path">
+			<text length="1" name="path" type="string">
 				Emplacement : [PATH]
 			</text>
-			<text type="string" length="1" name="not worn instructions">
+			<text length="1" name="not worn instructions" type="string">
 				Pour changer de chaussettes, faites-en glisser une paire de votre
-inventaire jusqu&apos;à votre avatar. L&apos;autre possibilité est d&apos;en créer une
-nouvelle paire et de la porter.
+inventaire jusqu&apos;à votre avatar. Vous pouvez aussi en créer une
+nouvelle paire et la porter.
 			</text>
-			<text type="string" length="1" name="no modify instructions">
+			<text length="1" name="no modify instructions" type="string">
 				Vous n&apos;avez pas la permission de modifier cet objet.
 			</text>
-			<color_swatch label="Couleur/Teinte" name="Color/Tint"
-			     tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" />
-			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
-			     width="74" />
+			<color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
+			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
 		</panel>
 		<panel label="Veste" name="Jacket">
-			<button label="Créer une veste" label_selected="Créer une veste" name="Create New" />
-			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" />
-			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save"
-			     width="82" />
-			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188"
-			     name="Save As" width="105" />
-			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
-			     width="82" />
-			<text type="string" length="1" name="title">
+			<button label="Créer une veste" label_selected="Créer une veste" name="Create New"/>
+			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
+			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
+			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
+			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
+			<text length="1" name="title" type="string">
 				[DESC]
 			</text>
-			<text type="string" length="1" name="title_no_modify">
+			<text length="1" name="title_no_modify" type="string">
 				[DESC]: impossible de modifier
 			</text>
-			<text type="string" length="1" name="title_loading">
+			<text length="1" name="title_loading" type="string">
 				[DESC]: en cours de chargement...
 			</text>
-			<text type="string" length="1" name="title_not_worn">
+			<text length="1" name="title_not_worn" type="string">
 				[DESC]: non portée
 			</text>
-			<text type="string" length="1" name="path">
+			<text length="1" name="path" type="string">
 				Emplacement : [PATH]
 			</text>
-			<text type="string" length="1" name="not worn instructions">
+			<text length="1" name="not worn instructions" type="string">
 				Pour changer de veste, faites-en glisser une de votre inventaire
-jusqu&apos;à votre avatar. L&apos;autre possibilité est d&apos;en créer une
-nouvelle et de la porter.
+jusqu&apos;à votre avatar. Vous pouvez aussi en créer une
+nouvelle et la porter.
 			</text>
-			<text type="string" length="1" name="no modify instructions">
+			<text length="1" name="no modify instructions" type="string">
 				Vous n&apos;avez pas la permission de modifier cet objet.
 			</text>
-			<color_swatch label="Couleur/Teinte" name="Color/Tint"
-			     tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="81" />
-			<texture_picker label="Tissu (dessus)" name="Upper Fabric"
-			     tool_tip="Cliquez pour sélectionner une image" width="81" />
-			<texture_picker label="Tissu (dessous)" name="Lower Fabric"
-			     tool_tip="Cliquez pour sélectionner une image" width="81" />
+			<color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="81"/>
+			<texture_picker label="Tissu (dessus)" name="Upper Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/>
+			<texture_picker label="Tissu (dessous)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/>
 		</panel>
 		<panel label="Gants" name="Gloves">
-			<button label="Créer des gants" label_selected="Créer des gants" name="Create New" />
-			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" />
-			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save"
-			     width="82" />
-			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188"
-			     name="Save As" width="105" />
-			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
-			     width="82" />
-			<text type="string" length="1" name="title">
+			<button label="Créer des gants" label_selected="Créer des gants" name="Create New"/>
+			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
+			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
+			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
+			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
+			<text length="1" name="title" type="string">
 				[DESC]
 			</text>
-			<text type="string" length="1" name="title_no_modify">
+			<text length="1" name="title_no_modify" type="string">
 				[DESC]: impossible de modifier
 			</text>
-			<text type="string" length="1" name="title_loading">
+			<text length="1" name="title_loading" type="string">
 				[DESC]: en cours de chargement...
 			</text>
-			<text type="string" length="1" name="title_not_worn">
+			<text length="1" name="title_not_worn" type="string">
 				[DESC]: non portés
 			</text>
-			<text type="string" length="1" name="path">
+			<text length="1" name="path" type="string">
 				Emplacement : [PATH]
 			</text>
-			<text type="string" length="1" name="not worn instructions">
+			<text length="1" name="not worn instructions" type="string">
 				Pour changer de gants, faites-en glisser une paire à partir de votre
-inventaire. L&apos;autre possibilité est d&apos;en créer une nouvelle paire
-et de la porter.
+inventaire. Vous pouvez aussi en créer une nouvelle paire
+et la porter.
 			</text>
-			<text type="string" length="1" name="no modify instructions">
+			<text length="1" name="no modify instructions" type="string">
 				Vous n&apos;avez pas la permission de modifier cet objet.
 			</text>
-			<color_swatch label="Couleur/Teinte" name="Color/Tint"
-			     tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" />
-			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
-			     width="74" />
+			<color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
+			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
 		</panel>
 		<panel label="Tricot de peau" name="Undershirt">
-			<button label="Créer un tricot de peau" label_selected="Créer un tricot"
-			     name="Create New" />
-			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" />
-			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save"
-			     width="82" />
-			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188"
-			     name="Save As" width="105" />
-			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
-			     width="82" />
-			<text type="string" length="1" name="title">
+			<button label="Créer un tricot de peau" label_selected="Créer un tricot" name="Create New"/>
+			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
+			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
+			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
+			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
+			<text length="1" name="title" type="string">
 				[DESC]
 			</text>
-			<text type="string" length="1" name="title_no_modify">
+			<text length="1" name="title_no_modify" type="string">
 				[DESC]: impossible de modifier
 			</text>
-			<text type="string" length="1" name="title_loading">
+			<text length="1" name="title_loading" type="string">
 				[DESC]: en cours de chargement...
 			</text>
-			<text type="string" length="1" name="title_not_worn">
+			<text length="1" name="title_not_worn" type="string">
 				[DESC]: non porté
 			</text>
-			<text type="string" length="1" name="path">
+			<text length="1" name="path" type="string">
 				Emplacement : [PATH]
 			</text>
-			<text type="string" length="1" name="not worn instructions">
+			<text length="1" name="not worn instructions" type="string">
 				Pour changer de tricot, faites-en glisser un à partir de votre inventaire.
-L&apos;autre possibilité est d&apos;en créer un nouveau et de le porter.
+Vous pouvez aussi en créer un nouveau et le porter.
 			</text>
-			<text type="string" length="1" name="no modify instructions">
+			<text length="1" name="no modify instructions" type="string">
 				Vous n&apos;avez pas la permission de modifier cet objet.
 			</text>
-			<color_swatch label="Couleur/Teinte" name="Color/Tint"
-			     tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" />
-			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
-			     width="74" />
+			<color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
+			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
 		</panel>
 		<panel label="Sous-vêtements" name="Underpants">
-			<button label="Créer des sous-vêtements" label_selected="Créer des sous-vêtements"
-			     name="Create New" />
-			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" />
-			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save"
-			     width="82" />
-			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188"
-			     name="Save As" width="105" />
-			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
-			     width="82" />
-			<text type="string" length="1" name="title">
+			<button label="Créer des sous-vêtements" label_selected="Créer des sous-vêtements" name="Create New"/>
+			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
+			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
+			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
+			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
+			<text length="1" name="title" type="string">
 				[DESC]
 			</text>
-			<text type="string" length="1" name="title_no_modify">
+			<text length="1" name="title_no_modify" type="string">
 				[DESC]: impossible de modifier
 			</text>
-			<text type="string" length="1" name="title_loading">
+			<text length="1" name="title_loading" type="string">
 				[DESC]: en cours de chargement...
 			</text>
-			<text type="string" length="1" name="title_not_worn">
+			<text length="1" name="title_not_worn" type="string">
 				[DESC]: non portés
 			</text>
-			<text type="string" length="1" name="path">
+			<text length="1" name="path" type="string">
 				Emplacement : [PATH]
 			</text>
-			<text type="string" length="1" name="not worn instructions">
-				Pour changer de sous-vêtement, faites-en glisser un à partir de votre
-inventaire. L&apos;autre possibilité est d&apos;en créer un nouveau et de le porter.
+			<text length="1" name="not worn instructions" type="string">
+				Pour changer de sous-vêtement, faites-en glisser une paire à partir de votre
+inventaire. Vous pouvez aussi en créer des nouveaux et les porter.
 			</text>
-			<text type="string" length="1" name="no modify instructions">
+			<text length="1" name="no modify instructions" type="string">
 				Vous n&apos;avez pas la permission de modifier cet objet.
 			</text>
-			<color_swatch label="Couleur/Teinte" name="Color/Tint"
-			     tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" />
-			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
-			     width="74" />
+			<color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
+			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
 		</panel>
 		<panel label="Jupe" name="Skirt">
-			<button label="Créer une jupe" label_selected="Créer une jupe" name="Create New" />
-			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" />
-			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save"
-			     width="82" />
-			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188"
-			     name="Save As" width="105" />
-			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
-			     width="82" />
-			<text type="string" length="1" name="title">
+			<button label="Créer une jupe" label_selected="Créer une jupe" name="Create New"/>
+			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
+			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
+			<button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
+			<button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
+			<text length="1" name="title" type="string">
 				[DESC]
 			</text>
-			<text type="string" length="1" name="title_no_modify">
+			<text length="1" name="title_no_modify" type="string">
 				[DESC]: impossible de modifier
 			</text>
-			<text type="string" length="1" name="title_loading">
+			<text length="1" name="title_loading" type="string">
 				[DESC]: en cours de chargement...
 			</text>
-			<text type="string" length="1" name="title_not_worn">
+			<text length="1" name="title_not_worn" type="string">
 				[DESC]: non portée
 			</text>
-			<text type="string" length="1" name="path">
+			<text length="1" name="path" type="string">
 				Emplacement : [PATH]
 			</text>
-			<text type="string" length="1" name="not worn instructions">
+			<text length="1" name="not worn instructions" type="string">
 				Pour changer de jupe, faites-en glisser une à partir de votre inventaire.
-L&apos;autre possibilité est d&apos;en créer une nouvelle et de la porter.
+Vous pouvez aussi en créer une nouvelle et la porter.
 			</text>
-			<text type="string" length="1" name="no modify instructions">
+			<text length="1" name="no modify instructions" type="string">
 				Vous n&apos;avez pas la permission de modifier cet objet.
 			</text>
-			<color_swatch label="Couleur/Teinte" name="Color/Tint"
-			     tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" />
-			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
-			     width="74" />
+			<color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
+			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
 		</panel>
 	</tab_container>
-	<scroll_container left="214" name="panel_container" />
-	<button label="Créer un ensemble" label_selected="Créer un ensemble"
-	     name="Make Outfit" right="-252" width="115" />
-	<button label="Tout enregistrer" label_selected="Tout enregistrer" name="Save All"
-	     right="-131" width="115" />
-	<button label="Fermer" label_selected="Fermer" name="Close" width="115" />
+	<scroll_container left="214" name="panel_container"/>
+	<button label="Créer un ensemble" label_selected="Créer un ensemble" name="Make Outfit" right="-252" width="115"/>
+	<button label="Tout enregistrer" label_selected="Tout enregistrer" name="Save All" right="-131" width="115"/>
+	<button label="Fermer" label_selected="Fermer" name="Close" width="115"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_directory.xml b/indra/newview/skins/default/xui/fr/floater_directory.xml
index ce51ac4..b5df2db 100644
--- a/indra/newview/skins/default/xui/fr/floater_directory.xml
+++ b/indra/newview/skins/default/xui/fr/floater_directory.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="directory" title="Rechercher dans Second Life">
 	<tab_container name="Directory Tabs">
 		<panel label="Tout" name="find_all_panel">
@@ -8,13 +8,13 @@
 			<string name="not_found_text">
 				Aucun résultat.
 			</string>
-			<button label="Précédente" name="back_btn" />
-			<button label="Suivante" name="forward_btn" />
-			<line_editor label="Rechercher" name="search_editor" tool_tip="Rechercher dans Second Life" />
-			<button label="Rechercher" name="search_btn" width="80" />
+			<button label="Précédente" name="back_btn"/>
+			<button label="Suivante" name="forward_btn"/>
+			<line_editor label="Rechercher" name="search_editor" tool_tip="Rechercher dans Second Life"/>
+			<button label="Rechercher" name="search_btn" width="80"/>
 			<combo_box name="Category">
 				<combo_item name="AnyCategory">
-					Toute catégorie
+					Toutes catégories
 				</combo_item>
 				<combo_item name="Events">
 					Événements
@@ -23,16 +23,16 @@
 					Groupes
 				</combo_item>
 				<combo_item name="People">
-					Personnes
+					Résidents
 				</combo_item>
 				<combo_item name="Places">
-					Endroits
+					Lieux
 				</combo_item>
 				<combo_item name="Wiki">
 					Wiki
 				</combo_item>
 			</combo_box>
-			<check_box label="Inclure le contenu pour adultes" name="mature_check" />
+			<check_box label="Inclure le contenu pour adultes" name="mature_check"/>
 			<string name="loading_text">
 				Chargement en cours...
 			</string>
@@ -53,56 +53,55 @@
 			<string name="not_found_text">
 				Aucun résultat.
 			</string>
-			<button label="Parcourir" label_selected="Parcourir" name="Browse" />
+			<button label="Parcourir" label_selected="Parcourir" name="Browse"/>
 			<scroll_list name="results">
-				<column label="" name="icon" />
-				<column label="" name="type" />
-				<column label="Nom" name="name" />
-				<column label="Prix" name="price" />
+				<column label="" name="icon"/>
+				<column label="" name="type"/>
+				<column label="Nom" name="name"/>
+				<column label="Prix" name="price"/>
 			</scroll_list>
-			<button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev" />
-			<button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;" />
+			<button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev"/>
+			<button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;"/>
 			<text name="find" width="63">
 				Trouver :
 			</text>
-			<line_editor left_delta="51" name="name" width="128" />
-			<check_box label="Inclure le contenu pour adultes" name="incmature" />
+			<line_editor left_delta="51" name="name" width="128"/>
+			<check_box label="Inclure le contenu pour adultes" name="incmature"/>
 			<combo_box left="195" name="Category">
 				<combo_item name="AnyCategory">
-					Toute catégorie
+					Toutes catégories
 				</combo_item>
 				<combo_item name="Shopping">
 					Shopping
 				</combo_item>
 				<combo_item name="LandRental">
-					Terrain à louer
+					Terrains à louer
 				</combo_item>
 				<combo_item name="PropertyRental">
-					Propriété à louer
+					Propriétés à louer
 				</combo_item>
 				<combo_item name="SpecialAttraction">
-					Divertissements spéciaux
+					Divertissements
 				</combo_item>
 				<combo_item name="NewProducts">
 					Nouveaux produits
 				</combo_item>
 				<combo_item name="Employment">
-					Emploi
+					Emplois
 				</combo_item>
 				<combo_item name="Wanted">
 					Offres
 				</combo_item>
 				<combo_item name="Service">
-					Service
+					Services
 				</combo_item>
 				<combo_item name="Personal">
 					Rencontres
 				</combo_item>
 			</combo_box>
-			<button label="Rechercher" label_selected="Rechercher" name="Search" width="85" />
-			<button label="Passer une annonce…" label_selected="Passer une annonce…"
-			     name="Place an Ad..." width="135" />
-			<button label="Supprimer" label_selected="Supprimer" name="Delete" />
+			<button label="Rechercher" label_selected="Rechercher" name="Search" width="85"/>
+			<button label="Passer une annonce…" label_selected="Passer une annonce…" name="Place an Ad..." width="135"/>
+			<button label="Supprimer" label_selected="Supprimer" name="Delete"/>
 		</panel>
 		<panel label="Événements" name="events_panel">
 			<string name="searching_text">
@@ -112,15 +111,15 @@
 				Aucun résultat.
 			</string>
 			<scroll_list name="results">
-				<column label="" name="icon" />
-				<column label="" name="type" />
-				<column label="Nom" name="name" />
-				<column label="Heure (Californie)" name="date" width="115" />
-				<column label="" name="event_id" />
-				<column label="Heure" name="time" />
+				<column label="" name="icon"/>
+				<column label="" name="type"/>
+				<column label="Nom" name="name"/>
+				<column label="Heure (Californie)" name="date" width="115"/>
+				<column label="" name="event_id"/>
+				<column label="Heure" name="time"/>
 			</scroll_list>
-			<button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev" />
-			<button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;" />
+			<button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev"/>
+			<button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;"/>
 			<radio_group name="date_mode">
 				<radio_item name="current">
 					En cours et futurs
@@ -129,15 +128,12 @@
 					Date
 				</radio_item>
 			</radio_group>
-			<button label="&lt;&lt;" label_selected="&lt;&lt;" name="&lt;&lt;"
-			     tool_tip="Revenir en arrière d&apos;un jour" />
+			<button label="&lt;&lt;" label_selected="&lt;&lt;" name="&lt;&lt;" tool_tip="Revenir en arrière d&apos;un jour"/>
 			<text name="date_text">
 				6/6
 			</text>
-			<button label="&gt;&gt;" label_selected="&gt;&gt;" name="&gt;&gt;"
-			     tool_tip="Avancer d&apos;un jour" />
-			<button label="Aujourd&apos;hui" label_selected="Aujourd&apos;hui" name="Today"
-			     tool_tip="Afficher les événements qui ont lieu aujourd&apos;hui" />
+			<button label="&gt;&gt;" label_selected="&gt;&gt;" name="&gt;&gt;" tool_tip="Avancer d&apos;un jour"/>
+			<button label="Aujourd&apos;hui" label_selected="Aujourd&apos;hui" name="Today" tool_tip="Afficher les événements qui ont lieu aujourd&apos;hui"/>
 			<text name="text">
 				Catégorie :
 			</text>
@@ -149,7 +145,7 @@
 					Tout
 				</combo_item>
 				<combo_item name="Discussion">
-					Discussion
+					Discussions
 				</combo_item>
 				<combo_item name="Sports">
 					Sports
@@ -158,7 +154,7 @@
 					Musique live
 				</combo_item>
 				<combo_item name="Commercial">
-					Publicité
+					Publicités
 				</combo_item>
 				<combo_item name="Nightlife/Entertainment">
 					Divertissements/Soirées
@@ -182,21 +178,21 @@
 					Divers
 				</combo_item>
 			</combo_box>
-			<line_editor left="370" name="event_search_text" width="175" />
-			<check_box label="Inclure le contenu &#10;pour adultes" left="551" name="incmature" />
-			<button label="Rechercher" label_selected="Rechercher" left_delta="129" name="Search"
-			     tool_tip="Rechercher" />
-			<button label="Supprimer" label_selected="Supprimer" name="Delete" />
+			<line_editor left="370" name="event_search_text" width="175"/>
+			<check_box label="Inclure le contenu 
+pour adultes" left="551" name="incmature"/>
+			<button label="Rechercher" label_selected="Rechercher" left_delta="129" name="Search" tool_tip="Rechercher"/>
+			<button label="Supprimer" label_selected="Supprimer" name="Delete"/>
 		</panel>
-		<panel label="A la Une" name="showcase_panel">
+		<panel label="À la Une" name="showcase_panel">
 			<string name="searching_text">
 				Recherche en cours...
 			</string>
 			<string name="not_found_text">
 				Aucun résultat.
 			</string>
-			<button label="Précédente" name="back_btn" />
-			<button label="Suivante" name="forward_btn" />
+			<button label="Précédente" name="back_btn"/>
+			<button label="Suivante" name="forward_btn"/>
 			<string name="loading_text">
 				Chargement en cours...
 			</string>
@@ -218,21 +214,21 @@
 				Aucun résultat.
 			</string>
 			<scroll_list name="results">
-				<column label="" name="icon" />
-				<column label="" name="type" />
-				<column label="Nom" name="name" />
-				<column label="Prix en $L" name="price" width="75" />
-				<column label="Surface" name="area" width="65" />
-				<column label="$L/m²" name="per_meter" />
+				<column label="" name="icon"/>
+				<column label="" name="type"/>
+				<column label="Nom" name="name"/>
+				<column label="Prix en L$" name="price" width="75"/>
+				<column label="Surface" name="area" width="65"/>
+				<column label="L$/m²" name="per_meter"/>
 			</scroll_list>
-			<button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev" />
-			<button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;" />
+			<button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev"/>
+			<button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;"/>
 			<combo_box name="type" width="150">
 				<combo_item name="AllTypes">
 					Tous types
 				</combo_item>
 				<combo_item name="Auction">
-					Enchère
+					Enchères
 				</combo_item>
 				<combo_item name="MainlandSales">
 					À vendre - Continent
@@ -243,28 +239,27 @@
 			</combo_box>
 			<combo_box name="rating" width="150">
 				<combo_item name="PG&amp;Mature">
-					Public averti et adulte
+					Tout public et Adultes
 				</combo_item>
 				<combo_item name="PGonly">
-					Public averti uniquement
+					Tout public uniquement
 				</combo_item>
 				<combo_item name="Matureonly">
 					Adultes uniquement
 				</combo_item>
 			</combo_box>
-			<check_box label="Prix &lt;= $L" left="157" name="pricecheck" />
-			<check_box label="Surface &gt;= m²" left="157" name="areacheck" />
-			<line_editor left="251" name="priceedit" width="50" />
-			<line_editor left="251" name="areaedit" width="50" />
-			<button label="Rechercher" label_selected="Rechercher" left="306" name="Search"
-			     width="85" />
+			<check_box label="Prix &lt;= L$" left="157" name="pricecheck"/>
+			<check_box label="Surface &gt;= m²" left="157" name="areacheck"/>
+			<line_editor left="251" name="priceedit" width="50"/>
+			<line_editor left="251" name="areaedit" width="50"/>
+			<button label="Rechercher" label_selected="Rechercher" left="306" name="Search" width="85"/>
 			<text left="399" name="land" width="379">
-				Les terrains peuvent être achetés directement en dollars Linden (L$) ou
-aux enchères (en $L ou $US). Pour acheter directement, visitez le terrain
+				Vous pouvez acheter un terrain directement en dollars Linden (L$) ou
+aux enchères (en L$ ou US$). Pour acheter directement, visitez le terrain
 et cliquez sur le nom de l&apos;endroit dans la barre de titre.
 			</text>
 		</panel>
-		<panel label="Endroits" name="places_panel">
+		<panel label="Lieux" name="places_panel">
 			<string name="searching_text">
 				Recherche en cours...
 			</string>
@@ -272,24 +267,24 @@ et cliquez sur le nom de l&apos;endroit dans la barre de titre.
 				Aucun résultat.
 			</string>
 			<scroll_list name="results">
-				<column label="" name="icon" />
-				<column label="" name="type" />
-				<column label="Nom" name="name" />
-				<column label="Trafic" name="dwell" />
+				<column label="" name="icon"/>
+				<column label="" name="type"/>
+				<column label="Nom" name="name"/>
+				<column label="Trafic" name="dwell"/>
 			</scroll_list>
-			<button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev" />
-			<button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;" />
+			<button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev"/>
+			<button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;"/>
 			<text name="find" width="63">
 				Trouver :
 			</text>
-			<line_editor left_delta="51" name="name" width="128" />
-			<check_box label="Inclure les parcelles avec du contenu Adultes" name="incmature" />
+			<line_editor left_delta="51" name="name" width="128"/>
+			<check_box label="Inclure les parcelles avec du contenu Adultes" name="incmature"/>
 			<combo_box left="195" name="Category" width="170">
 				<combo_item name="AnyCategory">
-					Toute catégorie
+					Toutes catégories
 				</combo_item>
 				<combo_item name="LindenLocation">
-					Emplacement Linden
+					Appartenant aux Lindens
 				</combo_item>
 				<combo_item name="Adult">
 					Adultes
@@ -307,10 +302,10 @@ et cliquez sur le nom de l&apos;endroit dans la barre de titre.
 					Jeux
 				</combo_item>
 				<combo_item name="Hangout">
-					Endroit favori
+					Favoris
 				</combo_item>
 				<combo_item name="NewcomerFriendly">
-					Convivial pour les nouveaux
+					Accueil pour les nouveaux
 				</combo_item>
 				<combo_item name="Parks&amp;Nature">
 					Parcs et Nature
@@ -325,10 +320,9 @@ et cliquez sur le nom de l&apos;endroit dans la barre de titre.
 					Autre
 				</combo_item>
 			</combo_box>
-			<button label="Rechercher" label_selected="Rechercher" left_delta="178" name="Search"
-			     width="80" />
+			<button label="Rechercher" label_selected="Rechercher" left_delta="178" name="Search" width="80"/>
 		</panel>
-		<panel label="Personnes" name="people_panel">
+		<panel label="Résidents" name="people_panel">
 			<string name="searching_text">
 				Recherche en cours...
 			</string>
@@ -336,32 +330,32 @@ et cliquez sur le nom de l&apos;endroit dans la barre de titre.
 				Aucun résultat.
 			</string>
 			<scroll_list name="results">
-				<column label="" name="icon" />
-				<column label="" name="type" />
-				<column label="Nom" name="name" />
+				<column label="" name="icon"/>
+				<column label="" name="type"/>
+				<column label="Nom" name="name"/>
 			</scroll_list>
-			<button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev" />
-			<button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;" />
+			<button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev"/>
+			<button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;"/>
 			<text name="find" width="63">
 				Trouver :
 			</text>
-			<line_editor left_delta="51" name="name" width="200" />
-			<button label="Rechercher" label_selected="Rechercher" name="Search" width="80" />
+			<line_editor left_delta="51" name="name" width="200"/>
+			<button label="Rechercher" label_selected="Rechercher" name="Search" width="80"/>
 		</panel>
 		<panel label="Groupes" name="groups_panel">
-			<button label="&lt; Précédent" label_selected="&lt; Précédent" name="&lt; Prev" />
-			<button label="Suivant &gt;" label_selected="Suivant &gt;" name="Next &gt;" />
+			<button label="&lt; Précédent" label_selected="&lt; Précédent" name="&lt; Prev"/>
+			<button label="Suivant &gt;" label_selected="Suivant &gt;" name="Next &gt;"/>
 			<string name="searching_text">
 				Recherche en cours...
 			</string>
 			<string name="not_found_text">
 				Aucun résultat.
 			</string>
-			<button label="Précédente" name="back_btn" />
-			<button label="Suivante" name="forward_btn" />
-			<line_editor label="Rechercher" name="search_editor" tool_tip="Rechercher dans Second Life" />
-			<button label="Rechercher" name="search_btn" width="80" />
-			<check_box label="Inclure le contenu pour adultes" name="mature_check" />
+			<button label="Précédente" name="back_btn"/>
+			<button label="Suivante" name="forward_btn"/>
+			<line_editor label="Rechercher" name="search_editor" tool_tip="Rechercher dans Second Life"/>
+			<button label="Rechercher" name="search_btn" width="80"/>
+			<check_box label="Inclure le contenu pour adultes" name="mature_check"/>
 			<string name="loading_text">
 				Chargement en cours...
 			</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_env_settings.xml b/indra/newview/skins/default/xui/fr/floater_env_settings.xml
index 1fe3192..b509ceb 100644
--- a/indra/newview/skins/default/xui/fr/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/fr/floater_env_settings.xml
@@ -1,27 +1,27 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Environment Editor Floater" title="Editeur d&apos;environnement">
-	<text name="EnvTimeText" bottom="-45" >
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="Éditeur d&apos;environnement">
+	<text bottom="-45" name="EnvTimeText">
 		Heure de la
 journée
 	</text>
-	<text name="EnvTimeText2" bottom_delta="-36" >
+	<text bottom_delta="-36" name="EnvTimeText2">
 		Midi
 	</text>
 	<text name="EnvCloudText">
 		Couverture
 nuageuse
 	</text>
-	<text name="EnvWaterColorText" bottom="-45" >
+	<text bottom="-45" name="EnvWaterColorText">
 		Couleur de
 l&apos;eau
 	</text>
-	<color_swatch name="EnvWaterColor" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" />
+	<color_swatch name="EnvWaterColor" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/>
 	<text name="EnvWaterFogText">
 		Brouillard
 dans l&apos;eau
 	</text>
-	<button label="Utiliser heure du domaine" name="EnvUseEstateTimeButton" bottom="-144"/>
-	<button label="Ciel avancé" name="EnvAdvancedSkyButton" />
-	<button label="Eau avancée" name="EnvAdvancedWaterButton" />
-	<button label="?" name="EnvSettingsHelpButton" />
+	<button bottom="-144" label="Utiliser heure du domaine" name="EnvUseEstateTimeButton"/>
+	<button label="Ciel avancé" name="EnvAdvancedSkyButton"/>
+	<button label="Eau avancée" name="EnvAdvancedWaterButton"/>
+	<button label="?" name="EnvSettingsHelpButton"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_god_tools.xml b/indra/newview/skins/default/xui/fr/floater_god_tools.xml
index afa38f3..2625b00 100644
--- a/indra/newview/skins/default/xui/fr/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_god_tools.xml
@@ -1,54 +1,37 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="godtools floater" title="Outils Admin">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="godtools floater" title="Outils divins">
 	<tab_container name="GodTools Tabs">
 		<panel label="Grille" name="grid">
-			<button label="Vider Tous" label_selected="Vider Tous" name="Kick all users" />
-			<button label="Vider le cache cartographique de la région"
-			     label_selected="Vider le cache cartographique de la région"
-			     name="Flush This Region&apos;s Map Visibility Caches" />
+			<button label="Éjecter tous" label_selected="Éjecter tous" name="Kick all users"/>
+			<button label="Vider le cache cartographique de la région" label_selected="Vider le cache cartographique de la région" name="Flush This Region&apos;s Map Visibility Caches"/>
 		</panel>
 		<panel label="Région" name="region">
 			<text name="Sim Name:">
 				Nom du sim :
 			</text>
-			<check_box label="Initiation" name="check prelude"
-			     tool_tip="Définir cette région comme zone d&apos;initiation." />
-			<check_box label="Soleil fixe" name="check fixed sun"
-			     tool_tip="Définir la position du soleil (comme dans Région/Domaine &gt; Terrain.)" />
-			<check_box label="Réinitialiser le domicile à la téléportation"
-			     name="check reset home"
-			     tool_tip="Lorsqu&apos;un résident se téléporte à l&apos;extérieur, réinitialise son domicile à la position de sa destination." />
-			<check_box label="Visible" name="check visible"
-			     tool_tip="Cochez pour rendre la région visible aux non-admins." />
-			<check_box label="Dégâts" name="check damage"
-			     tool_tip="Cochez pour activer les dégâts dans cette région." />
-			<check_box label="Bloquer le suivi de trafic" name="block dwell"
-			     tool_tip="Cochez pour que la région ne comptabilise pas le trafic." />
-			<check_box label="Bloquer le terraformage" name="block terraform"
-			     tool_tip="Cochez pour empêcher les personnes de terraformer leur terrain" />
-			<check_box label="Bac à sable" name="is sandbox"
-			     tool_tip="Basculer cette région en bac à sable." />
-			<button label="Figer le terrain" label_selected="Figer le terrain" name="Bake Terrain"
-			     tool_tip="Enregistrer le terrain actuel comme terrain par défaut." />
-			<button label="Rétablir le terrain" label_selected="Rétablir le terrain"
-			     name="Revert Terrain"
-			     tool_tip="Remplacer le terrain actuel avec le terrain par défaut." />
-			<button label="Échanger le terrain" label_selected="Échanger le terrain"
-			     name="Swap Terrain"
-			     tool_tip="Échanger le terrain actuel avec le terrain par défaut." />
+			<check_box label="Initiation" name="check prelude" tool_tip="Définir cette région comme zone d&apos;initiation."/>
+			<check_box label="Soleil fixe" name="check fixed sun" tool_tip="Définir la position du soleil (comme dans Région et Domaine &gt; Terrain.)"/>
+			<check_box label="Réinitialiser le domicile à la téléportation" name="check reset home" tool_tip="Lorsqu&apos;un résident se téléporte à l&apos;extérieur, réinitialise son domicile à la position de sa destination."/>
+			<check_box label="Visible" name="check visible" tool_tip="Cochez pour rendre la région visible aux non-admins."/>
+			<check_box label="Dégâts" name="check damage" tool_tip="Cochez pour activer les dégâts dans cette région."/>
+			<check_box label="Bloquer le suivi de trafic" name="block dwell" tool_tip="Cochez pour que la région ne comptabilise pas le trafic."/>
+			<check_box label="Bloquer le terraformage" name="block terraform" tool_tip="Cochez pour empêcher les personnes de terraformer leur terrain"/>
+			<check_box label="Bac à sable" name="is sandbox" tool_tip="Basculer cette région en bac à sable."/>
+			<button label="Figer le terrain" label_selected="Figer le terrain" name="Bake Terrain" tool_tip="Enregistrer le terrain actuel comme terrain par défaut."/>
+			<button label="Rétablir le terrain" label_selected="Rétablir le terrain" name="Revert Terrain" tool_tip="Remplacer le terrain actuel avec le terrain par défaut."/>
+			<button label="Échanger le terrain" label_selected="Échanger le terrain" name="Swap Terrain" tool_tip="Échangez le terrain actuel avec le terrain par défaut."/>
 			<text name="estate id">
 				ID du domaine :
 			</text>
 			<text name="parent id">
 				ID parent :
 			</text>
-			<line_editor name="parentestate"
-			     tool_tip="Il s&apos;agit du domaine parent de cette région" />
+			<line_editor name="parentestate" tool_tip="Il s&apos;agit du domaine parent de cette région"/>
 			<text name="Grid Pos: ">
 				Position sur la grille :
 			</text>
-			<line_editor name="gridposx" tool_tip="Position x de cette région sur la grille" />
-			<line_editor name="gridposy" tool_tip="Position y de cette région sur la grille" />
+			<line_editor name="gridposx" tool_tip="Position x de cette région sur la grille"/>
+			<line_editor name="gridposy" tool_tip="Position y de cette région sur la grille"/>
 			<text name="Redirect to Grid: ">
 				Rediriger vers la grille :
 			</text>
@@ -56,17 +39,12 @@
 				Facteur de facturation :
 			</text>
 			<text name="land cost text">
-				$L par m² :
+				L$ par m² :
 			</text>
-			<button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh"
-			     tool_tip="Cliquez ici pour rafraîchir les informations ci-dessus." />
-			<button label="Appliquer" label_selected="Appliquer" name="Apply"
-			     tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus." />
-			<button label="Sélectionner une région" label_selected="Sélectionner une région"
-			     name="Select Region"
-			     tool_tip="Sélectionnez une région entière à l&apos;aide de l&apos;outil Terrain." />
-			<button label="Sauvegarde automatique" label_selected="Sauvegarde automatique"
-			     name="Autosave now" tool_tip="Sauvegarde automatique au format gzip." />
+			<button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh" tool_tip="Cliquez ici pour rafraîchir les informations ci-dessus."/>
+			<button label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/>
+			<button label="Sélectionner une région" label_selected="Sélectionner une région" name="Select Region" tool_tip="Sélectionnez une région entière à l&apos;aide de l&apos;outil Terrain."/>
+			<button label="Sauvegarde automatique" label_selected="Sauvegarde automatique" name="Autosave now" tool_tip="Sauvegarde automatique au format gzip."/>
 		</panel>
 		<panel label="Objets" name="objects">
 			<text name="Sim Name:">
@@ -75,43 +53,20 @@
 			<text name="region name">
 				Gallois
 			</text>
-			<check_box label="Désactiver les scripts" name="disable scripts"
-			     tool_tip="Cochez pour désactiver tous les scripts dans cette région" />
-			<check_box label="Désactiver les collisions" name="disable collisions"
-			     tool_tip="Cochez pour désactiver les collisions entre non-avatars dans cette région" />
-			<check_box label="Désactiver les propriétés physiques" name="disable physics"
-			     tool_tip="Cochez pour désactiver toutes les propriétés physiques dans cette région" />
-			<button label="Appliquer" label_selected="Appliquer" name="Apply"
-			     tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus." />
-			<button label="Définir la cible" label_selected="Définir la cible" name="Set Target"
-			     tool_tip="Définir l&apos;avatar cible pour la suppression de l&apos;objet." />
+			<check_box label="Désactiver les scripts" name="disable scripts" tool_tip="Cochez pour désactiver tous les scripts dans cette région"/>
+			<check_box label="Désactiver les collisions" name="disable collisions" tool_tip="Cochez pour désactiver les collisions entre non-avatars dans cette région"/>
+			<check_box label="Désactiver les propriétés physiques" name="disable physics" tool_tip="Cochez pour désactiver toutes les propriétés physiques dans cette région"/>
+			<button label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/>
+			<button label="Définir la cible" label_selected="Définir la cible" name="Set Target" tool_tip="Définir l&apos;avatar cible pour la suppression de l&apos;objet."/>
 			<text name="target_avatar_name">
 				(aucune cible)
 			</text>
-			<button
-			     label="Supprimer tous les objets scriptés de la cible sur les terrains des autres"
-			     label_selected="Supprimer tous les objets scriptés de la cible sur les terrains des autres"
-			     name="Delete Target&apos;s Scripted Objects On Others Land"
-			     tool_tip="Supprimer tous les objets scriptés appartenant à la cible sur les terrains ne lui appartenant pas. Les objets non reproductibles seront renvoyés." />
-			<button label="Supprimer les objets scriptés de la cible sur *tous* les terrains"
-			     label_selected="Supprimer les objets scriptés de la cible sur *tous* les terrains"
-			     name="Delete Target&apos;s Scripted Objects On *Any* Land"
-			     tool_tip="Supprimer les objets scriptés appartenant à la cible dans cette région. Les objets non reproductibles seront renvoyés." />
-			<button label="Supprimer *tous* les objets de la cible"
-			     label_selected="Supprimer *tous* les objets de la cible"
-			     name="Delete *ALL* Of Target&apos;s Objects"
-			     tool_tip="Supprimer tous les objets appartenant à la cible dans cette région. Les objets non reproductibles seront renvoyés." />
-			<button label="Afficher les objets souvent responsables de collision"
-			     label_selected="Afficher les objets souvent responsables de collision"
-			     name="Get Top Colliders"
-			     tool_tip="Dresse une liste des objets avec les callbacks les plus fréquents. " />
-			<button label="Afficher les scripts fréquemment utilisés"
-			     label_selected="Afficher les scripts fréquemment utilisés"
-			     name="Get Top Scripts"
-			     tool_tip="Dresse une liste des objets qui passent le plus de temps à exécuter des scripts." />
-			<button label="Résumé des scripts" label_selected="Résumé des scripts"
-			     name="Scripts digest"
-			     tool_tip="Dresse une liste des scripts et de leurs occurrences." />
+			<button label="Supprimer tous les objets scriptés de la cible sur les terrains des autres" label_selected="Supprimer tous les objets scriptés de la cible sur les terrains des autres" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Supprimer tous les objets scriptés appartenant à la cible sur les terrains ne lui appartenant pas. Les objets non reproductibles seront renvoyés."/>
+			<button label="Supprimer les objets scriptés de la cible sur *tous* les terrains" label_selected="Supprimer les objets scriptés de la cible sur *tous* les terrains" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Supprimer les objets scriptés appartenant à la cible dans cette région. Les objets non reproductibles seront renvoyés."/>
+			<button label="Supprimer *tous* les objets de la cible" label_selected="Supprimer *tous* les objets de la cible" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Supprimer tous les objets appartenant à la cible dans cette région. Les objets non reproductibles seront renvoyés."/>
+			<button label="Afficher les objets souvent responsables de collision" label_selected="Afficher les objets souvent responsables de collision" name="Get Top Colliders" tool_tip="Dresse une liste des objets avec les callbacks les plus fréquents. "/>
+			<button label="Afficher les scripts fréquemment utilisés" label_selected="Afficher les scripts fréquemment utilisés" name="Get Top Scripts" tool_tip="Dresse une liste des objets qui passent le plus de temps à exécuter des scripts."/>
+			<button label="Résumé des scripts" label_selected="Résumé des scripts" name="Scripts digest" tool_tip="Dresse une liste des scripts et de leurs occurrences."/>
 		</panel>
 		<panel label="Requête" name="request">
 			<text name="Destination:">
@@ -145,8 +100,7 @@
 			<text name="Parameter:">
 				Paramètre :
 			</text>
-			<button label="Effectuer la requête" label_selected="Effectuer la requête"
-			     name="Make Request" />
+			<button label="Effectuer la requête" label_selected="Effectuer la requête" name="Make Request"/>
 		</panel>
 	</tab_container>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_group_info.xml b/indra/newview/skins/default/xui/fr/floater_group_info.xml
index ec3b4bd..ac25eb0 100644
--- a/indra/newview/skins/default/xui/fr/floater_group_info.xml
+++ b/indra/newview/skins/default/xui/fr/floater_group_info.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="groupinfo" title="Les Linden – Informations sur le groupe">
 	<tab_container name="tab">
 		<panel label="Général" name="gen">
@@ -9,16 +9,16 @@
 				Les groupes sont un moyen divertissant de collaborer avec vos amis.
 			</text>
 			<text name="txt2">
-				Les groupes vous permettent d&apos;avoir un titre, un emblème et de voter.
+				Les groupes vous permettent d&apos;avoir un titre, un logo et de voter.
 			</text>
 			<text name="txt3">
-				Tout le monde peut créer un groupe. Chaque personne peut appartenir à 15 groupes maximum.
+				Tout le monde peut créer un groupe. Chaque résident peut appartenir jusqu&apos;à 15 groupes.
 			</text>
 			<text name="txt4">
 				Pour rester actif, un groupe doit avoir au moins 3 membres.
 			</text>
 			<text name="group_create_text">
-				La création d&apos;un groupe coûte 100 $L.
+				La création d&apos;un groupe coûte 100 L$.
 			</text>
 			<text name="lbl">
 				Nom :
@@ -29,17 +29,15 @@
 			<text name="lbl2">
 				Charte :
 			</text>
-			<check_box label="Afficher dans la liste du groupe" name="sho" />
-			<check_box label="Afficher les membres dans la liste du groupe" name="sho_mem" />
-			<check_box label="Publier sur le web." name="allow_publish"
-			     tool_tip="Publiez votre profil sur le web." />
-			<button label="?" label_selected="?" name="publish_help_btn" />
-			<check_box label="Adulte" name="mature"
-			     tool_tip="Les informations de votre profil sont à caractère adulte." />
+			<check_box label="Afficher dans la liste du groupe" name="sho"/>
+			<check_box label="Afficher les membres dans la liste du groupe" name="sho_mem"/>
+			<check_box label="Publier sur le web." name="allow_publish" tool_tip="Publiez votre profil sur le web."/>
+			<button label="?" label_selected="?" name="publish_help_btn"/>
+			<check_box label="Adulte" name="mature" tool_tip="Les informations de votre profil sont à caractère adulte."/>
 		</panel>
 		<panel label="Titres" name="tit">
 			<text name="txt">
-				Titres au sein du groupe
+				Titres de groupe
 			</text>
 			<text name="txt2">
 				Les groupes peuvent avoir des officiers et des membres avec des titres particuliers.
@@ -54,9 +52,9 @@
 				Titre du membre :
 			</text>
 			<text name="lbl3">
-				Pour créer l&apos;emblème du groupe, faites glisser une texture depuis votre inventaire.
+				Pour créer le logo du groupe, faites glisser une texture depuis votre inventaire.
 			</text>
-			<texture_picker name="insig" tool_tip="Cliquez pour sélectionner une image" />
+			<texture_picker name="insig" tool_tip="Cliquez pour sélectionner une image"/>
 		</panel>
 		<panel label="Membres" name="mem">
 			<text name="txt">
@@ -74,8 +72,7 @@
 			<text name="members_label">
 				Membres :
 			</text>
-			<button label="Expulser le membre" label_selected="Expulser le membre"
-			     name="eject_member_btn" />
+			<button label="Expulser le membre" label_selected="Expulser le membre" name="eject_member_btn"/>
 		</panel>
 		<panel label="Vote" name="voting">
 			<tab_container name="tab">
@@ -85,33 +82,30 @@
 					</text>
 					<text name="instructions">
 						Pour commencer une nouvelle élection, cliquez sur Lancer l&apos;élection.  
-Tous les membres qui ne sont pas officiers sont candidats.
+Les candidats incluent tous les membres qui ne sont pas officiers.
 					</text>
 					<text name="lbl">
 						Candidats :
 					</text>
-					<button label="Vote" label_selected="Voter" name="btn_vote" />
-					<button label="M&apos;abstenir" label_selected="M&apos;abstenir" name="btn_abstain" />
-					<button label="Lancer l&apos;élection" label_selected="Lancer l&apos;élection"
-					     name="btn_start_election" />
+					<button label="Vote" label_selected="Voter" name="btn_vote"/>
+					<button label="M&apos;abstenir" label_selected="M&apos;abstenir" name="btn_abstain"/>
+					<button label="Lancer l&apos;élection" label_selected="Lancer l&apos;élection" name="btn_start_election"/>
 					<text name="lbl2">
 						Quorum :
 					</text>
-					<spinner name="quorum"
-					     tool_tip="Nombre  total de votants nécessaires pour que les résultats de l&apos;élection soient valides." />
+					<spinner name="quorum" tool_tip="Nombre total de votants nécessaires pour que les résultats de l&apos;élection soient valides."/>
 					<text name="quorum_text">
 						sur un total de 111 membres.
 					</text>
 					<text name="lbl3">
 						Majorité :
 					</text>
-					<radio_group name="majority"
-					     tool_tip="Majorité de tous les votes nécessaires pour remporter l&apos;élection.">
+					<radio_group name="majority" tool_tip="Majorité de tous les votes nécessaires pour remporter l&apos;élection.">
 						<radio_item name="radio">
 							Majorité simple
 						</radio_item>
 						<radio_item name="radio2">
-							Majorité des deux-tiers
+							Majorité des 2/3
 						</radio_item>
 						<radio_item name="radio3">
 							Unanimité
@@ -120,7 +114,7 @@ Tous les membres qui ne sont pas officiers sont candidats.
 					<text name="duration_lbl">
 						Durée :
 					</text>
-					<spinner name="duration" tool_tip="Durée de l&apos;élection (en nombre de jours)." />
+					<spinner name="duration" tool_tip="Durée de l&apos;élection (en nombre de jours)."/>
 					<text name="duration_days">
 						jours
 					</text>
@@ -141,34 +135,29 @@ Tous les membres qui ne sont pas officiers sont candidats.
 					<text name="proposal_lbl">
 						Propositions :
 					</text>
-					<button label="Oui" label_selected="Oui" name="btn_yes" />
-					<button label="Non" label_selected="Non" name="btn_no" />
-					<button label="M&apos;abstenir" label_selected="M&apos;abstenir" name="btn_abstain" />
-					<button label="Afficher la liste" label_selected="Afficher la liste"
-					     name="btn_view_list" />
-					<button label="Afficher l&apos;objet" label_selected="Afficher l&apos;objet"
-					     name="btn_view_item" />
-					<button label="Créer une proposition" label_selected="Créer une proposition"
-					     name="btn_proposal" />
-					<button label="Soumettre" label_selected="Soumettre" name="btn_submit" />
+					<button label="Oui" label_selected="Oui" name="btn_yes"/>
+					<button label="Non" label_selected="Non" name="btn_no"/>
+					<button label="M&apos;abstenir" label_selected="M&apos;abstenir" name="btn_abstain"/>
+					<button label="Afficher la liste" label_selected="Afficher la liste" name="btn_view_list"/>
+					<button label="Afficher l&apos;objet" label_selected="Afficher l&apos;objet" name="btn_view_item"/>
+					<button label="Créer une proposition" label_selected="Créer une proposition" name="btn_proposal"/>
+					<button label="Soumettre" label_selected="Soumettre" name="btn_submit"/>
 					<text name="quorum_lbl">
 						Quorum :
 					</text>
-					<spinner name="quorum"
-					     tool_tip="Nombre  total de votants nécessaires pour que les résultats de l&apos;élection soient valides." />
+					<spinner name="quorum" tool_tip="Nombre total de votants nécessaires pour que les résultats de l&apos;élection soient valides."/>
 					<text name="quorum_text">
 						sur un total de 111 membres.
 					</text>
 					<text name="majority_lbl">
 						Majorité :
 					</text>
-					<radio_group name="majority"
-					     tool_tip="Majorité de tous les votes nécessaires pour remporter l&apos;élection.">
+					<radio_group name="majority" tool_tip="Majorité de tous les votes nécessaires pour remporter l&apos;élection.">
 						<radio_item name="radio">
 							Majorité simple
 						</radio_item>
 						<radio_item name="radio2">
-							Majorité des deux-tiers
+							Majorité des 2/3
 						</radio_item>
 						<radio_item name="radio3">
 							Unanimité
@@ -177,7 +166,7 @@ Tous les membres qui ne sont pas officiers sont candidats.
 					<text name="duration_lbl">
 						Durée :
 					</text>
-					<spinner name="duration" tool_tip="Durée de l&apos;élection (en nombre de jours)." />
+					<spinner name="duration" tool_tip="Durée de l&apos;élection (en nombre de jours)."/>
 					<text name="duration_text">
 						jours
 					</text>
@@ -204,10 +193,8 @@ Tous les membres qui ne sont pas officiers sont candidats.
 					<text name="vote_text_lbl">
 						Résultats du vote :
 					</text>
-					<button label="Afficher la liste" label_selected="Afficher la liste"
-					     name="btn_view_list" />
-					<button label="Afficher l&apos;objet" label_selected="Afficher l&apos;objet"
-					     name="btn_view_item" />
+					<button label="Afficher la liste" label_selected="Afficher la liste" name="btn_view_list"/>
+					<button label="Afficher l&apos;objet" label_selected="Afficher l&apos;objet" name="btn_view_item"/>
 				</panel>
 			</tab_container>
 		</panel>
@@ -224,21 +211,17 @@ Tous les membres qui ne sont pas officiers sont candidats.
 			<text name="lbl">
 				Officiers :
 			</text>
-			<button label="Ajouter un officier..." label_selected="Ajouter un officier..."
-			     name="add_officer_btn" />
-			<button label="Supprimer la sélection" label_selected="Supprimer la sélection"
-			     name="remove_officer_btn" />
+			<button label="Ajouter un officier..." label_selected="Ajouter un officier..." name="add_officer_btn"/>
+			<button label="Supprimer la sélection" label_selected="Supprimer la sélection" name="remove_officer_btn"/>
 			<text name="lbl2">
 				Membres :
 			</text>
-			<button label="Ajouter un membre..." label_selected="Ajouter un membre..."
-			     name="add_member_btn" />
-			<button label="Supprimer la sélection" label_selected="Supprimer la sélection"
-			     name="remove_member_btn" />
+			<button label="Ajouter un membre..." label_selected="Ajouter un membre..." name="add_member_btn"/>
+			<button label="Supprimer la sélection" label_selected="Supprimer la sélection" name="remove_member_btn"/>
 			<text name="lbl3">
-				Frais d&apos;adhésion :
+				Frais d&apos;inscription :
 			</text>
-			<check_box label="Inscription libre (sans invitation)" name="open" />
+			<check_box label="Inscription libre (sans invitation)" name="open"/>
 		</panel>
 		<panel label="Terrain" name="land">
 			<text name="txt">
@@ -247,37 +230,32 @@ Tous les membres qui ne sont pas officiers sont candidats.
 			<text name="lbl">
 				Total des contributions :
 			</text>
-			<button label="Carte..." label_selected="Carte..." name="map_btn" />
+			<button label="Carte..." label_selected="Carte..." name="map_btn"/>
 			<text name="lbl2">
-				Total du terrain utilisé :
+				Superficie déjà utilisée :
 			</text>
 			<text name="lbl3">
-				Terrain disponible :
+				Superficie disponible :
 			</text>
-			<button label="Définir la contribution" label_selected="Définir la contribution"
-			     name="set_contrib_btn" />
+			<button label="Définir la contribution" label_selected="Définir la contribution" name="set_contrib_btn"/>
 			<text name="warning_label">
-				Avertissement : ce groupe a trop de terrain. les membres du groupe doivent faire une contribution plus importante.
+				Avertissement : ce groupe a trop de terrain. Les membres du groupe doivent faire une contribution plus importante.
 			</text>
 		</panel>
 		<panel label="Argent" name="mon">
 			<tab_container name="group money history tab">
-				<panel label="Planification" name="money panel" />
+				<panel label="Planification" name="money panel"/>
 				<panel label="Détails" name="money panel2">
-					<button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="&lt; Earlier"
-					     tool_tip="Reculer dans le temps" />
-					<button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="Later &gt;"
-					     tool_tip="Avancer dans le temps" />
+					<button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="&lt; Earlier" tool_tip="Reculer dans le temps"/>
+					<button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="Later &gt;" tool_tip="Avancer dans le temps"/>
 				</panel>
 				<panel label="Ventes" name="money panel3">
-					<button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="&lt; Earlier"
-					     tool_tip="Reculer dans le temps" />
-					<button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="Later &gt;"
-					     tool_tip="Avancer dans le temps" />
+					<button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="&lt; Earlier" tool_tip="Reculer dans le temps"/>
+					<button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="Later &gt;" tool_tip="Avancer dans le temps"/>
 				</panel>
 			</tab_container>
 		</panel>
 	</tab_container>
-	<button label="OK" label_selected="OK" name="OK" />
-	<button label="Annuler" label_selected="Annuler" name="Cancel" />
+	<button label="OK" label_selected="OK" name="OK"/>
+	<button label="Annuler" label_selected="Annuler" name="Cancel"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
index 1b5bcdb..87ab55f 100644
--- a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="Hardware Settings Floater" title="Configuration du matériel">
 	<text name="Filtering:">
 		Filtres :
 	</text>
-	<check_box label="Filtre anisotrope (plus lent si activé)" name="ani" />
+	<check_box label="Filtre anisotrope (plus lent si activé)" name="ani"/>
 	<text name="Antialiasing:">
 		Anti-aliasing :
 	</text>
@@ -24,17 +24,16 @@
 			16x
 		</combo_item>
 	</combo_box>
-	<spinner label="Gamma :" name="gamma" />
-	<text name="(brightness, lower is brighter)" left="217" >
+	<spinner label="Gamma :" name="gamma"/>
+	<text left="217" name="(brightness, lower is brighter)">
 		(luminosité, valeur faible = plus lumineux, 0 = défaut)
 	</text>
 	<text name="Enable VBO:">
 		Activer le VBO :
 	</text>
-	<check_box label="Activer OpenGL Vertex Buffer Objects" name="vbo"
-	     tool_tip="Sur un matériel moderne, cette option permet une meilleure performance.  Par contre, sur un matériel plus ancien, les VBO sont souvent mal implémentés et peuvent causer des crashs lorsqu&apos;ils sont activés." />
-	<slider label="Mémoire texture (Mo) :" name="GrapicsCardTextureMemory"
-	     tool_tip="Total de la mémoire alloué aux textures. Mémoire de la carte vidéo par défaut. En réduisant cette valeur, vous pouvez accroître la performance mais les textures risquent de devenir floues." />
-	<spinner label="Rapport de distance &#10;du brouillard :" name="fog" />
-	<button label="OK" label_selected="OK" name="OK" />
+	<check_box label="Activer OpenGL Vertex Buffer Objects" name="vbo" tool_tip="Sur un matériel moderne, cette option permet une meilleure performance. Par contre, sur un matériel plus ancien, les VBO sont souvent mal implémentés et peuvent causer des crashs lorsqu&apos;ils sont activés."/>
+	<slider label="Mémoire vidéo (Mo) :" name="GrapicsCardTextureMemory" tool_tip="Total de la mémoire alloué aux textures. Mémoire de la carte vidéo par défaut. En réduisant cette valeur, vous pouvez accroître la performance mais les textures risquent de devenir floues."/>
+	<spinner label="Indice 
+du brouillard :" name="fog"/>
+	<button label="OK" label_selected="OK" name="OK"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_image_preview.xml b/indra/newview/skins/default/xui/fr/floater_image_preview.xml
index a93547f..f440ffd 100644
--- a/indra/newview/skins/default/xui/fr/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_image_preview.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="Image Preview" title="">
 	<text name="name_label">
 		Nom :
@@ -46,7 +46,7 @@
 
 Sauvegardez en Targa 24 bit (.tga).
 	</text>
-	<check_box label="Utiliser une compression sans perte" name="lossless_check" />
-	<button label="Annuler" name="cancel_btn" />
-	<button label="Charger ([AMOUNT] $L)" name="ok_btn" />
+	<check_box label="Utiliser une compression sans perte" name="lossless_check"/>
+	<button label="Annuler" name="cancel_btn"/>
+	<button label="Charger ([AMOUNT] L$)" name="ok_btn"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_import.xml b/indra/newview/skins/default/xui/fr/floater_import.xml
index a29d8e6..3b4cdc0 100644
--- a/indra/newview/skins/default/xui/fr/floater_import.xml
+++ b/indra/newview/skins/default/xui/fr/floater_import.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="Import" title="">
 	<text name="name_label">
 		Nom :
@@ -9,8 +9,8 @@
 	<text name="preview_label">
 		Fichiers à charger :
 	</text>
-	<button label="Annuler" name="cancel_btn" />
-	<button label="Charger (10 $L)" name="ok_btn" />
+	<button label="Annuler" name="cancel_btn"/>
+	<button label="Charger (10 L$)" name="ok_btn"/>
 	<text name="preview_label2">
 		Prévisualisation de l&apos;image :
 	</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_instant_message.xml b/indra/newview/skins/default/xui/fr/floater_instant_message.xml
index cfa89fe..a11d1db 100644
--- a/indra/newview/skins/default/xui/fr/floater_instant_message.xml
+++ b/indra/newview/skins/default/xui/fr/floater_instant_message.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater label="(inconnue)" name="im_floater" title="(inconnue)">
-	<button label="Profil..." label_selected="Profil..." name="profile_btn" />
-	<button label="Fermer" label_selected="Fermer" name="close_btn" />
+	<button label="Profil..." label_selected="Profil..." name="profile_btn"/>
+	<button label="Fermer" label_selected="Fermer" name="close_btn"/>
 	<string name="ringing">
 		Appel en cours...
 	</string>
@@ -26,14 +26,14 @@
 	<string name="default_text_label">
 		Cliquez ici pour envoyer un message instantané.
 	</string>
-	<button label="Profil..." name="profile_callee_btn" />
-	<button label="Appeler" name="start_call_btn" />
-	<button label="Raccrocher" name="end_call_btn" />
+	<button label="Profil..." name="profile_callee_btn"/>
+	<button label="Appeler" name="start_call_btn"/>
+	<button label="Raccrocher" name="end_call_btn"/>
 	<panel name="speaker_controls">
-		<button name="mute_btn" tool_tip="Ignorer" />
+		<button name="mute_btn" tool_tip="Ignorez"/>
 	</panel>
-	<line_editor label="Cliquez ici pour envoyer un message instantané" name="chat_editor" />
-	<button label="Envoyer" name="send_btn" />
+	<line_editor label="Cliquez ici pour envoyer un message instantané" name="chat_editor"/>
+	<button label="Envoyer" name="send_btn"/>
 	<text name="live_help_dialog">
 		*** Bienvenue sur la page Demande d&apos;aide *** 
 Veuillez au préalable consulter les pages d&apos;aide de Second Life en appuyant sur la touche F1, ou en accédant à la base de connaissances http://secondlife.com/knowledgebase/ 
diff --git a/indra/newview/skins/default/xui/fr/floater_instant_message_ad_hoc.xml b/indra/newview/skins/default/xui/fr/floater_instant_message_ad_hoc.xml
index 64a9743..66e9767 100644
--- a/indra/newview/skins/default/xui/fr/floater_instant_message_ad_hoc.xml
+++ b/indra/newview/skins/default/xui/fr/floater_instant_message_ad_hoc.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater label="(inconnu)" name="im_floater" title="(inconnu)">
 	<string name="ringing">
 		En train de rejoindre le chat vocal...
@@ -27,11 +27,10 @@
 	<layout_stack name="panels">
 		<layout_panel name="im_contents_panel">
 			<button label="Appeler" name="start_call_btn" width="95"/>
-			<button label="Raccrocher" name="end_call_btn" width="95" halign="right"/>
-			<button label="&lt; &lt;" label_selected="&gt; &gt;" name="toggle_active_speakers_btn"
-			     tool_tip="Cliquez ici pour mettre la liste des intervenants actifs dans cette session IM en mode bascule." />
-			<line_editor label="Cliquez ici pour envoyer un message instantané" name="chat_editor" />
-			<button label="Envoyer" name="send_btn" />
+			<button halign="right" label="Raccrocher" name="end_call_btn" width="95"/>
+			<button label="&lt; &lt;" label_selected="&gt; &gt;" name="toggle_active_speakers_btn" tool_tip="Affichez/masquez la liste des intervenants actifs dans cette session IM."/>
+			<line_editor label="Cliquez ici pour envoyer un message instantané" name="chat_editor"/>
+			<button label="Envoyer" name="send_btn"/>
 		</layout_panel>
 	</layout_stack>
 	<string name="live_help_dialog">
diff --git a/indra/newview/skins/default/xui/fr/floater_instant_message_group.xml b/indra/newview/skins/default/xui/fr/floater_instant_message_group.xml
index faede02..06e4be0 100644
--- a/indra/newview/skins/default/xui/fr/floater_instant_message_group.xml
+++ b/indra/newview/skins/default/xui/fr/floater_instant_message_group.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater label="(inconnu)" name="im_floater" title="(inconnu)">
 	<string name="ringing">
 		En train de rejoindre le chat vocal...
@@ -38,13 +38,11 @@
 	</string>
 	<layout_stack name="panels">
 		<layout_panel name="im_contents_panel">
-			<button label="Infos sur le groupe" name="group_info_btn" width="120" />
-			<button label="Participer à l&apos;appel" left_delta="125" name="start_call_btn"
-			     width="145" />
-			<button halign="center" label="Raccrocher" name="end_call_btn" width="145" />
-			<button label="&lt; &lt;" label_selected="&gt; &gt;" name="toggle_active_speakers_btn"
-			     tool_tip="Cliquez ici pour mettre la liste des intervenants actifs dans cette session IM en mode bascule." />
-			<button label="Envoyer" name="send_btn" />
+			<button label="Infos sur le groupe" name="group_info_btn" width="120"/>
+			<button label="Participer à l&apos;appel" left_delta="125" name="start_call_btn" width="145"/>
+			<button halign="center" label="Raccrocher" name="end_call_btn" width="145"/>
+			<button label="&lt; &lt;" label_selected="&gt; &gt;" name="toggle_active_speakers_btn" tool_tip="Affichez/Masquez la liste des intervenants actifs dans cette session IM."/>
+			<button label="Envoyer" name="send_btn"/>
 		</layout_panel>
 	</layout_stack>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory.xml b/indra/newview/skins/default/xui/fr/floater_inventory.xml
index eb692db..4a552bd 100644
--- a/indra/newview/skins/default/xui/fr/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory.xml
@@ -1,55 +1,55 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="Inventory" title="Inventaire">
-	<search_editor label="Saisissez votre recherche ici" name="inventory search editor" />
+	<search_editor label="Saisissez votre recherche ici" name="inventory search editor"/>
 	<tab_container name="inventory filter tabs">
-		<inventory_panel label="Tous les objets" name="All Items" />
-		<inventory_panel label="Objets récents" name="Recent Items" />
+		<inventory_panel label="Tous les objets" name="All Items"/>
+		<inventory_panel label="Objets récents" name="Recent Items"/>
 	</tab_container>
 	<menu_bar name="Inventory Menu">
 		<menu label="Fichier" name="File">
-			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
-			<menu_item_call label="Ouvrir" name="Open" />
-			<menu_item_call label="Nouvelle fenêtre" name="New Window" />
-			<menu_item_call label="Afficher les filtres" name="Show Filters" />
-			<menu_item_call label="Réinitialiser les filtres" name="Reset Current" />
-			<menu_item_call label="Fermer tous les dossiers" name="Close All Folders" />
-			<menu_item_call label="Vider la corbeille" name="Empty Trash" />
+			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
+			<menu_item_call label="Ouvrir" name="Open"/>
+			<menu_item_call label="Nouvelle fenêtre" name="New Window"/>
+			<menu_item_call label="Afficher les filtres" name="Show Filters"/>
+			<menu_item_call label="Réinitialiser les filtres" name="Reset Current"/>
+			<menu_item_call label="Fermer tous les dossiers" name="Close All Folders"/>
+			<menu_item_call label="Vider la corbeille" name="Empty Trash"/>
 		</menu>
 		<menu label="Créer" name="Create">
-			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
-			<menu_item_call label="Nouveau dossier" name="New Folder" />
-			<menu_item_call label="Nouveau script" name="New Script" />
-			<menu_item_call label="Nouvelle note" name="New Note" />
-			<menu_item_call label="Nouveau geste" name="New Gesture" />
+			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
+			<menu_item_call label="Nouveau dossier" name="New Folder"/>
+			<menu_item_call label="Nouveau script" name="New Script"/>
+			<menu_item_call label="Nouvelle note" name="New Note"/>
+			<menu_item_call label="Nouveau geste" name="New Gesture"/>
 			<menu name="New Clothes">
-				<menu_item_call label="Nouvelle jupe" name="New Shirt" />
-				<menu_item_call label="Nouveau pantalon" name="New Pants" />
-				<menu_item_call label="Nouvelles chaussures" name="New Shoes" />
-				<menu_item_call label="Nouvelles chaussettes" name="New Socks" />
-				<menu_item_call label="Nouvelle veste" name="New Jacket" />
-				<menu_item_call label="Nouvelle jupe" name="New Skirt" />
-				<menu_item_call label="Nouveaux gants" name="New Gloves" />
-				<menu_item_call label="Nouveau tricot de peau" name="New Undershirt" />
-				<menu_item_call label="Nouveaux sous-vêtements" name="New Underpants" />
+				<menu_item_call label="Nouvelle chemise" name="New Shirt"/>
+				<menu_item_call label="Nouveau pantalon" name="New Pants"/>
+				<menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
+				<menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
+				<menu_item_call label="Nouvelle veste" name="New Jacket"/>
+				<menu_item_call label="Nouvelle jupe" name="New Skirt"/>
+				<menu_item_call label="Nouveaux gants" name="New Gloves"/>
+				<menu_item_call label="Nouveau tricot de peau" name="New Undershirt"/>
+				<menu_item_call label="Nouveaux sous-vêtements" name="New Underpants"/>
 			</menu>
 			<menu name="New Body Parts">
-				<menu_item_call label="Nouvelle silhouette" name="New Shape" />
-				<menu_item_call label="Nouvelle peau" name="New Skin" />
-				<menu_item_call label="Nouveaux cheveux" name="New Hair" />
-				<menu_item_call label="Nouveaux yeux" name="New Eyes" />
+				<menu_item_call label="Nouvelle silhouette" name="New Shape"/>
+				<menu_item_call label="Nouvelle peau" name="New Skin"/>
+				<menu_item_call label="Nouveaux cheveux" name="New Hair"/>
+				<menu_item_call label="Nouveaux yeux" name="New Eyes"/>
 			</menu>
 		</menu>
 		<menu label="Trier" name="Sort">
-			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
-			<menu_item_check label="Par nom" name="By Name" />
-			<menu_item_check label="Par date" name="By Date" />
-			<menu_item_check label="Dossiers toujours par nom" name="Folders Always By Name" />
-			<menu_item_check label="Dossiers système au dessus" name="System Folders To Top" />
+			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
+			<menu_item_check label="Par nom" name="By Name"/>
+			<menu_item_check label="Par date" name="By Date"/>
+			<menu_item_check label="Trier les dossiers par nom" name="Folders Always By Name"/>
+			<menu_item_check label="Dossiers système en premier" name="System Folders To Top"/>
 		</menu>
 		<menu label="Filters" name="Filters">
-			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
-			<menu_item_check label="Modifier actuel" name="Modify Current" />
-			<menu_item_call label="Réinitialiser actuel" name="Reset Current" />
+			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
+			<menu_item_check label="Modifier actuel" name="Modify Current"/>
+			<menu_item_call label="Réinitialiser actuel" name="Reset Current"/>
 		</menu>
 	</menu_bar>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
index a23a589..09934ad 100644
--- a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="item properties"
-     title="Propriétés de l&apos;objet de l&apos;inventaire">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="item properties" title="Propriétés de l&apos;objet de l&apos;inventaire">
 	<text name="LabelItemNameTitle">
 		Nom :
 	</text>
@@ -13,14 +12,14 @@
 	<text name="LabelCreatorName">
 		Nicole Linden
 	</text>
-	<button label="Profil..." label_selected="" name="BtnCreator" />
+	<button label="Profil..." label_selected="" name="BtnCreator"/>
 	<text name="LabelOwnerTitle">
 		Propriétaire :
 	</text>
 	<text name="LabelOwnerName">
 		Thrax Linden
 	</text>
-	<button label="Profil..." label_selected="" name="BtnOwner" />
+	<button label="Profil..." label_selected="" name="BtnOwner"/>
 	<text name="LabelAcquiredTitle">
 		Acquis :
 	</text>
@@ -30,9 +29,9 @@
 	<text name="OwnerLabel">
 		Vous pouvez :
 	</text>
-	<check_box label="Modifier" name="CheckOwnerModify" />
-	<check_box label="Copier" name="CheckOwnerCopy" />
-	<check_box label="Revendre/Donner" name="CheckOwnerTransfer" />
+	<check_box label="Modifier" name="CheckOwnerModify"/>
+	<check_box label="Copier" name="CheckOwnerCopy"/>
+	<check_box label="Revendre/Donner" name="CheckOwnerTransfer"/>
 	<text name="BaseMaskDebug">
 		B :
 	</text>
@@ -48,18 +47,18 @@
 	<text name="NextMaskDebug">
 		N :
 	</text>
-	<check_box label="Partager avec le groupe" name="CheckShareWithGroup" />
-	<check_box label="Autoriser tout le monde à copier" name="CheckEveryoneCopy" />
+	<check_box label="Partager avec le groupe" name="CheckShareWithGroup"/>
+	<check_box label="Autoriser tout le monde à copier" name="CheckEveryoneCopy"/>
 	<text name="NextOwnerLabel">
 		Le prochain propriétaire pourra :
 	</text>
-	<check_box label="Modifier" name="CheckNextOwnerModify" />
-	<check_box label="Copier" name="CheckNextOwnerCopy" />
-	<check_box label="Revendre/Donner" name="CheckNextOwnerTransfer" />
+	<check_box label="Modifier" name="CheckNextOwnerModify"/>
+	<check_box label="Copier" name="CheckNextOwnerCopy"/>
+	<check_box label="Revendre/Donner" name="CheckNextOwnerTransfer"/>
 	<text name="SaleLabel">
 		Marquer l&apos;objet :
 	</text>
-	<check_box label="À vendre" name="CheckPurchase" />
+	<check_box label="À vendre" name="CheckPurchase"/>
 	<radio_group name="RadioSaleType">
 		<radio_item name="radio">
 			Original
@@ -69,7 +68,7 @@
 		</radio_item>
 	</radio_group>
 	<text name="TextPrice">
-		Prix :  $L
+		Prix :  L$
 	</text>
 	<string name="unknown">
 		(inconnu)
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
index 2207d50..08c3e2a 100644
--- a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
@@ -1,24 +1,24 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="Inventory Finder" title="inventory_recent_items">
-	<check_box label="Animation" name="check_animation" />
-	<check_box label="Cartes de visite" name="check_calling_card" />
-	<check_box label="Habits" name="check_clothing" />
-	<check_box label="Gestes" name="check_gesture" />
-	<check_box label="Repères" name="check_landmark" />
-	<check_box label="Notes" name="check_notecard" />
-	<check_box label="Objets" name="check_object" />
-	<check_box label="Scripts" name="check_script" />
-	<check_box label="Sons" name="check_sound" />
-	<check_box label="Textures" name="check_texture" />
-	<check_box label="Photos" name="check_snapshot" />
-	<button label="Tout" label_selected="Tout" name="All" />
-	<button label="Aucun" label_selected="Aucun" name="None" />
-	<check_box label="Toujours montrer les dossiers" name="check_show_empty" />
-	<check_box label="Depuis la déconnexion" name="check_since_logoff" />
-	<text type="string" length="1" name="- OR -">
+	<check_box label="Animations" name="check_animation"/>
+	<check_box label="Cartes de visite" name="check_calling_card"/>
+	<check_box label="Habits" name="check_clothing"/>
+	<check_box label="Gestes" name="check_gesture"/>
+	<check_box label="Repères" name="check_landmark"/>
+	<check_box label="Notes" name="check_notecard"/>
+	<check_box label="Objets" name="check_object"/>
+	<check_box label="Scripts" name="check_script"/>
+	<check_box label="Sons" name="check_sound"/>
+	<check_box label="Textures" name="check_texture"/>
+	<check_box label="Photos" name="check_snapshot"/>
+	<button label="Tout" label_selected="Tout" name="All"/>
+	<button label="Aucun" label_selected="Aucun" name="None"/>
+	<check_box label="Toujours montrer les dossiers" name="check_show_empty"/>
+	<check_box label="Depuis la déconnexion" name="check_since_logoff"/>
+	<text length="1" name="- OR -" type="string">
 		Ou il y a...
 	</text>
-	<spinner label="Heures" name="spin_hours_ago" />
-	<spinner label="Jours" name="spin_days_ago" />
-	<button label="Fermer" label_selected="Fermer" name="Close" />
+	<spinner label="Heures" name="spin_hours_ago"/>
+	<spinner label="Jours" name="spin_days_ago"/>
+	<button label="Fermer" label_selected="Fermer" name="Close"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
index d6837c3..da51b1b 100644
--- a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
@@ -1,30 +1,30 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_lagmeter" title="Calcul du lag">
-	<button name="client_lagmeter" tool_tip="Statut du lag client" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_lagmeter" title="Mesure du lag">
+	<button name="client_lagmeter" tool_tip="Statut du lag client"/>
 	<text name="client">
 		Client :
 	</text>
 	<text name="client_text">
 		Normal
 	</text>
-	<button name="network_lagmeter" tool_tip="Statut du lag réseau" />
+	<button name="network_lagmeter" tool_tip="Statut du lag réseau"/>
 	<text name="network">
 		Réseau :
 	</text>
 	<text name="network_text">
 		Normal
 	</text>
-	<button name="server_lagmeter" tool_tip="Statut du lag serveur" />
+	<button name="server_lagmeter" tool_tip="Statut du lag serveur"/>
 	<text name="server">
 		Serveur :
 	</text>
 	<text name="server_text">
 		Normal
 	</text>
-	<button label="?" name="server_help" />
-	<button label="&gt;&gt;" name="minimize" />
+	<button label="?" name="server_help"/>
+	<button label="&gt;&gt;" name="minimize"/>
 	<string name="max_title_msg">
-		Calcul du lag
+		Mesure du lag
 	</string>
 	<string name="max_width_px">
 		360
@@ -57,7 +57,7 @@
 		Normal
 	</string>
 	<string name="client_draw_distance_cause_msg">
-		Cause possible : la distance d&apos;affichage est trop élevée
+		Cause possible : la limite d&apos;affichage est trop élevée
 	</string>
 	<string name="client_texture_loading_cause_msg">
 		Cause possible : images en cours de chargement
diff --git a/indra/newview/skins/default/xui/fr/floater_media_browser.xml b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
index 6d6d4fc..4695d16 100644
--- a/indra/newview/skins/default/xui/fr/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
@@ -1,20 +1,20 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_about" title="Navigateur média">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="Navigateur">
 	<layout_stack name="stack1">
 		<layout_panel name="nav_controls">
-			<button label="Précédente" name="back" width="75" />
-			<button label="Suivante" name="forward"  width="70" left_delta="75" />
-			<button label="Recharger" name="reload" left_delta="75" />
-			<combo_box left_delta="75" name="address" width="250" />
-			<button label="Aller" name="go" left_delta="255"/>
+			<button label="Précédente" name="back" width="75"/>
+			<button label="Suivante" left_delta="75" name="forward" width="70"/>
+			<button label="Recharger" left_delta="75" name="reload"/>
+			<combo_box left_delta="75" name="address" width="250"/>
+			<button label="OK" left_delta="255" name="go"/>
 		</layout_panel>
 		<layout_panel name="parcel_owner_controls">
-			<button label="Envoyer URL actuelle sur parcelle" name="assign" />
+			<button label="Envoyer l&apos;URL sur la parcelle" name="assign"/>
 		</layout_panel>
 		<layout_panel name="external_controls">
-			<button label="Ouvrir dans mon navigateur web" name="open_browser" width="190" />
-			<check_box label="Toujours ouvrir dans mon navigateur web" name="open_always" left_delta="195"/>
-			<button label="Fermer" name="close" />
+			<button label="Ouvrir dans mon navigateur web" name="open_browser" width="190"/>
+			<check_box label="Toujours ouvrir dans mon navigateur web" left_delta="195" name="open_always"/>
+			<button label="Fermer" name="close"/>
 		</layout_panel>
 	</layout_stack>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_moveview.xml b/indra/newview/skins/default/xui/fr/floater_moveview.xml
index 002dcce..7da1b46 100644
--- a/indra/newview/skins/default/xui/fr/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_moveview.xml
@@ -1,15 +1,12 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="move floater" title="">
-	<button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche" />
-	<button label="" label_selected="" name="turn right btn" tool_tip="Tourner à droite" />
-	<button label="" label_selected="" name="move up btn"
-	     tool_tip="Sauter ou voler vers le haut" />
-	<button label="" label_selected="" name="move down btn"
-	     tool_tip="S&apos;accroupir ou voler vers le bas" />
-	<button label="Voler" label_selected="Voler" name="fly btn"
-	     tool_tip="Démarrer/arrêter vol" />
-	<joystick_slide name="slide left btn" tool_tip="Se déplacer vers la gauche" />
-	<joystick_slide name="slide right btn" tool_tip="Se déplacer vers la droite" />
-	<joystick_turn name="forward btn" tool_tip="Se déplacer vers l&apos;avant" />
-	<joystick_turn name="backward btn" tool_tip="Se déplacer vers l&apos;arrière" />
+	<button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche"/>
+	<button label="" label_selected="" name="turn right btn" tool_tip="Tourner à droite"/>
+	<button label="" label_selected="" name="move up btn" tool_tip="Sauter ou voler vers le haut"/>
+	<button label="" label_selected="" name="move down btn" tool_tip="S&apos;accroupir ou voler vers le bas"/>
+	<button label="Voler" label_selected="Voler" name="fly btn" tool_tip="Démarrer/arrêter le vol"/>
+	<joystick_slide name="slide left btn" tool_tip="Se déplacer vers la gauche"/>
+	<joystick_slide name="slide right btn" tool_tip="Se déplacer vers la droite"/>
+	<joystick_turn name="forward btn" tool_tip="Se déplacer vers l&apos;avant"/>
+	<joystick_turn name="backward btn" tool_tip="Se déplacer vers l&apos;arrière"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_mute_object.xml b/indra/newview/skins/default/xui/fr/floater_mute_object.xml
index 0ce234a..61f40e8 100644
--- a/indra/newview/skins/default/xui/fr/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/fr/floater_mute_object.xml
@@ -1,12 +1,12 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="mute by name" title="Ignorer les objets par nom">
 	<text name="message">
-		Ignorer par nom ne marche que pour les chats et IM, pas les sons.
-Vous devez saisir le nom exact de l&apos;objet.
+		Cette fonction ne marche que pour les chats et les IM,
+pas les sons. Saisissez le nom exact de l&apos;objet.
 	</text>
 	<line_editor name="object_name">
 		Nom de l&apos;objet
 	</line_editor>
-	<button label="OK" name="OK" />
-	<button label="Annuler" name="Cancel" />
+	<button label="OK" name="OK"/>
+	<button label="Annuler" name="Cancel"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_name_description.xml b/indra/newview/skins/default/xui/fr/floater_name_description.xml
index 8ff5d3a..33faa06 100644
--- a/indra/newview/skins/default/xui/fr/floater_name_description.xml
+++ b/indra/newview/skins/default/xui/fr/floater_name_description.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="Name/Description" title="">
 	<text name="name_label">
 		Nom :
@@ -6,6 +6,6 @@
 	<text name="description_label">
 		Description :
 	</text>
-	<button label="Annuler" name="cancel_btn" />
-	<button label="Charger (10 $L)" name="ok_btn" />
+	<button label="Annuler" name="cancel_btn"/>
+	<button label="Charger (10 L$)" name="ok_btn"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_new_outfit_dialog.xml b/indra/newview/skins/default/xui/fr/floater_new_outfit_dialog.xml
index 2f3f00b..3b2d497 100644
--- a/indra/newview/skins/default/xui/fr/floater_new_outfit_dialog.xml
+++ b/indra/newview/skins/default/xui/fr/floater_new_outfit_dialog.xml
@@ -1,86 +1,85 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="modal container" width="585">
-	<button label="Enregistrer" label_selected="Enregistrer" left="171" name="Save"
-	     width="100" />
-	<button label="Annuler" label_selected="Annuler" left="280" name="Cancel" width="100" />
-	<check_box label="Silhouette" name="checkbox_Shape" />
-	<check_box label="Peau" name="checkbox_Skin" />
-	<check_box label="Cheveux" name="checkbox_Hair" />
-	<check_box label="Yeux" name="checkbox_Eyes" />
-	<check_box label="Donner un nom de &#10;dossier à l&apos;ensemble" name="rename" />
-	<check_box label="Chemise" name="checkbox_Shirt" />
-	<check_box label="Pantalon" name="checkbox_Pants" />
-	<check_box label="Chaussures" name="checkbox_Shoes" />
-	<check_box label="Chaussettes" name="checkbox_Socks" />
-	<check_box label="Veste" name="checkbox_Jacket" />
-	<check_box label="Gants" name="checkbox_Gloves" />
-	<check_box label="Tricot de peau" name="checkbox_Undershirt" />
-	<check_box label="Sous-vêtements" name="checkbox_Underpants" />
-	<check_box label="Jupe" name="checkbox_Skirt" />
-	<check_box label="Poitrine" left="225" name="checkbox_Chest" />
-	<check_box label="Crâne" left="225" name="checkbox_Skull" />
-	<check_box label="Épaule gauche" left="225" name="checkbox_Left Shoulder" />
-	<check_box label="Épaule droite" left="225" name="checkbox_Right Shoulder" />
-	<check_box label="Main gauche" left="225" name="checkbox_Left Hand" />
-	<check_box label="Main droite" left="225" name="checkbox_Right Hand" />
-	<check_box label="Pied gauche" left="225" name="checkbox_Left Foot" />
-	<check_box label="Pied droit" left="225" name="checkbox_Right Foot" />
-	<check_box label="Colonne" left="225" name="checkbox_Spine" />
-	<check_box label="Bassin" left="225" name="checkbox_Pelvis" />
-	<check_box label="Bouche" left="225" name="checkbox_Mouth" />
-	<check_box label="Menton" left="225" name="checkbox_Chin" />
-	<check_box label="Oreille gauche" left="225" name="checkbox_Left Ear" />
-	<check_box label="Oreille droite" left="325" name="checkbox_Right Ear" />
-	<check_box label="Globe oculaire gauche" left="325" name="checkbox_Left Eyeball" />
-	<check_box label="Globe oculaire droit" left="325" name="checkbox_Right Eyeball" />
-	<check_box label="Nez" left="325" name="checkbox_Nose" />
-	<check_box label="Bras droit" left="325" name="checkbox_R Upper Arm" />
-	<check_box label="Avant-bras droit" left="325" name="checkbox_R Forearm" />
-	<check_box label="Bras gauche" left="325" name="checkbox_L Upper Arm" />
-	<check_box label="Avant-bras gauche" left="325" name="checkbox_L Forearm" />
-	<check_box label="Hanche droite" left="325" name="checkbox_Right Hip" />
-	<check_box label="Cuisse droite" left="325" name="checkbox_R Upper Leg" />
-	<check_box label="Jambe droite" left="325" name="checkbox_R Lower Leg" />
-	<check_box label="Hanche gauche" left="325" name="checkbox_Left Hip" />
-	<check_box label="Cuisse gauche" left="325" name="checkbox_L Upper Leg" />
-	<check_box label="Jambe gauche" left="460" name="checkbox_L Lower Leg" />
-	<check_box label="Estomac" left="460" name="checkbox_Stomach" />
-	<check_box label="Pectoral gauche" left="460" name="checkbox_Left Pec" />
-	<check_box label="Pectoral droit" left="460" name="checkbox_Right Pec" />
-	<check_box label="Centre 2" left="460" name="checkbox_Center 2" />
-	<check_box label="En haut à droite" left="460" name="checkbox_Top Right" />
-	<check_box label="En haut" left="460" name="checkbox_Top" />
-	<check_box label="En haut à gauche" left="460" name="checkbox_Top Left" />
-	<check_box label="Centre" left="460" name="checkbox_Center" />
-	<check_box label="En bas à gauche" left="460" name="checkbox_Bottom Left" />
-	<check_box label="En bas" left="460" name="checkbox_Bottom" />
-	<check_box label="En bas à droite" left="460" name="checkbox_Bottom Right" />
-	<text type="string" length="1" name="Make New Outfit">
+	<button label="Enregistrer" label_selected="Enregistrer" left="171" name="Save" width="100"/>
+	<button label="Annuler" label_selected="Annuler" left="280" name="Cancel" width="100"/>
+	<check_box label="Silhouette" name="checkbox_Shape"/>
+	<check_box label="Peau" name="checkbox_Skin"/>
+	<check_box label="Cheveux" name="checkbox_Hair"/>
+	<check_box label="Yeux" name="checkbox_Eyes"/>
+	<check_box label="Donner le nom du 
+dossier à l&apos;ensemble" name="rename"/>
+	<check_box label="Chemise" name="checkbox_Shirt"/>
+	<check_box label="Pantalon" name="checkbox_Pants"/>
+	<check_box label="Chaussures" name="checkbox_Shoes"/>
+	<check_box label="Chaussettes" name="checkbox_Socks"/>
+	<check_box label="Veste" name="checkbox_Jacket"/>
+	<check_box label="Gants" name="checkbox_Gloves"/>
+	<check_box label="Tricot de peau" name="checkbox_Undershirt"/>
+	<check_box label="Sous-vêtements" name="checkbox_Underpants"/>
+	<check_box label="Jupe" name="checkbox_Skirt"/>
+	<check_box label="Poitrine" left="225" name="checkbox_Chest"/>
+	<check_box label="Crâne" left="225" name="checkbox_Skull"/>
+	<check_box label="Épaule gauche" left="225" name="checkbox_Left Shoulder"/>
+	<check_box label="Épaule droite" left="225" name="checkbox_Right Shoulder"/>
+	<check_box label="Main gauche" left="225" name="checkbox_Left Hand"/>
+	<check_box label="Main droite" left="225" name="checkbox_Right Hand"/>
+	<check_box label="Pied gauche" left="225" name="checkbox_Left Foot"/>
+	<check_box label="Pied droit" left="225" name="checkbox_Right Foot"/>
+	<check_box label="Colonne" left="225" name="checkbox_Spine"/>
+	<check_box label="Bassin" left="225" name="checkbox_Pelvis"/>
+	<check_box label="Bouche" left="225" name="checkbox_Mouth"/>
+	<check_box label="Menton" left="225" name="checkbox_Chin"/>
+	<check_box label="Oreille gauche" left="225" name="checkbox_Left Ear"/>
+	<check_box label="Oreille droite" left="325" name="checkbox_Right Ear"/>
+	<check_box label="Å’il gauche" left="325" name="checkbox_Left Eyeball"/>
+	<check_box label="Å’il droit" left="325" name="checkbox_Right Eyeball"/>
+	<check_box label="Nez" left="325" name="checkbox_Nose"/>
+	<check_box label="Bras droit" left="325" name="checkbox_R Upper Arm"/>
+	<check_box label="Avant-bras droit" left="325" name="checkbox_R Forearm"/>
+	<check_box label="Bras gauche" left="325" name="checkbox_L Upper Arm"/>
+	<check_box label="Avant-bras gauche" left="325" name="checkbox_L Forearm"/>
+	<check_box label="Hanche droite" left="325" name="checkbox_Right Hip"/>
+	<check_box label="Cuisse droite" left="325" name="checkbox_R Upper Leg"/>
+	<check_box label="Jambe droite" left="325" name="checkbox_R Lower Leg"/>
+	<check_box label="Hanche gauche" left="325" name="checkbox_Left Hip"/>
+	<check_box label="Cuisse gauche" left="325" name="checkbox_L Upper Leg"/>
+	<check_box label="Jambe gauche" left="460" name="checkbox_L Lower Leg"/>
+	<check_box label="Estomac" left="460" name="checkbox_Stomach"/>
+	<check_box label="Pectoral gauche" left="460" name="checkbox_Left Pec"/>
+	<check_box label="Pectoral droit" left="460" name="checkbox_Right Pec"/>
+	<check_box label="Centre 2" left="460" name="checkbox_Center 2"/>
+	<check_box label="En haut à droite" left="460" name="checkbox_Top Right"/>
+	<check_box label="En haut" left="460" name="checkbox_Top"/>
+	<check_box label="En haut à gauche" left="460" name="checkbox_Top Left"/>
+	<check_box label="Centre" left="460" name="checkbox_Center"/>
+	<check_box label="En bas à gauche" left="460" name="checkbox_Bottom Left"/>
+	<check_box label="En bas" left="460" name="checkbox_Bottom"/>
+	<check_box label="En bas à droite" left="460" name="checkbox_Bottom Right"/>
+	<text length="1" name="Make New Outfit" type="string">
 		Créer un ensemble
 	</text>
-	<text type="string" length="1"
-	     name="Outfits are folders that contain clothing and body parts. Drag an outfit folder onto your avatar to put it on.   &quot;Make New Outfit&quot; makes a new folder and saves copies of the items you are now wearing into it.">
+	<text length="1" name="Outfits are folders that contain clothing and body parts. Drag an outfit folder onto your avatar to put it on.   &quot;Make New Outfit&quot; makes a new folder and saves copies of the items you are now wearing into it." type="string">
 		Les ensembles sont des dossiers qui contiennent des habits et des parties du corps.
 Faites glisser le dossier contenant un ensemble vers votre avatar pour lui faire porter.
  
 Le bouton Créer un ensemble vous permet de créer un dossier et d&apos;y sauvegarder les copies des articles que vous portez maintenant.
 	</text>
-	<text type="string" length="1" name="Folder name:">
+	<text length="1" name="Folder name:" type="string">
 		Nom du dossier :
 	</text>
-	<text type="string" length="1" name="Items to include in outfit:">
+	<text length="1" name="Items to include in outfit:" type="string">
 		Articles à inclure à l&apos;ensemble :
 	</text>
-	<text type="string" length="1" name="Body Parts:">
+	<text length="1" name="Body Parts:" type="string">
 		Parties du corps :
 	</text>
-	<text type="string" length="1" left="115" name="Clothes:">
+	<text left="115" length="1" name="Clothes:" type="string">
 		Habits :
 	</text>
-	<text type="string" length="1" left="227" name="Attachments:">
+	<text left="227" length="1" name="Attachments:" type="string">
 		Attachements :
 	</text>
-	<text type="string" length="1" name="Options:">
+	<text length="1" name="Options:" type="string">
 		Options :
 	</text>
 	<line_editor name="name ed">
diff --git a/indra/newview/skins/default/xui/fr/floater_pay.xml b/indra/newview/skins/default/xui/fr/floater_pay.xml
index 70146eb..7933a26 100644
--- a/indra/newview/skins/default/xui/fr/floater_pay.xml
+++ b/indra/newview/skins/default/xui/fr/floater_pay.xml
@@ -1,22 +1,22 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="Give Money" title="">
-	<button label="1 $L" label_selected="1 $L" name="fastpay 1" />
-	<button label="5 $L" label_selected="5 $L" name="fastpay 5" />
-	<button label="10 $L" label_selected="10 $L" name="fastpay 10" />
-	<button label="20 $L" label_selected="20 $L" name="fastpay 20" />
-	<button label="Payer" label_selected="Payer" name="pay btn" />
-	<button label="Annuler" label_selected="Annuler" name="cancel btn" />
-	<text type="string" length="1" name="payee_label">
+	<button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
+	<button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
+	<button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
+	<button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
+	<button label="Payer" label_selected="Payer" name="pay btn"/>
+	<button label="Annuler" label_selected="Annuler" name="cancel btn"/>
+	<text length="1" name="payee_label" type="string">
 		Payer :
 	</text>
-	<text type="string" length="1" name="payee_name">
+	<text length="1" name="payee_name" type="string">
 		[FIRST] [LAST]
 	</text>
-	<text type="string" length="1" name="fastpay text">
+	<text length="1" name="fastpay text" type="string">
 		Paiement rapide :
 	</text>
-	<text type="string" length="1" name="amount text" left="4">
+	<text left="4" length="1" name="amount text" type="string">
 		Montant :
 	</text>
-	<line_editor left="60" name="amount" width="55" />
+	<line_editor left="60" name="amount" width="55"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_pay_object.xml b/indra/newview/skins/default/xui/fr/floater_pay_object.xml
index 13675f7..ce2c4bb 100644
--- a/indra/newview/skins/default/xui/fr/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/fr/floater_pay_object.xml
@@ -1,30 +1,30 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="Give Money" title="">
-	<text type="string" length="1" name="payee_group">
+	<text length="1" name="payee_group" type="string">
 		Payer le groupe :
 	</text>
-	<text type="string" length="1" name="payee_resident">
+	<text length="1" name="payee_resident" type="string">
 		Payer le résident :
 	</text>
-	<text type="string" length="1" name="payee_name">
+	<text length="1" name="payee_name" type="string">
 		[FIRST] [LAST]
 	</text>
-	<text type="string" length="1" name="object_name_label">
+	<text length="1" name="object_name_label" type="string">
 		Via un objet :
 	</text>
-	<text type="string" length="1" name="object_name_text">
+	<text length="1" name="object_name_text" type="string">
 		...
 	</text>
-	<text type="string" length="1" name="fastpay text">
+	<text length="1" name="fastpay text" type="string">
 		Paiement rapide :
 	</text>
-	<text type="string" length="1" name="amount text">
+	<text length="1" name="amount text" type="string">
 		Montant :
 	</text>
-	<button label="1 $L" label_selected="1 $L" name="fastpay 1" />
-	<button label="5 $L" label_selected="5 $L" name="fastpay 5" />
-	<button label="10 $L" label_selected="10 $L" name="fastpay 10" />
-	<button label="20 $L" label_selected="20 $L" name="fastpay 20" />
-	<button label="Payer" label_selected="Payer" name="pay btn" />
-	<button label="Annuler" label_selected="Annuler" name="cancel btn" />
+	<button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
+	<button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
+	<button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
+	<button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
+	<button label="Payer" label_selected="Payer" name="pay btn"/>
+	<button label="Annuler" label_selected="Annuler" name="cancel btn"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
index e8441ea..0371469 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
@@ -33,12 +33,14 @@
 	<text name="steps_label">
 		Étapes :
 	</text>
+	<!-- Revert translations as interim fix to VWR-9985 while the code is not properly internationalized
 	<scroll_list name="library_list">
 		Animation
 Son
 Chat
 Attendre
 	</scroll_list>
+	-->
 	<button label="Ajouter &gt;&gt;" name="add_btn" />
 	<button label="Monter" name="up_btn" />
 	<button label="Descendre" name="down_btn" />
diff --git a/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml b/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml
index 1a4b20b..0efec83 100644
--- a/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml
+++ b/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="price_for_listing" title="Publier la petite annonce">
 	<text name="explanation_text">
 		Votre petite annonce restera en ligne pendant une semaine à compter de sa date de publication. 
@@ -7,8 +7,8 @@ La position de votre annonce dans les listes dépend du montant que vous décide
 Les annonces les plus chères paraissent en tête de liste et sont plus visibles dans les résultats de recherche.
 	</text>
 	<text name="price_text">
-		Coût de l&apos;annonce ($L) :
+		Coût de l&apos;annonce (L$) :
 	</text>
-	<button label="Fixer le prix" name="set_price_btn" />
-	<button label="Annuler" name="cancel_btn" />
+	<button label="Fixer le prix" name="set_price_btn"/>
+	<button label="Annuler" name="cancel_btn"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_region_info.xml b/indra/newview/skins/default/xui/fr/floater_region_info.xml
index 631d37a..be36b41 100644
--- a/indra/newview/skins/default/xui/fr/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/fr/floater_region_info.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="regioninfo" title="Région/Domaine" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="regioninfo" title="Région et domaine"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
index 7b90653..7c6826c 100644
--- a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="floater_report_abuse" title="Signaler une infraction">
 	<text name="reporter_title" width="60">
 		Déposant :
@@ -15,8 +15,8 @@
 	<text name="pos_title">
 		Position :
 	</text>
-	<texture_picker name="screenshot" />
-	<check_box label="Inclure une capture d&apos;écran" name="screen_check" />
+	<texture_picker name="screenshot"/>
+	<check_box label="Inclure une capture d&apos;écran" name="screen_check"/>
 	<text name="pos_field">
 		{128.1, 128.1, 15.4}
 	</text>
@@ -26,8 +26,7 @@
 	<text left_delta="70" name="owner_name" width="105">
 		Hendrerit Vulputate
 	</text>
-	<combo_box name="category_combo"
-	     tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport">
+	<combo_box name="category_combo" tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport">
 		<combo_item name="Select_category">
 			Sélectionnez une catégorie
 		</combo_item>
@@ -56,7 +55,7 @@
 			Commerce &gt; Incapacité à fournir un produit ou service
 		</combo_item>
 		<combo_item name="Disclosure__First_Life_information">
-			Divulgation &gt; Informations sur la première vie (First Life)
+			Divulgation &gt; Informations sur la vie réelle (First Life)
 		</combo_item>
 		<combo_item name="Disclosure__Remotely_monitoring chat">
 			Divulgation &gt; Écoute d&apos;un chat à distance
@@ -80,7 +79,7 @@
 			Trouble de la paix &gt; Spam à caractère commercial
 		</combo_item>
 		<combo_item name="Fraud__L$">
-			Fraude &gt; $L
+			Fraude &gt; L$
 		</combo_item>
 		<combo_item name="Fraud__Land">
 			Fraude &gt; Terrain
@@ -89,7 +88,7 @@
 			Fraude &gt; Vente pyramidale ou lettre-chaîne
 		</combo_item>
 		<combo_item name="Fraud__US$">
-			Fraude &gt; $US
+			Fraude &gt; US$
 		</combo_item>
 		<combo_item name="Harassment__Advert_farms___visual_spam">
 			Harcèlement &gt; Spam visuel
@@ -119,10 +118,10 @@
 			Indécence &gt; Nom d&apos;avatar inapproprié
 		</combo_item>
 		<combo_item name="Indecency__Mature_content_in_PG_region">
-			Indécence &gt; Contenu Adulte dans une région où l&apos;accompagnement parental est requis
+			Indécence &gt; Contenu Adultes dans une région Tout public
 		</combo_item>
 		<combo_item name="Intolerance">
-			Intolerance
+			Intolérance
 		</combo_item>
 		<combo_item name="Land__Abuse_of_sandbox_resources">
 			Terrain &gt; Utilisation abusive des ressources du bac à sable
@@ -146,8 +145,7 @@
 			Autre
 		</combo_item>
 	</combo_box>
-	<button label="" label_selected="" name="pick_btn"
-	     tool_tip="Le sélecteur d&apos;objet vous permet d&apos;identifier un objet comme sujet du rapport." />
+	<button label="" label_selected="" name="pick_btn" tool_tip="Le sélecteur d&apos;objet vous permet d&apos;identifier un objet comme sujet du rapport."/>
 	<text name="select_object_label">
 		Cliquez sur le bouton puis l&apos;objet :
 	</text>
@@ -160,12 +158,10 @@
 	<text name="abuser_name_title">
 		Nom du contrevenant :
 	</text>
-	<button label="Choisir le résident" label_selected="" name="select_abuser"
-	     tool_tip="Sélectionnez le nom du résident dans une liste" />
-	<check_box label="Ne connaît pas le nom du contrevenant" name="omit_abuser_name"
-	     tool_tip="Cochez cette case si vous ne connaissez pas le nom du contrevenant" />
+	<button label="Choisir le résident" label_selected="" name="select_abuser" tool_tip="Sélectionnez le nom du résident dans une liste"/>
+	<check_box label="Ne connaît pas le nom du contrevenant" name="omit_abuser_name" tool_tip="Cochez cette case si vous ne connaissez pas le nom du contrevenant"/>
 	<text name="abuser_name_title2">
-		Lieu où l&apos;infraction a eu lieu :
+		Indiquez où l&apos;infraction a eu lieu :
 	</text>
 	<text name="sum_title">
 		Récapitulatif :
@@ -176,13 +172,12 @@
 	<text name="bug_aviso">
 		Indiquez la date, le lieu, la nature de l&apos;infraction, ainsi que
 tout chat ou IM relatif à l&apos;infraction, en étant aussi précis
-que possible. Essayez aussi d&apos;indiquer un sujet.
+que possible. Pensez à indiquer un objet.
 	</text>
 	<text bottom_delta="-16" name="incomplete_title">
 		Remarque : les rapports incomplets ne feront pas l&apos;objet d&apos;une
 enquête.
 	</text>
-	<button label="Signaler une infraction" label_selected="Signaler une infraction"
-	     name="send_btn" />
-	<button label="Annuler" label_selected="Annuler" name="cancel_btn" />
+	<button label="Signaler une infraction" label_selected="Signaler une infraction" name="send_btn"/>
+	<button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_report_bug.xml b/indra/newview/skins/default/xui/fr/floater_report_bug.xml
index 0ab0981..eba1faa 100644
--- a/indra/newview/skins/default/xui/fr/floater_report_bug.xml
+++ b/indra/newview/skins/default/xui/fr/floater_report_bug.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="bug_reporter" title="Signaler un bug">
 	<text name="reporter_title">
 		Signalant :
@@ -12,8 +12,7 @@
 	<text name="select_object_label">
 		Cliquez sur le bouton puis l&apos;objet :
 	</text>
-	<button label="" label_selected="" name="pick_btn"
-	     tool_tip="Le sélecteur d&apos;objet vous permet d&apos;identifier un objet comme sujet du rapport." />
+	<button label="" label_selected="" name="pick_btn" tool_tip="Le sélecteur d&apos;objet vous permet d&apos;identifier un objet comme sujet du rapport."/>
 	<text name="object_name_label">
 		Nom :
 	</text>
@@ -23,16 +22,15 @@
 	<text name="owner_name_label">
 		Propriétaire :
 	</text>
-	<check_box label="Inclure une capture d&apos;écran" name="screen_check" />
-	<texture_picker label="Instantané en cours..." name="screenshot" />
+	<check_box label="Inclure une capture d&apos;écran" name="screen_check"/>
+	<texture_picker label="Instantané en cours..." name="screenshot"/>
 	<text name="category_label">
 		Catégorie :
 	</text>
 	<text name="owner_name">
 		Hendrerit Vulputate
 	</text>
-	<combo_box name="category_combo"
-	     tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport">
+	<combo_box name="category_combo" tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport">
 		<combo_item name="Selectcategory">
 			Sélectionnez une catégorie
 		</combo_item>
@@ -64,7 +62,7 @@
 			Contenu manquant
 		</combo_item>
 		<combo_item name="LindenDollars(L$)">
-			Dollar Linden ($L)
+			Dollar Linden (L$)
 		</combo_item>
 		<combo_item name="Permissions">
 			Autorisations
@@ -92,7 +90,7 @@
 		Récapitulatif :
 	</text>
 	<text name="dscr_title">
-		Détails : (Soyez aussi précis que possible)
+		Détails (soyez aussi précis que possible) :
 	</text>
 	<text_editor name="details_edit">
 		Étapes pour reproduire le bug :
@@ -105,6 +103,6 @@ Résultats attendus :
 		Remarque : les rapports incomplets ne feront pas l&apos;objet d&apos;une enquête.
 Si ce bug vous permet de faire quelque chose que vous ne devriez pas pouvoir faire, surtout s&apos;il a des conséquences sur la sécurité et la performance, veuillez sélectionner la catégorie Exploit. Merci !
 	</text>
-	<button label="Signaler un bug" label_selected="Signaler un bug" name="send_btn" />
-	<button label="Annuler" label_selected="Annuler" name="cancel_btn" />
+	<button label="Signaler un bug" label_selected="Signaler un bug" name="send_btn"/>
+	<button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_sell_land.xml b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
index e3256c8..7b90982 100644
--- a/indra/newview/skins/default/xui/fr/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="sell land" title="Vendre terrain">
 	<text name="info_parcel_label">
 		Parcelle :
@@ -22,10 +22,10 @@
 		Fixez un prix convenable pour ce terrain.
 	</text>
 	<text name="price_ld">
-		$L
+		L$
 	</text>
 	<text name="price_per_m">
-		([PER_METER] $L par mètre carré)
+		([PER_METER] L$ par mètre carré)
 	</text>
 	<text name="sell_to_label">
 		Vos acheteurs :
@@ -44,7 +44,7 @@
 			Acheteur spécifique :
 		</combo_item>
 	</combo_box>
-	<button label="Sélectionner..." name="sell_to_select_agent" />
+	<button label="Sélectionner..." name="sell_to_select_agent"/>
 	<text name="sell_objects_label">
 		Vendez-vous des objets avec ce terrain ?
 	</text>
@@ -59,10 +59,10 @@
 			Oui, vendre les objets avec le terrain
 		</radio_item>
 	</radio_group>
-	<button label="Afficher les objets" name="show_objects" />
+	<button label="Afficher les objets" name="show_objects"/>
 	<text name="nag_message_label">
 		Rappel : toute vente est définitive.
 	</text>
-	<button label="Mettre le terrain en vente" name="sell_btn" />
-	<button label="Annuler" name="cancel_btn" />
+	<button label="Mettre le terrain en vente" name="sell_btn"/>
+	<button label="Annuler" name="cancel_btn"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_skin_preview_template.xml b/indra/newview/skins/default/xui/fr/floater_skin_preview_template.xml
index 23206bb..8bd1ec3 100644
--- a/indra/newview/skins/default/xui/fr/floater_skin_preview_template.xml
+++ b/indra/newview/skins/default/xui/fr/floater_skin_preview_template.xml
@@ -1,19 +1,16 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <multi_floater name="floater_chatterbox">
-	<icon label="Voler" label_selected="Atterrir" name=""
-	     tool_tip="Commencez à voler. Utilisez E/C ou PgHaut/PageBas pour voler vers le haut et vers le bas." />
+	<icon label="Voler" label_selected="Atterrir" name="" tool_tip="Commencez à voler. Utilisez E/C ou PgHaut/PageBas pour voler vers le haut et vers le bas."/>
 	<panel name="panel_littletoolbar">
-		<button name="chat_btn" tool_tip="Afficher la barre de chat. (Entrée)" />
-		<flyout_button label="Communiquer" name="communicate_btn"
-		     tool_tip="Communiquer avec vos amis et vos groupes." />
-		<button label="Voler" label_selected="Atterrir" name="fly_btn"
-		     tool_tip="Commencez à voler. Utilisez E/C ou PgHaut/PageBas pour voler vers le haut et vers le bas." />
+		<button name="chat_btn" tool_tip="Affichez la barre de chat. (Entrée)"/>
+		<flyout_button label="Communiquer" name="communicate_btn" tool_tip="Communiquez avec vos amis et vos groupes."/>
+		<button label="Voler" label_selected="Atterrir" name="fly_btn" tool_tip="Commencez à voler. Utilisez E/C ou PgHaut/PageBas pour voler vers le haut et vers le bas."/>
 	</panel>
 	<panel name="panel_unfocused_floater">
 		<text name="titlebar_focused">
 			Pas de mise au point
 		</text>
-		<combo_box label="Zone combinée" name="combo_box_1" />
+		<combo_box label="Zone combinée" name="combo_box_1"/>
 		<text_editor name="Chat History Editor">
 			Texte
 		</text_editor>
@@ -24,14 +21,14 @@
 		</text>
 		<tab_container name="chatterbox_tabs">
 			<panel label="Mise au point" name="test_1">
-				<slider label="Curseur" name="SliderTestName" />
-				<check_box label="Vrai" name="check_box_test_1" />
-				<check_box label="Faux" name="check_box_test_2" />
+				<slider label="Curseur" name="SliderTestName"/>
+				<check_box label="Vrai" name="check_box_test_1"/>
+				<check_box label="Faux" name="check_box_test_2"/>
 				<text_editor name="Chat History Editor">
 					Texte du chat
 				</text_editor>
 			</panel>
-			<panel label="Pas de mise au point" name="test_2" />
+			<panel label="Pas de mise au point" name="test_2"/>
 		</tab_container>
 	</panel>
 </multi_floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_snapshot.xml b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
index 8fee6dc..aa2cfdd 100644
--- a/indra/newview/skins/default/xui/fr/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater height="536" name="Snapshot" title="Prévisualiser la photo" width="245">
 	<text name="type_label">
 		Destination de la photo
@@ -8,14 +8,14 @@
 			Envoyer par e-mail
 		</radio_item>
 		<radio_item name="texture">
-			Enregistrer dans votre inventaire (10 $L)
+			Enregistrer dans votre inventaire (10 L$)
 		</radio_item>
 		<radio_item name="local">
 			Enregistrer sur votre disque dur
 		</radio_item>
 	</radio_group>
-	<button label="Plus &gt;&gt;" name="more_btn" tool_tip="Options avancées" />
-	<button label="&lt;&lt; Moins" name="less_btn" tool_tip="Options avancées" />
+	<button label="Plus &gt;&gt;" name="more_btn" tool_tip="Options avancées"/>
+	<button label="&lt;&lt; Moins" name="less_btn" tool_tip="Options avancées"/>
 	<text name="type_label2">
 		Taille
 	</text>
@@ -93,9 +93,9 @@
 			BMP
 		</combo_item>
 	</combo_box>
-	<spinner label="Largeur" label_width="41" name="snapshot_width" width="101" />
-	<spinner label="Hauteur" label_width="41" left="121" name="snapshot_height" width="101" />
-	<slider label="Qualité de l&apos;image" name="image_quality_slider" />
+	<spinner label="Largeur" label_width="41" name="snapshot_width" width="101"/>
+	<spinner label="Hauteur" label_width="41" left="121" name="snapshot_height" width="101"/>
+	<slider label="Qualité de l&apos;image" name="image_quality_slider"/>
 	<text name="layer_type_label">
 		Capturer :
 	</text>
@@ -113,20 +113,17 @@
 	<text name="file_size_label">
 		Taille du fichier : [SIZE] Ko
 	</text>
-	<check_box bottom_delta="-20" label="Voir l&apos;interface sur la photo" name="ui_check" />
-	<check_box bottom_delta="-18" label="Voir les éléments HUD sur la photo"
-	     name="hud_check" />
-	<check_box bottom_delta="-18" label="Garder ouvert après enregistrement"
-	     name="keep_open_check" />
-	<check_box label="Imposer les proportions" name="keep_aspect_check" />
-	<check_box bottom_delta="-18" label="Geler le cadre (prévisualisation &#10;plein écran)"
-	     name="freeze_frame_check" />
-	<button bottom_delta="-18" label="Rafraîchir" name="new_snapshot_btn" />
-	<check_box bottom_delta="-30" label="Auto-rafraîchir" name="auto_snapshot_check" />
-	<button label="Enregistrer (10 $L)" name="upload_btn" />
-	<button label="Envoyer" name="send_btn" />
-	<flyout_button label="Enregistrer" name="save_btn"
-	     tool_tip="Enregistrer l&apos;image dans un fichier">
+	<check_box bottom_delta="-20" label="Voir l&apos;interface sur la photo" name="ui_check"/>
+	<check_box bottom_delta="-18" label="Voir les éléments HUD sur la photo" name="hud_check"/>
+	<check_box bottom_delta="-18" label="Garder ouvert après enregistrement" name="keep_open_check"/>
+	<check_box label="Imposer les proportions" name="keep_aspect_check"/>
+	<check_box bottom_delta="-18" label="Prévisualisation plein écran
+(geler l&apos;écran)" name="freeze_frame_check"/>
+	<button bottom_delta="-18" label="Rafraîchir" name="new_snapshot_btn"/>
+	<check_box bottom_delta="-30" label="Rafraîchissement automatique" name="auto_snapshot_check"/>
+	<button label="Enregistrer (10 L$)" name="upload_btn"/>
+	<button label="Envoyer" name="send_btn"/>
+	<flyout_button label="Enregistrer" name="save_btn" tool_tip="Enregistrer l&apos;image dans un fichier">
 		<flyout_button_item name="save_item">
 			Enregistrer
 		</flyout_button_item>
@@ -134,7 +131,7 @@
 			Enregistrer sous...
 		</flyout_button_item>
 	</flyout_button>
-	<button label="Annuler" name="discard_btn" />
+	<button label="Annuler" name="discard_btn"/>
 	<string name="unknown">
 		inconnu
 	</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_sound_preview.xml b/indra/newview/skins/default/xui/fr/floater_sound_preview.xml
index 9c9c630..22bf929 100644
--- a/indra/newview/skins/default/xui/fr/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_sound_preview.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="Name/Description" title="sound.wav">
 	<text name="name_label">
 		Nom :
@@ -6,8 +6,8 @@
 	<text name="description_label">
 		Description :
 	</text>
-	<button label="Annuler" label_selected="Annuler" name="cancel_btn" />
-	<button label="Charger (10 $L)" label_selected="Charger (10 $L)" name="ok_btn" />
+	<button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
+	<button label="Charger (10 L$)" label_selected="Charger (10 L$)" name="ok_btn"/>
 	<text name="text">
 		Débit (kbps) :
 	</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
index 115d006..07b18e4 100644
--- a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
@@ -1,23 +1,23 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="texture picker" title="Choisir : Texture">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="texture picker" title="Texture">
 	<string name="choose_picture">
 		Cliquez pour sélectionner une image
 	</string>
-	<text type="string" length="1" name="Multiple">
+	<text length="1" name="Multiple" type="string">
 		Multiple
 	</text>
-	<text type="string" length="1" name="unknown">
+	<text length="1" name="unknown" type="string">
 		Dimensions : [DIMENSIONS]
 	</text>
-	<button label="Défaut" label_selected="Défaut" name="Default" />
-	<button label="Aucune" label_selected="Aucune" name="None" />
-	<button label="Vierge" label_selected="Vierge" name="Blank" />
-	<check_box label="Afficher les dossiers" name="show_folders_check" />
-	<search_editor label="Saisissez votre recherche ici" name="inventory search editor" />
-	<check_box label="Appliquer immédiatement" name="apply_immediate_check" />
-	<button label="" label_selected="" name="Pipette" />
-	<button label="Annuler" label_selected="Annuler" name="Cancel" />
-	<button label="Sélectionner" label_selected="Sélectionner" name="Select" />
+	<button label="Défaut" label_selected="Défaut" name="Default"/>
+	<button label="Aucune" label_selected="Aucune" name="None"/>
+	<button label="Vierge" label_selected="Vierge" name="Blank"/>
+	<check_box label="Afficher les dossiers" name="show_folders_check"/>
+	<search_editor label="Saisissez votre recherche ici" name="inventory search editor"/>
+	<check_box label="Appliquer immédiatement" name="apply_immediate_check"/>
+	<button label="" label_selected="" name="Pipette"/>
+	<button label="Annuler" label_selected="Annuler" name="Cancel"/>
+	<button label="Sélectionner" label_selected="Sélectionner" name="Select"/>
 	<string name="pick title">
 		Choisir :
 	</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml
index 35d9d8a..33ddbfa 100644
--- a/indra/newview/skins/default/xui/fr/floater_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tools.xml
@@ -1,42 +1,42 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="toolbox floater" title="">
-	<button label="" label_selected="" name="button focus" tool_tip="Mise au point" />
+	<button label="" label_selected="" name="button focus" tool_tip="Mise au point"/>
 	<text name="tool label">
-		Faire le point
+		Mise au point
 	</text>
-	<button label="" label_selected="" name="button move" tool_tip="Déplacer" />
+	<button label="" label_selected="" name="button move" tool_tip="Déplacer"/>
 	<text name="tool label2">
 		Se déplacer
 	</text>
-	<button label="" label_selected="" name="button edit" tool_tip="Modifier" />
+	<button label="" label_selected="" name="button edit" tool_tip="Modifier"/>
 	<text name="tool label3">
 		Edition
 	</text>
-	<button label="" label_selected="" name="button create" tool_tip="Créer" />
+	<button label="" label_selected="" name="button create" tool_tip="Créer"/>
 	<text name="tool label4">
 		Créer
 	</text>
-	<button label="" label_selected="" name="button land" tool_tip="Terrain" />
+	<button label="" label_selected="" name="button land" tool_tip="Terrain"/>
 	<text name="tool label5">
 		Terrain
 	</text>
-	<check_box label="Zoom" name="radio zoom" />
-	<check_box label="Orbite (Ctrl)" name="radio orbit" />
-	<check_box label="Panoramique (Ctrl-Maj)" name="radio pan" />
-	<check_box label="Déplacer" name="radio move" />
-	<check_box label="Orbite (Ctrl)" name="radio lift" />
-	<check_box label="Faire tourner (Ctrl-Maj)" name="radio spin" />
-	<check_box label="Position" name="radio position" />
-	<check_box label="Faire pivoter (Ctrl)" name="radio rotate" />
-	<check_box label="Étirer (Ctrl-Maj)" name="radio stretch" />
-	<check_box label="Sélectionner une texture" name="radio select face" />
-	<check_box label="Modifier les parties liées" name="checkbox edit linked parts" />
-	<check_box label="Utiliser la grille" name="checkbox snap to grid" />
-	<button label="Options..." label_selected="Options..." name="Options..." />
-	<check_box label="Étirer les deux côtés" name="checkbox uniform" />
-	<check_box label="Étirer les textures" name="checkbox stretch textures" />
+	<check_box label="Zoom" name="radio zoom"/>
+	<check_box label="Orbite (Ctrl)" name="radio orbit"/>
+	<check_box label="Panoramique (Ctrl-Maj)" name="radio pan"/>
+	<check_box label="Déplacer" name="radio move"/>
+	<check_box label="Orbite (Ctrl)" name="radio lift"/>
+	<check_box label="Faire tourner (Ctrl-Maj)" name="radio spin"/>
+	<check_box label="Positionner" name="radio position"/>
+	<check_box label="Pivoter (Ctrl)" name="radio rotate"/>
+	<check_box label="Étirer (Ctrl-Maj)" name="radio stretch"/>
+	<check_box label="Sélectionner une face" name="radio select face"/>
+	<check_box label="Modifier les parties liées" name="checkbox edit linked parts"/>
+	<check_box label="Utiliser la grille" name="checkbox snap to grid"/>
+	<button label="Options..." label_selected="Options..." name="Options..."/>
+	<check_box label="Étirer les deux côtés" name="checkbox uniform"/>
+	<check_box label="Étirer les textures" name="checkbox stretch textures"/>
 	<text name="text ruler mode">
-		Règle :
+		Axe :
 	</text>
 	<text name="text status">
 		Faîtes glisser pour déplacer, Maj-faire glisser pour copier.
@@ -52,32 +52,32 @@
 			Référence
 		</combo_item>
 	</combo_box>
-	<button label="" label_selected="" name="ToolCube" tool_tip="Cube" />
-	<button label="" label_selected="" name="ToolPrism" tool_tip="Prisme" />
-	<button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide" />
-	<button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tétraèdre" />
-	<button label="" label_selected="" name="ToolCylinder" tool_tip="Cylindre" />
-	<button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Demi-cylindre" />
-	<button label="" label_selected="" name="ToolCone" tool_tip="Cône" />
-	<button label="" label_selected="" name="ToolHemiCone" tool_tip="Demi-cône" />
-	<button label="" label_selected="" name="ToolSphere" tool_tip="Sphère" />
-	<button label="" label_selected="" name="ToolHemiSphere" tool_tip="Demi-sphère" />
-	<check_box label="Copier la sélection" name="checkbox copy selection" />
-	<button label="" label_selected="" name="ToolTorus" tool_tip="Tore" />
-	<button label="" label_selected="" name="ToolTube" tool_tip="Tube" />
-	<button label="" label_selected="" name="ToolRing" tool_tip="Anneau" />
-	<button label="" label_selected="" name="ToolTree" tool_tip="Arbre" />
-	<button label="" label_selected="" name="ToolGrass" tool_tip="Herbe" />
-	<check_box label="Maintenir l&apos;outil sélectionné" name="checkbox sticky" />
-	<check_box label="Centrer la copie" name="checkbox copy centers" />
-	<check_box label="Faire pivoter la copie" name="checkbox copy rotates" />
-	<check_box label="Sélectionner le terrain" name="radio select land" />
-	<check_box label="Aplatir le terrain" name="radio flatten" />
-	<check_box label="Surélever le terrain" name="radio raise" />
-	<check_box label="Abaisser le terrain" name="radio lower" />
-	<check_box label="Lisser le terrain" name="radio smooth" />
-	<check_box label="Bosseler le terrain" name="radio noise" />
-	<check_box label="Rétablir le terrain" name="radio revert" />
+	<button label="" label_selected="" name="ToolCube" tool_tip="Cube"/>
+	<button label="" label_selected="" name="ToolPrism" tool_tip="Prisme"/>
+	<button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/>
+	<button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tétraèdre"/>
+	<button label="" label_selected="" name="ToolCylinder" tool_tip="Cylindre"/>
+	<button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Demi-cylindre"/>
+	<button label="" label_selected="" name="ToolCone" tool_tip="Cône"/>
+	<button label="" label_selected="" name="ToolHemiCone" tool_tip="Demi-cône"/>
+	<button label="" label_selected="" name="ToolSphere" tool_tip="Sphère"/>
+	<button label="" label_selected="" name="ToolHemiSphere" tool_tip="Demi-sphère"/>
+	<check_box label="Copier la sélection" name="checkbox copy selection"/>
+	<button label="" label_selected="" name="ToolTorus" tool_tip="Tore"/>
+	<button label="" label_selected="" name="ToolTube" tool_tip="Tube"/>
+	<button label="" label_selected="" name="ToolRing" tool_tip="Anneau"/>
+	<button label="" label_selected="" name="ToolTree" tool_tip="Arbre"/>
+	<button label="" label_selected="" name="ToolGrass" tool_tip="Herbe"/>
+	<check_box label="Maintenir l&apos;outil sélectionné" name="checkbox sticky"/>
+	<check_box label="Centrer la copie" name="checkbox copy centers"/>
+	<check_box label="Pivoter la copie" name="checkbox copy rotates"/>
+	<check_box label="Sélectionner le terrain" name="radio select land"/>
+	<check_box label="Aplatir le terrain" name="radio flatten"/>
+	<check_box label="Élever le terrain" name="radio raise"/>
+	<check_box label="Abaisser le terrain" name="radio lower"/>
+	<check_box label="Lisser le terrain" name="radio smooth"/>
+	<check_box label="Bosseler le terrain" name="radio noise"/>
+	<check_box label="Annuler modification" name="radio revert"/>
 	<combo_box name="combobox brush size">
 		<combo_item name="Small">
 			Petit
@@ -92,12 +92,10 @@
 	<text name="Strength:">
 		Force :
 	</text>
-	<button label="Appliquer à la sélection" label_selected="Appliquer à la sélection"
-	     name="button apply to selection"
-	     tool_tip="Modifier le terrain sélectionné" />
-	<check_box label="Afficher les propriétaires" name="checkbox show owners" />
-	<button label="Plus &gt;&gt;" name="button more" tool_tip="Options avancées" />
-	<button label="&lt;&lt; Moins" name="button less" tool_tip="Options avancées" />
+	<button label="Appliquer à la sélection" label_selected="Appliquer à la sélection" name="button apply to selection" tool_tip="Modifier le terrain sélectionné"/>
+	<check_box label="Afficher les limites" name="checkbox show owners"/>
+	<button label="Plus &gt;&gt;" name="button more" tool_tip="Options avancées"/>
+	<button label="&lt;&lt; Moins" name="button less" tool_tip="Options avancées"/>
 	<tab_container name="Object Info Tabs">
 		<panel label="Général" name="General">
 			<text name="Name:">
@@ -112,21 +110,21 @@
 			<text name="Creator Name">
 				Thrax Linden
 			</text>
-			<button label="Profil..." label_selected="Profil..." name="button creator profile" />
+			<button label="Profil..." label_selected="Profil..." name="button creator profile"/>
 			<text name="Owner:">
 				Propriétaire :
 			</text>
 			<text name="Owner Name">
 				Thrax Linden
 			</text>
-			<button label="Profil..." label_selected="Profil..." name="button owner profile" />
+			<button label="Profil..." label_selected="Profil..." name="button owner profile"/>
 			<text name="Group:">
 				Groupe :
 			</text>
 			<text name="Group Name Proxy">
-				Les Linden
+				Les Lindens
 			</text>
-			<button label="Définir..." label_selected="Définir..." name="button set group" />
+			<button label="Définir..." label_selected="Définir..." name="button set group"/>
 			<text name="prim info">
 				1 objet, 1 prim
 			</text>
@@ -136,34 +134,30 @@
 			<text name="perm_modify">
 				Vous pouvez modifier cet objet.
 			</text>
-			<check_box label="Partager avec le groupe" name="checkbox share with group"
-			     tool_tip="Autoriser les membres du groupe à déplacer, copier et supprimer." />
+			<check_box label="Partager avec le groupe" name="checkbox share with group" tool_tip="Autoriser les membres du groupe à déplacer, copier et supprimer."/>
 			<text name="text deed continued">
 				Transférer...
 			</text>
 			<text name="text deed">
 				Transférer
 			</text>
-			<button label="Transférer..." label_selected="Transférer..." name="button deed"
-			     tool_tip="Les objets partagés par un groupe peuvent être transférés par un officier." />
-			<check_box label="Autoriser tout le monde à déplacer"
-			     name="checkbox allow everyone move" />
-			<check_box label="Autoriser tout le monde à copier" name="checkbox allow everyone copy" />
-			<check_box label="Afficher dans la recherche" name="search_check"
-			     tool_tip="Afficher l&apos;objet dans les résultats de recherche" />
-			<check_box label="À vendre" name="checkbox for sale" />
+			<button label="Céder..." label_selected="Céder..." name="button deed" tool_tip="Les objets partagés par un groupe peuvent être cédés par un officier."/>
+			<check_box label="Autoriser tout le monde à déplacer" name="checkbox allow everyone move"/>
+			<check_box label="Autoriser tout le monde à copier" name="checkbox allow everyone copy"/>
+			<check_box label="Afficher dans la recherche" name="search_check" tool_tip="Afficher l&apos;objet dans les résultats de recherche"/>
+			<check_box label="À vendre" name="checkbox for sale"/>
 			<text name="Price:  L$">
-				Prix :  L$
+				Prix : L$
 			</text>
 			<text name="Cost">
-				Prix :  $L
+				Prix : L$
 			</text>
 			<radio_group name="sale type">
 				<radio_item name="Original">
 					Original
 				</radio_item>
 				<radio_item name="Copy">
-					Copier
+					Copie
 				</radio_item>
 				<radio_item name="Contents">
 					Contenus
@@ -172,18 +166,18 @@
 			<text name="Next owner can:">
 				Le prochain propriétaire pourra :
 			</text>
-			<check_box label="Modifier" name="checkbox next owner can modify" />
-			<check_box label="Copier" name="checkbox next owner can copy" />
-			<check_box label="Revendre/Donner" name="checkbox next owner can transfer" />
+			<check_box label="Modifier" name="checkbox next owner can modify"/>
+			<check_box label="Copier" name="checkbox next owner can copy"/>
+			<check_box label="Revendre/Donner" name="checkbox next owner can transfer"/>
 			<text name="label click action">
-				Action clic-gauche :
+				Action du clic-gauche :
 			</text>
 			<combo_box name="clickaction">
 				<combo_item name="Touch/grab(default)">
 					Toucher/attraper (défaut)
 				</combo_item>
 				<combo_item name="Sitonobject">
-					M&apos;asseoir sur l&apos;objet
+					S&apos;asseoir sur l&apos;objet
 				</combo_item>
 				<combo_item name="Buyobject">
 					Acheter l&apos;objet
@@ -195,10 +189,10 @@
 					Ouvrir
 				</combo_item>
 				<combo_item name="Play">
-					Jouer le média sur la parcelle
+					Jouer le média de la parcelle
 				</combo_item>
 				<combo_item name="Opemmedia">
-					Ouvrir le média sur la parcelle
+					Ouvrir le média de la parcelle
 				</combo_item>
 			</combo_box>
 			<text name="B:">
@@ -232,16 +226,16 @@
 				Vous ne pouvez pas modifier ces objets.
 			</text>
 			<text name="text modify warning">
-				Pour définir les permissions, vous devez sélectionner l&apos;objet en entier.
+				Sélectionnez l&apos;objet en entier.
 			</text>
 			<string name="Cost Default">
-				Prix :           $L
+				Prix :           L$
 			</string>
 			<string name="Cost Total">
-				Prix total :  $L
+				Prix total :  L$
 			</string>
 			<string name="Cost Per Unit">
-				Prix par :     $L
+				Prix par :     L$
 			</string>
 			<string name="Cost Mixed">
 				Prix mixte
@@ -252,37 +246,33 @@
 		</panel>
 		<panel label="Objet" name="Object">
 			<text name="select_single">
-				Sélectionnez un seul prim pour modifier les paramètres.
+				Sélectionnez un prim pour modifier les paramètres.
 			</text>
 			<text name="edit_object">
 				Modifier les paramètres de l&apos;objet :
 			</text>
-			<check_box label="Verrouillé" name="checkbox locked"
-			     tool_tip="Empêche l&apos;objet d&apos;être déplacé ou supprimé. Utile pendant la construction pour éviter les modifications involontaires." />
-			<check_box label="Physique" name="Physical Checkbox Ctrl"
-			     tool_tip="Permet à l&apos;objet d&apos;être poussé et affecté par la gravité" />
-			<check_box label="Temporaire" name="Temporary Checkbox Ctrl"
-			     tool_tip="L&apos;objet est supprimé 1 mn après sa création." />
-			<check_box label="Fantôme" name="Phantom Checkbox Ctrl"
-			     tool_tip="Permet à l&apos;objet de ne pas entrer en collision avec d&apos;autres objets ou avatars." />
+			<check_box label="Verrouillé" name="checkbox locked" tool_tip="Empêche l&apos;objet d&apos;être déplacé ou supprimé. Utile pendant la construction pour éviter les modifications involontaires."/>
+			<check_box label="Physique" name="Physical Checkbox Ctrl" tool_tip="Permet à l&apos;objet d&apos;être poussé et affecté par la gravité"/>
+			<check_box label="Temporaire" name="Temporary Checkbox Ctrl" tool_tip="L&apos;objet est supprimé 1 mn après sa création."/>
+			<check_box label="Fantôme" name="Phantom Checkbox Ctrl" tool_tip="Permet à l&apos;objet de ne pas entrer en collision avec d&apos;autres objets ou avatars."/>
 			<text name="label position">
 				Position (mètres)
 			</text>
-			<spinner label="X" name="Pos X" />
-			<spinner label="Y" name="Pos Y" />
-			<spinner label="Z" name="Pos Z" />
+			<spinner label="X" name="Pos X"/>
+			<spinner label="Y" name="Pos Y"/>
+			<spinner label="Z" name="Pos Z"/>
 			<text name="label size">
 				Taille (mètres)
 			</text>
-			<spinner label="X" name="Scale X" />
-			<spinner label="Y" name="Scale Y" />
-			<spinner label="Z" name="Scale Z" />
+			<spinner label="X" name="Scale X"/>
+			<spinner label="Y" name="Scale Y"/>
+			<spinner label="Z" name="Scale Z"/>
 			<text name="label rotation">
 				Rotation (degrés)
 			</text>
-			<spinner label="X" name="Rot X" />
-			<spinner label="Y" name="Rot Y" />
-			<spinner label="Z" name="Rot Z" />
+			<spinner label="X" name="Rot X"/>
+			<spinner label="Y" name="Rot Y"/>
+			<spinner label="Z" name="Rot Z"/>
 			<text name="label material">
 				Matériau
 			</text>
@@ -335,19 +325,19 @@
 					Anneau
 				</combo_item>
 				<combo_item name="Sculpted">
-					Sculpté
+					Sculptie
 				</combo_item>
 			</combo_box>
 			<text name="text cut">
-				Début et fin de la découpe du tracé
+				Début et fin de découpe du tracé
 			</text>
-			<spinner label="D" name="cut begin" />
-			<spinner label="F" name="cut end" />
+			<spinner label="D" name="cut begin"/>
+			<spinner label="F" name="cut end"/>
 			<text name="text hollow">
 				Creux
 			</text>
 			<text name="text skew">
-				Biaiser
+				Biais
 			</text>
 			<text name="Hollow Shape">
 				Forme du creux
@@ -367,50 +357,47 @@
 				</combo_item>
 			</combo_box>
 			<text name="text twist">
-				Début et fin de la vrille
+				Début et fin de vrille
 			</text>
-			<spinner label="D" name="Twist Begin" />
-			<spinner label="F" name="Twist End" />
+			<spinner label="D" name="Twist Begin"/>
+			<spinner label="F" name="Twist End"/>
 			<text name="scale_taper">
-				Biseauter
+				Biseautage
 			</text>
 			<text name="scale_hole">
 				Taille du trou
 			</text>
-			<spinner label="X" name="Taper Scale X" />
-			<spinner label="Y" name="Taper Scale Y" />
+			<spinner label="X" name="Taper Scale X"/>
+			<spinner label="Y" name="Taper Scale Y"/>
 			<text name="text topshear">
 				Inclinaison
 			</text>
-			<spinner label="X" name="Shear X" />
-			<spinner label="Y" name="Shear Y" />
+			<spinner label="X" name="Shear X"/>
+			<spinner label="Y" name="Shear Y"/>
 			<text name="advanced_cut">
-				Début et fin de la découpe du profilé
+				Début et fin de découpe du profilé
 			</text>
 			<text name="advanced_dimple">
 				Début et fin du creux
 			</text>
-			<spinner label="D" name="Path Limit Begin" />
-			<spinner label="F" name="Path Limit End" />
+			<spinner label="D" name="Path Limit Begin"/>
+			<spinner label="F" name="Path Limit End"/>
 			<text name="text taper2">
-				Biseauter
+				Biseautage
 			</text>
-			<spinner label="X" name="Taper X" />
-			<spinner label="Y" name="Taper Y" />
+			<spinner label="X" name="Taper X"/>
+			<spinner label="Y" name="Taper Y"/>
 			<text name="text radius delta">
 				Rayon
 			</text>
 			<text name="text revolutions">
 				Révolutions
 			</text>
-			<texture_picker label="Sculpter la texture" name="sculpt texture control"
-			     tool_tip="Cliquez pour sélectionner une image" />
-			<check_box label="Mirroir" name="sculpt mirror control"
-			     tool_tip="Retourne le prim sculpté le long de l&apos;axe des X." />
-			<check_box label="A l&apos;envers" name="sculpt invert control"
-			     tool_tip="Inverse les valeurs normales d&apos;un prim sculpté et le fait apparaître à l&apos;envers." />
+			<texture_picker label="Texture du sculptie" name="sculpt texture control" tool_tip="Cliquez pour sélectionner une image"/>
+			<check_box label="Mirroir" name="sculpt mirror control" tool_tip="Retourne le sculptie le long de l&apos;axe des X."/>
+			<check_box label="A l&apos;envers" name="sculpt invert control" tool_tip="Inverse les valeurs normales d&apos;un sculptie et le fait apparaître à l&apos;envers."/>
 			<text name="label sculpt type">
-				Type de couture
+				Type de raccord
 			</text>
 			<combo_box name="sculpt type control">
 				<combo_item name="None">
@@ -432,44 +419,39 @@
 		</panel>
 		<panel label="Attributs" name="Features">
 			<text name="select_single">
-				Sélectionnez un seul prim pour modifier les attributs.
+				Sélectionnez un prim pour modifier les attributs.
 			</text>
 			<text name="edit_object">
 				Modifier les attributs de l&apos;objet :
 			</text>
-			<check_box label="Tracé flexible" name="Flexible1D Checkbox Ctrl"
-			     tool_tip="Donne à l&apos;objet de la souplesse sur l&apos;axe des Z.  (côté client uniquement)" />
-			<spinner label="Souplesse" name="FlexNumSections" />
-			<spinner label="Gravité" name="FlexGravity" />
-			<spinner label="Faire glisser" name="FlexFriction" />
-			<spinner label="Vent" name="FlexWind" />
-			<spinner label="Tension" name="FlexTension" />
-			<spinner label="Force X" name="FlexForceX" />
-			<spinner label="Force Y" name="FlexForceY" />
-			<spinner label="Force Z" name="FlexForceZ" />
-			<check_box label="Lumière" name="Light Checkbox Ctrl"
-			     tool_tip="Permet aux objets d&apos;émettre de la lumière" />
+			<check_box label="Flexibilité" name="Flexible1D Checkbox Ctrl" tool_tip="Donne à l&apos;objet de la souplesse sur l&apos;axe des Z (côté client uniquement)."/>
+			<spinner label="Souplesse" name="FlexNumSections"/>
+			<spinner label="Gravité" name="FlexGravity"/>
+			<spinner label="Élasticité" name="FlexFriction"/>
+			<spinner label="Vent" name="FlexWind"/>
+			<spinner label="Tension" name="FlexTension"/>
+			<spinner label="Force X" name="FlexForceX"/>
+			<spinner label="Force Y" name="FlexForceY"/>
+			<spinner label="Force Z" name="FlexForceZ"/>
+			<check_box label="Lumière" name="Light Checkbox Ctrl" tool_tip="Permet aux objets d&apos;émettre de la lumière"/>
 			<text name="label color">
 				Couleur
 			</text>
-			<color_swatch label="" name="colorswatch"
-			     tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" />
-			<spinner label="Intensité" name="Light Intensity" />
-			<spinner label="Rayon" name="Light Radius" />
-			<spinner label="Atténuation" name="Light Falloff" />
+			<color_swatch label="" name="colorswatch" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+			<spinner label="Intensité" name="Light Intensity"/>
+			<spinner label="Portée" name="Light Radius"/>
+			<spinner label="Atténuation" name="Light Falloff"/>
 		</panel>
 		<panel label="Texture" name="Texture">
-			<texture_picker label="Texture" name="texture control"
-			     tool_tip="Cliquez pour sélectionner une image" />
-			<color_swatch label="Couleur" name="colorswatch"
-			     tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" />
+			<texture_picker label="Texture" name="texture control" tool_tip="Cliquez pour sélectionner une image"/>
+			<color_swatch label="Couleur" name="colorswatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/>
 			<text name="color trans" width="88">
-				Transparence (%)
+				Transparence
 			</text>
 			<text name="glow label">
 				Rayonnement
 			</text>
-			<check_box label="Luminosité &#10;maximale" name="checkbox fullbright" />
+			<check_box label="Rendre lumineux" name="checkbox fullbright"/>
 			<text name="tex gen">
 				Application
 			</text>
@@ -478,7 +460,7 @@
 					Défaut
 				</combo_item>
 				<combo_item name="Planar">
-					Planaire
+					Planar
 				</combo_item>
 			</combo_box>
 			<text name="label shininess">
@@ -512,58 +494,58 @@
 					Obscurité
 				</combo_item>
 				<combo_item name="woodgrain">
-					aggloméré
+					Aggloméré
 				</combo_item>
 				<combo_item name="bark">
-					écorce
+					Écorce
 				</combo_item>
 				<combo_item name="bricks">
-					briques
+					Briques
 				</combo_item>
 				<combo_item name="checker">
-					damier
+					Damier
 				</combo_item>
 				<combo_item name="concrete">
-					béton
+					Béton
 				</combo_item>
 				<combo_item name="crustytile">
-					carrelage
+					Carrelage
 				</combo_item>
 				<combo_item name="cutstone">
-					pierre de taille
+					Pierre de taille
 				</combo_item>
 				<combo_item name="discs">
-					rondelles
+					Disques
 				</combo_item>
 				<combo_item name="gravel">
-					gravier
+					Gravier
 				</combo_item>
 				<combo_item name="petridish">
-					boîte de Petri
+					Boîte de Petri
 				</combo_item>
 				<combo_item name="siding">
-					bardage
+					Lattes
 				</combo_item>
 				<combo_item name="stonetile">
-					carreau
+					Carreaux
 				</combo_item>
 				<combo_item name="stucco">
-					stuc
+					Stuc
 				</combo_item>
 				<combo_item name="suction">
-					ventouses
+					Ventouses
 				</combo_item>
 				<combo_item name="weave">
-					tissage
+					Tissage
 				</combo_item>
 			</combo_box>
 			<text name="tex scale">
 				Répétitions par face
 			</text>
-			<spinner label="Horizontal (U)" name="TexScaleU" />
-			<check_box label="Retourner" name="checkbox flip s" />
-			<spinner label="Vertical (V)" name="TexScaleV" />
-			<check_box label="Retourner" name="checkbox flip t" />
+			<spinner label="Horizontal (U)" name="TexScaleU"/>
+			<check_box label="Inverser" name="checkbox flip s"/>
+			<spinner label="Vertical (V)" name="TexScaleV"/>
+			<check_box label="Inverser" name="checkbox flip t"/>
 			<text name="tex rotate">
 				Rotation (degrés)
 			</text>
@@ -576,38 +558,34 @@
 			<text name="rpt">
 				Répétitions au mètre
 			</text>
-			<button label="Appliquer" label_selected="Appliquer" name="button apply" />
+			<button label="Appliquer" label_selected="Appliquer" name="button apply"/>
 			<text name="tex offset">
-				Décaler
+				Décalage
 			</text>
-			<spinner label="Horizontal (U)" name="TexOffsetU" />
-			<spinner label="Vertical (V)" name="TexOffsetV" />
+			<spinner label="Horizontal (U)" name="TexOffsetU"/>
+			<spinner label="Vertical (V)" name="TexOffsetV"/>
 			<text name="textbox autofix">
 				Ajuster la texture du média
 (chargement préalable)
 			</text>
-			<button label="Ajuster" label_selected="Ajuster" name="button align" />
+			<button label="Ajuster" label_selected="Ajuster" name="button align"/>
 		</panel>
 		<panel label="Contenu" name="Contents">
-			<button label="Nouveau script..." label_selected="Nouveau script..."
-			     name="button new script" />
+			<button label="Nouveau script..." label_selected="Nouveau script..." name="button new script"/>
 		</panel>
 	</tab_container>
 	<panel name="land info panel">
 		<text name="label_area_price">
-			Prix : [PRICE] $L pour [AREA] m².
+			Prix : [PRICE] L$ pour [AREA] m².
 		</text>
 		<text name="label_area">
 			Surface : [AREA] m²
 		</text>
-		<button label="Acheter le terrain..." label_selected="Acheter le terrain..."
-		     name="button buy land" width="132" />
-		<button label="Céder le terrain..." label_selected="Céder le terrain..."
-		     name="button abandon land" width="132" />
-		<button label="Diviser..." label_selected="Diviser..." name="button subdivide land" width="132" />
-		<button label="Fusionner..." label_selected="Fusionner..." name="button join land" width="132" />
-		<button label="À propos du terrain..." label_selected="À propos du terrain..."
-		     name="button about land"  width="132" />
+		<button label="Acheter le terrain..." label_selected="Acheter le terrain..." name="button buy land" width="132"/>
+		<button label="Abandonner le terrain..." label_selected="Abandonner le terrain..." name="button abandon land" width="132"/>
+		<button label="Diviser..." label_selected="Diviser..." name="button subdivide land" width="132"/>
+		<button label="Fusionner..." label_selected="Fusionner..." name="button join land" width="132"/>
+		<button label="À propos du terrain..." label_selected="À propos du terrain..." name="button about land" width="132"/>
 	</panel>
 	<string name="status_rotate">
 		Pour faire tourner l&apos;objet, faîtes glisser les bandes de couleur.
@@ -634,7 +612,7 @@
 		Cliquez et faîtes glisser pour sélectionner le terrain
 	</string>
 	<string name="grid_screen_text">
-		Ecran
+		Écran
 	</string>
 	<string name="grid_local_text">
 		Local
diff --git a/indra/newview/skins/default/xui/fr/floater_top_objects.xml b/indra/newview/skins/default/xui/fr/floater_top_objects.xml
index be92328..7ef4a60 100644
--- a/indra/newview/skins/default/xui/fr/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/fr/floater_top_objects.xml
@@ -1,32 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="top_objects" title="en cours de chargement...">
 	<text name="title_text">
 		Chargement en cours...
 	</text>
 	<scroll_list name="objects_list">
-		<column label="Score" name="score" />
-		<column label="Nom" name="name" />
-		<column label="Propriétaire" name="owner" />
-		<column label="Emplacement" name="location" />
-		<column label="Heure" name="time" />
+		<column label="Score" name="score"/>
+		<column label="Nom" name="name"/>
+		<column label="Propriétaire" name="owner"/>
+		<column label="Lieu" name="location"/>
+		<column label="Heure" name="time"/>
 	</scroll_list>
 	<text name="id_text">
 		ID de l&apos;objet :
 	</text>
-	<button label="Afficher balise" name="show_beacon_btn" />
+	<button label="Afficher balise" name="show_beacon_btn"/>
 	<text name="obj_name_text">
 		Nom :
 	</text>
-	<button label="Filtre" name="filter_object_btn" />
+	<button label="Filtre" name="filter_object_btn"/>
 	<text name="owner_name_text">
 		Nom :
 	</text>
-	<button label="Filtre" name="filter_owner_btn" />
-	<button label="Renvoyer" name="return_selected_btn" />
-	<button label="Renvoyer tous" name="return_all_btn" />
-	<button label="Désactiver" name="disable_selected_btn" />
-	<button label="Désactiver tous" name="disable_all_btn" />
-	<button label="Rafraîchir" name="refresh_btn" />
+	<button label="Filtre" name="filter_owner_btn"/>
+	<button label="Renvoyer" name="return_selected_btn"/>
+	<button label="Renvoyer tous" name="return_all_btn"/>
+	<button label="Désactiver" name="disable_selected_btn"/>
+	<button label="Désactiver tous" name="disable_all_btn"/>
+	<button label="Rafraîchir" name="refresh_btn"/>
 	<text name="top_scripts_title">
 		Scripts principaux
 	</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_world_map.xml b/indra/newview/skins/default/xui/fr/floater_world_map.xml
index f2219c8..c628b11 100644
--- a/indra/newview/skins/default/xui/fr/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/fr/floater_world_map.xml
@@ -1,107 +1,90 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="worldmap" title="Carte du monde">
 	<tab_container name="maptab" width="955">
-		<panel label="Objets" name="objects_mapview" width="953" />
-		<panel label="Terrain" name="terrain_mapview" width="953" />
+		<panel label="Objets" name="objects_mapview" width="953"/>
+		<panel label="Terrain" name="terrain_mapview" width="953"/>
 	</tab_container>
-	<icon left="973" name="square" />
+	<icon left="973" name="square"/>
 	<text name="land_for_sale_label">
 		Terrain à vendre
 	</text>
-	<icon left="1113" name="square2" />
+	<icon left="1113" name="square2"/>
 	<text name="auction_label">
 		Enchère
 	</text>
-	<icon left="973" name="self" />
+	<icon left="973" name="self"/>
 	<text name="you_label">
 		Vous
 	</text>
-	<icon left="1033" name="home" />
+	<icon left="1033" name="home"/>
 	<text name="home_label">
 		Domicile
 	</text>
-	<button label="Aller chez moi" label_selected="Aller chez moi" name="Go Home"
-	     tool_tip="Vous téléporte à votre domicile" />
-	<icon left="977" name="person" />
+	<button label="Aller chez moi" label_selected="Aller chez moi" name="Go Home" tool_tip="Vous téléporte à votre domicile"/>
+	<icon left="977" name="person"/>
 	<text name="person_label">
-		Personne
+		Résident
 	</text>
-	<icon left="973" name="infohub" />
-	<check_box label=" " left_delta="60" name="people_chk" />
+	<icon left="973" name="infohub"/>
+	<check_box label=" " left_delta="60" name="people_chk"/>
 	<text name="infohub_label">
 		Infohub
 	</text>
-	<icon left="973" name="telehub" />
-	<check_box label=" " left_delta="60" name="infohub_chk" />
+	<icon left="973" name="telehub"/>
+	<check_box label=" " left_delta="60" name="infohub_chk"/>
 	<text name="telehub_label">
 		Téléhub
 	</text>
-	<check_box label=" " left_delta="60" name="telehubchk" />
-	<icon left="1113" name="landforsale" />
+	<check_box label=" " left_delta="60" name="telehubchk"/>
+	<icon left="1113" name="landforsale"/>
 	<text name="land_for_sale_label2">
 		Terrain à vendre
 	</text>
-	<check_box label=" " name="land_for_sale_chk" />
-	<icon left="1113" name="event" />
+	<check_box label=" " name="land_for_sale_chk"/>
+	<icon left="1113" name="event"/>
 	<text name="events_label">
 		Événements
 	</text>
-	<check_box label=" " name="event_chk" />
-	<icon left="1113" name="events_mature_icon" />
+	<check_box label=" " name="event_chk"/>
+	<icon left="1113" name="events_mature_icon"/>
 	<text name="events_mature_label">
 		Événements (A)
 	</text>
-	<check_box label=" " name="event_mature_chk" />
-	<icon left="973" name="avatar_icon" />
-	<combo_box label="Amis connectés" name="friend combo"
-	     tool_tip="Ami à afficher sur la carte" width="232">
+	<check_box label=" " name="event_mature_chk"/>
+	<icon left="973" name="avatar_icon"/>
+	<combo_box label="Amis connectés" name="friend combo" tool_tip="Ami à afficher sur la carte" width="232">
 		<combo_item name="none_selected">
 			Amis connectés
 		</combo_item>
 	</combo_box>
-	<icon left="973" name="landmark_icon" />
-	<combo_box label="Repères" name="landmark combo"
-	     tool_tip="Repère à afficher sur la carte" width="232">
+	<icon left="973" name="landmark_icon"/>
+	<combo_box label="Repères" name="landmark combo" tool_tip="Repère à afficher sur la carte" width="232">
 		<combo_item name="none_selected">
 			Repères
 		</combo_item>
 	</combo_box>
-	<icon left="973" name="location_icon" />
-	<line_editor label="Rechercher par nom de région" name="location"
-	     tool_tip="Saisissez le nom d&apos;une région" width="155">
+	<icon left="973" name="location_icon"/>
+	<line_editor label="Rechercher par nom de région" name="location" tool_tip="Saisissez le nom d&apos;une région" width="155">
 		Recherche par nom de région
 	</line_editor>
-	<button label="Rechercher" label_selected="&gt;" left_delta="160" name="DoSearch"
-	     tool_tip="Rechercher dans la région" width="75" />
+	<button label="Rechercher" label_selected="&gt;" left_delta="160" name="DoSearch" tool_tip="Rechercher dans la région" width="75"/>
 	<text left="973" name="search_label">
 		Résultats de la recherche :
 	</text>
 	<scroll_list left="973" name="search_results" width="252">
-		<column label="" name="icon" />
-		<column label="" name="sim_name" />
+		<column label="" name="icon"/>
+		<column label="" name="sim_name"/>
 	</scroll_list>
 	<text left="973" name="location_label">
 		Emplacement :
 	</text>
-	<spinner left="993" name="spin x"
-	     tool_tip="Coordonnées des X du lieu à afficher sur la carte" />
-	<spinner left="993" name="spin y"
-	     tool_tip="Coordonnées des Y du lieu à afficher sur la carte" />
-	<spinner left="993" name="spin z"
-	     tool_tip="Coordonnées des Z du lieu à afficher sur la carte" />
-	<button label="Téléporter" label_selected="Téléporter" left="-270" name="Teleport"
-	     tool_tip="Téléporter à l&apos;endroit sélectionné" />
-	<button label="Afficher la destination" label_selected="Afficher la destination"
-	     name="Show Destination"
-	     tool_tip="Centrer la carte sur l&apos;endroit sélectionné" width="165" />
-	<button label="Effacer" label_selected="Effacer" left="-270" name="Clear"
-	     tool_tip="Arrêter de suivre" />
-	<button label="Afficher mon emplacement" label_selected="Afficher mon emplacement"
-	     name="Show My Location"
-	     tool_tip="Centrer la carte sur l&apos;emplacement de votre avatar"
-	     width="165" />
-	<button label="Copier la SLURL sur le presse-papier" left="-270" name="copy_slurl"
-	     tool_tip="Copier l&apos;emplacement actuel comme SLURL pour l&apos;utiliser sur le Web."
-	     width="262" />
-	<slider label="Zoom" left="-270" name="zoom slider" />
+	<spinner left="993" name="spin x" tool_tip="Coordonnées des X du lieu à afficher sur la carte"/>
+	<spinner left="993" name="spin y" tool_tip="Coordonnées des Y du lieu à afficher sur la carte"/>
+	<spinner left="993" name="spin z" tool_tip="Coordonnées des Z du lieu à afficher sur la carte"/>
+	<button label="Téléporter" label_selected="Téléporter" left="-270" name="Teleport" tool_tip="Téléporter à l&apos;endroit sélectionné"/>
+	<button label="Afficher la destination" label_selected="Afficher la destination" name="Show Destination" tool_tip="Centrer la carte sur l&apos;endroit sélectionné" width="165"/>
+	<button label="Effacer" label_selected="Effacer" left="-270" name="Clear" tool_tip="Arrêter de suivre"/>
+	<button label="Afficher mon emplacement" label_selected="Afficher mon emplacement" name="Show My Location" tool_tip="Centrer la carte sur l&apos;emplacement de votre avatar" width="165"/>
+	<button label="Copier la SLURL dans le presse-papier" left="-270" name="copy_slurl" tool_tip="Copier l&apos;emplacement actuel comme SLURL pour l&apos;utiliser sur le Web." width="262"/>
+	<slider label="Zoom" left="-270" name="zoom slider"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory.xml b/indra/newview/skins/default/xui/fr/menu_inventory.xml
index da1773e..8391e3b 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory.xml
@@ -1,70 +1,67 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu name="Popup">
-	<menu_item_call label="Acheter" name="Task Buy" />
-	<menu_item_call label="Ouvrir" name="Task Open" />
-	<menu_item_call label="Jouer" name="Task Play" />
-	<menu_item_call label="Propriétés" name="Task Properties" />
-	<menu_item_call label="Renommer" name="Task Rename" />
-	<menu_item_call label="Supprimer" name="Task Remove" />
-	<menu_item_call label="Vider la corbeille" name="Empty Trash" />
-	<menu_item_call label="Vider les objets trouvés" name="Empty Lost And Found" />
-	<menu_item_call label="Nouveau dossier" name="New Folder" />
-	<menu_item_call label="Nouveau script" name="New Script" />
-	<menu_item_call label="Nouvelle note" name="New Note" />
-	<menu_item_call label="Nouveau geste" name="New Gesture" />
+	<menu_item_call label="Acheter" name="Task Buy"/>
+	<menu_item_call label="Ouvrir" name="Task Open"/>
+	<menu_item_call label="Jouer" name="Task Play"/>
+	<menu_item_call label="Propriétés" name="Task Properties"/>
+	<menu_item_call label="Renommer" name="Task Rename"/>
+	<menu_item_call label="Supprimer" name="Task Remove"/>
+	<menu_item_call label="Vider la corbeille" name="Empty Trash"/>
+	<menu_item_call label="Vider les objets trouvés" name="Empty Lost And Found"/>
+	<menu_item_call label="Nouveau dossier" name="New Folder"/>
+	<menu_item_call label="Nouveau script" name="New Script"/>
+	<menu_item_call label="Nouvelle note" name="New Note"/>
+	<menu_item_call label="Nouveau geste" name="New Gesture"/>
 	<menu name="New Clothes">
-		<menu_item_call label="Nouvelle jupe" name="New Shirt" />
-		<menu_item_call label="Nouveau pantalon" name="New Pants" />
-		<menu_item_call label="Nouvelles chaussures" name="New Shoes" />
-		<menu_item_call label="Nouvelles chaussettes" name="New Socks" />
-		<menu_item_call label="Nouvelle veste" name="New Jacket" />
-		<menu_item_call label="Nouvelle jupe" name="New Skirt" />
-		<menu_item_call label="Nouveaux gants" name="New Gloves" />
-		<menu_item_call label="Nouveau tricot de peau" name="New Undershirt" />
-		<menu_item_call label="Nouveaux sous-vêtements" name="New Underpants" />
+		<menu_item_call label="Nouvelle chemise" name="New Shirt"/>
+		<menu_item_call label="Nouveau pantalon" name="New Pants"/>
+		<menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
+		<menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
+		<menu_item_call label="Nouvelle veste" name="New Jacket"/>
+		<menu_item_call label="Nouvelle jupe" name="New Skirt"/>
+		<menu_item_call label="Nouveaux gants" name="New Gloves"/>
+		<menu_item_call label="Nouveau tricot de peau" name="New Undershirt"/>
+		<menu_item_call label="Nouveaux sous-vêtements" name="New Underpants"/>
 	</menu>
 	<menu name="New Body Parts">
-		<menu_item_call label="Nouvelle silhouette" name="New Shape" />
-		<menu_item_call label="Nouvelle peau" name="New Skin" />
-		<menu_item_call label="Nouveaux cheveux" name="New Hair" />
-		<menu_item_call label="Nouveaux yeux" name="New Eyes" />
+		<menu_item_call label="Nouvelle silhouette" name="New Shape"/>
+		<menu_item_call label="Nouvelle peau" name="New Skin"/>
+		<menu_item_call label="Nouveaux cheveux" name="New Hair"/>
+		<menu_item_call label="Nouveaux yeux" name="New Eyes"/>
 	</menu>
-	<menu_item_call label="Téléporter" name="Landmark Open" />
-	<menu_item_call label="Ouvrir" name="Animation Open" />
-	<menu_item_call label="Ouvrir" name="Sound Open" />
-	<menu_item_call label="Purger l&apos;objet" name="Purge Item" />
-	<menu_item_call label="Restaurer l&apos;objet" name="Restore Item" />
-	<menu_item_call label="Ouvrir" name="Open" />
-	<menu_item_call label="Propriétés" name="Properties" />
-	<menu_item_call label="Renommer" name="Rename" />
-	<menu_item_call label="Copier l&apos;identifiant universel unique (UUID) de l&apos;actif"
-	     name="Copy Asset UUID" />
-	<menu_item_call label="Copier" name="Copy" />
-	<menu_item_call label="Coller" name="Paste" />
-	<menu_item_call label="Supprimer" name="Delete" />
-	<menu_item_call label="Ajouter à l&apos;ensemble" name="Add To Outfit" />
-	<menu_item_call label="Remplacer l&apos;ensemble" name="Replace Outfit" />
-	<menu_item_call label="Enlever les objets" name="Take Off Items" />
-	<menu_item_call label="Envoyer un IM aux contacts en ligne dans le dossier"
-	     name="IM Online Contacts In Folder" />
-	<menu_item_call label="Envoyer un IM à tous les contacts dans le dossier"
-	     name="IM All Contacts In Folder" />
-	<menu_item_call label="Démarrer le chat conférence" name="Conference Chat Folder" />
-	<menu_item_call label="Jouer" name="Sound Play" />
-	<menu_item_call label="Au sujet du repère" name="Teleport To Landmark" />
-	<menu_item_call label="Jouer dans le Monde" name="Animation Play" />
-	<menu_item_call label="Jouer localement" name="Animation Audition" />
-	<menu_item_call label="Envoyer un message instantané" name="Send Instant Message" />
-	<menu_item_call label="Offrir de téléporter..." name="Offer Teleport..." />
-	<menu_item_call label="Démarrer le chat conférence" name="Conference Chat" />
-	<menu_item_call label="Activer" name="Activate" />
-	<menu_item_call label="Désactiver" name="Deactivate" />
-	<menu_item_call label="Détacher de vous" name="Detach From Yourself" />
-	<menu_item_call label="Porter" name="Object Wear" />
-	<menu label="Attacher à" name="Attach To" />
-	<menu label="Attacher au HUD " name="Attach To HUD" />
-	<menu_item_call label="Porter" name="Wearable Wear" />
-	<menu_item_call label="Éditer" name="Wearable Edit" />
-	<menu_item_call label="Enlever" name="Take Off" />
-	<menu_item_call label="--aucune option--" name="--no options--" />
+	<menu_item_call label="Téléporter" name="Landmark Open"/>
+	<menu_item_call label="Ouvrir" name="Animation Open"/>
+	<menu_item_call label="Ouvrir" name="Sound Open"/>
+	<menu_item_call label="Purger l&apos;objet" name="Purge Item"/>
+	<menu_item_call label="Restaurer l&apos;objet" name="Restore Item"/>
+	<menu_item_call label="Ouvrir" name="Open"/>
+	<menu_item_call label="Propriétés" name="Properties"/>
+	<menu_item_call label="Renommer" name="Rename"/>
+	<menu_item_call label="Copier l&apos;UUID (identifiant universel unique)" name="Copy Asset UUID"/>
+	<menu_item_call label="Copier" name="Copy"/>
+	<menu_item_call label="Coller" name="Paste"/>
+	<menu_item_call label="Supprimer" name="Delete"/>
+	<menu_item_call label="Ajouter à l&apos;ensemble" name="Add To Outfit"/>
+	<menu_item_call label="Remplacer l&apos;ensemble" name="Replace Outfit"/>
+	<menu_item_call label="Enlever les objets" name="Take Off Items"/>
+	<menu_item_call label="Envoyer un IM aux contacts en ligne dans le dossier" name="IM Online Contacts In Folder"/>
+	<menu_item_call label="Envoyer un IM à tous les contacts dans le dossier" name="IM All Contacts In Folder"/>
+	<menu_item_call label="Démarrer le chat conférence" name="Conference Chat Folder"/>
+	<menu_item_call label="Jouer" name="Sound Play"/>
+	<menu_item_call label="Au sujet du repère" name="Teleport To Landmark"/>
+	<menu_item_call label="Jouer dans le Monde" name="Animation Play"/>
+	<menu_item_call label="Jouer localement" name="Animation Audition"/>
+	<menu_item_call label="Envoyer un message instantané" name="Send Instant Message"/>
+	<menu_item_call label="Offrir de téléporter..." name="Offer Teleport..."/>
+	<menu_item_call label="Démarrer le chat conférence" name="Conference Chat"/>
+	<menu_item_call label="Activer" name="Activate"/>
+	<menu_item_call label="Désactiver" name="Deactivate"/>
+	<menu_item_call label="Détacher de vous" name="Detach From Yourself"/>
+	<menu_item_call label="Porter" name="Object Wear"/>
+	<menu label="Attacher à" name="Attach To"/>
+	<menu label="Attacher au HUD " name="Attach To HUD"/>
+	<menu_item_call label="Porter" name="Wearable Wear"/>
+	<menu_item_call label="Éditer" name="Wearable Edit"/>
+	<menu_item_call label="Enlever" name="Take Off"/>
+	<menu_item_call label="--aucune option--" name="--no options--"/>
 </menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_pie_avatar.xml b/indra/newview/skins/default/xui/fr/menu_pie_avatar.xml
index cccece5..c6d5ff6 100644
--- a/indra/newview/skins/default/xui/fr/menu_pie_avatar.xml
+++ b/indra/newview/skins/default/xui/fr/menu_pie_avatar.xml
@@ -1,17 +1,17 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <pie_menu name="Avatar Pie">
-	<menu_item_call label="Profil..." name="Profile..." />
-	<menu_item_call label="Ignorer" name="Avatar Mute" />
-	<menu_item_call label="Aller" name="Go To" />
-	<menu_item_call label="Ajouter comme ami..." name="Add Friend" />
-	<menu_item_call label="Payer..." name="Pay..." />
+	<menu_item_call label="Profil..." name="Profile..."/>
+	<menu_item_call label="Ignorer" name="Avatar Mute"/>
+	<menu_item_call label="Aller" name="Go To"/>
+	<menu_item_call label="Devenir amis..." name="Add Friend"/>
+	<menu_item_call label="Payer..." name="Pay..."/>
 	<pie_menu label="Plus &gt;" name="More &gt;">
-		<menu_item_call label="Geler..." name="Freeze..." />
-		<menu_item_call label="Donner une carte" name="Give Card" />
-		<menu_item_call label="Invitation de groupe..." name="Invite..." />
-		<menu_item_call label="Expulser..." name="Eject..." />
-		<menu_item_call label="Débugger..." name="Debug..." />
-		<menu_item_call label="Inspecter" name="Object Inspect" />
+		<menu_item_call label="Geler..." name="Freeze..."/>
+		<menu_item_call label="Donner une carte" name="Give Card"/>
+		<menu_item_call label="Invitation de groupe..." name="Invite..."/>
+		<menu_item_call label="Expulser..." name="Eject..."/>
+		<menu_item_call label="Débugger..." name="Debug..."/>
+		<menu_item_call label="Inspecter" name="Object Inspect"/>
 	</pie_menu>
-	<menu_item_call label="Envoyer IM..." name="Send IM..." />
+	<menu_item_call label="Envoyer IM..." name="Send IM..."/>
 </pie_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_pie_land.xml b/indra/newview/skins/default/xui/fr/menu_pie_land.xml
index 3da5245..0cc7469 100644
--- a/indra/newview/skins/default/xui/fr/menu_pie_land.xml
+++ b/indra/newview/skins/default/xui/fr/menu_pie_land.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <pie_menu name="Land Pie">
-	<menu_item_call label="À propos du terrain..." name="About Land..." />
-	<menu_item_call label="Créer" name="Create" />
-	<menu_item_call label="Aller ici" name="Go Here" />
-	<menu_item_call label="M&apos;asseoir ici" name="Sit Here" />
-	<menu_item_call label="Acheter laissez-passer..." name="Land Buy Pass" />
-	<menu_item_call label="Modifier le terrain" name="Edit Terrain" />
-	<menu_item_call label="Acheter le terrain..." name="Land Buy" />
+	<menu_item_call label="À propos du terrain..." name="About Land..."/>
+	<menu_item_call label="Créer" name="Create"/>
+	<menu_item_call label="Aller ici" name="Go Here"/>
+	<menu_item_call label="M&apos;asseoir ici" name="Sit Here"/>
+	<menu_item_call label="Acheter pass..." name="Land Buy Pass"/>
+	<menu_item_call label="Modifier le terrain" name="Edit Terrain"/>
+	<menu_item_call label="Acheter le terrain..." name="Land Buy"/>
 </pie_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 6e34d27..4746d82 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -1,279 +1,263 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu_bar name="Main Menu">
 	<menu label="Fichier" name="File">
-		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
-		<menu_item_call label="Charger une image ([COST] $L)..." name="Upload Image" />
-		<menu_item_call label="Charger un son ([COST] $L)..." name="Upload Sound" />
-		<menu_item_call label="Charger une animation ([COST] $L)..." name="Upload Animation" />
-		<menu_item_call label="Charger un lot de fichiers ([COST] $L par fichier)..."
-		     name="Bulk Upload" />
-		<menu_item_separator label="-----------" name="separator" />
-		<menu_item_call label="Fermer la fenêtre" name="Close Window" />
-		<menu_item_call label="Fermer toutes les fenêtres" name="Close All Windows" />
-		<menu_item_separator label="-----------" name="separator2" />
-		<menu_item_call label="Enregistrer la texture sous..." name="Save Texture As..." />
-		<menu_item_separator label="-----------" name="separator3" />
-		<menu_item_call label="Prendre une photo" name="Take Snapshot" />
-		<menu_item_call label="Enregistrer la photo sur le disque" name="Snapshot to Disk"
-		     shortcut="control|shift|X" />
-		<menu_item_separator label="-----------" name="separator4" />
+		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
+		<menu_item_call label="Charger une image ([COST] L$)..." name="Upload Image"/>
+		<menu_item_call label="Charger un son ([COST] L$)..." name="Upload Sound"/>
+		<menu_item_call label="Charger une animation ([COST] L$)..." name="Upload Animation"/>
+		<menu_item_call label="Charger un lot de fichiers ([COST] L$ par fichier)..." name="Bulk Upload"/>
+		<menu_item_separator label="-----------" name="separator"/>
+		<menu_item_call label="Fermer la fenêtre" name="Close Window"/>
+		<menu_item_call label="Fermer toutes les fenêtres" name="Close All Windows"/>
+		<menu_item_separator label="-----------" name="separator2"/>
+		<menu_item_call label="Enregistrer la texture sous..." name="Save Texture As..."/>
+		<menu_item_separator label="-----------" name="separator3"/>
+		<menu_item_call label="Prendre une photo" name="Take Snapshot"/>
+		<menu_item_call label="Enregistrer la photo sur le disque" name="Snapshot to Disk" shortcut="control|shift|X"/>
+		<menu_item_separator label="-----------" name="separator4"/>
 		<menu label="Définir taille de la fenêtre" name="Set Window Size">
-			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
-			<menu_item_call label="320x240" name="320x240" />
-			<menu_item_call label="640x480" name="640x480" />
-			<menu_item_call label="800x600" name="800x600" />
-			<menu_item_separator label="-----------" name="separator" />
-			<menu_item_call label="720x480 (NTSC)" name="720x480 (NTSC)" />
-			<menu_item_call label="768x576 (PAL)" name="768x576 (PAL)" />
+			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
+			<menu_item_call label="320x240" name="320x240"/>
+			<menu_item_call label="640x480" name="640x480"/>
+			<menu_item_call label="800x600" name="800x600"/>
+			<menu_item_separator label="-----------" name="separator"/>
+			<menu_item_call label="720x480 (NTSC)" name="720x480 (NTSC)"/>
+			<menu_item_call label="768x576 (PAL)" name="768x576 (PAL)"/>
 		</menu>
-		<menu_item_separator label="-----------" name="separator5" />
-		<menu_item_call label="Quitter" name="Quit" />
+		<menu_item_separator label="-----------" name="separator5"/>
+		<menu_item_call label="Quitter" name="Quit"/>
 	</menu>
 	<menu label="Édition" name="Edit">
-		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
-		<menu_item_call label="Annuler" name="Undo" />
-		<menu_item_call label="Recommencer" name="Redo" />
-		<menu_item_separator label="-----------" name="separator" />
-		<menu_item_call label="Couper" name="Cut" />
-		<menu_item_call label="Copier" name="Copy" />
-		<menu_item_call label="Coller" name="Paste" />
-		<menu_item_call label="Supprimer" name="Delete" />
-		<menu_item_separator label="-----------" name="separator2" />
-		<menu_item_call label="Rechercher..." name="Search..." />
-		<menu_item_separator label="-----------" name="separator3" />
-		<menu_item_call label="Tout sélectionner" name="Select All" />
-		<menu_item_call label="Désélectionner" name="Deselect" />
-		<menu_item_separator label="-----------" name="separator4" />
-		<menu_item_call label="Dupliquer" name="Duplicate" />
-		<menu_item_separator label="-----------" name="separator5" />
-		<menu label="Attacher objet" name="Attach Object" />
-		<menu label="Détacher objet" name="Detach Object" />
+		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
+		<menu_item_call label="Annuler" name="Undo"/>
+		<menu_item_call label="Recommencer" name="Redo"/>
+		<menu_item_separator label="-----------" name="separator"/>
+		<menu_item_call label="Couper" name="Cut"/>
+		<menu_item_call label="Copier" name="Copy"/>
+		<menu_item_call label="Coller" name="Paste"/>
+		<menu_item_call label="Supprimer" name="Delete"/>
+		<menu_item_separator label="-----------" name="separator2"/>
+		<menu_item_call label="Rechercher..." name="Search..."/>
+		<menu_item_separator label="-----------" name="separator3"/>
+		<menu_item_call label="Tout sélectionner" name="Select All"/>
+		<menu_item_call label="Désélectionner" name="Deselect"/>
+		<menu_item_separator label="-----------" name="separator4"/>
+		<menu_item_call label="Dupliquer" name="Duplicate"/>
+		<menu_item_separator label="-----------" name="separator5"/>
+		<menu label="Attacher l&apos;objet" name="Attach Object"/>
+		<menu label="Détacher l&apos;objet" name="Detach Object"/>
 		<menu label="Enlever mes habits" name="Take Off Clothing">
-			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
-			<menu_item_call label="Chemise" name="Shirt" />
-			<menu_item_call label="Pantalon" name="Pants" />
-			<menu_item_call label="Chaussures" name="Shoes" />
-			<menu_item_call label="Chaussettes" name="Socks" />
-			<menu_item_call label="Veste" name="Jacket" />
-			<menu_item_call label="Gants" name="Gloves" />
-			<menu_item_call label="Tricot de peau" name="Menu Undershirt" />
-			<menu_item_call label="Sous-vêtements" name="Menu Underpants" />
-			<menu_item_call label="Jupe" name="Skirt" />
-			<menu_item_call label="Tous les habits" name="All Clothes" />
+			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
+			<menu_item_call label="Chemise" name="Shirt"/>
+			<menu_item_call label="Pantalon" name="Pants"/>
+			<menu_item_call label="Chaussures" name="Shoes"/>
+			<menu_item_call label="Chaussettes" name="Socks"/>
+			<menu_item_call label="Veste" name="Jacket"/>
+			<menu_item_call label="Gants" name="Gloves"/>
+			<menu_item_call label="Tricot de peau" name="Menu Undershirt"/>
+			<menu_item_call label="Sous-vêtements" name="Menu Underpants"/>
+			<menu_item_call label="Jupe" name="Skirt"/>
+			<menu_item_call label="Tous les habits" name="All Clothes"/>
 		</menu>
-		<menu_item_separator label="-----------" name="separator6" />
-		<menu_item_call label="Gestes..." name="Gestures..." />
-		<menu_item_call label="Profil..." name="Profile..." />
-		<menu_item_call label="Apparence..." name="Appearance..." />
-		<menu_item_separator label="-----------" name="separator7" />
-		<menu_item_check label="Amis..." name="Friends..." />
-		<menu_item_call label="Groupes..." name="Groups..." />
-		<menu_item_separator label="-----------" name="separator8" />
-		<menu_item_call label="Préférences..." name="Preferences..." />
+		<menu_item_separator label="-----------" name="separator6"/>
+		<menu_item_call label="Gestes..." name="Gestures..."/>
+		<menu_item_call label="Profil..." name="Profile..."/>
+		<menu_item_call label="Apparence..." name="Appearance..."/>
+		<menu_item_separator label="-----------" name="separator7"/>
+		<menu_item_check label="Amis..." name="Friends..."/>
+		<menu_item_call label="Groupes..." name="Groups..."/>
+		<menu_item_separator label="-----------" name="separator8"/>
+		<menu_item_call label="Préférences..." name="Preferences..."/>
 	</menu>
 	<menu label="Affichage" name="View">
-		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
-		<menu_item_call label="Vue subjective" name="Mouselook" />
-		<menu_item_check label="Construire" name="Build" />
-		<menu_item_check label="Joystick Flycam" name="Joystick Flycam" />
-		<menu_item_call label="Réinitialiser l&apos;affichage" name="Reset View" />
-		<menu_item_call label="Regarder la dernière personne qui a parlé" name="Look at Last Chatter"
-		     shortcut="alt|V" />
-		<menu_item_separator label="-----------" name="separator" />
-		<menu_item_check label="Barre d&apos;outils" name="Toolbar" />
-		<menu_item_check label="Chat local" name="Chat History" />
-		<menu_item_check label="Communiquer" name="Instant Message" />
-		<menu_item_call label="Inventaire" name="Inventory" />
-		<menu_item_check label="Intervenants actifs" name="Active Speakers" />
-		<menu_item_check label="Liste des ignorés" name="Mute List" />
-		<menu_item_separator label="-----------" name="separator2" />
-		<menu_item_check label="Contrôles de la caméra" name="Camera Controls" />
-		<menu_item_check label="Contrôle des déplacements" name="Movement Controls" />
-		<menu_item_check label="Carte du monde" name="World Map" />
-		<menu_item_check label="Mini-carte" name="Mini-Map" />
-		<menu_item_separator label="-----------" name="separator3" />
-		<menu_item_check label="Barre de statistiques" name="Statistics Bar" />
-		<menu_item_check label="Limites de la propriété" name="Property Lines" />
-		<menu_item_check label="Propriétaires fonciers" name="Land Owners" />
-		<menu_item_separator label="-----------" name="separator4" />
-		<menu label="Astuces en survol" name="Hover Tips">
-			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
-			<menu_item_check label="Afficher les astuces" name="Show Tips" />
-			<menu_item_separator label="-----------" name="separator" />
-			<menu_item_check label="Astuces sur les terrains" name="Land Tips" />
-			<menu_item_check label="Astuces sur tous les objets" name="Tips On All Objects" />
+		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
+		<menu_item_call label="Vue subjective" name="Mouselook"/>
+		<menu_item_check label="Construire" name="Build"/>
+		<menu_item_check label="Vue avec le joystick" name="Joystick Flycam"/>
+		<menu_item_call label="Réinitialiser l&apos;affichage" name="Reset View"/>
+		<menu_item_call label="Regarder le dernier intervenant" name="Look at Last Chatter" shortcut="alt|V"/>
+		<menu_item_separator label="-----------" name="separator"/>
+		<menu_item_check label="Barre d&apos;outils" name="Toolbar"/>
+		<menu_item_check label="Chat local" name="Chat History"/>
+		<menu_item_check label="Communiquer" name="Instant Message"/>
+		<menu_item_call label="Inventaire" name="Inventory"/>
+		<menu_item_check label="Intervenants actifs" name="Active Speakers"/>
+		<menu_item_check label="Liste des ignorés" name="Mute List"/>
+		<menu_item_separator label="-----------" name="separator2"/>
+		<menu_item_check label="Contrôles de la caméra" name="Camera Controls"/>
+		<menu_item_check label="Contrôle des déplacements" name="Movement Controls"/>
+		<menu_item_check label="Carte du monde" name="World Map"/>
+		<menu_item_check label="Mini-carte" name="Mini-Map"/>
+		<menu_item_separator label="-----------" name="separator3"/>
+		<menu_item_check label="Statistiques" name="Statistics Bar"/>
+		<menu_item_check label="Limites des parcelles" name="Property Lines"/>
+		<menu_item_check label="Propriétaires fonciers" name="Land Owners"/>
+		<menu_item_separator label="-----------" name="separator4"/>
+		<menu label="Infobulles" name="Hover Tips">
+			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
+			<menu_item_check label="Affichez les astuces" name="Show Tips"/>
+			<menu_item_separator label="-----------" name="separator"/>
+			<menu_item_check label="Astuces sur les terrains" name="Land Tips"/>
+			<menu_item_check label="Astuces sur tous les objets" name="Tips On All Objects"/>
 		</menu>
-		<menu_item_check label="Alt affiche les propriétés physiques" name="Alt Shows Physical" />
-		<menu_item_check label="Voir les objets invisibles" name="Highlight Transparent" />
-		<menu_item_check label="Balises toujours activées" name="Beacons Always On" />
+		<menu_item_check label="Alt affiche les propriétés physiques" name="Alt Shows Physical"/>
+		<menu_item_check label="Voir les objets invisibles" name="Highlight Transparent"/>
+		<menu_item_check label="Balises toujours activées" name="Beacons Always On"/>
 		<menu label="Balises" name="Beacons">
-			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
-			<menu_item_check label="Objets scriptés avec Toucher uniquement"
-			     name="Scripted Objects With Touch Only" />
-			<menu_item_check label="Objets scriptés" name="Scripted Objects" />
-			<menu_item_check label="Objets physiques" name="Physical Objects" />
-			<menu_item_check label="Sources sonores" name="Sound Sources" />
-			<menu_item_check label="Sources des particules" name="Particle Sources" />
-			<menu_item_separator label="-----------" name="separator" />
-			<menu_item_check label="Montrer les surbrillances" name="Render Highlights" />
-			<menu_item_check label="Montrer les balises" name="Render Beacons" />
-			<menu_item_separator label="-----------" name="separator2" />
-			<menu_item_check label="Masquer les particules" name="Hide Particles" />
-			<menu_item_separator label="-----------" name="separator3" />
+			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
+			<menu_item_check label="Objets scriptés avec Toucher uniquement" name="Scripted Objects With Touch Only"/>
+			<menu_item_check label="Objets scriptés" name="Scripted Objects"/>
+			<menu_item_check label="Objets physiques" name="Physical Objects"/>
+			<menu_item_check label="Sources sonores" name="Sound Sources"/>
+			<menu_item_check label="Sources des particules" name="Particle Sources"/>
+			<menu_item_separator label="-----------" name="separator"/>
+			<menu_item_check label="Montrer les surbrillances" name="Render Highlights"/>
+			<menu_item_check label="Montrer les balises" name="Render Beacons"/>
+			<menu_item_separator label="-----------" name="separator2"/>
+			<menu_item_check label="Masquer les particules" name="Hide Particles"/>
+			<menu_item_separator label="-----------" name="separator3"/>
 			<menu label="Largeur de la balise" name="Beacon Width">
-				<menu_item_call label="1" name="Beacon Width 1" />
-				<menu_item_call label="4" name="Beacon Width 4" />
-				<menu_item_call label="16" name="Beacon Width 16" />
-				<menu_item_call label="32" name="Beacon Width 32" />
+				<menu_item_call label="1" name="Beacon Width 1"/>
+				<menu_item_call label="4" name="Beacon Width 4"/>
+				<menu_item_call label="16" name="Beacon Width 16"/>
+				<menu_item_call label="32" name="Beacon Width 32"/>
 			</menu>
 		</menu>
-		<menu_item_check label="Afficher les éléments HUD" name="Show HUD Attachments" />
-		<menu_item_separator label="-----------" name="separator5" />
-		<menu_item_call label="Zoomer" name="Zoom In" />
-		<menu_item_call label="Zoom par défaut" name="Zoom Default" />
-		<menu_item_call label="Zoomer en arrière" name="Zoom Out" />
-		<menu_item_separator label="-----------" name="separator6" />
+		<menu_item_check label="Afficher les HUD" name="Show HUD Attachments"/>
+		<menu_item_separator label="-----------" name="separator5"/>
+		<menu_item_call label="Zoomer" name="Zoom In"/>
+		<menu_item_call label="Zoom par défaut" name="Zoom Default"/>
+		<menu_item_call label="Zoomer en arrière" name="Zoom Out"/>
+		<menu_item_separator label="-----------" name="separator6"/>
 		<menu label="Plus" name="More">
-			<menu_item_call label="Passer en plein écran" name="Toggle Fullscreen" />
-			<menu_item_call label="Définir la taille de l&apos;IU à sa valeur par défaut"
-			     name="Set UI Size to Default" />
+			<menu_item_call label="Passer en plein écran" name="Toggle Fullscreen"/>
+			<menu_item_call label="Définir la taille de l&apos;interface à sa valeur par défaut" name="Set UI Size to Default"/>
 		</menu>
-		<menu_item_call label="Plein écran en mode bascule" name="Toggle Fullscreen" />
-		<menu_item_call label="Taille de l&apos;interface par défaut" name="Set UI Size to Default" />
+		<menu_item_call label="Activer/Quitter le plein écran" name="Toggle Fullscreen"/>
+		<menu_item_call label="Taille de l&apos;interface par défaut" name="Set UI Size to Default"/>
 	</menu>
 	<menu label="Monde" name="World">
-		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
-		<menu_item_call label="Chat" name="Chat" />
-		<menu_item_call label="Démarrer geste" name="Start Gesture" />
-		<menu_item_check label="Toujours courir" name="Always Run" />
-		<menu_item_check label="Voler" name="Fly" shortcut="F" />
-		<menu_item_separator label="-----------" name="separator" />
-		<menu_item_call label="Créer un repère ici" name="Create Landmark Here" />
-		<menu_item_call label="Définir comme domicile" name="Set Home to Here" />
-		<menu_item_separator label="-----------" name="separator2" />
-		<menu_item_call label="Téléporter chez moi" name="Teleport Home" />
-		<menu_item_separator label="-----------" name="separator3" />
-		<menu_item_call label="Définir comme absent(e)" name="Set Away" />
-		<menu_item_call label="Définir comme occupé(e)" name="Set Busy" />
-		<menu_item_call label="Arrêter toutes les animations" name="Stop All Animations" />
-		<menu_item_call label="Libérer les touches" name="Release Keys" />
-		<menu_item_separator label="-----------" name="separator4" />
-		<menu_item_call label="Historique du compte..." name="Account History..." />
-		<menu_item_call label="Gérer mon compte..." name="Manage My Account..." />
-		<menu_item_call label="Acheter des $L..." name="Buy and Sell L$..." />
-		<menu_item_separator label="-----------" name="separator5" />
-		<menu_item_call label="Mon terrain..." name="My Land..." />
-		<menu_item_call label="À propos du terrain..." name="About Land..." />
-		<menu_item_call label="Acheter le terrain..." name="Buy Land..." />
-		<menu_item_call label="Région/Domaine..." name="Region/Estate..." />
-		<menu_item_separator label="-----------" name="separator6" />
+		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
+		<menu_item_call label="Chat" name="Chat"/>
+		<menu_item_call label="Démarrer le geste" name="Start Gesture"/>
+		<menu_item_check label="Toujours courir" name="Always Run"/>
+		<menu_item_check label="Voler" name="Fly" shortcut="F"/>
+		<menu_item_separator label="-----------" name="separator"/>
+		<menu_item_call label="Créer un repère ici" name="Create Landmark Here"/>
+		<menu_item_call label="Définir comme domicile" name="Set Home to Here"/>
+		<menu_item_separator label="-----------" name="separator2"/>
+		<menu_item_call label="Me téléporter chez moi" name="Teleport Home"/>
+		<menu_item_separator label="-----------" name="separator3"/>
+		<menu_item_call label="Me mettre absent(e)" name="Set Away"/>
+		<menu_item_call label="Me mettre occupé(e)" name="Set Busy"/>
+		<menu_item_call label="Arrêter mes animations" name="Stop All Animations"/>
+		<menu_item_call label="Reprendre le contrôle" name="Release Keys"/>
+		<menu_item_separator label="-----------" name="separator4"/>
+		<menu_item_call label="Historique de mon compte..." name="Account History..."/>
+		<menu_item_call label="Gérer mon compte..." name="Manage My Account..."/>
+		<menu_item_call label="Acheter des L$..." name="Buy and Sell L$..."/>
+		<menu_item_separator label="-----------" name="separator5"/>
+		<menu_item_call label="Mes terrains..." name="My Land..."/>
+		<menu_item_call label="À propos du terrain..." name="About Land..."/>
+		<menu_item_call label="Acheter le terrain..." name="Buy Land..."/>
+		<menu_item_call label="Région et domaine..." name="Region/Estate..."/>
+		<menu_item_separator label="-----------" name="separator6"/>
 		<menu label="Forcer le soleil" name="Force Sun">
-			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
-			<menu_item_call label="Soleil Levant" name="Sunrise" />
-			<menu_item_call label="Midi" name="Noon" />
-			<menu_item_call label="Soleil Couchant" name="Sunset" />
-			<menu_item_call label="Minuit" name="Midnight" />
-			<menu_item_separator label="-----------" name="separator" />
-			<menu_item_call label="Revenir aux valeurs par défaut de la région"
-			     name="Revert to Region Default" />
+			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
+			<menu_item_call label="Soleil Levant" name="Sunrise"/>
+			<menu_item_call label="Midi" name="Noon"/>
+			<menu_item_call label="Soleil Couchant" name="Sunset"/>
+			<menu_item_call label="Minuit" name="Midnight"/>
+			<menu_item_separator label="-----------" name="separator"/>
+			<menu_item_call label="Revenir aux valeurs par défaut de la région" name="Revert to Region Default"/>
 		</menu>
-		<menu label="Paramètres de l&apos;environnement" name="Environment Settings">
-			<menu_item_call label="Lever de soleil" name="Sunrise" />
-			<menu_item_call label="Milieu de journée" name="Noon" />
-			<menu_item_call label="Coucher de soleil" name="Sunset" />
-			<menu_item_call label="Minuit" name="Midnight" />
-			<menu_item_call label="Revenir aux options par défaut" name="Revert to Region Default" />
-			<menu_item_separator label="-----------" name="separator" />
-			<menu_item_call label="Éditeur d&apos;environnement" name="Environment Editor" />
+		<menu label="Environnement" name="Environment Settings">
+			<menu_item_call label="Aube" name="Sunrise"/>
+			<menu_item_call label="Milieu de journée" name="Noon"/>
+			<menu_item_call label="Coucher de soleil" name="Sunset"/>
+			<menu_item_call label="Minuit" name="Midnight"/>
+			<menu_item_call label="Revenir aux options par défaut" name="Revert to Region Default"/>
+			<menu_item_separator label="-----------" name="separator"/>
+			<menu_item_call label="Éditeur d&apos;environnement" name="Environment Editor"/>
 		</menu>
 	</menu>
 	<menu label="Outils" name="Tools">
-		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
+		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
 		<menu label="Sélectionner un outil" name="Select Tool">
-			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
-			<menu_item_call label="Mise au point" name="Focus" />
-			<menu_item_call label="Déplacer" name="Move" />
-			<menu_item_call label="Éditer" name="Edit" />
-			<menu_item_call label="Créer" name="Create" />
-			<menu_item_call label="Terrain" name="Land" />
+			<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
+			<menu_item_call label="Mise au point" name="Focus"/>
+			<menu_item_call label="Déplacer" name="Move"/>
+			<menu_item_call label="Éditer" name="Edit"/>
+			<menu_item_call label="Créer" name="Create"/>
+			<menu_item_call label="Terrain" name="Land"/>
 		</menu>
-		<menu_item_separator label="-----------" name="separator" />
-		<menu_item_check label="Sélectionner mes objets uniquement" name="Select Only My Objects" />
-		<menu_item_check label="Sélectionner les objets déplaçables uniquement"
-		     name="Select Only Movable Objects" />
-		<menu_item_check label="Sélectionner mes alentours" name="Select By Surrounding" />
-		<menu_item_check label="Afficher la sélection cachée" name="Show Hidden Selection" />
-		<menu_item_check label="Afficher le marquage lumineux de la sélection"
-		     name="Show Light Radius for Selection" />
-		<menu_item_check label="Afficher le faisceau de sélection" name="Show Selection Beam" />
-		<menu_item_separator label="-----------" name="separator2" />
-		<menu_item_check label="Fixer sur la grille" name="Snap to Grid" />
-		<menu_item_call label="Fixer sur les axes XY de la grille" name="Snap Object XY to Grid" />
-		<menu_item_call label="Utiliser la sélection pour la grille" name="Use Selection for Grid" />
-		<menu_item_call label="Options de la grille..." name="Grid Options..." />
-		<menu_item_separator label="-----------" name="separator3" />
-		<menu_item_check label="Modifier les parties liées" name="Edit Linked Parts" />
-		<menu_item_call label="Lier" name="Link" />
-		<menu_item_call label="Délier" name="Unlink" />
-		<menu_item_separator label="-----------" name="separator4" />
-		<menu_item_separator label="-----------" name="separator5" />
-		<menu_item_call label="Mise au point sur la sélection" name="Focus on Selection" />
-		<menu_item_call label="Zoom sur la sélection" name="Zoom to Selection" />
-		<menu_item_call label="Acheter l&apos;objet" name="Menu Object Take" />
-		<menu_item_call label="Prendre une copie" name="Take Copy" />
-		<menu_item_call label="Remettre et enregistrer l&apos;objet dans mon inventaire"
-		     name="Save Object Back to My Inventory" />
-		<menu_item_call label="Remettre et enregistrer l&apos;objet dans les Contenus de l&apos;objet"
-		     name="Save Object Back to Object Contents" />
-		<menu_item_separator label="-----------" name="separator6" />
-		<menu_item_call label="Afficher fenêtre d&apos;alertes/erreurs de script"
-		     name="Show Script Warning/Error Window" />
-		<menu_item_call label="Recompiler les scripts dans la sélection"
-		     name="Recompile Scripts in Selection">
-			<menu_item_call label="Mono" name="Mono" />
-			<menu_item_call label="LSL" name="LSL" />
+		<menu_item_separator label="-----------" name="separator"/>
+		<menu_item_check label="Sélectionner mes objets uniquement" name="Select Only My Objects"/>
+		<menu_item_check label="Sélectionner les objets déplaçables uniquement" name="Select Only Movable Objects"/>
+		<menu_item_check label="Sélectionner en entourant" name="Select By Surrounding"/>
+		<menu_item_check label="Afficher les parties cachées de la sélection" name="Show Hidden Selection"/>
+		<menu_item_check label="Afficher la sphère de lumière de la sélection" name="Show Light Radius for Selection"/>
+		<menu_item_check label="Afficher le faisceau de sélection" name="Show Selection Beam"/>
+		<menu_item_separator label="-----------" name="separator2"/>
+		<menu_item_check label="Fixer sur la grille" name="Snap to Grid"/>
+		<menu_item_call label="Fixer sur les axes XY de la grille" name="Snap Object XY to Grid"/>
+		<menu_item_call label="Utiliser la sélection pour la grille" name="Use Selection for Grid"/>
+		<menu_item_call label="Options de la grille..." name="Grid Options..."/>
+		<menu_item_separator label="-----------" name="separator3"/>
+		<menu_item_check label="Modifier les parties liées" name="Edit Linked Parts"/>
+		<menu_item_call label="Lier" name="Link"/>
+		<menu_item_call label="Délier" name="Unlink"/>
+		<menu_item_separator label="-----------" name="separator4"/>
+		<menu_item_separator label="-----------" name="separator5"/>
+		<menu_item_call label="Mise au point sur la sélection" name="Focus on Selection"/>
+		<menu_item_call label="Zoom sur la sélection" name="Zoom to Selection"/>
+		<menu_item_call label="Acheter l&apos;objet" name="Menu Object Take"/>
+		<menu_item_call label="Prendre une copie" name="Take Copy"/>
+		<menu_item_call label="Remplacer l&apos;objet dans mon inventaire" name="Save Object Back to My Inventory"/>
+		<menu_item_call label="Remplacer l&apos;objet dans le contenu de l&apos;objet" name="Save Object Back to Object Contents"/>
+		<menu_item_separator label="-----------" name="separator6"/>
+		<menu_item_call label="Afficher la fenêtre d&apos;alertes/erreurs de script" name="Show Script Warning/Error Window"/>
+		<menu_item_call label="Recompiler les scripts dans la sélection" name="Recompile Scripts in Selection">
+			<menu_item_call label="Mono" name="Mono"/>
+			<menu_item_call label="LSL" name="LSL"/>
 		</menu_item_call>
-		<menu_item_call label="Réinitialiser les scripts dans la sélection"
-		     name="Reset Scripts in Selection" />
-		<menu_item_call label="Activer les scripts dans la sélection"
-		     name="Set Scripts to Running in Selection" />
-		<menu_item_call label="Désactiver les scripts dans la sélection"
-		     name="Set Scripts to Not Running in Selection" />
+		<menu_item_call label="Réinitialiser les scripts dans la sélection" name="Reset Scripts in Selection"/>
+		<menu_item_call label="Activer les scripts dans la sélection" name="Set Scripts to Running in Selection"/>
+		<menu_item_call label="Désactiver les scripts dans la sélection" name="Set Scripts to Not Running in Selection"/>
 	</menu>
 	<menu label="Aide" name="Help">
-		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" />
-		<menu_item_call label="Aide Second Life" name="Second Life Help" />
-		<menu_item_call label="Base de connaissances…" name="Knowledge Base..." />
-		<menu_item_call label="Aide en ligne" name="Live Help..." />
-		<menu_item_call label="Didacticiel" name="Tutorial" />
-		<menu_item_separator label="-----------" name="separator" />
-		<menu_item_call label="Blog officiel des Linden..." name="Official Linden Blog..." />
-		<menu_item_separator label="-----------" name="separator2" />
-		<menu_item_call label="Guide de scripting..." name="Scripting Guide..." />
-		<menu_item_call label="Scripting Wiki..." name="Scripting Wiki..." />
-		<menu_item_call label="Portail de scripting..." name="Scripting Portal..." />
-		<menu_item_separator label="-----------" name="separator3" />
-		<menu_item_call label="Message du jour..." name="Message of the Day..." />
-		<menu_item_separator label="-----------" name="separator4" />
-		<menu_item_call label="Signaler une infraction..." name="Report Abuse..." />
-		<menu_item_call label="Collisions, coups et bousculades…"
-		     name="Bumps, Pushes &amp;amp; Hits..." />
-		<menu_item_separator label="-----------" name="separator5" />
-		<menu_item_call label="Signaler un bug..." name="Report Bug..." />
-		<menu_item_call label="Notes de version…" name="Release Notes..." />
-		<menu_item_separator label="-----------" name="separator6" />
-		<menu_item_call label="Calcul du lag" name="Lag Meter" />
-		<menu_item_separator label="-----------" name="separator7" />
+		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
+		<menu_item_call label="Aide Second Life" name="Second Life Help"/>
+		<menu_item_call label="Base de connaissances…" name="Knowledge Base..."/>
+		<menu_item_call label="Aide en ligne" name="Live Help..."/>
+		<menu_item_call label="Didacticiel" name="Tutorial"/>
+		<menu_item_separator label="-----------" name="separator"/>
+		<menu_item_call label="Blog officiel des Lindens..." name="Official Linden Blog..."/>
+		<menu_item_separator label="-----------" name="separator2"/>
+		<menu_item_call label="Guide pour l&apos;écriture de scripts..." name="Scripting Guide..."/>
+		<menu_item_call label="Scripting Wiki..." name="Scripting Wiki..."/>
+		<menu_item_call label="Portail pour l&apos;écriture de scripts..." name="Scripting Portal..."/>
+		<menu_item_separator label="-----------" name="separator3"/>
+		<menu_item_call label="Message du jour..." name="Message of the Day..."/>
+		<menu_item_separator label="-----------" name="separator4"/>
+		<menu_item_call label="Signaler une infraction..." name="Report Abuse..."/>
+		<menu_item_call label="Collisions, coups et bousculades…" name="Bumps, Pushes &amp;amp; Hits..."/>
+		<menu_item_separator label="-----------" name="separator5"/>
+		<menu_item_call label="Signaler un bug..." name="Report Bug..."/>
+		<menu_item_call label="Notes de version…" name="Release Notes..."/>
+		<menu_item_separator label="-----------" name="separator6"/>
+		<menu_item_call label="Mesure du lag" name="Lag Meter"/>
+		<menu_item_separator label="-----------" name="separator7"/>
 		<menu label="Signaler des bugs" name="Bug Reporting">
-			<menu_item_call label="Suivi des problèmes..." name="Public Issue Tracker..." />
-			<menu_item_call label="Aide au suivi des problèmes..." name="Publc Issue Tracker Help..." />
-			<menu_item_separator label="-----------" name="separator7" />
-			<menu_item_call label="Comment signaler des bugs ?" name="Bug Reporing 101..." />
-			<menu_item_call label="Problèmes de sécurité..." name="Security Issues..." />
-			<menu_item_call label="Wiki Assurance Qualité…" name="QA Wiki..." />
-			<menu_item_separator label="-----------" name="separator9" />
-			<menu_item_call label="Signaler un bug..." name="Report Bug..." />
+			<menu_item_call label="Ouvrir un JIRA..." name="Public Issue Tracker..."/>
+			<menu_item_call label="Comment utiliser JIRA ?" name="Publc Issue Tracker Help..."/>
+			<menu_item_separator label="-----------" name="separator7"/>
+			<menu_item_call label="Comment signaler des bugs ?" name="Bug Reporing 101..."/>
+			<menu_item_call label="Comment signaler un problème de sécurité ?" name="Security Issues..."/>
+			<menu_item_call label="Wiki Assurance Qualité…" name="QA Wiki..."/>
+			<menu_item_separator label="-----------" name="separator9"/>
+			<menu_item_call label="Signaler un bug..." name="Report Bug..."/>
 		</menu>
-		<menu_item_call label="À propos de Second Life..." name="About Second Life..." />
+		<menu_item_call label="À propos de Second Life..." name="About Second Life..."/>
 	</menu>
 </menu_bar>
diff --git a/indra/newview/skins/default/xui/fr/mime_types.xml b/indra/newview/skins/default/xui/fr/mime_types.xml
index 3e5c96d..5b8b7ca 100644
--- a/indra/newview/skins/default/xui/fr/mime_types.xml
+++ b/indra/newview/skins/default/xui/fr/mime_types.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <mimetypes name="default">
 	<widgetset name="web">
 		<label name="web_label">
 			Contenu web
 		</label>
 		<tooltip name="web_tooltip">
-			Il y a du contenu web à cet endroit
+			Cette parcelle propose du contenu multimédia
 		</tooltip>
 		<playtip name="web_playtip">
 			Afficher le contenu web
@@ -35,7 +35,7 @@
 			Image
 		</label>
 		<tooltip name="image_tooltip">
-			Il y a une image ici
+			Cette parcelle contient une image
 		</tooltip>
 		<playtip name="image_playtip">
 			Afficher l&apos;image qui se trouve ici
@@ -46,7 +46,7 @@
 			Audio
 		</label>
 		<tooltip name="audio_tooltip">
-			Il y a du contenu audio ici
+			Cette parcelle propose du contenu audio
 		</tooltip>
 		<playtip name="audio_playtip">
 			Jouer le contenu audio qui se trouve ici
diff --git a/indra/newview/skins/default/xui/fr/notify.xml b/indra/newview/skins/default/xui/fr/notify.xml
index e9aefcb..3a33b05 100644
--- a/indra/newview/skins/default/xui/fr/notify.xml
+++ b/indra/newview/skins/default/xui/fr/notify.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <notifications>
 	<notify name="SystemMessageTip">
 		<message name="message">
@@ -37,7 +37,7 @@
 	</notify>
 	<notify name="AddSelfFriend">
 		<message name="message">
-			Vous ne pouvez pas vous ajouter comme ami.
+			Vous ne pouvez pas devenir ami avec vous-même.
 		</message>
 	</notify>
 	<notify name="UploadingAuctionSnapshot">
@@ -48,7 +48,7 @@
 	</notify>
 	<notify name="UploadPayment">
 		<message name="message">
-			Le chargement a coûté [AMOUNT] $L.
+			Le chargement a coûté [AMOUNT] L$.
 		</message>
 	</notify>
 	<notify name="UploadingSnapshot">
@@ -100,7 +100,7 @@ Merci de réessayer.
 	</notify>
 	<notify name="UnableToLoadLandmark">
 		<message name="message">
-			Impossible de charger le repère.  Merci de réessayer.
+			Impossible de charger le repère. Merci de réessayer.
 		</message>
 	</notify>
 	<notify name="CapsKeyOn">
@@ -143,7 +143,7 @@ Merci de réessayer.
 	</notify>
 	<notify name="UnableToLoadScript">
 		<message name="message">
-			Impossible de charger le script.  Merci de réessayer.
+			Impossible de charger le script. Merci de réessayer.
 		</message>
 	</notify>
 	<notify name="IncompleteInventory">
@@ -198,12 +198,12 @@ propriétaires différents. Veuillez sélectionner un seul objet.
 	</notify>
 	<notify name="EnteringGodMode">
 		<message name="message">
-			Activation du mode admin : niveau [LEVEL]
+			Activation du mode divin : niveau [LEVEL]
 		</message>
 	</notify>
 	<notify name="LeavingGodMode">
 		<message name="message">
-			Désactivation du mode admin : niveau [LEVEL]
+			Désactivation du mode divin : niveau [LEVEL]
 		</message>
 	</notify>
 	<notify name="CopyFailed">
@@ -307,7 +307,7 @@ Veuillez sélectionner un terrain plus petit.
 	</notify>
 	<notify name="TransferObjectsHighlighted">
 		<message name="message">
-			Tous les objets sur cette parcelle qui seront
+			Tous les objets de cette parcelle qui seront
 transférés à l&apos;acheteur sont maintenant mis en surbrillance.
  
 * Les arbres et la pelouse qui seront transférés ne sont pas mis en surbrillance.
@@ -348,7 +348,7 @@ ont été renvoyés dans votre inventaire.
 	</notify>
 	<notify name="OtherObjectsReturned2">
 		<message name="message">
-			Les objets sur la parcelle de terrain
+			Les objets sur la parcelle
 appartenant à « [NAME] »
 ont étés renvoyés à leur propriétaire.
 		</message>
@@ -368,7 +368,7 @@ Les objets non transférables donnés au groupe ont étés supprimés.
 	<notify name="NotSafe">
 		<message name="message">
 			Les dégâts sont autorisés sur ce terrain (« non sécurisé »).
-Vous pouvez être blessé ici.  Si vous décédez, vous serez téléporté à votre domicile.
+Vous pouvez être blessé ici. Si vous décédez, vous serez téléporté à votre domicile.
 		</message>
 	</notify>
 	<notify name="NoFly">
@@ -494,7 +494,7 @@ Aucun script n&apos;est exécuté à part ceux du propriétaire du terrain.
 		<message name="message">
 			[NAME] vous invite à
 rejoindre un groupe comme officier.
-L&apos;adhésion est gratuite.
+L&apos;inscription est gratuite.
  
 [MESSAGE]
 		</message>
@@ -512,7 +512,7 @@ L&apos;adhésion est gratuite.
 		<message name="message">
 			[NAME] vous invite à
 rejoindre un groupe.
-L&apos;adhésion coûte [COST] $L.
+L&apos;inscription coûte [COST] L$.
  
 [MESSAGE]
 		</message>
@@ -530,7 +530,7 @@ L&apos;adhésion coûte [COST] $L.
 		<message name="message">
 			[NAME] vous invite à
 rejoindre un groupe.
-L&apos;adhésion est gratuite.
+L&apos;inscription est gratuite.
  
 [MESSAGE]
 		</message>
@@ -576,7 +576,7 @@ le/la rejoindre par téléportation :
  
 [MESSAGE]
  
-(Par défaut, vous pourrez voir chacun si l&apos;autre est connecté.)
+(Par défaut, vous pourrez voir lorsque vous êtes tous deux connectés.)
 		</message>
 		<option name="Accept">
 			Accepter
@@ -625,13 +625,13 @@ vous permet d&apos;envoyer rapidement un IM à ce résident.
 	<notify name="RegionRestartMinutes">
 		<message name="message">
 			La région va redémarrer dans [MINUTES] minutes.
-Si vous restez dans cette région, vous serez déconnecté.
+Si vous restez dans cette région, vous serez déconnecté(e).
 		</message>
 	</notify>
 	<notify name="RegionRestartSeconds">
 		<message name="message">
 			La région va redémarrer dans [SECONDS] secondes.
-Si vous restez dans cette région, vous serez déconnecté.
+Si vous restez dans cette région, vous serez déconnecté(e).
 		</message>
 	</notify>
 	<notify name="LoadWebPage">
@@ -640,7 +640,7 @@ Si vous restez dans cette région, vous serez déconnecté.
  
 [MESSAGE]
  
-Venant de l&apos;objet :  [OBJECTNAME], appartenant à :  [NAME]?
+Venant de l&apos;objet : [OBJECTNAME], appartenant à : [NAME]?
 		</message>
 		<option name="Gotopage">
 			Aller sur cette page
@@ -679,7 +679,7 @@ Réessayez dans une minute le temps de résoudre le problème.
 	</notify>
 	<notify name="ScriptTakeMoney">
 		<message name="message">
-			Débite vos dollars Linden ($L)
+			Débite vos dollars Linden (L$)
 		</message>
 	</notify>
 	<notify name="ActOnControlInputs">
@@ -751,22 +751,22 @@ Acceptez-vous ?
 	</notify>
 	<notify name="ScriptQuestionCautionChatGranted">
 		<message name="message">
-			&apos;[OBJECTNAME]&apos;, un objet appartenant à &apos;[OWNERNAME]&apos;, situé dans [REGIONNAME] à [REGIONPOS], a reçu la permission de : [PERMISSIONS].
+			&apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu la permission de : [PERMISSIONS].
 		</message>
 	</notify>
 	<notify name="ScriptQuestionCautionChatDenied">
 		<message name="message">
-			&apos;[OBJECTNAME]&apos;, un objet appartenant à &apos;[OWNERNAME]&apos;, situé dans [REGIONNAME] à [REGIONPOS], n&apos;a pas reçu la permission de : [PERMISSIONS].
+			&apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n&apos;a pas reçu la permission de : [PERMISSIONS].
 		</message>
 	</notify>
 	<notify name="ScriptQuestionCautionWarn">
 		<message name="message">
-			Un objet demande la permission de prélever des dollars Linden ($L) sur votre compte.
+			Un objet demande la permission de prélever des dollars Linden (L$) sur votre compte.
 		</message>
 	</notify>
 	<notify name="ScriptQuestionCaution">
 		<message name="message">
-			&apos;[OBJECTNAME]&apos;, un objet appartenant à &apos;[NAME]&apos;, aimerait :
+			[OBJECTNAME], un objet appartenant à [NAME], aimerait :
  
 [QUESTIONS]
 Si vous n&apos;avez pas confiance en cet objet ni en son créateur, vous devriez refuser cette requête. Pour plus d&apos;informations, cliquez sur le bouton Détails.
@@ -803,14 +803,14 @@ Accepter cette requête ?
 	</notify>
 	<notify name="FirstBalanceIncrease">
 		<message name="message">
-			Vous venez de recevoir [AMOUNT] $L.
-Des objets et des utilisateurs peuvent vous donner des $L.
+			Vous venez de recevoir [AMOUNT] L$.
+Des objets et des utilisateurs peuvent vous donner des L$.
 Votre solde est affiché dans le coin en haut à droite de l&apos;écran.
 		</message>
 	</notify>
 	<notify name="FirstBalanceDecrease">
 		<message name="message">
-			Vous venez de payer [AMOUNT] $L.
+			Vous venez de payer [AMOUNT] L$.
 Votre solde est affiché dans le coin en haut à droite de l&apos;écran.
 		</message>
 	</notify>
@@ -867,10 +867,10 @@ Vous pouvez modifier votre apparence aussi souvent que vous le souhaitez.
 	</notify>
 	<notify name="FirstInventory">
 		<message name="message">
-			Il s&apos;agit de votre inventaire qui contient des objets, notes, vêtements, et autres choses que vous possédez. 
+			Il s&apos;agit de votre inventaire qui contient des objets, notes, vêtements, et autres possessions. 
 * Pour porter un objet ou le dossier contenant un ensemble complet, faites-le glisser sur vous-même.
 * Pour mettre un objet dans le monde, faites-le glisser sur le sol.
-* Pour lire une notice, double-cliquez dessus.
+* Pour lire une note, double-cliquez dessus.
 		</message>
 	</notify>
 	<notify name="FirstSandbox">
@@ -944,7 +944,7 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore
 	</notify>
 	<notify name="VoiceInviteGroup">
 		<message name="message">
-			[NAME] a rejoint un chat oral avec le groupe [GROUP]. 
+			[NAME] a rejoint un chat vocal avec le groupe [GROUP]. 
 Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer.
 		</message>
 		<option name="Accept">
@@ -994,7 +994,7 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore
 	</notify>
 	<notify name="ProximalVoiceChannelFull">
 		<message name="message">
-			Nous sommes désolés.  Le nombre maximum de conversations orales a été atteint dans cette zone.  Veuillez trouver un autre endroit pour discuter.
+			Nous sommes désolés. Le nombre maximum de conversations vocales a été atteint dans cette zone. Veuillez trouver un autre endroit pour discuter.
 		</message>
 	</notify>
 	<notify name="VoiceChannelDisconnected">
@@ -1044,7 +1044,7 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore
 	</notify>
 	<notify name="VoiceNotAllowed">
 		<message name="message">
-			Vous n&apos;êtes pas autorisé à vous connecter au chat oral pour [VOICE_CHANNEL_NAME].
+			Vous n&apos;êtes pas autorisé à vous connecter au chat vocal pour [VOICE_CHANNEL_NAME].
 		</message>
 	</notify>
 	<notify name="VoiceCallGenericError">
diff --git a/indra/newview/skins/default/xui/fr/panel_audio.xml b/indra/newview/skins/default/xui/fr/panel_audio.xml
index f2be953..380d952 100644
--- a/indra/newview/skins/default/xui/fr/panel_audio.xml
+++ b/indra/newview/skins/default/xui/fr/panel_audio.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Audio et Vidéo" name="Media panel">
-	<slider label="Master" name="System Volume" label_width="65" />
-	<slider label="Musique" name="Music Volume" label_width="65" />
-	<slider label="Média" name="Media Volume" label_width="65" />
-	<slider label="Voix" name="Voice Volume" label_width="65" />
-	<slider label="Sons" name="SFX Volume" label_width="65"/>
-	<slider label="Son ambiant" name="Wind Volume" label_width="65"  />
-	<slider label="UI" name="UI Volume" label_width="65"/>
+	<slider label="Principal" label_width="65" name="System Volume"/>
+	<slider label="Musique" label_width="65" name="Music Volume"/>
+	<slider label="Média" label_width="65" name="Media Volume"/>
+	<slider label="Voix" label_width="65" name="Voice Volume"/>
+	<slider label="Sons" label_width="65" name="SFX Volume"/>
+	<slider label="Son ambiant" label_width="65" name="Wind Volume"/>
+	<slider label="Interface" label_width="65" name="UI Volume"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_audio_device.xml b/indra/newview/skins/default/xui/fr/panel_audio_device.xml
index 8663fe1..7ca53b7 100644
--- a/indra/newview/skins/default/xui/fr/panel_audio_device.xml
+++ b/indra/newview/skins/default/xui/fr/panel_audio_device.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="device_settings">
 	<text name="Audio Devices">
 		Matériel audio
@@ -7,16 +7,15 @@
 		Périphérique d&apos;entrée (micro) :
 	</text>
 	<text name="Output device (speakers):">
-		Périphérique de sortie (speakers) :
+		Périphérique de sortie (haut-parleurs) :
 	</text>
 	<text name="Input level:">
 		Volume d&apos;entrée
 	</text>
 	<text_editor name="voice_intro_text1">
-		Pour que les autres résidents vous entendent plus ou moins fort, utilisez le curseur. Pour tester le volume d&apos;entrée, il vous suffit de parler dans le micro.
+		Pour que les autres résidents vous entendent plus ou moins fort, utilisez le curseur. Pour tester le volume, parlez dans le micro.
 	</text_editor>
-	<volume_slider name="mic_volume_slider"
-	     tool_tip="Réglez le volume à l&apos;aide de ce curseur." />
+	<volume_slider name="mic_volume_slider" tool_tip="Réglez le volume avec ce curseur."/>
 	<text name="wait_text">
 		Veuillez patienter
 	</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_avatar.xml b/indra/newview/skins/default/xui/fr/panel_avatar.xml
index 548020c..bb49a1b 100644
--- a/indra/newview/skins/default/xui/fr/panel_avatar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_avatar.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="Panel Avatar">
 	<tab_container name="tab">
 		<panel label="2nd Life" name="2nd Life">
@@ -16,7 +16,7 @@
 				Membre originaire
 			</string>
 			<string name="AcctTypeEmployee">
-				Employé de Linden Lab
+				Employé(e) de Linden Lab
 			</string>
 			<string name="PaymentInfoUsed">
 				Infos de paiement utilisées
@@ -37,7 +37,7 @@
 				Nom :
 			</text>
 			<text name="online_yes">
-				Connecté actuellement
+				Actuellement connecté(e)
 			</text>
 			<text name="label">
 				Né(e) le :
@@ -45,21 +45,18 @@
 			<text name="label2">
 				Compte :
 			</text>
-			<text name="partner_label"
-			     tool_tip="Partenaire sur Second Life. Pour en savoir plus, allez sur www.secondlife.com/partner">
+			<text name="partner_label" tool_tip="Partenaire sur Second Life. Pour en savoir plus, allez sur www.secondlife.com/partner">
 				Partenaire :
 			</text>
-			<button label="i" label_selected="i" left_delta="62" name="partner_info"
-			     tool_tip="Cliquez pour ouvrir le profil du partenaire" />
-			<button label="?" label_selected="?" left_delta="24" name="partner_help" />
-			<line_editor name="partner_edit"
-			     tool_tip="Partenaire sur Second Life. Pour en savoir plus, allez sur www.secondlife.com/partner">
+			<button label="i" label_selected="i" left_delta="62" name="partner_info" tool_tip="Cliquez pour ouvrir le profil du partenaire"/>
+			<button label="?" label_selected="?" left_delta="24" name="partner_help"/>
+			<line_editor name="partner_edit" tool_tip="Partenaire sur Second Life. Pour en savoir plus, allez sur www.secondlife.com/partner">
 				[FIRST] [LAST]
 			</line_editor>
 			<text name="Photo:">
 				Photo :
 			</text>
-			<texture_picker label="" name="img" tool_tip="Cliquez pour sélectionner une image" />
+			<texture_picker label="" name="img" tool_tip="Cliquez pour sélectionner une image"/>
 			<text name="Groups:">
 				Groupes :
 			</text>
@@ -70,28 +67,22 @@
 				(500 car.)
 			</text>
 			<text name="Give item:">
-				Donner objet :
-			</text>
-			<text name="Give inventory"
-			     tool_tip="Mettez les objets de l&apos;inventaire ici pour les donner à cette personne.">
-				Mettez les objets de l&apos;inventaire ici.
-			</text>
-			<check_box label="Afficher dans la recherche" name="allow_publish"
-			     tool_tip="Publiez des infos suplémentaires telles qu&apos;une description et une image dans la Recherche." />
-			<button label="?" label_selected="?" left_delta="160" name="?" />
-			<button label="Localiser" label_selected="Localiser" name="Find on Map" />
-			<button label="Offrir téléportation..." label_selected="Offrir téléportation..."
-			     name="Offer Teleport..." />
-			<button label="Ajouter comme ami..." label_selected="Ajouter comme ami..."
-			     name="Add Friend..." />
-			<button label="Payer..." label_selected="Payer..." name="Pay..." />
-			<button label="Message instantané..." label_selected="Message instantané..."
-			     name="Instant Message..." tool_tip="Message instantané (IM)" />
-			<button label="Ignorer" label_selected="Ignorer" name="Mute" />
+				Donner des objets :
+			</text>
+			<text name="Give inventory" tool_tip="Mettez les objets de l&apos;inventaire ici pour les donner à cette personne.">
+				Mettez les objets à transférer ici.
+			</text>
+			<check_box label="Afficher dans la recherche" name="allow_publish" tool_tip="Publiez des infos suplémentaires telles qu&apos;une description et une image dans la Recherche."/>
+			<button label="?" label_selected="?" left_delta="160" name="?"/>
+			<button label="Localiser" label_selected="Localiser" name="Find on Map"/>
+			<button label="Proposer téléportation..." label_selected="Proposer téléportation..." name="Offer Teleport..."/>
+			<button label="Devenir amis..." label_selected="Devenir amis..." name="Add Friend..."/>
+			<button label="Payer..." label_selected="Payer..." name="Pay..."/>
+			<button label="Message instantané..." label_selected="Message instantané..." name="Instant Message..." tool_tip="Message instantané (IM)"/>
+			<button label="Ignorer" label_selected="Ignorer" name="Mute"/>
 		</panel>
 		<panel label="Web" name="WebProfile">
-			<flyout_button label="Charger" label_selected="Charger" name="load"
-			     tool_tip="Charger cette page du profil avec le navigateur web incorporé.">
+			<flyout_button label="Charger" label_selected="Charger" name="load" tool_tip="Charger cette page du profil avec le navigateur web incorporé.">
 				<flyout_button_item name="open_item">
 					Dans un navigateur externe
 				</flyout_button_item>
@@ -99,42 +90,40 @@
 					URL du domicile
 				</flyout_button_item>
 			</flyout_button>
-			<button label="?" label_selected="?" name="web_profile_help" />
-			<check_box label="Charger automatiquement les profils du web" name="auto_load"
-			     tool_tip="Charger automatiquement toutes les pages web des profils sans demander au préalable." />
+			<button label="?" label_selected="?" name="web_profile_help"/>
+			<check_box label="Charger directement la page web" name="auto_load" tool_tip="Charger automatiquement toutes les pages web des profils sans demander au préalable."/>
 		</panel>
 		<panel label="Intérêts" name="Interests">
 			<text left="2" name="I Want To:">
 				Je veux :
 			</text>
-			<check_box label="Construire" name="chk0" />
-			<check_box label="Explorer" left_delta="160" name="chk1" />
-			<check_box label="Faire des rencontres" left_delta="-160" name="chk2" />
-			<check_box label="Être engagé" left_delta="160" name="chk6" />
-			<check_box label="Rejoindre un groupe" left_delta="-160" name="chk3" />
-			<check_box label="Acheter" left_delta="160" name="chk4" />
-			<check_box label="Vendre" left_delta="-160" name="chk5" />
-			<check_box label="Recruter" left_delta="160" name="chk7" />
+			<check_box label="Construire" name="chk0"/>
+			<check_box label="Explorer" left_delta="160" name="chk1"/>
+			<check_box label="Faire des rencontres" left_delta="-160" name="chk2"/>
+			<check_box label="Être engagé" left_delta="160" name="chk6"/>
+			<check_box label="Rejoindre un groupe" left_delta="-160" name="chk3"/>
+			<check_box label="Acheter" left_delta="160" name="chk4"/>
+			<check_box label="Vendre" left_delta="-160" name="chk5"/>
+			<check_box label="Recruter" left_delta="160" name="chk7"/>
 			<text left="2" name="Skills:">
 				Mes talents :
 			</text>
-			<check_box label="Textures" name="schk0" />
-			<check_box label="Architecture" left_delta="160" name="schk1" />
-			<check_box label="Organisation d&apos;événements" name="schk2" />
-			<check_box label="Modélisation" left_delta="-160" name="schk3" />
-			<check_box label="Rédaction de scripts" name="schk4" />
-			<check_box label="Customisation de personnages" left_delta="160" name="schk5" />
+			<check_box label="Textures" name="schk0"/>
+			<check_box label="Architecture" left_delta="160" name="schk1"/>
+			<check_box label="Organisation d&apos;événements" name="schk2"/>
+			<check_box label="Modélisation" left_delta="-160" name="schk3"/>
+			<check_box label="Rédaction de scripts" name="schk4"/>
+			<check_box label="Customisation de personnages" left_delta="160" name="schk5"/>
 			<text left="2" name="Languages:">
 				Langues :
 			</text>
 		</panel>
 		<panel label="Favoris" name="Picks">
-			<text left="10" name="Tell everyone about your favorite places in Second Life."
-			     width="412">
+			<text left="10" name="Tell everyone about your favorite places in Second Life." width="412">
 				Faites connaître aux autres résidents vos endroits favoris dans Second Life.
 			</text>
-			<button label="Créer..." label_selected="Créer..." name="New..." />
-			<button label="Supprimer..." label_selected="Supprimer..." name="Delete..." />
+			<button label="Créer..." label_selected="Créer..." name="New..."/>
+			<button label="Supprimer..." label_selected="Supprimer..." name="Delete..."/>
 			<text name="loading_text">
 				Chargement en cours...
 			</text>
@@ -143,8 +132,8 @@
 			<text name="Place an ad in Second Life&apos;s classified listings.">
 				Passez une petite annonce sur Second Life.
 			</text>
-			<button label="Créer..." label_selected="Créer..." name="New..." />
-			<button label="Supprimer..." label_selected="Supprimer..." name="Delete..." />
+			<button label="Créer..." label_selected="Créer..." name="New..."/>
+			<button label="Supprimer..." label_selected="Supprimer..." name="Delete..."/>
 			<text name="loading_text">
 				Chargement en cours...
 			</text>
@@ -153,7 +142,7 @@
 			<text name="Photo:">
 				Photo :
 			</text>
-			<texture_picker label="" name="img" tool_tip="Cliquez pour sélectionner une photo" />
+			<texture_picker label="" name="img" tool_tip="Cliquez pour sélectionner une photo"/>
 			<text name="Info:">
 				Infos :
 			</text>
@@ -167,22 +156,19 @@
 			</string>
 			<text name="label">
 				Dans cet espace, vous pouvez enregistrer vos remarques au sujet de ce
-résident. Vous pouvez aussi utiliser cet onglet pour prendre des notes sur
-certains projets. Vous êtes le seul à pouvoir y accéder.  Même le résident
-dont vous consultez le profil actuellement ne peut pas voir vos notes.
+résident ou prendre des notes sur certains projets. Vous êtes le seul à
+pouvoir accéder à cet espace et même le résident dont vous consultez le profil
+ne pourra pas voir ce que vous avez écrit.
 			</text>
-			<text_editor bottom_delta="-260" height="240" name="notes edit" />
+			<text_editor bottom_delta="-260" height="240" name="notes edit"/>
 		</panel>
 	</tab_container>
-	<button label="OK" label_selected="OK" name="OK" />
-	<button label="Annuler" label_selected="Annuler" name="Cancel" />
-	<button label="Vider" label_selected="Vider" name="Kick" />
-	<button label="Geler" label_selected="Geler" name="Freeze"
-	     tool_tip="Empêcher ce résident de bouger et de chatter." />
-	<button label="Dégeler" label_selected="Dégeler" name="Unfreeze"
-	     tool_tip="Dégeler le résident" />
-	<button label="Admin" label_selected="Admin" name="csr_btn"
-	     tool_tip="Contacter le Service Clientèle pour ce résident" />
+	<button label="OK" label_selected="OK" name="OK"/>
+	<button label="Annuler" label_selected="Annuler" name="Cancel"/>
+	<button label="Éjecter" label_selected="Éjecter" name="Kick"/>
+	<button label="Geler" label_selected="Geler" name="Freeze" tool_tip="Empêcher ce résident de bouger et de chatter."/>
+	<button label="Dégeler" label_selected="Dégeler" name="Unfreeze" tool_tip="Dégeler le résident"/>
+	<button label="Admin" label_selected="Admin" name="csr_btn" tool_tip="Contacter le Service Clientèle pour ce résident"/>
 	<string name="ShowOnMapNonFriend">
 		Voir sur la carte.
 Ceci n&apos;est pas possible car vous
@@ -200,7 +186,7 @@ n&apos;êtes pas ami avec cette personne.
 		Téléporter le résident là où vous êtes de force.
 	</string>
 	<string name="TeleportPrelude">
-		Offrir au résident d&apos;être téléporté là où vous êtes.
+		Proposer au résident d&apos;être téléporté là où vous êtes.
 Ceci n&apos;est pas possible tant que vous êtes sur l&apos;île d&apos;orientation.
 	</string>
 	<string name="TeleportNormal">
diff --git a/indra/newview/skins/default/xui/fr/panel_avatar_classified.xml b/indra/newview/skins/default/xui/fr/panel_avatar_classified.xml
index 3074e95..b43b1fe 100644
--- a/indra/newview/skins/default/xui/fr/panel_avatar_classified.xml
+++ b/indra/newview/skins/default/xui/fr/panel_avatar_classified.xml
@@ -1,16 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="Classified" title="Annonces">
-	<line_editor name="given_name_editor"
-	     tool_tip="Le nom doit commencer par une lettre ou un chiffre, et non un signe de ponctuation." />
-	<line_editor name="location_editor"
-	     tool_tip="Définir votre position actuelle comme emplacement pour cette annonce." />
-	<button label="Définir position" name="set_location_btn" />
-	<button label="Téléporter" name="classified_teleport_btn" />
-	<button label="Carte" name="classified_map_btn" />
-	<combo_box label="" name="classified_category_combo" />
+	<line_editor name="given_name_editor" tool_tip="Le nom doit commencer par une lettre ou un chiffre, et non un signe de ponctuation."/>
+	<line_editor name="location_editor" tool_tip="Définir votre position actuelle comme emplacement pour cette annonce."/>
+	<button label="Définir position" name="set_location_btn"/>
+	<button label="Téléporter" name="classified_teleport_btn"/>
+	<button label="Carte" name="classified_map_btn"/>
+	<combo_box label="" name="classified_category_combo"/>
 	<check_box label="Adulte" name="classified_mature_check">
 		<combo_item name="select_mature">
-			- Pour adultes -
+			- Type de public -
 		</combo_item>
 		<combo_item name="mature">
 			Contenu réservé aux adultes
@@ -19,18 +17,16 @@
 			Contenu non réservé aux adultes
 		</combo_item>
 	</check_box>
-	<text name="classified_info_text"
-	     tool_tip="Plus vous payez pour votre annonce, mieux elle est placée dans la liste.">
-		Annonce passée : pas encore publiée
+	<text name="classified_info_text" tool_tip="Plus vous payez cher pour votre annonce, mieux elle est placée dans la liste.">
+		Annonce passée, pas encore publiée
 	</text>
-	<text name="click_through_text"
-	     tool_tip="Nombre total de clics sur chaque bouton depuis la parution de l&apos;annonce.">
+	<text name="click_through_text" tool_tip="Nombre total de clics sur chaque bouton depuis la parution de l&apos;annonce.">
 		Clics :
 	</text>
-	<button label="Publier..." name="classified_update_btn" />
-	<check_box label="Republier chaque semaine" name="auto_renew_check" />
+	<button label="Publier..." name="classified_update_btn"/>
+	<check_box label="Publier chaque semaine" name="auto_renew_check"/>
 	<text name="ad_placed_paid">
-		Annonce passée : [DATE], a payé [AMT] $L pour l&apos;annonce.
+		Annonce passée le : [DATE]. Prix : [AMT] L$.
 	</text>
 	<string name="update_txt">
 		Mise à jour
diff --git a/indra/newview/skins/default/xui/fr/panel_classified.xml b/indra/newview/skins/default/xui/fr/panel_classified.xml
index 37b632d..1797015 100644
--- a/indra/newview/skins/default/xui/fr/panel_classified.xml
+++ b/indra/newview/skins/default/xui/fr/panel_classified.xml
@@ -1,13 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="Classified" title="Annonces">
-	<line_editor name="given_name_editor"
-	     tool_tip="Le nom doit commencer par une lettre ou un chiffre, et non un signe de ponctuation." />
-	<line_editor name="location_editor"
-	     tool_tip="Définir votre position actuelle comme emplacement pour cette annonce." />
-	<button label="Définir" name="set_location_btn" />
-	<button label="Téléporter" name="classified_teleport_btn" />
-	<button label="Voir sur la carte" name="classified_map_btn" width="115" />
-	<button label="Profil" left="245" name="classified_profile_btn" />
+	<line_editor name="given_name_editor" tool_tip="Le nom doit commencer par une lettre ou un chiffre, et non un signe de ponctuation."/>
+	<line_editor name="location_editor" tool_tip="Définir votre position actuelle comme emplacement pour cette annonce."/>
+	<button label="Définir" name="set_location_btn"/>
+	<button label="Téléporter" name="classified_teleport_btn"/>
+	<button label="Voir sur la carte" name="classified_map_btn" width="115"/>
+	<button label="Profil" left="245" name="classified_profile_btn"/>
 	<check_box label="Adulte" name="classified_mature_check">
 		<combo_item name="select_mature">
 			- Sélectionner Pour adultes -
@@ -19,10 +17,10 @@
 			Contenu non réservé aux adultes
 		</combo_item>
 	</check_box>
-	<combo_box label="" name="classified_category_combo" />
-	<button label="Mise à jour" name="classified_update_btn" />
+	<combo_box label="" name="classified_category_combo"/>
+	<button label="Mise à jour" name="classified_update_btn"/>
 	<string name="ad_placed_paid">
-		Annonce passée  : [DATE], a payé [AMT] $L pour l&apos;annonce.
+		Annonce passée le : [DATE]. Prix : [AMT] L$.
 	</string>
 	<string name="update_txt">
 		Mise à jour
diff --git a/indra/newview/skins/default/xui/fr/panel_friends.xml b/indra/newview/skins/default/xui/fr/panel_friends.xml
index f553287..e43305b 100644
--- a/indra/newview/skins/default/xui/fr/panel_friends.xml
+++ b/indra/newview/skins/default/xui/fr/panel_friends.xml
@@ -1,29 +1,20 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="friends">
 	<string name="Multiple">
 		Amis multiples...
 	</string>
-	<scroll_list name="friend_list"
-	     tool_tip="Pour sélectionner plusieurs amis, cliquez en maintenant la touche Maj ou Ctrl appuyée">
-		<column name="icon_online_status" tool_tip="Statut en ligne" />
-		<column label="Nom" name="friend_name" tool_tip="Nom" />
-		<column name="icon_visible_online"
-		     tool_tip="Vos amis voient si vous êtes connecté(e)" />
-		<column name="icon_visible_map" tool_tip="Vos amis peuvent vous situer sur la carte" />
-		<column name="icon_edit_mine"
-		     tool_tip="Vos amis peuvent modifier, supprimer ou prendre vos objets" />
-		<column name="icon_edit_theirs" tool_tip="Vous pouvez modifier les objets de cet ami" />
+	<scroll_list name="friend_list" tool_tip="Pour sélectionner plusieurs amis, cliquez en maintenant la touche Maj ou Ctrl appuyée">
+		<column name="icon_online_status" tool_tip="Statut en ligne"/>
+		<column label="Nom" name="friend_name" tool_tip="Nom"/>
+		<column name="icon_visible_online" tool_tip="Vos amis voient si vous êtes connecté(e)"/>
+		<column name="icon_visible_map" tool_tip="Vos amis peuvent vous situer sur la carte"/>
+		<column name="icon_edit_mine" tool_tip="Vos amis peuvent modifier, supprimer ou prendre vos objets"/>
+		<column name="icon_edit_theirs" tool_tip="Vous pouvez modifier les objets de cet ami"/>
 	</scroll_list>
-	<button label="IM/Appel" name="im_btn"
-	     tool_tip="Ouvrez une session de messagerie instantanée" />
-	<button label="Profil" name="profile_btn"
-	     tool_tip="Affichez une photo, vos groupes et autres infos" />
-	<button label="Téléporter..." name="offer_teleport_btn"
-	     tool_tip="Proposez à cet ami d&apos;être téléporté là où vous êtes" />
-	<button label="Payer..." name="pay_btn"
-	     tool_tip="Donnez des dollars Linden ($L) à cet ami" />
-	<button label="Supprimer..." name="remove_btn"
-	     tool_tip="Supprimez cette personne de votre liste d&apos;amis" />
-	<button label="Ajouter..." name="add_btn"
-	     tool_tip="Demandez à un résident de devenir votre ami" />
+	<button label="IM/Appel" name="im_btn" tool_tip="Ouvrez une session de messagerie instantanée"/>
+	<button label="Profil" name="profile_btn" tool_tip="Affichez une photo, vos groupes et autres infos"/>
+	<button label="Téléporter..." name="offer_teleport_btn" tool_tip="Proposez à cet ami d&apos;être téléporté là où vous êtes"/>
+	<button label="Payer..." name="pay_btn" tool_tip="Donnez des L$ à cet ami"/>
+	<button label="Supprimer..." name="remove_btn" tool_tip="Supprimez cette personne de votre liste d&apos;amis"/>
+	<button label="Ajouter..." name="add_btn" tool_tip="Demandez à un résident de devenir votre ami"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_general.xml b/indra/newview/skins/default/xui/fr/panel_group_general.xml
index 16e9890..b6814cf 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_general.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Général" name="general_tab">
 	<text name="help_text">
 		L&apos;onglet Général contient des infos générales sur le groupe, une liste des propriétaires et des membres visibles, les préférences relatives au groupe ainsi que différentes options concernant les membres.
@@ -8,7 +8,7 @@ Pour obtenir de l&apos;aide, survolez les options avec votre souris.
 	<string name="group_info_unchanged">
 		Les infos générales du groupe ont changé.
 	</string>
-	<button label="?" label_selected="?" name="help_button" />
+	<button label="?" label_selected="?" name="help_button"/>
 	<line_editor label="Saisissez le nom du groupe ici" name="group_name_editor">
 		Entrez le nom de votre nouveau groupe ici
 	</line_editor>
@@ -24,14 +24,12 @@ Pour obtenir de l&apos;aide, survolez les options avec votre souris.
 	<text name="group_charter_label">
 		Charte du groupe
 	</text>
-	<texture_picker label="Emblème du groupe" name="insignia"
-	     tool_tip="Cliquez pour sélectionner une image" />
+	<texture_picker label="Logo du groupe" name="insignia" tool_tip="Cliquez pour sélectionner une image"/>
 	<text_editor name="charter">
 		Charte du groupe
 	</text_editor>
-	<button label="Rejoindre (0$L)" label_selected="Rejoindre (0$L)" name="join_button" />
-	<button label="Affichage détaillé" label_selected="Affichage détaillé"
-	     name="info_button" />
+	<button label="Rejoindre (0L$)" label_selected="Rejoindre (0L$)" name="join_button"/>
+	<button label="Affichage détaillé" label_selected="Affichage détaillé" name="info_button"/>
 	<text>
 		Propriétaires et membres visibles
 	</text>
@@ -56,48 +54,38 @@ Pour obtenir de l&apos;aide, survolez les options avec votre souris.
 		Extraction des données du résident en cours
 	</text>
 	<text name="confirm_group_create_str">
-		La création de ce groupe coûte 100 $L. 
-Êtes-vous vraiment certain de vouloir dépenser 100 $L pour créer ce groupe ?
+		La création de ce groupe coûte 100 L$. 
+Êtes-vous vraiment certain de vouloir dépenser 100 L$ pour créer ce groupe ?
 Sachez que si personne ne rejoint ce groupe sous 48h, il sera démantelé et ne pourra plus être utilisé à l&apos;avenir.
 	</text>
 	<text>
 		Préférences du Groupe
 	</text>
 	<panel name="preferences_container">
-		<check_box label="Afficher dans la recherche" name="show_in_group_list"
-		     tool_tip="Afficher ce groupe dans les résultats de recherche." />
-		<check_box label="Publier sur le web" name="publish_on_web"
-		     tool_tip="Cochez pour publier les informations de ce groupe sur le web." />
-		<check_box label="Inscription libre" name="open_enrollement"
-		     tool_tip="Indique si une invitation est nécessaire pour devenir membre de ce groupe." />
-		<check_box label="Frais d&apos;inscription : $L" name="check_enrollment_fee"
-		     tool_tip="Indique s&apos;il y a des frais d&apos;inscription pour devenir membre." />
-		<spinner name="spin_enrollment_fee"
-		     tool_tip="Lorsque la case Frais d&apos;inscription est cochée, cela signifie qu&apos;il faut payer des frais pour devenir membre." />
-		<check_box label="Adulte" name="mature"
-		     tool_tip="Cochez si les informations de votre groupe sont à caractère adulte." />
-		<combo_box width="195" name="group_mature_check"
-		     tool_tip="Indique si les informations de votre groupe sont considérées comme étant réservées aux adultes.">
-			<combo_item name="select_mature" >
-				- Sélectionner Pour adultes -
+		<check_box label="Afficher dans la recherche" name="show_in_group_list" tool_tip="Afficher ce groupe dans les résultats de recherche."/>
+		<check_box label="Publier sur le web" name="publish_on_web" tool_tip="Cochez pour publier les informations de ce groupe sur le web."/>
+		<check_box label="Inscription libre" name="open_enrollement" tool_tip="Indique si une invitation est nécessaire pour devenir membre de ce groupe."/>
+		<check_box label="Frais d&apos;inscription : L$" name="check_enrollment_fee" tool_tip="Indique s&apos;il y a des frais d&apos;inscription pour devenir membre."/>
+		<spinner name="spin_enrollment_fee" tool_tip="Si la case Frais d&apos;inscription est cochée, cela signifie qu&apos;il faut payer des frais pour devenir membre."/>
+		<check_box label="Adulte" name="mature" tool_tip="Cochez si les informations de votre groupe sont à caractère adulte."/>
+		<combo_box name="group_mature_check" tool_tip="Indique si les informations de votre groupe sont considérées comme étant réservées aux adultes." width="195">
+			<combo_item name="select_mature">
+				- Type de public -
 			</combo_item>
 			<combo_item name="mature">
 				Contenu pour adultes
 			</combo_item>
 			<combo_item name="not_mature">
-				Contenu non réservé aux adultes
+				Tout public
 			</combo_item>
 		</combo_box>
 		<panel name="title_container">
 			<text name="active_title_label">
 				Mon titre actuel
 			</text>
-			<combo_box name="active_title"
-			     tool_tip="Définit le titre qui apparaît près du nom de votre avatar lorsque ce groupe est actif." />
+			<combo_box name="active_title" tool_tip="Définit le titre qui apparaît près du nom de votre avatar lorsque ce groupe est actif."/>
 		</panel>
-		<check_box label="Recevoir des notes de groupe" name="receive_notices"
-		     tool_tip="Définit si vous souhaitez recevoir les notes envoyées au groupe.  Décochez si ce groupe vous envoie des spams." />
-		<check_box label="Afficher dans mon profil" name="list_groups_in_profile"
-		     tool_tip="Indique si vous voulez que ce groupe apparaisse dans votre profil" />
+		<check_box label="Recevoir des notifications du groupe" name="receive_notices" tool_tip="Cochez si vous souhaitez recevoir les notifications envoyées au groupe. Décochez si ce groupe vous envoie des spams."/>
+		<check_box label="Afficher dans mon profil" name="list_groups_in_profile" tool_tip="Indique si vous voulez que ce groupe apparaisse dans votre profil"/>
 	</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_invite.xml b/indra/newview/skins/default/xui/fr/panel_group_invite.xml
index e989fa0..00a62ad 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_invite.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel label="Inviter un membre" name="invite_panel">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Inviter un résident" name="invite_panel">
 	<text>
 		Vous pouvez sélectionner plusieurs résidents
 à inviter dans votre groupe. Cliquez sur &apos;Ouvrir 
@@ -10,21 +10,18 @@ le Sélecteur de Personnes&apos; pour commencer.
 Cliquez sur Sélecteur 
 de personnes pour commencer.
 	</text>
-	<button label="Sélecteur de personnes" name="add_button" tool_tip="" />
-	<name_list name="invitee_list"
-	     tool_tip="Pour sélectionner plusieurs noms, maintenez la touche Ctrl enfoncée en cliquant sur le nom des résidents." />
-	<button label="Supprimer de la liste" name="remove_button"
-	     tool_tip="Supprime les résidents sélectionnés de la liste des invités." />
+	<button label="Sélecteur de personnes" name="add_button" tool_tip=""/>
+	<name_list name="invitee_list" tool_tip="Pour sélectionner plusieurs noms, maintenez la touche Ctrl enfoncée en cliquant sur le nom des résidents."/>
+	<button label="Supprimer de la liste" name="remove_button" tool_tip="Supprime les résidents sélectionnés de la liste des invités."/>
 	<text>
 		Choisissez le Rôle à leur attribuer :
 	</text>
 	<text name="role_text">
 		Assignez-leur un rôle :
 	</text>
-	<combo_box name="role_name"
-	     tool_tip="Choisissez des rôles à assigner aux membres dans la liste." />
-	<button label="Envoyer des invitations" name="ok_button" />
-	<button label="Annuler" name="cancel_button" />
+	<combo_box name="role_name" tool_tip="Choisissez des rôles à assigner aux membres dans la liste."/>
+	<button label="Envoyer des invitations" name="ok_button"/>
+	<button label="Annuler" name="cancel_button"/>
 	<string name="confirm_invite_owner_str">
 		Etes-vous certain de vouloir inviter un/de nouveau(x) propriétaire(s) ? Ce choix est permanent !
 	</string>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
index 17beac2..2bc97bd 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel label="Terrain &amp; $L" name="land_money_tab">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Terrain &amp; L$" name="land_money_tab">
 	<text name="help_text">
-		Les parcelles appartenant au groupe apparaissent avec les détails des contributions.  Un avertissement apparaîtra tant que le Total du terrain utilisé sera inférieur ou égal aux Contributions totales.  Les onglets Planification, Détails et Ventes fournissent des détails sur les finances du groupe.
+		Les parcelles appartenant au groupe apparaissent avec les détails des contributions. Un avertissement apparaîtra tant que le Total du terrain utilisé sera inférieur ou égal au Total des contributions. Les onglets Planification, Détails et Ventes fournissent des détails sur les finances du groupe.
 	</text>
-	<button label="?" name="help_button" />
+	<button label="?" name="help_button"/>
 	<text name="cant_view_group_land_text">
 		Vous n&apos;avez pas la permission de voir quel terrain possède ce groupe.
 	</text>
@@ -17,26 +17,26 @@
 		Terrain du groupe
 	</text>
 	<scroll_list name="group_parcel_list">
-		<column label="Nom de la parcelle" name="name" />
-		<column label="Région" name="location" />
-		<column label="Surface" name="area" />
-		<column label="" name="hidden" />
+		<column label="Nom de la parcelle" name="name"/>
+		<column label="Région" name="location"/>
+		<column label="Surface" name="area"/>
+		<column label="" name="hidden"/>
 	</scroll_list>
-	<button label="Voir sur la carte" label_selected="Voir sur la carte" name="map_button" />
+	<button label="Voir sur la carte" label_selected="Voir sur la carte" name="map_button"/>
 	<text name="total_contributed_land_label">
-		Contributions totales :
+		Total des contributions :
 	</text>
 	<text name="total_contributed_land_value">
 		[AREA] m²
 	</text>
 	<text name="total_land_in_use_label">
-		Total du terrain utilisé :
+		Superficie déjà utilisée :
 	</text>
 	<text name="total_land_in_use_value">
 		[AREA] m²
 	</text>
 	<text name="land_available_label">
-		Terrain disponible :
+		Superficie disponible :
 	</text>
 	<text name="land_available_value">
 		[AREA] m²
@@ -58,7 +58,7 @@
 charge le terrain utilisé.
 	</text>
 	<text name="group_money_heading">
-		$L du groupe
+		Comptes du groupe
 	</text>
 	<tab_container name="group_money_tab_container">
 		<panel label="Planification" name="group_money_planning_tab">
@@ -70,19 +70,15 @@ charge le terrain utilisé.
 			<text_editor name="group_money_details_text">
 				Calcul en cours...
 			</text_editor>
-			<button label="&lt; Plus tôt" label_selected="&lt; Plus tôt"
-			     name="earlier_details_button" tool_tip="Reculer dans le temps" />
-			<button label="Plus tard &gt;" label_selected="Plus tard &gt;"
-			     name="later_details_button" tool_tip="Avancer dans le temps" />
+			<button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="earlier_details_button" tool_tip="Reculer dans le temps"/>
+			<button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="later_details_button" tool_tip="Avancer dans le temps"/>
 		</panel>
 		<panel label="Ventes" name="group_money_sales_tab">
 			<text_editor name="group_money_sales_text">
 				Calcul en cours...
 			</text_editor>
-			<button label="&lt; Plus tôt" label_selected="&lt; Plus tôt"
-			     name="earlier_sales_button" tool_tip="Reculer dans le temps" />
-			<button label="Plus tard &gt;" label_selected="Plus tard &gt;"
-			     name="later_sales_button" tool_tip="Avancer dans le temps" />
+			<button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="earlier_sales_button" tool_tip="Reculer dans le temps"/>
+			<button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="later_sales_button" tool_tip="Avancer dans le temps"/>
 		</panel>
 	</tab_container>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_notices.xml b/indra/newview/skins/default/xui/fr/panel_group_notices.xml
index a065839..8a9ef69 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_notices.xml
@@ -1,70 +1,65 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel label="Notes" name="notices_tab">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Notifications" name="notices_tab">
 	<text name="help_text">
-		Les notes vous permettent d&apos;envoyer des messages et pièces-jointes à tous les membres du groupe en même temps. Ces messages ne sont envoyés qu&apos;aux membres dont le rôle les autorise à recevoir des notes. Vous pouvez désactiver les notes à l&apos;onglet Général.
+		Les notifications vous permettent d&apos;envoyer des messages et pièces-jointes à tous les membres du groupe en même temps. Ces messages ne sont envoyés qu&apos;aux membres dont le rôle les autorise à recevoir des notifications. Vous pouvez désactiver les notifications à l&apos;onglet Général.
 	</text>
 	<text name="no_notices_text">
-		Aucune note précédemment envoyée.
+		Aucune notification précédemment envoyée.
 	</text>
-	<button label="?" label_selected="?" name="help_button" />
+	<button label="?" label_selected="?" name="help_button"/>
 	<text name="lbl">
-		Archive des notes du groupe
+		Archive des notifications du groupe
 	</text>
 	<text name="lbl2">
-		Les notes sont conservées pendant 14 jours. Cliquez sur la note que vous
-voulez afficher. Pour voir si vous avez reçu de nouvelles notes, cliquez sur
-Rafraîchir. Chaque groupe a une limite quotidienne de 200 notes.
+		Les notifications sont conservées pendant 14 jours. Cliquez sur la notification que vous
+voulez afficher. Pour voir si vous avez reçu de nouvelles notifications, cliquez sur
+Rafraîchir. Chaque groupe a une limite quotidienne de 200 notifications.
 	</text>
 	<scroll_list name="notice_list">
-		<column label="" name="icon" />
-		<column label="Sujet" name="subject" />
-		<column label="De" name="from" />
-		<column label="Date" name="date" />
+		<column label="" name="icon"/>
+		<column label="Sujet" name="subject"/>
+		<column label="De" name="from"/>
+		<column label="Date" name="date"/>
 	</scroll_list>
 	<text name="notice_list_none_found">
 		Aucun résultat.
 	</text>
-	<button label="Créer une note" label_selected="Créer une note"
-	     name="create_new_notice" />
-	<button label="Rafraîchir" label_selected="Rafraîchir la liste"
-	     name="refresh_notices" />
-	<panel label="Créer une note" name="panel_create_new_notice">
+	<button label="Créer une notification" label_selected="Créer une notification" name="create_new_notice"/>
+	<button label="Rafraîchir" label_selected="Rafraîchir la liste" name="refresh_notices"/>
+	<panel label="Créer une notification" name="panel_create_new_notice">
 		<text name="lbl">
-			Créer une note
+			Créer une notification
 		</text>
 		<text name="lbl2">
-			Pour envoyer une note, vous devez saisir un sujet. Pour joindre
-une pièce-jointe à cette note, faites-la glisser depuis votre 
+			Pour envoyer une notification, vous devez saisir un sujet. Pour joindre
+une pièce-jointe à cette notification, faites-la glisser depuis votre 
 inventaire vers cette fenêtre. Les pièces-jointes doivent être
 copiables et transférables. Il n&apos;est pas possible d&apos;envoyer de
 dossiers.
 		</text>
-		<text name="lbl3" bottom_delta="-79" >
+		<text bottom_delta="-79" name="lbl3">
 			Sujet :
 		</text>
-		<line_editor name="create_subject" width="346" />
+		<line_editor name="create_subject" width="346"/>
 		<text name="lbl4">
 			Message :
 		</text>
-		<text_editor bottom_delta="-90" height="104" name="create_message" />
+		<text_editor bottom_delta="-90" height="104" name="create_message"/>
 		<text name="lbl5">
 			Attacher :
 		</text>
-		<line_editor name="create_inventory_name" width="206" />
-		<button label="Supprimer pièce-jointe" label_selected="Supprimer pièce-jointe"
-		     name="remove_attachment" left="274" width="140"/>
-		<button label="Envoyer note" label_selected="Envoyer note" name="send_notice" left="274" width="140"/>
-		<panel name="drop_target2"
-		     tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." />
-		<panel name="drop_target"
-		     tool_tip="Pour joindre un objet de l&apos;inventaire à la note, faites-le glisser dans la boîte de message. Pour envoyer l&apos;objet avec la note, vous devez avoir la permission de le copier et de le transférer." />
+		<line_editor name="create_inventory_name" width="206"/>
+		<button label="Supprimer pièce-jointe" label_selected="Supprimer pièce-jointe" left="274" name="remove_attachment" width="140"/>
+		<button label="Envoyer notification" label_selected="Envoyer notification" left="274" name="send_notice" width="140"/>
+		<panel name="drop_target2" tool_tip="Pour joindre un objet de l&apos;inventaire à la notification, faites-le glisser dans la boîte de message. Pour envoyer l&apos;objet avec la notification, vous devez avoir la permission de le copier et de le transférer."/>
+		<panel name="drop_target" tool_tip="Pour joindre un objet de l&apos;inventaire à la notification, faites-le glisser dans la boîte de message. Pour envoyer l&apos;objet avec la notification, vous devez avoir la permission de le copier et de le transférer."/>
 	</panel>
-	<panel label="Voir ancienne note" name="panel_view_past_notice">
+	<panel label="Voir ancienne notification" name="panel_view_past_notice">
 		<text name="lbl">
-			Note archivée
+			Notification archivée
 		</text>
 		<text name="lbl2">
-			Pour envoyer une nouvelle note, cliquez sur Créer une note ci-dessus.
+			Pour envoyer une nouvelle notification, cliquez sur Créer une notification ci-dessus.
 		</text>
 		<text name="lbl3">
 			Sujet :
@@ -72,8 +67,7 @@ dossiers.
 		<text name="lbl4">
 			Message :
 		</text>
-		<button label="Ouvrir pièce-jointe" label_selected="Ouvrir pièce-jointe"
-		     name="open_attachment" width="118" />
-		<line_editor left="128" name="view_inventory_name" width="256" />
+		<button label="Ouvrir pièce-jointe" label_selected="Ouvrir pièce-jointe" name="open_attachment" width="118"/>
+		<line_editor left="128" name="view_inventory_name" width="256"/>
 	</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_roles.xml b/indra/newview/skins/default/xui/fr/panel_group_roles.xml
index ab32917..e973b43 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_roles.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Membres et rôles" name="roles_tab">
 	<text name="default_needs_apply_text">
 		Certains changements n&apos;ont pas été appliqués sur ce sous-onglet.
@@ -7,9 +7,9 @@
 		Voulez-vous les appliquer ?
 	</text>
 	<text name="cant_delete_role">
-		Les Rôles &apos;Tout le monde&apos; et &apos;Propriétaires&apos; sont particuliers, et ne peuvent être supprimés.
+		Les Rôles Tout le monde et Propriétaires sont spéciaux et ne peuvent être supprimés.
 	</text>
-	<button label="?" name="help_button" />
+	<button label="?" name="help_button"/>
 	<panel name="members_header">
 		<text name="static">
 			Membres et rôles
@@ -32,7 +32,7 @@ description et le titre du membre.
 			Sélectionnez un rôle ci-dessous pour en connaître les propriétés, les
 membres et les pouvoirs.
 		</text>
-		<text name="role_actions_modifiable" bottom_delta="-28">
+		<text bottom_delta="-28" name="role_actions_modifiable">
 			Vous pouvez aussi assigner des pouvoirs au rôle.
 		</text>
 		<text name="role_actions_not_modifiable">
@@ -48,34 +48,34 @@ membres et les pouvoirs.
 quels membres ces pouvoirs sont assignés.
 		</text>
 	</panel>
-	<tab_container name="roles_tab_container" height="164">
-		<panel label="Membres" name="members_sub_tab" tool_tip="Membres" height="148">
-			<line_editor bottom="127" name="search_text" />
-			<button label="Rechercher" name="search_button" width="75" />
-			<button label="Afficher tout" name="show_all_button" left_delta="80" />
-			<name_list name="member_list" height="104" bottom_delta="-105">
-				<column label="Nom du membre" name="name" />
+	<tab_container height="164" name="roles_tab_container">
+		<panel height="148" label="Membres" name="members_sub_tab" tool_tip="Membres">
+			<line_editor bottom="127" name="search_text"/>
+			<button label="Rechercher" name="search_button" width="75"/>
+			<button label="Afficher tout" left_delta="80" name="show_all_button"/>
+			<name_list bottom_delta="-105" height="104" name="member_list">
+				<column label="Nom du membre" name="name"/>
 				<column label="Terrain donné" name="donated" width="116"/>
 				<column label="Dernière connexion" name="online" width="136"/>
 			</name_list>
-			<button label="Inviter nouvelle personne..." name="member_invite" width="165"/>
-			<button label="Expulser du groupe" name="member_eject" />
+			<button label="Inviter nouveau résident..." name="member_invite" width="165"/>
+			<button label="Expulser du groupe" name="member_eject"/>
 			<text name="help_text">
 				Vous pouvez ajouter ou supprimer les rôles assignés aux membres.
 Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la touche Ctrl enfoncée.
 			</text>
 		</panel>
-		<panel label="Rôles" name="roles_sub_tab" height="148">
-		<line_editor bottom="127" name="search_text" />
+		<panel height="148" label="Rôles" name="roles_sub_tab">
+			<line_editor bottom="127" name="search_text"/>
 			<button label="Rechercher" name="search_button" width="75"/>
-			<button label="Afficher tout" name="show_all_button" left_delta="80"/>
-			<scroll_list name="role_list" height="104" bottom_delta="-104">
-				<column label="Nom du rôle" name="name" />
-				<column label="Titre" name="title" />
-				<column label="Membres" name="members" />
+			<button label="Afficher tout" left_delta="80" name="show_all_button"/>
+			<scroll_list bottom_delta="-104" height="104" name="role_list">
+				<column label="Nom du rôle" name="name"/>
+				<column label="Titre" name="title"/>
+				<column label="Membres" name="members"/>
 			</scroll_list>
-			<button label="Créer un rôle..." name="role_create" />
-			<button label="Supprimer le rôle" name="role_delete" />
+			<button label="Créer un rôle..." name="role_create"/>
+			<button label="Supprimer le rôle" name="role_delete"/>
 			<text name="help_text">
 				Chaque rôle a un titre et une liste des pouvoirs assignés aux membres. Chaque membre peut avoir un ou plusieurs rôles. Un groupe peut avoir jusqu&apos;à 10 rôles, y compris les rôles Tous et Propriétaires.
 			</text>
@@ -83,14 +83,13 @@ Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la to
 				Les rôles Tous et Propriétaires sont spéciaux et ne peuvent pas être supprimés.
 			</string>
 		</panel>
-		<panel label="Pouvoirs" name="actions_sub_tab" height="148">
-			<line_editor bottom="127" name="search_text" />
+		<panel height="148" label="Pouvoirs" name="actions_sub_tab">
+			<line_editor bottom="127" name="search_text"/>
 			<button label="Rechercher" name="search_button" width="75"/>
-			<button label="Afficher tout" name="show_all_button" left_delta="80"/>
-			<scroll_list name="action_list"
-			     tool_tip="Sélectionnez un pouvoir pour en afficher les détails." height="118" bottom_delta="-120">
-				<column label="" name="icon" />
-				<column label="" name="action" />
+			<button label="Afficher tout" left_delta="80" name="show_all_button"/>
+			<scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Sélectionnez un pouvoir pour en afficher les détails.">
+				<column label="" name="icon"/>
+				<column label="" name="action"/>
 			</scroll_list>
 			<text name="help_text">
 				Lorsqu&apos;un membre a des pouvoirs, il peut faire un certain nombre de choses dans le groupe. Il existe un grand nombre de pouvoirs.
@@ -105,13 +104,12 @@ Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la to
 			Pouvoirs attribués
 		</text>
 		<scroll_list name="member_assigned_roles">
-			<column label="" name="checkbox" />
-			<column label="" name="role" />
+			<column label="" name="checkbox"/>
+			<column label="" name="role"/>
 		</scroll_list>
-		<scroll_list name="member_allowed_actions"
-		     tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l&apos;onglet Pouvoirs.">
-			<column label="" name="icon" />
-			<column label="" name="action" />
+		<scroll_list name="member_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l&apos;onglet Pouvoirs.">
+			<column label="" name="icon"/>
+			<column label="" name="action"/>
 		</scroll_list>
 	</panel>
 	<panel name="roles_footer">
@@ -136,17 +134,15 @@ Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la to
 		<text name="static4">
 			Membres assignés
 		</text>
-		<text name="static5"
-		     tool_tip="Une liste des pouvoirs auquel le rôle sélectionné a accès.">
+		<text name="static5" tool_tip="Une liste des pouvoirs auquel le rôle sélectionné a accès.">
 			Pouvoirs attribués
 		</text>
-		<check_box label="Les membres sont &#10;visibles" name="role_visible_in_list"
-		     tool_tip="Définit si les membres de ce rôle sont visibles à partir de l&apos;onglet Général aux personnes en dehors du groupe." />
-		<scroll_list name="role_allowed_actions"
-		     tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l&apos;onglet Pouvoirs.">
-			<column label="" name="icon" />
-			<column label="" name="checkbox" />
-			<column label="" name="action" />
+		<check_box label="Les membres sont 
+visibles" name="role_visible_in_list" tool_tip="Définit si les membres de ce rôle sont visibles à partir de l&apos;onglet Général aux personnes en dehors du groupe."/>
+		<scroll_list name="role_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l&apos;onglet Pouvoirs.">
+			<column label="" name="icon"/>
+			<column label="" name="checkbox"/>
+			<column label="" name="action"/>
 		</scroll_list>
 	</panel>
 	<panel name="actions_footer">
@@ -154,7 +150,7 @@ Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la to
 			Description
 		</text>
 		<text_editor name="action_description">
-			Ce pouvoir permet d&apos; « expulser les membres de ce groupe ». Seul un propriétaire peut expulser un autre propriétaire.
+			Ce pouvoir permet d&apos;expulser des membres du groupe. Seul un propriétaire peut expulser un autre propriétaire.
 		</text_editor>
 		<text name="static2">
 			Rôles avec pouvoirs
diff --git a/indra/newview/skins/default/xui/fr/panel_group_voting.xml b/indra/newview/skins/default/xui/fr/panel_group_voting.xml
index 85a9ba6..ffe96fb 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_voting.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_voting.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Propositions" name="voting_tab">
 	<text name="help_text">
 		Les propositions de groupe permettent d&apos;en savoir plus sur les objectifs du groupe ou son avis sur un sujet donné. Si vous avez les pouvoirs requis, vous pouvez créer des propositions, voter et accéder à d&apos;anciennes propositions.
 	</text>
-	<button label="?" name="help_button" />
+	<button label="?" name="help_button"/>
 	<text name="proposal_header">
 		Propositions du groupe actives
 	</text>
@@ -43,29 +43,24 @@ ou abstenez-vous en cliquant sur M&apos;abstenir.
 	<text name="proposal_lbl">
 		Description de la proposition
 	</text>
-	<button label="Créer une proposition" label_selected="Créer une proposition"
-	     name="btn_proposal" />
-	<button label="Afficher la proposition" label_selected="Afficher la proposition"
-	     name="btn_view_proposal_item" />
-	<button label="Afficher la liste" label_selected="Afficher la liste"
-	     name="btn_view_proposal_list" />
+	<button label="Créer une proposition" label_selected="Créer une proposition" name="btn_proposal"/>
+	<button label="Afficher la proposition" label_selected="Afficher la proposition" name="btn_view_proposal_item"/>
+	<button label="Afficher la liste" label_selected="Afficher la liste" name="btn_view_proposal_list"/>
 	<text name="quorum_lbl">
 		Quorum :
 	</text>
-	<spinner name="quorum"
-	     tool_tip="Nombre total de votants nécessaires pour que les résultats de l&apos;élection soient valides." />
+	<spinner name="quorum" tool_tip="Nombre total de votants nécessaires pour que les résultats de l&apos;élection soient valides."/>
 	<text name="quorum_text">
 		sur [MEMBERS] membres doivent voter.
 	</text>
 	<text name="duration_lbl">
 		Durée :
 	</text>
-	<spinner name="duration" tool_tip="Durée de l&apos;élection (en nombre de jours)." />
+	<spinner name="duration" tool_tip="Durée de l&apos;élection (en nombre de jours)."/>
 	<text name="duration_text">
 		jours
 	</text>
-	<radio_group name="majority" left="296"
-	     tool_tip="Majorité de tous les votes nécessaires pour remporter l&apos;élection.">
+	<radio_group left="296" name="majority" tool_tip="Majorité de tous les votes nécessaires pour remporter l&apos;élection.">
 		Majorité simple
 		Majorité des 2/3
 		Unanimité
@@ -76,28 +71,25 @@ ou abstenez-vous en cliquant sur M&apos;abstenir.
 	<text name="end_lbl">
 		Fin du vote :
 	</text>
-	<button label="Soumettre la proposition" label_selected="Soumettre la proposition"
-	     name="btn_submit" width="150" left="170" />
-	<button label="Annuler" label_selected="Annuler" name="btn_cancel" left_delta="158"/>
-	<button label="Oui" label_selected="Oui" name="btn_yes" width="70" left="183" font="SansSerifSmall" />
-	<button label="Non" label_selected="Non" name="btn_no" width="70" left_delta="77" font="SansSerifSmall"/>
-	<button label="M&apos;abstenir" label_selected="M&apos;abstenir" name="btn_abstain" width="70" left_delta="77" font="SansSerifSmall"/>
-	<text name="txt" left="7">
+	<button label="Soumettre la proposition" label_selected="Soumettre la proposition" left="170" name="btn_submit" width="150"/>
+	<button label="Annuler" label_selected="Annuler" left_delta="158" name="btn_cancel"/>
+	<button font="SansSerifSmall" label="Oui" label_selected="Oui" left="183" name="btn_yes" width="70"/>
+	<button font="SansSerifSmall" label="Non" label_selected="Non" left_delta="77" name="btn_no" width="70"/>
+	<button font="SansSerifSmall" label="M&apos;abstenir" label_selected="M&apos;abstenir" left_delta="77" name="btn_abstain" width="70"/>
+	<text left="7" name="txt">
 		Historique des votes du groupe
 	</text>
-	<text name="instructions" left="7" width="405">
+	<text left="7" name="instructions" width="405">
 		Double-cliquez sur un ancien vote ou sélectionnez-en un pour voir les résultats.
 	</text>
 	<text name="history_list_lbl">
 		Ancien vote                                                      Fin du vote
 	</text>
-	<button label="Afficher la proposition" label_selected="Afficher la proposition"
-	     name="btn_view_history_item" width="160" left="247"/>
+	<button label="Afficher la proposition" label_selected="Afficher la proposition" left="247" name="btn_view_history_item" width="160"/>
 	<text name="vote_text_lbl">
 		Résultats du vote :
 	</text>
-	<button label="Afficher la liste" label_selected="Afficher la liste"
-	     name="btn_view_history_list" />
+	<button label="Afficher la liste" label_selected="Afficher la liste" name="btn_view_history_list"/>
 	<string name="proposals_submit_yes_txt">
 		Soumission du Oui en cours...
 	</string>
@@ -111,7 +103,7 @@ ou abstenez-vous en cliquant sur M&apos;abstenir.
 		Soumission de la nouvelle proposition en cours...
 	</string>
 	<string name="vote_recorded">
-		Votre vote a été reçu.
+		Votre vote a bien été reçu.
 	</string>
 	<string name="vote_previously_recorded">
 		Vous avez déjà voté. Vous ne pouvez voter qu&apos;une fois au cours d&apos;une élection.
diff --git a/indra/newview/skins/default/xui/fr/panel_groups.xml b/indra/newview/skins/default/xui/fr/panel_groups.xml
index dda643e..c64ce9e 100644
--- a/indra/newview/skins/default/xui/fr/panel_groups.xml
+++ b/indra/newview/skins/default/xui/fr/panel_groups.xml
@@ -1,18 +1,16 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="groups">
-	<scroll_list bottom="50" name="group list" />
-	<text name="groupdesc" bottom="16" height="32" width="268">
-		Le groupe dans lequel vous êtes actif en ce moment
-est en gras.
+	<scroll_list bottom="50" name="group list"/>
+	<text bottom="16" height="32" name="groupdesc" width="268">
+		Le groupe actif est en gras.
 	</text>
-	<text name="groupcount" bottom="3" >
-		Vous appartenez à [COUNT] groupes (sur [MAX] maximum).
+	<text bottom="3" name="groupcount">
+		Vous appartenez à [COUNT] groupes ([MAX] max).
 	</text>
-	<button label="IM/Appel" name="IM"
-	     tool_tip="Ouvrir une session de messagerie instantanée" />
-	<button label="Infos" name="Info" />
-	<button label="Activer" name="Activate" />
-	<button label="Quitter" name="Leave" />
-	<button label="Créer..." name="Create" />
-	<button label="Rechercher..." name="Search..." />
+	<button label="IM/Appel" name="IM" tool_tip="Ouvrir une session de messagerie instantanée"/>
+	<button label="Infos" name="Info"/>
+	<button label="Activer" name="Activate"/>
+	<button label="Quitter" name="Leave"/>
+	<button label="Créer..." name="Create"/>
+	<button label="Rechercher..." name="Search..."/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index 3d2fa68..4be1bf8 100644
--- a/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="panel_login">
 	<string name="forgot_password_url">
 		http://secondlife.com/account/request.php
@@ -17,7 +17,7 @@
 	</text>
 	<combo_box name="start_location_combo">
 		<combo_item name="MyHome">
-			Mon domicile
+			Domicile
 		</combo_item>
 		<combo_item name="MyLastLocation">
 			Dernier emplacement
@@ -29,16 +29,14 @@
 			&lt;Nom de la région&gt;
 		</combo_item>
 	</combo_box>
-	<check_box label="Enregistrer le mot de passe" name="remember_check" />
+	<check_box label="Enregistrer le mot de passe" name="remember_check"/>
 	<text name="full_screen_text">
 		Le plein écran sera activé après identification.
 	</text>
-	<button label="Nouveau Compte..." label_selected="Nouveau Compte..."
-	     name="new_account_btn" />
-	<button label="Me connecter" label_selected="Me connecter" name="connect_btn" />
-	<button label="Préférences..." label_selected="Préférences..."
-	     name="preferences_btn" />
-	<button label="Quitter" label_selected="Quitter" name="quit_btn" />
+	<button label="Nouveau Compte..." label_selected="Nouveau Compte..." name="new_account_btn"/>
+	<button label="Me connecter" label_selected="Me connecter" name="connect_btn"/>
+	<button label="Préférences..." label_selected="Préférences..." name="preferences_btn"/>
+	<button label="Quitter" label_selected="Quitter" name="quit_btn"/>
 	<text name="version_text">
 		1.23.4 (5)
 	</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_master_volume.xml b/indra/newview/skins/default/xui/fr/panel_master_volume.xml
index 95486f1..cfba25a 100644
--- a/indra/newview/skins/default/xui/fr/panel_master_volume.xml
+++ b/indra/newview/skins/default/xui/fr/panel_master_volume.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="master_volume">
-	<button name="volume"
-	     tool_tip="Contrôle du volume master, cliquez pour ouvrir les paramètres" />
-	<volume_slider name="volume_slider" tool_tip="Réglez le volume à l&apos;aide de ce curseur." />
+	<button name="volume" tool_tip="Contrôle du volume principal, cliquez pour ouvrir les paramètres"/>
+	<volume_slider name="volume_slider" tool_tip="Réglez le volume à l&apos;aide de ce curseur."/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_media_controls.xml b/indra/newview/skins/default/xui/fr/panel_media_controls.xml
index 4fa8769..d13aaee 100644
--- a/indra/newview/skins/default/xui/fr/panel_media_controls.xml
+++ b/indra/newview/skins/default/xui/fr/panel_media_controls.xml
@@ -1,16 +1,16 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="media_controls">
-	<icon name="music_icon" tool_tip="Jouer/pauser le flux musical" />
-	<button name="music_play" tool_tip="Jouer/pauser le flux musical" />
-	<button name="music_pause" tool_tip="Pauser le flux musical" />
-	<button name="music_stop" tool_tip="Arrêter le flux musical" />
-	<icon name="media_icon" tool_tip="Jouer/pauser le flux musical" />
-	<button name="media_play" tool_tip="Jouer/pauser le flux musical" />
-	<button name="media_pause" tool_tip="Pauser le flux de média" />
-	<button name="media_stop" tool_tip="Arrêter le flux de média" />
-	<volume_slider name="volume_slider" tool_tip="Volume master" />
-	<button name="mute_master" tool_tip="Master muet" />
-	<button name="expand" tool_tip="Ajuster les niveaux de volume individuels" />
+	<icon name="music_icon" tool_tip="Jouer/pauser le flux musical"/>
+	<button name="music_play" tool_tip="Jouer/pauser le flux musical"/>
+	<button name="music_pause" tool_tip="Pauser le flux musical"/>
+	<button name="music_stop" tool_tip="Arrêter le flux musical"/>
+	<icon name="media_icon" tool_tip="Jouer/pauser le flux musical"/>
+	<button name="media_play" tool_tip="Jouer/pauser le flux musical"/>
+	<button name="media_pause" tool_tip="Pauser le flux de média"/>
+	<button name="media_stop" tool_tip="Arrêter le flux de média"/>
+	<volume_slider name="volume_slider" tool_tip="Volume principal"/>
+	<button name="mute_master" tool_tip="Coupez le volume principal"/>
+	<button name="expand" tool_tip="Ajustez les niveaux de volume individuels"/>
 	<string name="play_label">
 		Jouer
 	</string>
diff --git a/indra/newview/skins/default/xui/fr/panel_media_remote.xml b/indra/newview/skins/default/xui/fr/panel_media_remote.xml
index 50ef48d..3e86085 100644
--- a/indra/newview/skins/default/xui/fr/panel_media_remote.xml
+++ b/indra/newview/skins/default/xui/fr/panel_media_remote.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="music_remote">
-	<text type="string" length="1" name="text">
+	<text length="1" name="text" type="string">
 		Vidéo
 	</text>
-	<button label="" label_selected="" name="stop_btn" tool_tip="Arrêter le media" />
-	<button label="" label_selected="" name="play_btn" tool_tip="Lire le flux" />
-	<button label="" label_selected="" name="pause_btn" tool_tip="Suspendre le flux" />
-	<volume_slider name="volume_slider" tool_tip="Réglez le volume à l&apos;aide du curseur" />
+	<button label="" label_selected="" name="stop_btn" tool_tip="Arrêter le média"/>
+	<button label="" label_selected="" name="play_btn" tool_tip="Lire le flux"/>
+	<button label="" label_selected="" name="pause_btn" tool_tip="Suspendre le flux"/>
+	<volume_slider name="volume_slider" tool_tip="Réglez le volume à l&apos;aide du curseur"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_media_remote_expanded.xml b/indra/newview/skins/default/xui/fr/panel_media_remote_expanded.xml
index f2cac09..33afb1c 100644
--- a/indra/newview/skins/default/xui/fr/panel_media_remote_expanded.xml
+++ b/indra/newview/skins/default/xui/fr/panel_media_remote_expanded.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="media_remote">
-	<panel label="Audio et Vidéo" name="Volume Panel" />
+	<panel label="Audio et Vidéo" name="Volume Panel"/>
 	<string name="play_label">
 		Jouer
 	</string>
@@ -17,7 +17,7 @@
 		(URL cachée par le propriétaire de la parcelle)
 	</string>
 	<string name="media_icon_tooltip_web">
-		Il y a du contenu  web à cet endroit. Cliquez sur Jouer pour afficher le contenu web.
+		Il y a du contenu web à cet endroit. Cliquez sur Jouer pour afficher le contenu web.
 	</string>
 	<string name="media_icon_tooltip_movie">
 		Il y a du contenu vidéo à cet endroit. Cliquez sur Jouer pour lire la vidéo.
diff --git a/indra/newview/skins/default/xui/fr/panel_overlaybar.xml b/indra/newview/skins/default/xui/fr/panel_overlaybar.xml
index 11e8bff..dab1f79 100644
--- a/indra/newview/skins/default/xui/fr/panel_overlaybar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_overlaybar.xml
@@ -1,18 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="overlay">
 	<layout_stack name="overlay_layout_panel">
 		<layout_panel name="main_panel">
 			<layout_stack name="chatbar_and_buttons">
 				<layout_panel name="state_buttons">
-					<button label="IM reçus" label_selected="IM reçus" name="IM Received"
-					     tool_tip="Vous avez reçu un message instantané. Cliquez pour afficher les IM." />
-					<button label="Disponible"
-					     label_selected="Disponible" name="Set Not Busy"
-					     tool_tip="Le chat et les IM ne s&apos;affichent pas. Cliquez ici pour ne pas apparaître occupé(e)." />
-					<button label="Vue subjective" label_selected="Vue subjective" name="Mouselook"
-					     tool_tip="Utilisez la souris pour diriger votre vue. Si vous avez un pistolet, vous pouvez tirer en cliquant." />
-					<button label="Me lever" label_selected="Me lever" name="Stand Up"
-					     tool_tip="Cliquez ici pour vous lever." />
+					<button label="IM reçus" label_selected="IM reçus" name="IM Received" tool_tip="Vous avez reçu des messages instantanés. Cliquez pour afficher les IM."/>
+					<button label="Disponible" label_selected="Disponible" name="Set Not Busy" tool_tip="Le chat et les IM ne s&apos;affichent pas. Cliquez ici pour ne plus être en mode occupé(e)."/>
+					<button label="Vue subjective" label_selected="Vue subjective" name="Mouselook" tool_tip="Utilisez la souris pour diriger votre vue. Si vous avez un pistolet, vous pouvez tirer en cliquant."/>
+					<button label="Me lever" label_selected="Me lever" name="Stand Up" tool_tip="Cliquez ici pour vous lever."/>
 				</layout_panel>
 			</layout_stack>
 		</layout_panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_place.xml b/indra/newview/skins/default/xui/fr/panel_place.xml
index 1df6495..d2f21a7 100644
--- a/indra/newview/skins/default/xui/fr/panel_place.xml
+++ b/indra/newview/skins/default/xui/fr/panel_place.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="Place" title="Emplacement">
 	<text name="name_label">
 		Nom :
@@ -9,14 +9,14 @@
 	<text name="information_label">
 		Informations :
 	</text>
-	<text left="103" name="info_editor" width="338" />
+	<text left="103" name="info_editor" width="338"/>
 	<text name="location_label">
 		Emplacement :
 	</text>
-	<text left="103" name="location_editor" width="338" />
-	<button label="Téléporter" name="teleport_btn" />
-	<button label="Voir sur la carte" name="map_btn" />
-	<button label="Enchères..." name="auction_btn" />
+	<text left="103" name="location_editor" width="338"/>
+	<button label="Téléporter" name="teleport_btn"/>
+	<button label="Voir sur la carte" name="map_btn"/>
+	<button label="Enchères..." name="auction_btn"/>
 	<string name="traffic_text">
 		Trafic : [TRAFFIC]
 	</string>
@@ -24,18 +24,18 @@
 		Surface : [AREA] m²
 	</string>
 	<string name="forsale_text">
-		En vente pour [PRICE] $L
+		En vente pour [PRICE] L$
 	</string>
 	<string name="auction_text">
 		Code de l&apos;enchère [ID].
 	</string>
 	<string name="server_update_text">
-		Les informations sur l&apos;emplacement ne sont pas disponibles sans mise à jour du serveur.
+		Les informations sur le lieu ne sont pas disponibles sans mise à jour du serveur.
 	</string>
 	<string name="server_error_text">
-		Aucune information sur cet emplacement n&apos;est disponible actuellement, veuillez réessayer ultérieurement.
+		Aucune information sur ce lieu n&apos;est disponible actuellement, veuillez réessayer ultérieurement.
 	</string>
 	<string name="server_forbidden_text">
-		Les informations sur cet emplacement ne sont pas disponibles car l&apos;accès y est restreint. Veuillez vérifier vos permissions avec le propriétaire de la parcelle.
+		Les informations sur ce lieu ne sont pas disponibles car l&apos;accès y est restreint. Veuillez vérifier vos permissions avec le propriétaire de la parcelle.
 	</string>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_place_small.xml b/indra/newview/skins/default/xui/fr/panel_place_small.xml
index 1df6495..50b8c8b 100644
--- a/indra/newview/skins/default/xui/fr/panel_place_small.xml
+++ b/indra/newview/skins/default/xui/fr/panel_place_small.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="Place" title="Emplacement">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Place" title="Lieu">
 	<text name="name_label">
 		Nom :
 	</text>
@@ -9,14 +9,14 @@
 	<text name="information_label">
 		Informations :
 	</text>
-	<text left="103" name="info_editor" width="338" />
+	<text left="103" name="info_editor" width="338"/>
 	<text name="location_label">
-		Emplacement :
+		Lieu :
 	</text>
-	<text left="103" name="location_editor" width="338" />
-	<button label="Téléporter" name="teleport_btn" />
-	<button label="Voir sur la carte" name="map_btn" />
-	<button label="Enchères..." name="auction_btn" />
+	<text left="103" name="location_editor" width="338"/>
+	<button label="Téléporter" name="teleport_btn"/>
+	<button label="Voir sur la carte" name="map_btn"/>
+	<button label="Enchères..." name="auction_btn"/>
 	<string name="traffic_text">
 		Trafic : [TRAFFIC]
 	</string>
@@ -24,18 +24,18 @@
 		Surface : [AREA] m²
 	</string>
 	<string name="forsale_text">
-		En vente pour [PRICE] $L
+		En vente pour [PRICE] L$
 	</string>
 	<string name="auction_text">
 		Code de l&apos;enchère [ID].
 	</string>
 	<string name="server_update_text">
-		Les informations sur l&apos;emplacement ne sont pas disponibles sans mise à jour du serveur.
+		Les informations sur le lieu ne sont pas disponibles sans mise à jour du serveur.
 	</string>
 	<string name="server_error_text">
-		Aucune information sur cet emplacement n&apos;est disponible actuellement, veuillez réessayer ultérieurement.
+		Aucune information sur ce lieu n&apos;est disponible actuellement, veuillez réessayer ultérieurement.
 	</string>
 	<string name="server_forbidden_text">
-		Les informations sur cet emplacement ne sont pas disponibles car l&apos;accès y est restreint. Veuillez vérifier vos permissions avec le propriétaire de la parcelle.
+		Les informations sur ce lieu ne sont pas disponibles car l&apos;accès y est restreint. Veuillez vérifier vos permissions avec le propriétaire de la parcelle.
 	</string>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_audio.xml b/indra/newview/skins/default/xui/fr/panel_preferences_audio.xml
index 8298b6e..eb1ce2f 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_audio.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_audio.xml
@@ -1,29 +1,26 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Audio et Vidéo" name="Media panel">
-	<text type="string" length="1" name="muting_text">
+	<text length="1" name="muting_text" type="string">
 		Volume :
 	</text>
-	<panel left="159" name="Volume Panel" width="249" />
-	<check_box label="Désactiver le son" name="disable audio" />
-	<text name="streaming_prefs_text" width="145" bottom="-195" >
-		Préférences de flux continu :
+	<panel left="159" name="Volume Panel" width="249"/>
+	<check_box label="Couper le son" name="disable audio"/>
+	<text bottom="-195" name="streaming_prefs_text" width="145">
+		Préférences média :
 	</text>
 	<text name="audio_prefs_text">
 		Préférences audio :
 	</text>
-	<panel label="Volume" name="Volume Panel" />
-	<check_box label="Désactiver le son lorsque la fenêtre est minimisée"
-	     name="mute_when_minimized"  left="159" />
-	<check_box
-	     label="Jouer des flux musicaux quand cela est possible&#10;(gourmand en bande passante)"
-	     name="streaming_music" left="159" bottom="-200" height="32" />
-	<check_box
-	     label="Jouer des flux médias quand cela est possible&#10;(gourmand en bande passante)"
-	     name="streaming_video" left="159" bottom_delta="-32" height="32" />
-	<check_box label="Lire automatiquement le média" name="auto_streaming_video" left="179" bottom_delta="-32" />
-	<slider label="Effet Doppler" name="Doppler Effect" left="165" label_width="115" />
-	<slider label="Facteur d&apos;éloignement" name="Distance Factor" left="165" label_width="115" />
-	<slider label="Facteur d&apos;atténuation" name="Rolloff Factor" left="165" label_width="115" />
-	<spinner label="Alerte dépenses" name="L$ Change Threshold" left="165" />
-	<spinner label="Alerte santé" name="Health Change Threshold" left="165" />
+	<panel label="Volume" name="Volume Panel"/>
+	<check_box label="Couper le son lorsque la fenêtre est minimisée" left="159" name="mute_when_minimized"/>
+	<check_box bottom="-200" height="32" label="Jouer la musique disponible
+(consommateur en bande passante)" left="159" name="streaming_music"/>
+	<check_box bottom_delta="-32" height="32" label="Jouer le média disponible
+(consommateur en bande passante)" left="159" name="streaming_video"/>
+	<check_box bottom_delta="-32" label="Lire automatiquement le média" left="179" name="auto_streaming_video"/>
+	<slider label="Effet Doppler" label_width="115" left="165" name="Doppler Effect"/>
+	<slider label="Facteur d&apos;éloignement" label_width="115" left="165" name="Distance Factor"/>
+	<slider label="Facteur d&apos;atténuation" label_width="115" left="165" name="Rolloff Factor"/>
+	<spinner label="Alerte L$" left="165" name="L$ Change Threshold"/>
+	<spinner label="Alerte santé" left="165" name="Health Change Threshold"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
index ddd7f59..55faeb5 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
@@ -1,66 +1,59 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Chat écrit" name="chat">
-	<text type="string" length="1" name="text_box">
+	<text length="1" name="text_box" type="string">
 		Taille de la police 
 du chat :
 	</text>
-	<radio_group name="chat font size">
-		<radio_item type="string" length="1" name="radio">
+	<radio_group name="chat_font_size">
+		<radio_item length="1" name="radio" type="string">
 			Petite
 		</radio_item>
-		<radio_item type="string" length="1" name="radio2">
+		<radio_item length="1" name="radio2" type="string">
 			Moyenne
 		</radio_item>
-		<radio_item type="string" length="1" name="radio3">
+		<radio_item length="1" name="radio3" type="string">
 			Grande
 		</radio_item>
 	</radio_group>
-	<text type="string" length="1" name="text_box2">
+	<text length="1" name="text_box2" type="string">
 		Couleur du chat :
 	</text>
-	<color_swatch label="Vous" name="user" />
-	<color_swatch label="Les autres" name="agent" width="60" />
-	<color_swatch label="IM" left_delta="64" name="im" />
-	<color_swatch label="Système" name="system" />
-	<color_swatch label="Erreurs" name="script_error" />
-	<color_swatch label="Objets" name="objects" />
-	<color_swatch label="Propriétaire" name="owner" width="60" />
-	<color_swatch label="Bulle" left_delta="64" name="background" />
-	<color_swatch label="URL" name="links" />
-	<text type="string" length="1" name="text_box3">
+	<color_swatch label="Vous" name="user"/>
+	<color_swatch label="Les autres" name="agent" width="60"/>
+	<color_swatch label="IM" left_delta="64" name="im"/>
+	<color_swatch label="Système" name="system"/>
+	<color_swatch label="Erreurs" name="script_error"/>
+	<color_swatch label="Objets" name="objects"/>
+	<color_swatch label="Propriétaire" name="owner" width="60"/>
+	<color_swatch label="Bulle" left_delta="64" name="background"/>
+	<color_swatch label="URL" name="links"/>
+	<text length="1" name="text_box3" type="string">
 		Console du chat :
 	</text>
-	<spinner label="Effacer le texte après" label_width="112" name="fade_chat_time"
-	     width="162" />
-	<text type="string" length="1" left="313" name="text_box4">
+	<spinner label="Effacer le texte après" label_width="112" name="fade_chat_time" width="162"/>
+	<text left="313" length="1" name="text_box4" type="string">
 		s
 	</text>
-	<spinner left="335" name="max_chat_count" />
-	<text type="string" length="1" left="397" name="text_box5" width="74">
-		(nb de lignes)
+	<spinner left="335" name="max_chat_count"/>
+	<text left="397" length="1" name="text_box5" type="string" width="74">
+		lignes
 	</text>
-	<slider label="Opacité" name="console_opacity" />
-	<text type="string" length="1" name="text_box6">
+	<slider label="Opacité" name="console_opacity"/>
+	<text length="1" name="text_box6" type="string">
 		Options du chat :
 	</text>
-	<check_box label="Utiliser la largeur du plein écran (redémarrage requis)"
-	     name="chat_full_width_check" />
-	<check_box label="Fermer le chat après avoir appuyé sur Entrée"
-	     name="close_chat_on_return_check" />
-	<check_box label="Faire bouger l&apos;avatar avec les touches de direction"
-	     name="arrow_keys_move_avatar_check" />
-	<check_box label="Afficher les marques temporelles dans le chat local"
-	     name="show_timestamps_check" />
-	<check_box label="Montrer lorsque vous écrivez pendant la discussion"
-	     name="play_typing_animation" />
-	<text type="string" length="1" name="text_box7">
+	<check_box label="Utiliser la largeur de l&apos;écran (redémarrage requis)" name="chat_full_width_check"/>
+	<check_box label="Fermer le chat après avoir appuyé sur Entrée" name="close_chat_on_return_check"/>
+	<check_box label="Faire bouger l&apos;avatar avec les touches de direction" name="arrow_keys_move_avatar_check"/>
+	<check_box label="Afficher les heures dans le chat local" name="show_timestamps_check"/>
+	<check_box label="Jouer l&apos;animation clavier quand vous écrivez" name="play_typing_animation"/>
+	<text length="1" name="text_box7" type="string">
 		Bulles de chat  :
 	</text>
-	<check_box label="Afficher les bulles de chat" name="bubble_text_chat" />
-	<slider label="Opacité" name="bubble_chat_opacity" />
-	<text type="string" length="1" name="text_box8">
+	<check_box label="Afficher les bulles de chat" name="bubble_text_chat"/>
+	<slider label="Opacité" name="bubble_chat_opacity"/>
+	<text length="1" name="text_box8" type="string">
 		Erreurs de script :
 	</text>
-	<check_box label="Afficher les erreurs et avertissements comme chat ordinaire"
-	     name="script_errors_as_chat" />
+	<check_box label="Afficher les erreurs et avertissements dans le chat" name="script_errors_as_chat"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
index 34d3bda..04a7172 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
@@ -1,15 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Général" name="general_panel">
 	<combo_box name="location_combobox" width="166">
 		<combo_item name="MyHome">
-			Mon domicile
+			Domicile
 		</combo_item>
 		<combo_item name="MyLastLocation">
-			Mon dernier emplacement
+			Dernier emplacement
 		</combo_item>
 	</combo_box>
-	<check_box label="Afficher le lieu de départ sur l&apos;écran de connexion"
-	     name="show_location_checkbox" />
+	<check_box label="Afficher le lieu de départ sur l&apos;écran de connexion" name="show_location_checkbox"/>
 	<combo_box name="fade_out_combobox" width="166">
 		<combo_item name="Never">
 			Jamais
@@ -21,79 +20,68 @@
 			Toujours
 		</combo_item>
 	</combo_box>
-	<check_box label="Masquer mon nom sur mon écran" name="show_my_name_checkbox" />
+	<check_box label="Masquer mon nom sur mon écran" name="show_my_name_checkbox"/>
 	<text name="group_titles_textbox">
 		Titres de groupe :
 	</text>
-	<check_box label="Masquer tous les titres de groupe"
-	     name="show_all_title_checkbox" />
-	<check_box label="Masquer mon titre de groupe" name="show_my_title_checkbox" />
-	<check_box label="Nom de l&apos;avatar en petit" name="small_avatar_names_checkbox" />
-	<check_box label="M&apos;avertir lorsque mes amis se connectent"
-	     name="friends_online_notify_checkbox" />
+	<check_box label="Masquer tous les titres de groupe" name="show_all_title_checkbox"/>
+	<check_box label="Masquer mon titre de groupe" name="show_my_title_checkbox"/>
+	<check_box label="Nom de l&apos;avatar en petit" name="small_avatar_names_checkbox"/>
+	<check_box label="M&apos;avertir lorsque mes amis se connectent" name="friends_online_notify_checkbox"/>
 	<text name="UI Size:">
 		Taille de l&apos;interface :
 	</text>
-	<check_box label="Utiliser une échelle indépendante de la résolution"
-	     name="ui_auto_scale" />
-	<check_box label="Faire pivoter la mini-carte" name="rotate_mini_map_checkbox" />
-	<check_box label="M&apos;avertir lorsque je dépense ou reçois des dollars Linden ($L)"
-	     name="notify_money_change_checkbox" />
-	<check_box label="Détecter carte graphique au prochain démarrage"
-	     name="probe_hardware_checkbox"
-	     tool_tip="Second Life configure automatiquement certains réglages de la carte graphique d&apos;après votre configuration matérielle. Nous vous recommandons d&apos;effectuer la détection à chaque nouvelle installation de matériel." />
-	<check_box label="Utiliser le sélecteur de couleur par défaut"
-	     name="use_system_color_picker_checkbox"
-	     tool_tip="Utiliser le sélecteur de couleur par défaut au lieu de celui intégré à Second Life." />
-	<check_box label="Afficher la boîte de recherche en haut à droite de l&apos;écran"
-	     name="show_search_panel"
-	     tool_tip="Affiche la boîte de recherche incorporée." />
-	<text type="string" length="1" name="start_location_textbox">
+	<check_box label="Utiliser une échelle indépendante de la résolution" name="ui_auto_scale"/>
+	<check_box label="Pivoter la mini-carte" name="rotate_mini_map_checkbox"/>
+	<check_box label="M&apos;avertir lorsque je dépense ou reçois des L$" name="notify_money_change_checkbox"/>
+	<check_box label="Détecter carte graphique au prochain démarrage" name="probe_hardware_checkbox" tool_tip="Second Life configure automatiquement certains réglages de la carte graphique d&apos;après votre configuration matérielle. Nous vous recommandons d&apos;effectuer la détection à chaque nouvelle installation de matériel."/>
+	<check_box label="Utiliser le sélecteur de couleur par défaut" name="use_system_color_picker_checkbox" tool_tip="Utiliser le sélecteur de couleur par défaut au lieu de celui intégré à Second Life."/>
+	<check_box label="Afficher la boîte de recherche en haut à droite de l&apos;écran" name="show_search_panel" tool_tip="Affiche la boîte de recherche incorporée."/>
+	<text length="1" name="start_location_textbox" type="string">
 		Lieu de départ :
 	</text>
-	<text type="string" length="1" name="show_names_textbox">
+	<text length="1" name="show_names_textbox" type="string">
 		Afficher les noms :
 	</text>
-	<text type="string" length="1" name="effects_color_textbox">
-		Couleur de mes effets :
+	<text length="1" name="effects_color_textbox" type="string">
+		Couleur du faisceau de sélection :
 	</text>
-	<text type="string" length="1" name="seconds_textbox">
+	<text length="1" name="seconds_textbox" type="string">
 		secondes
 	</text>
-	<text type="string" length="1" name="crash_report_textbox">
+	<text length="1" name="crash_report_textbox" type="string">
 		Rapports de crash :
 	</text>
-	<text type="string" length="1" name="language_textbox">
+	<text length="1" name="language_textbox" type="string">
 		Langue :
 	</text>
-	<text type="string" length="1" left_delta="313" name="language_textbox2">
-		(nécessite un redémarrage)
+	<text left_delta="313" length="1" name="language_textbox2" type="string">
+		(redémarrage requis)
 	</text>
 	<radio_group name="fade_out_radio">
-		<radio_item type="string" length="1" name="Never">
+		<radio_item length="1" name="Never" type="string">
 			Jamais
 		</radio_item>
-		<radio_item type="string" length="1" name="Temporarily">
+		<radio_item length="1" name="Temporarily" type="string">
 			Temporairement
 		</radio_item>
-		<radio_item type="string" length="1" name="Always">
+		<radio_item length="1" name="Always" type="string">
 			Toujours
 		</radio_item>
 	</radio_group>
-	<color_swatch label="" name="effect_color_swatch"
-	     tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" />
-	<spinner label="Absent(e) après :" name="afk_timeout_spinner" />
+	<color_swatch label="" name="effect_color_swatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/>
+	<spinner label="Absent(e) après :" name="afk_timeout_spinner"/>
 	<text name="region_name_prompt">
 		&lt;Saisissez le nom de la région&gt;
 	</text>
 	<combo_box name="crash_behavior_combobox" width="166">
-		<combo_item type="string" length="1" name="Askbeforesending">
+		<combo_item length="1" name="Askbeforesending" type="string">
 			Demander avant d&apos;envoyer
 		</combo_item>
-		<combo_item type="string" length="1" name="Alwayssend">
+		<combo_item length="1" name="Alwayssend" type="string">
 			Toujours envoyer
 		</combo_item>
-		<combo_item type="string" length="1" name="Neversend">
+		<combo_item length="1" name="Neversend" type="string">
 			Ne jamais envoyer
 		</combo_item>
 	</combo_box>
@@ -101,22 +89,22 @@
 		<combo_item name="System Default Language">
 			Choix par défaut
 		</combo_item>
-		<combo_item type="string" length="1" name="English">
+		<combo_item length="1" name="English" type="string">
 			Anglais
 		</combo_item>
-		<combo_item type="string" length="1" name="Deutsch(German)">
+		<combo_item length="1" name="Deutsch(German)" type="string">
 			Deutsch (Allemand) - Bêta
 		</combo_item>
 		<combo_item name="French">
 			Français - Bêta
 		</combo_item>
-		<combo_item type="string" length="1" name="(Japanese)">
+		<combo_item length="1" name="(Japanese)" type="string">
 			日本語 (Japonais) - Bêta
 		</combo_item>
-		<combo_item type="string" length="1" name="(Korean)">
+		<combo_item length="1" name="(Korean)" type="string">
 			한국어 (Coréen) - Bêta
 		</combo_item>
-		<combo_item type="string" length="1" name="Chinese">
+		<combo_item length="1" name="Chinese" type="string">
 			汉语/漢語 (Chinois) - Bêta
 		</combo_item>
 		<combo_item name="Portugese">
@@ -126,6 +114,5 @@
 			Español (Espagnol) - Bêta
 		</combo_item>
 	</combo_box>
-	<check_box label="Partager la langue avec les objets" name="language_is_public"
-	     tool_tip="Cette option permet de faire connaître aux objets du Monde votre langue favorite." />
+	<check_box label="Partager la langue avec les objets" name="language_is_public" tool_tip="Cette option permet de faire connaître aux objets du Monde votre langue favorite."/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
index bf2b336..00e4cae 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Graphiques" name="Display panel">
-	<button label="?" name="GraphicsPreferencesHelpButton" />
+	<button label="?" name="GraphicsPreferencesHelpButton"/>
 	<text_editor bottom="-56" height="40" left="25" name="FullScreenInfo" width="460">
-		Si cette option n&apos;est pas cochée, le visualisateur prend tout l&apos;écran lorsque vous êtes connecté(e).
+		Cochez cette option pour que le client s&apos;affiche en plein écran.
 	</text_editor>
 	<text name="WindowSizeLabel">
 		Taille de la fenêtre :
@@ -31,42 +31,42 @@
 		Rapport hauteur/largeur :
 	</text>
 	<combo_box name="aspect_ratio" tool_tip="largeur/hauteur">
-		<combo_item type="string" length="1" name="4:3(StandardCRT)">
+		<combo_item length="1" name="4:3(StandardCRT)" type="string">
 			4:3 (Standard CRT)
 		</combo_item>
-		<combo_item type="string" length="1" name="5:4(1280x1024LCD)">
+		<combo_item length="1" name="5:4(1280x1024LCD)" type="string">
 			5:4 (1280 x 1024 LCD)
 		</combo_item>
 		<combo_item name="8:5(Widescreen)">
-			8 : 5 (écran large)
+			8:5 (écran large)
 		</combo_item>
-		<combo_item type="string" length="1" name="16:9(Widescreen)">
+		<combo_item length="1" name="16:9(Widescreen)" type="string">
 			16:9 (plein écran)
 		</combo_item>
 	</combo_box>
-	<text type="string" length="1" name="text">
+	<text length="1" name="text" type="string">
 		Résolution d&apos;affichage :
 	</text>
-	<text type="string" length="1" name="Fullscreen Aspect Ratio:">
+	<text length="1" name="Fullscreen Aspect Ratio:" type="string">
 		Format de plein écran :
 	</text>
-	<text type="string" length="1" name="(width / height)">
+	<text length="1" name="(width / height)" type="string">
 		(largeur / hauteur)
 	</text>
-	<text type="string" length="1" name="UI Size:">
+	<text length="1" name="UI Size:" type="string">
 		Taille de l&apos;IU :
 	</text>
-	<text type="string" length="1" name="(meters, lower is faster)">
+	<text length="1" name="(meters, lower is faster)" type="string">
 		(mètres, moins = plus rapide)
 	</text>
-	<text type="string" length="1" name="text2">
+	<text length="1" name="text2" type="string">
 		Options d&apos;affichage :
 	</text>
-	<check_box label="Lancer Second Life dans une fenêtre" name="windowed mode" />
-	<check_box label="Auto-détection du ratio" left="350" name="aspect_auto_detect" />
-	<check_box label="Utiliser échelle de résolution indépendante" name="ui_auto_scale" />
-	<check_box label="Montrer l&apos;avatar en mode Mouselook" name="avfp" />
-	<spinner label="Draw Distance :" name="draw_distance" />
+	<check_box label="Lancer Second Life en mode fenêtré" name="windowed mode"/>
+	<check_box label="Auto-détection du ratio" left="350" name="aspect_auto_detect"/>
+	<check_box label="Utiliser échelle de résolution indépendante" name="ui_auto_scale"/>
+	<check_box label="Montrer l&apos;avatar en vue subjective" name="avfp"/>
+	<spinner label="Distance d&apos;affichage :" name="draw_distance"/>
 	<text name="HigherText">
 		Qualité et
 	</text>
@@ -91,28 +91,27 @@
 	<text bottom="-86" left="325" name="HigherText2">
 		Plus élevée
 	</text>
-	<text name="QualityText2" visible="false" />
-	<check_box label="Personnaliser" left="395" name="CustomSettings" />
+	<text name="QualityText2" visible="false"/>
+	<check_box label="Personnaliser" left="395" name="CustomSettings"/>
 	<text name="ShadersText">
-		Shaders :
+		Effets :
 	</text>
-	<check_box label="Placage de relief et brillance" name="BumpShiny" />
-	<check_box label="Shaders de base" name="BasicShaders"
-	     tool_tip="Désactiver cette option peut empêcher certains drivers de cartes graphiques de planter." />
-	<check_box label="Shaders atmosphériques" name="WindLightUseAtmosShaders" />
-	<check_box label="Reflets de l&apos;eau" name="Reflections" />
+	<check_box label="Placage de relief et brillance" name="BumpShiny"/>
+	<check_box label="Effets de base" name="BasicShaders" tool_tip="Désactiver cette option peut empêcher certains drivers de cartes graphiques de planter."/>
+	<check_box label="Effets atmosphériques" name="WindLightUseAtmosShaders"/>
+	<check_box label="Reflets de l&apos;eau" name="Reflections"/>
 	<text name="ReflectionDetailText">
-		Détails des reflets :
+		Objets reflétés :
 	</text>
 	<radio_group name="ReflectionDetailRadio">
 		<radio_item name="0">
 			Terrain et Arbres
 		</radio_item>
 		<radio_item name="1">
-			Tous les objets statiques
+			Objets statiques
 		</radio_item>
 		<radio_item name="2">
-			Tous les objets et avatars
+			Objets et avatars
 		</radio_item>
 		<radio_item name="3">
 			Tout
@@ -121,27 +120,27 @@
 	<text name="AvatarRenderingText">
 		Rendu de l&apos;avatar :
 	</text>
-	<check_box label="Avatars éloignés en 2D" name="AvatarImpostors" />
-	<check_box label="Rendu matériel des skins" name="AvatarVertexProgram" />
-	<check_box label="Habit de l&apos;avatar" name="AvatarCloth" />
+	<check_box label="Avatars éloignés en 2D" name="AvatarImpostors"/>
+	<check_box label="Accélération du rendu" name="AvatarVertexProgram"/>
+	<check_box label="Mouvement des habits" name="AvatarCloth"/>
 	<text name="DrawDistanceMeterText1">
 		m
 	</text>
 	<text name="DrawDistanceMeterText2">
 		m
 	</text>
-	<slider label="Distance d&apos;affichage :" name="DrawDistance" />
-	<slider label="Nombre de particules max. :" label_width="143" name="MaxParticleCount" />
-	<slider label="Qualité post-traitement :" name="RenderPostProcess" />
+	<slider label="Limite d&apos;affichage :" name="DrawDistance"/>
+	<slider label="Nombre de particules max. :" label_width="143" name="MaxParticleCount"/>
+	<slider label="Qualité post-traitement :" name="RenderPostProcess"/>
 	<text name="MeshDetailText">
-		Détails du maillage :
-	</text>
-	<slider label="  Objets :" name="ObjectMeshDetail" />
-	<slider label="  Flexiprims :" name="FlexibleMeshDetail" />
-	<slider label="  Arbres :" name="TreeMeshDetail" />
-	<slider label="  Avatars :" name="AvatarMeshDetail" />
-	<slider label="  Terrain :" name="TerrainMeshDetail" />
-	<slider label="  Ciel :" name="SkyMeshDetail" />
+		Détails des rendus :
+	</text>
+	<slider label="  Objets :" name="ObjectMeshDetail"/>
+	<slider label="  Flexiprims :" name="FlexibleMeshDetail"/>
+	<slider label="  Arbres :" name="TreeMeshDetail"/>
+	<slider label="  Avatars :" name="AvatarMeshDetail"/>
+	<slider label="Relief :" name="TerrainMeshDetail"/>
+	<slider label="  Ciel :" name="SkyMeshDetail"/>
 	<text name="PostProcessText">
 		Faible
 	</text>
@@ -164,7 +163,7 @@
 		Faible
 	</text>
 	<text name="LightingDetailText">
-		Détails de la lumière :
+		Sources lumineuses :
 	</text>
 	<radio_group name="LightingDetailRadio">
 		<radio_item name="SunMoon">
@@ -175,7 +174,7 @@
 		</radio_item>
 	</radio_group>
 	<text left="380" name="TerrainDetailText">
-		Détails du terrain :
+		Rendu du terrain :
 	</text>
 	<radio_group name="TerrainDetailRadio">
 		<radio_item name="0">
@@ -185,9 +184,8 @@
 			Élevé
 		</radio_item>
 	</radio_group>
-	<button label="Paramètres recommandés" name="Defaults" />
-	<button label="Configuration du matériel" label_selected="Configuration du matériel"
-	     name="GraphicsHardwareButton" />
+	<button label="Paramètres recommandés" name="Defaults"/>
+	<button label="Configuration du matériel" label_selected="Configuration du matériel" name="GraphicsHardwareButton"/>
 	<text name="resolution_format">
 		[RES_X] x [RES_Y]
 	</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_im.xml b/indra/newview/skins/default/xui/fr/panel_preferences_im.xml
index 2640bd5..e855e6a 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_im.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_im.xml
@@ -1,38 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Communication" name="im">
-	<text type="string" length="1" name="text_box">
+	<text length="1" name="text_box" type="string">
 		Mon statut en ligne :
 	</text>
-	<check_box label="Seuls mes amis et groupes voient quand je suis connecté(e)"
-	     name="online_visibility" />
+	<check_box label="Seuls mes amis et groupes voient quand je suis connecté(e)" name="online_visibility"/>
 	<text name="log_in_to_change">
 		se connecter pour changer
 	</text>
-	<check_box label="Envoyer l&apos;IM à une adresse e-mail ([EMAIL])"
-	     name="send_im_to_email" />
-	<check_box label="Inclure les IM dans le chat local" name="include_im_in_chat_history" />
-	<check_box label="Afficher les marques temporelles dans les IM"
-	     name="show_timestamps_check" />
-	<check_box label="Me prévenir quand des amis se connectent"
-	     name="friends_online_notify_checkbox" />
+	<check_box label="Envoyer les IM à mon adresse e-mail ([EMAIL])" name="send_im_to_email"/>
+	<check_box label="Inclure les IM dans le chat local" name="include_im_in_chat_history"/>
+	<check_box label="Afficher l&apos;heure dans les IM" name="show_timestamps_check"/>
+	<check_box label="Me prévenir quand des amis se connectent" name="friends_online_notify_checkbox"/>
 	<text name="text_box3">
-		Réponse mode occupé :
+		Réponse si occupé(e) :
 	</text>
 	<text name="text_box4">
 		Options de connexion :
 	</text>
-	<check_box label="Enregistrer un journal des IM sur mon ordinateur"
-	     name="log_instant_messages" />
-	<check_box label="Inclure les marques temporelles" name="log_instant_messages_timestamp" />
-	<check_box label="Enregistrer un journal du chat local sur mon ordinateur" name="log_chat" />
-	<check_box label="Inclure la fin de la dernière conversation IM" name="log_show_history" />
-	<check_box label="Inclure les marques temporelles" name="log_chat_timestamp" />
-	<check_box label="Inclure les IM reçus" name="log_chat_IM" />
-	<check_box label="Inclure la date avec les marques temporelles" name="log_date_timestamp" />
-	<button label="Changer d&apos;emplacement" label_selected="Changer d&apos;emplacement"
-	     name="log_path_button" width="150" />
-	<line_editor left="308" name="log_path_string" right="-20" />
-	<text type="string" length="1" name="text_box2">
-		Options IM :
+	<check_box label="Enregistrer les IM sur mon ordinateur" name="log_instant_messages"/>
+	<check_box label="Inclure les heures" name="log_instant_messages_timestamp"/>
+	<check_box label="Enregistrer le chat local sur mon ordinateur" name="log_chat"/>
+	<check_box label="Inclure la fin de la dernière conversation IM" name="log_show_history"/>
+	<check_box label="Inclure les heures" name="log_chat_timestamp"/>
+	<check_box label="Inclure les IM reçus" name="log_chat_IM"/>
+	<check_box label="Inclure la date avec les heures" name="log_date_timestamp"/>
+	<button label="Changer d&apos;emplacement" label_selected="Changer d&apos;emplacement" name="log_path_button" width="150"/>
+	<line_editor left="308" name="log_path_string" right="-20"/>
+	<text length="1" name="text_box2" type="string">
+		Options des IM :
 	</text>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_input.xml b/indra/newview/skins/default/xui/fr/panel_preferences_input.xml
index ae37dab..6593e2a 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_input.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_input.xml
@@ -1,23 +1,22 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel label="Entrée et Caméra" name="Input panel">
-	<text type="string" length="1" name=" Mouselook Options:">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Contrôle et Caméra" name="Input panel">
+	<text length="1" name=" Mouselook Options:" type="string">
 		Vue subjective :
 	</text>
-	<text type="string" length="1" name=" Mouse Sensitivity:">
+	<text length="1" name=" Mouse Sensitivity:" type="string">
 		Sensibilité de la souris :
 	</text>
-	<text type="string" length="1" name=" Auto Fly Options:">
+	<text length="1" name=" Auto Fly Options:" type="string">
 		Vol automatique :
 	</text>
-	<text type="string" length="1" name=" Camera Options:">
+	<text length="1" name=" Camera Options:" type="string">
 		Options de la caméra :
 	</text>
-	<text type="string" length="1" name="Camera Springiness:">
+	<text length="1" name="Camera Springiness:" type="string">
 		Réactivité :
 	</text>
-	<check_box label="Inverser la souris" name="invert mouse" />
-	<check_box label="Voler/atterrir en appuyant sur la flèche du haut/bas"
-	     name="automatic fly" />
+	<check_box label="Inverser la souris" name="invert_mouse"/>
+	<check_box label="Voler/atterrir en appuyant sur la flèche du haut/bas" name="automatic_fly"/>
 	<text name="Camera Follow Distance:">
 		Distance de la caméra :
 	</text>
@@ -27,18 +26,14 @@
 	<text name="Camera Smoothing:">
 		Effet de lissage :
 	</text>
-	<check_box label="Ajustement automatique de la caméra en mode Édition"
-	     name="edit camera movement"
-	     tool_tip="Positionner automatiquement la caméra lors de l&apos;entrée ou de la sortie du mode Édition" />
-	<check_box label="Ajustement automatique de la caméra en mode Apparence"
-	     name="appearance camera movement"
-	     tool_tip="Positionner automatiquement la caméra en mode Édition" />
+	<check_box label="Ajustement automatique de la caméra en mode Édition" name="edit_camera_movement" tool_tip="Positionner automatiquement la caméra lors de l&apos;entrée ou de la sortie du mode Édition"/>
+	<check_box label="Ajustement automatique de la caméra en mode Apparence" name="appearance_camera_movement" tool_tip="Positionner automatiquement la caméra en mode Édition"/>
 	<text name="text2">
 		Affichage de l&apos;avatar :
 	</text>
-	<check_box label="Montrer l&apos;avatar dans la vue subjective" name="avfp" />
+	<check_box label="Montrer l&apos;avatar dans la vue subjective" name="first_person_avatar_visible"/>
 	<text name="text5">
 		Options du joystick :
 	</text>
-	<button label="Configuration du joystick" name="joystic_setup_button" width="175" />
+	<button label="Configuration du joystick" name="joystick_setup_button" width="175"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_network.xml b/indra/newview/skins/default/xui/fr/panel_preferences_network.xml
index cd63d30..99acb4f 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_network.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_network.xml
@@ -1,24 +1,23 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Réseau" name="network">
-	<text type="string" length="1" name="text_box">
-		Bande passante maximum :
+	<text length="1" name="text_box" type="string">
+		Bande passante maximale :
 	</text>
-	<text type="string" length="1" name="text_box2">
+	<text length="1" name="text_box2" type="string">
 		kbps (kilobits par seconde)
 	</text>
 	<text name="cache_size_label_l" width="210">
 		Taille de la mémoire cache du disque :
 	</text>
-	<text type="string" length="1" name="text_box5">
+	<text length="1" name="text_box5" type="string">
 		Mo
 	</text>
-	<button label="Vider la mémoire cache" label_selected="Vider le cache"
-	     name="clear_cache" width="150"/>
+	<button label="Vider la mémoire cache" label_selected="Vider le cache" name="clear_cache" width="150"/>
 	<text name="cache_location_label">
 		Emplacement du cache :
 	</text>
-	<button label="Définir" label_selected="Définir" name="set_cache" />
-	<button label="Redéfinir" label_selected="Définir" name="reset_cache" />
-	<check_box label="Port de connexion personnalisé" name="connection_port_enabled" />
-	<spinner label="Numéro de port :" name="connection_port" label_width="95" width="170"/>
+	<button label="Définir" label_selected="Définir" name="set_cache"/>
+	<button label="Redéfinir" label_selected="Définir" name="reset_cache"/>
+	<check_box label="Port de connexion personnalisé" name="connection_port_enabled"/>
+	<spinner label="Numéro de port :" label_width="95" name="connection_port" width="170"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_popups.xml b/indra/newview/skins/default/xui/fr/panel_preferences_popups.xml
index 72ea942..01fe695 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_popups.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_popups.xml
@@ -1,29 +1,21 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Pop-ups" name="popups" title="Pop-ups">
-	<text type="string" length="1" name="text_box">
+	<text length="1" name="text_box" type="string">
 		Ne pas afficher les pop-ups :
 	</text>
 	<text name="dont_show_label">
 		Ne pas afficher ces pop-ups :
 	</text>
-	<button label="Activer ce pop-up" label_selected="Autoriser cette pop-up"
-	     name="enable_popup" />
+	<button label="Activer ce pop-up" label_selected="Autoriser ce pop-up" name="enable_popup"/>
 	<text name="show_label">
 		Afficher ces pop-ups :
 	</text>
-	<button width="185" label="Désactiver tous ces pop-ups..." name="skip_dialogs_btn"
-	     tool_tip="Désactiver tous les pop-ups facultatifs et les notifications envoyées lors d&apos;un premier usage." />
-	<text type="string" length="1" name="text_box2">
+	<button label="Désactiver tous les pop-ups..." name="skip_dialogs_btn" tool_tip="Désactiver tous les pop-ups et les notifications envoyées lors d&apos;un premier usage." width="185"/>
+	<text length="1" name="text_box2" type="string">
 		Offres de notes, textures et repères :
 	</text>
-	<button width="185" label="Activer tous les pop-ups..."
-	     label_selected="Réinitialiser les dialogues &apos;Afficher la prochaine fois&apos;..."
-	     name="reset_dialogs_btn"
-	     tool_tip="Activer tous les pop-ups facultatifs et les notifications envoyées lors d&apos;un premier usage." />
-	<check_box label="Accepter automatiquement" name="accept_new_inventory" />
-	<check_box label="Afficher automatiquement après avoir accepté"
-	     name="show_new_inventory" />
-	<check_box
-	     label="Afficher automatiquement les objets récemment acceptés dans l&apos;inventaire"
-	     name="show_in_inventory" />
+	<button label="Activer tous les pop-ups" label_selected="Réinitialiser les dialogues &apos;Afficher la prochaine fois&apos;..." name="reset_dialogs_btn" tool_tip="Activer tous les pop-ups et les notifications envoyées lors d&apos;un premier usage." width="185"/>
+	<check_box label="Accepter automatiquement" name="accept_new_inventory"/>
+	<check_box label="Afficher après avoir accepté" name="show_new_inventory"/>
+	<check_box label="Ouvrir l&apos;inventaire et sélectionner les objets reçus" name="show_in_inventory"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_voice.xml b/indra/newview/skins/default/xui/fr/panel_preferences_voice.xml
index 996f60a..4580984 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_voice.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_voice.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Chat vocal" name="chat">
 	<text_editor name="voice_unavailable">
 		Le chat vocal n&apos;est pas disponible
 	</text_editor>
-	<check_box label="Activer le chat vocal" name="enable_voice_check" />
+	<check_box label="Activer la voix" name="enable_voice_check"/>
 	<radio_group name="ear_location">
 		<radio_item name="0">
 			Écouter depuis la position de la caméra.
@@ -16,22 +16,20 @@
 		Mode Appuyer pour parler
 	</text>
 	<text_editor name="voice_chat_description" width="465">
-		En mode Appuyer pour parler, vous contrôlez le moment où votre voix est transmise. Lorsque vous êtes en mode bascule, appuyez et relâchez le bouton Appuyer pour parler pour activer ou désactiver votre micro. Lorsque vous n&apos;êtes pas en mode bascule, le micro n&apos;est activé que lorsque vous appuyez sur le déclencheur.
+		En mode Appuyer pour parler, vous contrôlez le moment où votre voix est transmise en appuyant et en relâchant le bouton Parler en bas à droite de l&apos;écran. Pour quitter ce mode et laisser votre micro constamment activé, verrouillez le petit cadenas en cliquant dessus. Vous pouvez aussi définir une touche de contrôle pour le mode Appuyer pour parler. Pour cela, laissez le cadenas à gauche du bouton Parler déverrouillé, cochez l&apos;option ci-dessous et choisissez une nouvelle touche.
 	</text_editor>
-	<check_box label="Utiliser la fonction Appuyer pour parler en mode bascule"
-	     name="push_to_talk_toggle_check" />
+	<check_box label="Attribuer une touche de contrôle" name="push_to_talk_toggle_check"/>
 	<text name="push_to_talk_label">
-		Déclencheur de la fonction Appuyer pour parler :
+		Touche de contrôle du mode Appuyer pour parler :
 	</text>
-	<button label="Choisir la touche" name="set_voice_hotkey_button" />
-	<button label="Molette de la souris" name="set_voice_middlemouse_button" />
+	<button label="Choisir la touche" name="set_voice_hotkey_button"/>
+	<button label="Molette de la souris" name="set_voice_middlemouse_button"/>
 	<text name="privacy_heading">
 		Options de confidentialité
 	</text>
-	<check_box label="N&apos;accepter que les appels de mes amis"
-	     name="voice_call_friends_only_check" />
+	<check_box label="N&apos;accepter que les appels de mes amis" name="voice_call_friends_only_check"/>
 	<text_editor name="device_settings_text">
 		Remarque : si vous cliquez sur Paramètres du matériel, vous serez temporairement deconnecté du chat vocal.
 	</text_editor>
-	<button label="Paramètres du matériel" name="device_settings_btn" />
+	<button label="Paramètres du matériel" name="device_settings_btn"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_web.xml b/indra/newview/skins/default/xui/fr/panel_preferences_web.xml
index d2c0288..afc081e 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_web.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_web.xml
@@ -1,31 +1,28 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Web" name="web">
 	<radio_group name="use_external_browser">
-		<radio_item name="external"
-		     tool_tip="Utilisez le navigateur web du système pour l&apos;aide, les liens web etc. Déconseillé en mode plein écran.">
+		<radio_item name="external" tool_tip="Utilisez le navigateur web du système pour l&apos;aide, les liens web etc. Déconseillé en mode plein écran.">
 			Utiliser un navigateur web externe (Firefox, Safari, Internet Explorer)
 		</radio_item>
-		<radio_item name="internal"
-		     tool_tip="Utilisez le navigateur web intégré pour l&apos;aide, les liens etc. Ce navigateur s&apos;ouvre dans une nouvelle fenêtre à l&apos;intérieur de Second Life.">
+		<radio_item name="internal" tool_tip="Utilisez le navigateur web intégré pour l&apos;aide, les liens etc. Ce navigateur s&apos;ouvre dans une nouvelle fenêtre à l&apos;intérieur de Second Life.">
 			Utiliser le navigateur web intégré
 		</radio_item>
 	</radio_group>
 	<text name="cache_size_label_l">
 		Cache du navigateur :
 	</text>
-	<button label="Vider" name="clear_cache" />
+	<button label="Vider" name="clear_cache"/>
 	<text name="cookie_label">
 		Cookies :
 	</text>
-	<check_box label="Accepter les cookies d&apos;autres sites" name="cookies_enabled" />
+	<check_box label="Accepter les cookies" name="cookies_enabled"/>
 	<text name="proxy_label">
-		Web proxy :
+		Proxy web :
 	</text>
-	<check_box label="Activer le Web proxy" name="web_proxy_enabled" />
+	<check_box label="Activer le proxy web" name="web_proxy_enabled"/>
 	<text name="proxy_text_label">
 		Adresse :
 	</text>
-	<line_editor name="web_proxy_editor"
-	     tool_tip="Le nom ou adresse IP du proxy que vous souhaitez utiliser" left="237" />
-	<spinner label="Numéro de port :" name="web_proxy_port" label_width="95" width="170"/>
+	<line_editor left="237" name="web_proxy_editor" tool_tip="Le nom ou adresse IP du proxy que vous souhaitez utiliser"/>
+	<spinner label="Numéro de port :" label_width="95" name="web_proxy_port" width="170"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_debug.xml b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
index d001191..2cc1736 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Débugger" name="Debug">
 	<text name="region_text_lbl">
 		Région :
@@ -6,46 +6,28 @@
 	<text name="region_text">
 		(inconnue)
 	</text>
-	<check_box label="Désactiver les scripts" name="disable_scripts_check"
-	     tool_tip="Désactiver tous les scripts dans cette région" />
-	<button label="?" name="disable_scripts_help" />
-	<check_box label="Désactiver les collisions" name="disable_collisions_check"
-	     tool_tip="Désactiver les collisions entre non-avatars dans cette région" />
-	<button label="?" name="disable_collisions_help" />
-	<check_box label="Désactiver les propriétés physiques" name="disable_physics_check"
-	     tool_tip="Désactiver toutes les propriétés physiques dans cette région" />
-	<button label="?" name="disable_physics_help" />
-	<button label="Appliquer" name="apply_btn" />
+	<check_box label="Désactiver les scripts" name="disable_scripts_check" tool_tip="Désactiver tous les scripts dans cette région"/>
+	<button label="?" name="disable_scripts_help"/>
+	<check_box label="Désactiver les collisions" name="disable_collisions_check" tool_tip="Désactiver les collisions entre non-avatars dans cette région"/>
+	<button label="?" name="disable_collisions_help"/>
+	<check_box label="Désactiver les propriétés physiques" name="disable_physics_check" tool_tip="Désactiver toutes les propriétés physiques dans cette région"/>
+	<button label="?" name="disable_physics_help"/>
+	<button label="Appliquer" name="apply_btn"/>
 	<line_editor name="target_avatar_name">
 		(aucun)
 	</line_editor>
-	<button label="Choisir..." name="choose_avatar_btn" />
-	<button
-	     label="Renvoyer les objets scriptés de l&apos;avatar vers une propriété tierce"
-	     name="return_scripted_other_land_btn" />
-	<button label="Renvoyer TOUS les objets scriptés de l&apos;avatar"
-	     name="return_scripted_all_btn" />
-	<check_box label="Ne renvoyer que les objets avec des scripts" name="return_scripts"
-	     tool_tip="Ne renvoyer que les objets avec des scripts." />
-	<check_box
-	     label="Ne renvoyer que les objets sur le terrain de quelqu&apos;un d&apos;autre"
-	     name="return_other_land"
-	     tool_tip="Ne renvoyer que les objets se trouvant sur le terrain de quelqu&apos;un d&apos;autre" />
-	<check_box label="Renvoyer les objets dans toutes les régions de ce domaine"
-	     name="return_estate_wide"
-	     tool_tip="Renvoyer les objets dans toutes les régions qui constituent ce domaine" />
-	<button label="Renvoyer" name="return_btn" />
-	<button label="Afficher les objets souvent responsables de collision..."
-	     name="top_colliders_btn"
-	     tool_tip="Liste des objets avec le plus de collisions potentielles" />
-	<button label="?" name="top_colliders_help" />
-	<button label="Afficher les objets exécutant le plus de scripts..."
-	     name="top_scripts_btn"
-	     tool_tip="Liste des objets qui passent le plus de temps à exécuter des scripts" />
-	<button label="?" name="top_scripts_help" />
-	<button label="Redémarrer la région" name="restart_btn"
-	     tool_tip="Redémarrer la région au bout de 2 minutes" />
-	<button label="?" name="restart_help" />
-	<button label="Retarder le redémarrage" name="cancel_restart_btn"
-	     tool_tip="Retarder le redémarrage de la région d&apos;une heure" />
+	<button label="Choisir..." name="choose_avatar_btn"/>
+	<button label="Renvoyer les objets scriptés de l&apos;avatar vers une propriété tierce" name="return_scripted_other_land_btn"/>
+	<button label="Renvoyer tous les objets scriptés de l&apos;avatar" name="return_scripted_all_btn"/>
+	<check_box label="Ne renvoyer que les objets avec des scripts" name="return_scripts" tool_tip="Ne renvoyer que les objets avec des scripts."/>
+	<check_box label="Ne renvoyer que les objets sur le terrain de quelqu&apos;un d&apos;autre" name="return_other_land" tool_tip="Ne renvoyer que les objets se trouvant sur le terrain de quelqu&apos;un d&apos;autre"/>
+	<check_box label="Renvoyer les objets dans toutes les régions de ce domaine" name="return_estate_wide" tool_tip="Renvoyer les objets dans toutes les régions qui constituent ce domaine"/>
+	<button label="Renvoyer" name="return_btn"/>
+	<button label="Afficher les objets souvent responsables de collision..." name="top_colliders_btn" tool_tip="Liste des objets avec le plus de collisions potentielles"/>
+	<button label="?" name="top_colliders_help"/>
+	<button label="Afficher les objets exécutant le plus de scripts..." name="top_scripts_btn" tool_tip="Liste des objets qui passent le plus de temps à exécuter des scripts"/>
+	<button label="?" name="top_scripts_help"/>
+	<button label="Redémarrer la région" name="restart_btn" tool_tip="Redémarrer la région au bout de 2 minutes"/>
+	<button label="?" name="restart_help"/>
+	<button label="Retarder le redémarrage" name="cancel_restart_btn" tool_tip="Retarder le redémarrage de la région d&apos;une heure"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_estate.xml b/indra/newview/skins/default/xui/fr/panel_region_estate.xml
index f4585a8..5052bed 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_estate.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Domaine" name="Estate">
 	<text name="estate_help_text">
 		Les changements apportés aux paramètres de cet onglet auront des répercussions sur toutes les régions du domaine.
@@ -18,61 +18,59 @@
 	<text name="Only Allow">
 		Limiter l&apos;accès aux résidents :
 	</text>
-	<check_box label="Qui ont enregistré leurs infos de paiement" name="limit_payment"
-	     tool_tip="Interdire les résidents non identifés." />
-	<check_box label="Adultes dont l&apos;âge a été vérifié" name="limit_age_verified"
-	     tool_tip="Interdire les résidents dont l&apos;âge n&apos;a pas été vérifié. Pour plus d&apos;infos, consultez la page support.secondlife.com." />
-	<check_box label="Autoriser les chats vocaux" name="voice_chat_check" />
-	<button label="?" name="voice_chat_help" />
+	<check_box label="Qui ont enregistré leurs infos de paiement" name="limit_payment" tool_tip="Bannir les résidents non identifés."/>
+	<check_box label="Adultes dont l&apos;âge a été vérifié" name="limit_age_verified" tool_tip="Bannir les résidents dont l&apos;âge n&apos;a pas été vérifié. Pour plus d&apos;infos, consultez la page support.secondlife.com."/>
+	<check_box label="Autoriser les chats vocaux" name="voice_chat_check"/>
+	<button label="?" name="voice_chat_help"/>
 	<text name="abuse_email_text">
 		E-mail où signaler l&apos;infraction :
 	</text>
 	<string name="email_unsupported">
 		Non pris en charge
 	</string>
-	<button label="?" name="abuse_email_address_help" />
+	<button label="?" name="abuse_email_address_help"/>
 	<text name="estate_manager_label">
 		Gérants du domaine :
 	</text>
-	<button label="?" name="estate_manager_help" />
-	<button label="Ajouter..." name="add_estate_manager_btn" />
-	<button label="Supprimer..." name="remove_estate_manager_btn" />
-	<check_box label="Utiliser le temps universel" name="use_global_time_check" />
-	<button label="?" name="use_global_time_help" />
-	<check_box label="Soleil fixe" name="fixed_sun_check" />
-	<button label="?" name="fixed_sun_help" />
-	<slider label="Phase" name="sun_hour_slider" />
-	<check_box label="Autoriser l&apos;accès public" name="externally_visible_check" />
-	<button label="?" name="externally_visible_help" />
-	<check_box label="Vue sur le continent" name="mainland_visible_check" />
-	<button label="?" name="mainland_visible_help" />
-	<check_box label="Autoriser la téléportation directe" name="allow_direct_teleport" />
-	<button label="?" name="allow_direct_teleport_help" />
+	<button label="?" name="estate_manager_help"/>
+	<button label="Ajouter..." name="add_estate_manager_btn"/>
+	<button label="Supprimer..." name="remove_estate_manager_btn"/>
+	<check_box label="Utiliser le temps universel" name="use_global_time_check"/>
+	<button label="?" name="use_global_time_help"/>
+	<check_box label="Soleil fixe" name="fixed_sun_check"/>
+	<button label="?" name="fixed_sun_help"/>
+	<slider label="Phase" name="sun_hour_slider"/>
+	<check_box label="Autoriser l&apos;accès public" name="externally_visible_check"/>
+	<button label="?" name="externally_visible_help"/>
+	<check_box label="Vue sur le continent" name="mainland_visible_check"/>
+	<button label="?" name="mainland_visible_help"/>
+	<check_box label="Autoriser la téléportation directe" name="allow_direct_teleport"/>
+	<button label="?" name="allow_direct_teleport_help"/>
 	<text name="region_text_lbl">
 		Refuser l&apos;accès selon les infos de paiement :
 	</text>
-	<check_box label="Refuser sans infos de paiement enregistrées" name="deny_anonymous" />
-	<check_box label="Refuser avec infos de paiement enregistrées" name="deny_identified" />
-	<check_box label="Refuser avec infos de paiement utilisées" name="deny_transacted" />
-	<button label="Appliquer" name="apply_btn" />
+	<check_box label="Refuser sans infos de paiement enregistrées" name="deny_anonymous"/>
+	<check_box label="Refuser avec infos de paiement enregistrées" name="deny_identified"/>
+	<check_box label="Refuser avec infos de paiement utilisées" name="deny_transacted"/>
+	<button label="Appliquer" name="apply_btn"/>
 	<text name="allow_resident_label">
 		Résidents autorisés :
 	</text>
-	<button label="?" name="allow_resident_help" />
-	<button label="Ajouter..." name="add_allowed_avatar_btn" />
-	<button label="Supprimer..." name="remove_allowed_avatar_btn" />
+	<button label="?" name="allow_resident_help"/>
+	<button label="Ajouter..." name="add_allowed_avatar_btn"/>
+	<button label="Supprimer..." name="remove_allowed_avatar_btn"/>
 	<text name="allow_group_label">
 		Groupes autorisés :
 	</text>
-	<button label="?" name="allow_group_help" />
-	<button label="Ajouter..." name="add_allowed_group_btn" />
-	<button label="Supprimer..." name="remove_allowed_group_btn" />
+	<button label="?" name="allow_group_help"/>
+	<button label="Ajouter..." name="add_allowed_group_btn"/>
+	<button label="Supprimer..." name="remove_allowed_group_btn"/>
 	<text name="ban_resident_label">
-		Résidents interdits :
+		Résidents bannis :
 	</text>
-	<button label="?" name="ban_resident_help" />
-	<button label="Ajouter..." name="add_banned_avatar_btn" />
-	<button label="Supprimer..." name="remove_banned_avatar_btn" />
-	<button label="Envoyer un message au domaine..." name="message_estate_btn" />
-	<button label="Expulser le résident du domaine..." name="kick_user_from_estate_btn" />
+	<button label="?" name="ban_resident_help"/>
+	<button label="Ajouter..." name="add_banned_avatar_btn"/>
+	<button label="Supprimer..." name="remove_banned_avatar_btn"/>
+	<button label="Envoyer un message au domaine..." name="message_estate_btn"/>
+	<button label="Éjecter le résident du domaine..." name="kick_user_from_estate_btn"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_general.xml b/indra/newview/skins/default/xui/fr/panel_region_general.xml
index 95cd0c2..1556c87 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_general.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Région" name="General">
 	<text name="region_text_lbl">
 		Région :
@@ -12,42 +12,39 @@
 	<text name="version_channel_text">
 		(inconnu)
 	</text>
-	<check_box label="Bloquer le terraformage" name="block_terraform_check" />
-	<button label="?" name="terraform_help" />
-	<check_box label="Interdire le vol" name="block_fly_check" />
-	<button label="?" name="fly_help" />
-	<check_box label="Autoriser les dégâts" name="allow_damage_check" />
-	<button label="?" name="damage_help" />
-	<check_box label="Interdire les bousculades" name="restrict_pushobject" />
-	<button label="?" name="restrict_pushobject_help" />
-	<check_box label="Autoriser la revente de terrain" name="allow_land_resell_check" />
-	<button label="?" name="land_resell_help" />
-	<check_box label="Autoriser la fusion/division de terrain"
-	     name="allow_parcel_changes_check" />
-	<button label="?" name="parcel_changes_help" />
-	<check_box label="Ne pas afficher le terrain dans la recherche"
-	     name="block_parcel_search_check"
-	     tool_tip="Afficher cette région et ses parcelles dans les résultats de recherche" />
-	<button label="?" name="parcel_search_help" />
-	<spinner label="Nombre limite d&apos;avatars" name="agent_limit_spin" />
-	<button label="?" name="agent_limit_help" />
-	<spinner label="Bonus objet" name="object_bonus_spin" />
-	<button label="?" name="object_bonus_help" />
+	<check_box label="Bloquer le terraformage" name="block_terraform_check"/>
+	<button label="?" name="terraform_help"/>
+	<check_box label="Interdire le vol" name="block_fly_check"/>
+	<button label="?" name="fly_help"/>
+	<check_box label="Autoriser les dégâts" name="allow_damage_check"/>
+	<button label="?" name="damage_help"/>
+	<check_box label="Interdire les bousculades" name="restrict_pushobject"/>
+	<button label="?" name="restrict_pushobject_help"/>
+	<check_box label="Autoriser la revente de terrain" name="allow_land_resell_check"/>
+	<button label="?" name="land_resell_help"/>
+	<check_box label="Autoriser la fusion/division de terrain" name="allow_parcel_changes_check"/>
+	<button label="?" name="parcel_changes_help"/>
+	<check_box label="Ne pas afficher le terrain dans la recherche" name="block_parcel_search_check" tool_tip="Afficher cette région et ses parcelles dans les résultats de recherche"/>
+	<button label="?" name="parcel_search_help"/>
+	<spinner label="Nombre limite d&apos;avatars" name="agent_limit_spin"/>
+	<button label="?" name="agent_limit_help"/>
+	<spinner label="Bonus objet" name="object_bonus_spin"/>
+	<button label="?" name="object_bonus_help"/>
 	<text label="Maturité" name="access_text">
 		Maturité :
 	</text>
 	<combo_box label="Adulte" name="access_combo">
 		<combo_item name="PG">
-			Accompagnement parental
+			Tout public
 		</combo_item>
 		<combo_item name="Mature">
-			Adulte
+			Adultes
 		</combo_item>
 	</combo_box>
-	<button label="?" name="access_help" />
-	<button label="Appliquer" name="apply_btn" />
-	<button label="Téléporter un résident chez lui..." name="kick_btn" />
-	<button label="Téléporter tous les résidents chez eux..." name="kick_all_btn" />
-	<button label="Envoyer un message à la région..." name="im_btn" />
-	<button label="Gérer le Téléhub..." name="manage_telehub_btn" />
+	<button label="?" name="access_help"/>
+	<button label="Appliquer" name="apply_btn"/>
+	<button label="Téléporter un résident chez lui..." name="kick_btn"/>
+	<button label="Téléporter tous les résidents chez eux..." name="kick_all_btn"/>
+	<button label="Envoyer un message à la région..." name="im_btn"/>
+	<button label="Gérer le Téléhub..." name="manage_telehub_btn"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_terrain.xml b/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
index d176f07..219e0da 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Terrain" name="Terrain">
 	<text name="region_text_lbl">
 		Région :
@@ -6,25 +6,22 @@
 	<text name="region_text">
 		(inconnue)
 	</text>
-	<spinner label="Niveau de l&apos;eau" name="water_height_spin" />
-	<button label="?" name="water_height_help" />
-	<spinner label="Limite de surélévation du terrain" name="terrain_raise_spin" />
-	<button label="?" name="terrain_raise_help" />
-	<spinner label="Limite d&apos;abaissement du terrain" name="terrain_lower_spin" />
-	<button label="?" name="terrain_lower_help" />
-	<check_box label="Utiliser le soleil du domaine" name="use_estate_sun_check" />
-	<button label="?" name="use_estate_sun_help" />
-	<check_box label="Soleil fixe" name="fixed_sun_check" />
-	<button label="?" name="fixed_sun_help" />
-	<slider label="Phase" name="sun_hour_slider" />
-	<button label="Appliquer" name="apply_btn" />
-	<button label="Télécharger le terrain au format RAW..." name="download_raw_btn"
-	     tool_tip="Réservé aux propriétaires de domaine, pas aux gérants" />
-	<button label="?" name="download_raw_help" />
-	<button label="Charger le terrain au format RAW..." name="upload_raw_btn"
-	     tool_tip="Réservé aux propriétaires de domaine, pas aux gérants" />
-	<button label="?" name="upload_raw_help" />
-	<button label="Figer le terrain" name="bake_terrain_btn"
-	     tool_tip="Définir le terrain actuel comme point central pour les limites de surélévation/abaissement" />
-	<button label="?" name="bake_terrain_help" />
+	<spinner label="Niveau de l&apos;eau" name="water_height_spin"/>
+	<button label="?" name="water_height_help"/>
+	<spinner label="Limite d&apos;élévation du terrain" name="terrain_raise_spin"/>
+	<button label="?" name="terrain_raise_help"/>
+	<spinner label="Limite d&apos;abaissement du terrain" name="terrain_lower_spin"/>
+	<button label="?" name="terrain_lower_help"/>
+	<check_box label="Utiliser le soleil du domaine" name="use_estate_sun_check"/>
+	<button label="?" name="use_estate_sun_help"/>
+	<check_box label="Soleil fixe" name="fixed_sun_check"/>
+	<button label="?" name="fixed_sun_help"/>
+	<slider label="Phase" name="sun_hour_slider"/>
+	<button label="Appliquer" name="apply_btn"/>
+	<button label="Télécharger le terrain au format RAW..." name="download_raw_btn" tool_tip="Réservé aux propriétaires de domaine, pas aux gérants"/>
+	<button label="?" name="download_raw_help"/>
+	<button label="Charger le terrain au format RAW..." name="upload_raw_btn" tool_tip="Réservé aux propriétaires de domaine, pas aux gérants"/>
+	<button label="?" name="upload_raw_help"/>
+	<button label="Figer le terrain" name="bake_terrain_btn" tool_tip="Définir le terrain actuel comme point central pour les limites d&apos;élévation/abaissement"/>
+	<button label="?" name="bake_terrain_help"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_speaker_controls.xml b/indra/newview/skins/default/xui/fr/panel_speaker_controls.xml
index 7c63202..c23e95d 100644
--- a/indra/newview/skins/default/xui/fr/panel_speaker_controls.xml
+++ b/indra/newview/skins/default/xui/fr/panel_speaker_controls.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="active_speakers_panel">
 	<string name="moderator_label">
 		(Modérateur)
@@ -7,23 +7,23 @@
 		<layout_panel name="moderation_mode_panel">
 			<combo_box name="moderation_mode">
 				<combo_item name="OpenVoice">
-					Voix activées par défaut)
+					Voix activées par défaut
 				</combo_item>
 				<combo_item name="ModeratedVoice">
-					Voix désactivées par défaut)
+					Voix désactivées par défaut
 				</combo_item>
 			</combo_box>
 		</layout_panel>
 		<layout_panel name="moderate_chat_panel">
 			<scroll_list name="speakers_list">
-				<column label="Nom" name="speaker_name" />
+				<column label="Nom" name="speaker_name"/>
 			</scroll_list>
 			<panel name="speaker_controls">
 				<text name="resident_name">
 					Rumplstiltskin Califragilistic
 				</text>
-				<button name="mute_btn" tool_tip="Rendre ce résident muet" />
-				<check_box label="Ignorer le texte" name="mute_text_btn" />
+				<button name="mute_btn" tool_tip="Ignorer ce résident"/>
+				<check_box label="Ignorer les messages" name="mute_text_btn"/>
 			</panel>
 		</layout_panel>
 		<layout_panel name="moderator_controls">
diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
index fc94923..c3ff6f7 100644
--- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
@@ -1,14 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="status">
-	<text type="string" length="1" name="ParcelNameText"
-	     tool_tip="Nom de la parcelle de terrain sur laquelle vous vous trouvez. Cliquez pour ouvrir À propos du terrain.">
+	<text length="1" name="ParcelNameText" tool_tip="Nom de la parcelle de terrain sur laquelle vous vous trouvez. Cliquez pour ouvrir la section À propos du terrain." type="string">
 		Saisissez le nom de la parcelle ici
 	</text>
-	<text type="string" length="1" name="BalanceText" tool_tip="Solde du compte">
+	<text length="1" name="BalanceText" tool_tip="Solde du compte" type="string">
 		Chargement en cours...
 	</text>
-	<button label="" label_selected="" name="buycurrency" tool_tip="Acheter des devises" />
-	<text type="string" length="12" name="TimeText" tool_tip="Heure actuelle (Californie)">
+	<button label="" label_selected="" name="buycurrency" tool_tip="Acheter des devises"/>
+	<text length="12" name="TimeText" tool_tip="Heure actuelle (Californie)" type="string">
 		midi
 	</text>
 	<string name="StatBarDaysOfWeek">
@@ -17,23 +16,22 @@
 	<string name="StatBarMonthsOfYear">
 		January:February:March:April:May:June:July:August:September:October:November:December
 	</string>
-	<button label="" label_selected="" name="scriptout"
-	     tool_tip="Alertes et erreurs de scripts" />
-	<button label="" label_selected="" name="health" tool_tip="Santé" />
-	<text type="string" length="1" name="HealthText" tool_tip="Santé">
-		100%
+	<button label="" label_selected="" name="scriptout" tool_tip="Alertes et erreurs de scripts"/>
+	<button label="" label_selected="" name="health" tool_tip="Santé"/>
+	<text length="1" name="HealthText" tool_tip="Santé" type="string">
+		100 %
 	</text>
-	<button label="" label_selected="" name="fly" tool_tip="Vol interdit" />
-	<button label="" label_selected="" name="build" tool_tip="Construction interdite" />
-	<button label="" label_selected="" name="scripts" tool_tip="Scripts interdits" />
-	<button name="no_fly" tool_tip="Interdiction de voler" />
-	<button name="no_build" tool_tip="Interdiction de construire/rezzer" />
-	<button name="no_scripts" tool_tip="Interdiction d&apos;utiliser des scripts" />
-	<button label="" label_selected="" name="restrictpush" tool_tip="llPushObject interdit" />
-	<button name="status_no_voice" tool_tip="Voix non disponible ici" />
-	<button label="" label_selected="" name="buyland" tool_tip="Acheter cette parcelle" />
-	<line_editor label="Rechercher" name="search_editor" tool_tip="Rechercher dans Second Life" />
-	<button name="search_btn" tool_tip="Rechercher dans Second Life" />
+	<button label="" label_selected="" name="fly" tool_tip="Vol interdit"/>
+	<button label="" label_selected="" name="build" tool_tip="Construction interdite"/>
+	<button label="" label_selected="" name="scripts" tool_tip="Scripts interdits"/>
+	<button name="no_fly" tool_tip="Interdiction de voler"/>
+	<button name="no_build" tool_tip="Interdiction de construire/rezzer"/>
+	<button name="no_scripts" tool_tip="Interdiction d&apos;utiliser des scripts"/>
+	<button label="" label_selected="" name="restrictpush" tool_tip="llPushObject interdit"/>
+	<button name="status_no_voice" tool_tip="Voix non disponible ici"/>
+	<button label="" label_selected="" name="buyland" tool_tip="Acheter cette parcelle"/>
+	<line_editor label="Rechercher" name="search_editor" tool_tip="Rechercher dans Second Life"/>
+	<button name="search_btn" tool_tip="Rechercher dans Second Life"/>
 	<text name="packet_loss_tooltip">
 		Perte de paquets
 	</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_toolbar.xml b/indra/newview/skins/default/xui/fr/panel_toolbar.xml
index c059fff..99aaa65 100644
--- a/indra/newview/skins/default/xui/fr/panel_toolbar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_toolbar.xml
@@ -1,22 +1,17 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="toolbar">
 	<string name="Redock Windows">
 		Rétablir les fenêtres
 	</string>
 	<layout_stack name="toolbar_stack">
-		<button label="" name="chat_btn" tool_tip="Afficher la barre de chat. (Entrée)" />
-		<flyout_button label="Communiquer" name="communicate_btn"
-		     tool_tip="Communiquer avec vos amis et vos groupes." />
-		<button label="Voler" label_selected="Atterrir" name="fly_btn"
-		     tool_tip="Commencer à voler. Utilisez E/C ou PgHaut/PageBas pour voler vers le haut et vers le bas." />
-		<button label="Photo" name="snapshot_btn"
-		     tool_tip="Enregistrer une photo sur le disque ou dans l&apos;inventaire." />
-		<button label="Rechercher" name="directory_btn"
-		     tool_tip="Rechercher des endroits, des événements, des personnes, et plus encore." />
-		<button label="Construire" name="build_btn" tool_tip="Créer de nouveaux objets." />
-		<button label="Mini-carte" name="radar_btn"
-		     tool_tip="Carte de la zone autour de vous. (Ctrl-Maj-M)" />
-		<button label="Carte" name="map_btn" tool_tip="Carte du monde. (Ctrl-M)" />
-		<button label="Inventaire" name="inventory_btn" tool_tip="Vos objets. (Ctrl-I)" />
+		<button label="" name="chat_btn" tool_tip="Affichez la barre de chat. (Entrée)"/>
+		<flyout_button label="Communiquer" name="communicate_btn" tool_tip="Communiquez avec vos amis et vos groupes."/>
+		<button label="Voler" label_selected="Atterrir" name="fly_btn" tool_tip="Commencez à voler. Utilisez E/C ou PgHaut/PageBas pour voler vers le haut et vers le bas."/>
+		<button label="Photo" name="snapshot_btn" tool_tip="Enregistrez une photo sur le disque ou dans l&apos;inventaire."/>
+		<button label="Rechercher" name="directory_btn" tool_tip="Recherchez des endroits, des événements, des résidents, et plus encore."/>
+		<button label="Construire" name="build_btn" tool_tip="Créez de nouveaux objets."/>
+		<button label="Mini-carte" name="radar_btn" tool_tip="Affichez la carte de la zone autour de vous. (Ctrl-Maj-M)"/>
+		<button label="Carte" name="map_btn" tool_tip="Affichez la carte du Monde. (Ctrl-M)"/>
+		<button label="Inventaire" name="inventory_btn" tool_tip="Vos objets (Ctrl-I)"/>
 	</layout_stack>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_voice_enable.xml b/indra/newview/skins/default/xui/fr/panel_voice_enable.xml
index 7fcc9bc..f585388 100644
--- a/indra/newview/skins/default/xui/fr/panel_voice_enable.xml
+++ b/indra/newview/skins/default/xui/fr/panel_voice_enable.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="content_panel">
 	<text_editor name="voice_intro_text1">
-		Bienvenue dans le chat vocal de Second Life ! Le chat vocal vous permet de communiquer avec les autres résidents. Cet assistant vous aidera à le paramétrer correctement.  Le chat vocal requiert l&apos;utilisation de speakers audio. Pour parler, il vous faudra aussi un micro ou un casque stéréo avec un micro.
+		Bienvenue dans le chat vocal de Second Life ! Le chat vocal vous permet de communiquer avec les autres résidents. Cet assistant vous aidera à le paramétrer correctement. Le chat vocal requiert l&apos;utilisation de haut-parleurs audio. Pour parler, il vous faudra aussi un micro ou un casque stéréo avec un micro.
 	</text_editor>
 	<text_editor name="voice_intro_text2">
 		Le chat vocal est activé par défaut. Souhaitez-vous continuer à l&apos;utiliser ?
diff --git a/indra/newview/skins/default/xui/fr/panel_voice_options.xml b/indra/newview/skins/default/xui/fr/panel_voice_options.xml
index 0814e76..9d67987 100644
--- a/indra/newview/skins/default/xui/fr/panel_voice_options.xml
+++ b/indra/newview/skins/default/xui/fr/panel_voice_options.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="content_panel">
 	<text_editor name="voice_intro_text1">
 		Pour configurer votre chat vocal, utilisez les options ci-dessous.
@@ -11,13 +11,11 @@
 			Écouter depuis la position de l&apos;avatar.
 		</radio_item>
 	</radio_group>
-	<check_box label="N&apos;autoriser que mes amis à m&apos;appeler."
-	     name="friends_only_check" />
-	<check_box label="Utiliser la fonction Appuyer pour parler en mode bascule"
-	     name="push_to_talk_toggle_check" />
+	<check_box label="N&apos;autoriser que mes amis à m&apos;appeler." name="friends_only_check"/>
+	<check_box label="Attribuer une touche de contrôle" name="push_to_talk_toggle_check"/>
 	<text name="push_to_talk_label">
-		Déclencheur de la fonction Appuyer pour parler :
+		Touche de contrôle de la fonction Appuyer pour parler :
 	</text>
-	<button label="Choisir la touche" name="set_voice_hotkey_button" />
-	<button label="Molette de la souris" name="set_voice_middlemouse_button" />
+	<button label="Choisir la touche" name="set_voice_hotkey_button"/>
+	<button label="Molette de la souris" name="set_voice_middlemouse_button"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 0c4b625..3978b1d 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <strings>
 	<string name="LoginInProgress">
 		La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter.
@@ -82,7 +82,7 @@
 		Toucher
 	</string>
 	<string name="TooltipFlagL$">
-		$L
+		L$
 	</string>
 	<string name="TooltipFlagDropInventory">
 		Laisser tomber l&apos;inventaire
@@ -100,7 +100,7 @@
 		Copie autorisée
 	</string>
 	<string name="TooltipForSaleL$">
-		À vendre : [AMOUNT] $L
+		À vendre : [AMOUNT] L$
 	</string>
 	<string name="TooltipForSaleMsg">
 		À vendre : [MESSAGE]
@@ -301,7 +301,7 @@
 		Non
 	</string>
 	<string name="anim_nyanya">
-		Na na na nère
+		Na na na na nère
 	</string>
 	<string name="anim_punch_onetwo">
 		Gauche-droite
@@ -409,9 +409,9 @@
 		Hors ligne
 	</string>
 	<string name="whisper">
-		chuchotages :
+		chuchote :
 	</string>
 	<string name="shout">
-		cris :
+		crie :
 	</string>
 </strings>
diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml
index adc85df..55df129 100644
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -171,9 +171,6 @@
 			<text type="string" length="1" name="Simulator primitive usage:" width="500">
 				シミュレータの基本要素使用状況:
 			</text>
-			<text type="string" length="1" left="200" name="0 out of 0 available">
-				14055のうち0(14055利用可能)
-			</text>
 			<text left="200" name="objects_available">
 				[MAX]の内[COUNT]([AVAILABLE]利用可能)
 			</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
index bc5675c..7ebcacd 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
@@ -30,12 +30,14 @@
 	<text name="steps_label">
 		手順:
 	</text>
+	<!-- Revert translations as interim fix to VWR-9985 while the code is not properly internationalized
 	<scroll_list name="library_list">
 		アニメーション
 サウンド
 チャット
 å¾…æ©Ÿ
 	</scroll_list>
+	-->
 	<button label="追加>>" name="add_btn"/>
 	<button label="上に移動" name="up_btn"/>
 	<button label="下に移動" name="down_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml
index 4d22f39..b8e6c3e 100644
--- a/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -74,7 +74,7 @@
 	<check_box label="土地を選択" name="radio select land" />
 	<check_box label="土地をならす" name="radio flatten" />
 	<check_box label="土地を隆起させる" name="radio raise" />
-	<check_box label="低地" name="radio lower" />
+	<check_box label="土地を低くする" name="radio lower" />
 	<check_box label="土地を滑らかにする" name="radio smooth" />
 	<check_box label="土地を荒らす" name="radio noise" />
 	<check_box label="土地を元に戻す" name="radio revert" />
diff --git a/indra/newview/skins/default/xui/ja/panel_avatar.xml b/indra/newview/skins/default/xui/ja/panel_avatar.xml
index 04f802a..5bdc712 100644
--- a/indra/newview/skins/default/xui/ja/panel_avatar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_avatar.xml
@@ -20,7 +20,7 @@
 				Linden Lab従業員
 			</string>
 			<string name="PaymentInfoUsed">
-				使用する支払い情報
+				支払い情報登録済
 			</string>
 			<string name="PaymentInfoOnFile">
 				支払い情報登録済み
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
index 1ad08fb..96a4bc3 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
@@ -3,7 +3,7 @@
 	<text length="1" name="text_box" type="string">
 		チャットのフォント:
 	</text>
-	<radio_group name="chat font size">
+	<radio_group name="chat_font_size">
 		<radio_item length="1" name="radio" type="string">
 			小
 		</radio_item>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_input.xml b/indra/newview/skins/default/xui/ja/panel_preferences_input.xml
index b24b01e..75e9051 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_input.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_input.xml
@@ -6,11 +6,11 @@
 	<text name=" Mouse Sensitivity:">
 		感度:
 	</text>
-	<check_box label="上下を反転" name="invert mouse"/>
+	<check_box label="上下を反転" name="invert_mouse"/>
 	<text name=" Auto Fly Options:">
 		自動飛行オプション:
 	</text>
-	<check_box label="上下矢印キーの長押しで飛行/着地" name="automatic fly"/>
+	<check_box label="上下矢印キーの長押しで飛行/着地" name="automatic_fly"/>
 	<text name=" Camera Options:">
 		カメラ・オプション:
 	</text>
@@ -23,15 +23,15 @@
 	<text name="Camera Smoothing:">
 		カメラ・スムージング:
 	</text>
-	<check_box label="編集カメラの自動移動" name="edit camera movement" tool_tip="編集モードの開始、終了時はカメラ自動位置調整を使用"/>
-	<check_box label="容姿カメラの自動移動" name="appearance camera movement" tool_tip="編集モードでは、カメラ自動位置調整を使用"/>
+	<check_box label="編集カメラの自動移動" name="edit_camera_movement" tool_tip="編集モードの開始、終了時はカメラ自動位置調整を使用"/>
+	<check_box label="容姿カメラの自動移動" name="appearance_camera_movement" tool_tip="編集モードでは、カメラ自動位置調整を使用"/>
 	<text name="text2">
 		アバター表示:
 	</text>
-	<check_box label="アバターをマウスルックで表示" name="avfp"/>
+	<check_box label="アバターをマウスルックで表示" name="first_person_avatar_visible"/>
 	<text name="text5">
 		ジョイスティック
 オプション:
 	</text>
-	<button label="ジョイスティック設定" name="joystic_setup_button"/>
+	<button label="ジョイスティック設定" name="joystick_setup_button"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_network.xml b/indra/newview/skins/default/xui/ja/panel_preferences_network.xml
index 1c65481..3e408af 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_network.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_network.xml
@@ -4,7 +4,7 @@
 		最大帯域幅:
 	</text>
 	<text type="string" length="1" name="text_box2">
-		Kbps
+		kbps
 	</text>
 	<text type="string" length="1" name="cache_size_label_l">
 		キャッシュ:
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 8339b10..f982b84 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -435,9 +435,9 @@
 	</string>
 	<!-- Chat -->
 	<string name="whisper">
-		ささやく:
+		のささやき:
 	</string>
 	<string name="shout">
-		叫ぶ:
+		の叫び:
 	</string>
 </strings>
diff --git a/indra/newview/skins/default/xui/ko/floater_about_land.xml b/indra/newview/skins/default/xui/ko/floater_about_land.xml
index 01b3072..0eb42ad 100644
--- a/indra/newview/skins/default/xui/ko/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ko/floater_about_land.xml
@@ -169,9 +169,6 @@
 			<text type="string" length="1" name="Simulator primitive usage:">
 				시뮬레이터 프림 사용률:
 			</text>
-			<text type="string" length="1" name="0 out of 0 available">
-				14055개 중 0개(14055개 사용 가능)
-			</text>
 			<text name="objects_available">
 				[MAX] 중  [COUNT]   ([AVAILABLE] 사용 가능)
 			</text>
diff --git a/indra/newview/skins/default/xui/ko/floater_preview_gesture.xml b/indra/newview/skins/default/xui/ko/floater_preview_gesture.xml
index fda53bc..1327873 100644
--- a/indra/newview/skins/default/xui/ko/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/ko/floater_preview_gesture.xml
@@ -30,12 +30,14 @@
 	<text name="steps_label">
 		단계:
 	</text>
+	<!-- Revert translations as interim fix to VWR-9985 while the code is not properly internationalized
 	<scroll_list name="library_list">
 		애니메이션 
 사운드 
 채팅 
 대기
 	</scroll_list>
+	-->
 	<button label="추가 &gt;&gt;" name="add_btn"/>
 	<button label="위로 이동" name="up_btn"/>
 	<button label="아래로 이동" name="down_btn"/>
diff --git a/indra/newview/skins/default/xui/ko/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ko/panel_preferences_chat.xml
index e94c428..1f9bdbc 100644
--- a/indra/newview/skins/default/xui/ko/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ko/panel_preferences_chat.xml
@@ -3,7 +3,7 @@
 	<text length="1" name="text_box" type="string">
 		글자 크기:
 	</text>
-	<radio_group name="chat font size">
+	<radio_group name="chat_font_size">
 		<radio_item length="1" name="radio" type="string">
 			소
 		</radio_item>
diff --git a/indra/newview/skins/default/xui/ko/panel_preferences_input.xml b/indra/newview/skins/default/xui/ko/panel_preferences_input.xml
index f391b2b..06edb21 100644
--- a/indra/newview/skins/default/xui/ko/panel_preferences_input.xml
+++ b/indra/newview/skins/default/xui/ko/panel_preferences_input.xml
@@ -6,11 +6,11 @@
 	<text name=" Mouse Sensitivity:">
 		마우스 민감성:
 	</text>
-	<check_box label="마우스 반전" name="invert mouse"/>
+	<check_box label="마우스 반전" name="invert_mouse"/>
 	<text name=" Auto Fly Options:">
 		자동 비행 옵션:
 	</text>
-	<check_box label="PageUp/Down 키로 이착륙" name="automatic fly"/>
+	<check_box label="PageUp/Down 키로 이착륙" name="automatic_fly"/>
 	<text name=" Camera Options:">
 		카메라 옵션:
 	</text>
@@ -23,14 +23,14 @@
 	<text name="Camera Smoothing:">
 		카메라 스무딩:
 	</text>
-	<check_box label="자동편집 카메라 설정" name="edit camera movement" tool_tip="편집 모드를 시작하거나 종료할 때 카메라 자동 위치 설정 사용"/>
-	<check_box label="내 모습 변경시 카메라 자동 설정" name="appearance camera movement" tool_tip="편집 모드일 때 카메라 자동 위치 설정 사용"/>
+	<check_box label="자동편집 카메라 설정" name="edit_camera_movement" tool_tip="편집 모드를 시작하거나 종료할 때 카메라 자동 위치 설정 사용"/>
+	<check_box label="내 모습 변경시 카메라 자동 설정" name="appearance_camera_movement" tool_tip="편집 모드일 때 카메라 자동 위치 설정 사용"/>
 	<text name="text2">
 		아바타 디스플레이 옵션:
 	</text>
-	<check_box label="1인칭 시점으로 시작" name="avfp"/>
+	<check_box label="1인칭 시점으로 시작" name="first_person_avatar_visible"/>
 	<text name="text5">
 		조이스틱 설정:
 	</text>
-	<button label="조이스틱 설치" name="joystic_setup_button"/>
+	<button label="조이스틱 설치" name="joystick_setup_button"/>
 </panel>
diff --git a/indra/newview/skins/default/xui/pt/alerts.xml b/indra/newview/skins/default/xui/pt/alerts.xml
index caceb16..3464521 100644
--- a/indra/newview/skins/default/xui/pt/alerts.xml
+++ b/indra/newview/skins/default/xui/pt/alerts.xml
@@ -3501,7 +3501,7 @@ s
 	</alert>
 	<alert name="HelpReportAbuseEmailLL">
 		<message name="message">
-			Use esta ferramenta para reportar violações dos Termos de Serviço e Padrões da Comunidade. Veja: -http://secondlife.com/corporate/tos.php http://secondlife.com/corporate/cs.php - Todos os abusos reportados dos Termos de Serviço e Padrões da Comunidade são investigados e resolvidos. Você receberá um e-mail informando-lhe da resolução quando esta ocorrer. Você também pode ver a resolução do incidente no Police Blotter em:- http://secondlife.com/community/blotter.php
+			Use esta ferramenta para reportar violações dos Termos de Serviço e Padrões da Comunidade. Veja: -http://secondlife.com/corporate/tos.php http://secondlife.com/corporate/cs.php - Todos os abusos reportados dos Termos de Serviço e Padrões da Comunidade são investigados e resolvidos. Você receberá um e-mail informando-lhe da resolução quando esta ocorrer. Você também pode ver a resolução do incidente no Incident Report em:- http://secondlife.com/support/incidentreport.php
 		</message>
 	</alert>
 	<alert name="HelpReportAbuseEmailEO">
diff --git a/indra/newview/skins/default/xui/zh/alerts.xml b/indra/newview/skins/default/xui/zh/alerts.xml
index 49cf3b2..a8e2b2a 100644
--- a/indra/newview/skins/default/xui/zh/alerts.xml
+++ b/indra/newview/skins/default/xui/zh/alerts.xml
@@ -3967,20 +3967,6 @@ allowed above.
 			取消
 		</option>
 	</alert>
-	<alert name="HelpReportAbuse">
-		<message name="message">
-			Use this tool to report violations of the Terms of Service and Community Standards. See: 
-http://secondlife.com/corporate/tos.php 
-http://secondlife.com/corporate/cs.php 
- 
-All reported abuses of the Terms of Service and Community Standards 
-are investigated and resolved. You will receive an email informing you
-of the resolution when it occurs. 
-You can also view the incident resolution on the Police Blotter at: 
- 
-http://secondlife.com/community/blotter.php
-		</message>
-	</alert>
 	<alert name="HelpReportAbuseEmailLL">
 		<message name="message">
 			使用这个工具可以报告违反服务和社区标准条例的操作。详情请见: 
diff --git a/indra/newview/skins/default/xui/zh/floater_about_land.xml b/indra/newview/skins/default/xui/zh/floater_about_land.xml
index 63ac152..cd85615 100644
--- a/indra/newview/skins/default/xui/zh/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/zh/floater_about_land.xml
@@ -128,54 +128,33 @@
 			<text type="string" length="1" name="Simulator primitive usage:">
 				模拟器简单用法:
 			</text>
-			<text type="string" length="1" name="0 out of 0 available">
-				0个,总数为14055 (14055个有效)
-			</text>
 			<text type="string" length="1" name="Primitives parcel supports:">
 				原始土地支柱:
 			</text>
-			<text type="string" length="1" name="object_contrib_text">
-				926
-			</text>
 			<text type="string" length="1" name="Primitives on parcel:">
 				土地上所有的原始建筑:
 			</text>
-			<text type="string" length="1" name="total_objects_text">
-				0
-			</text>
 			<text type="string" length="1" name="Owned by parcel owner:">
 				为土地拥有者所有:
 			</text>
-			<text type="string" length="1" name="owner_objects_text">
-				0
-			</text>
 			<button label="显示" label_selected="显示" name="ShowOwner" />
 			<button label="归还..." label_selected="归还..." name="ReturnOwner..."
 			     tool_tip="将东东归还其主人." />
 			<text type="string" length="1" name="Set to group:">
 				转入社团状态:
 			</text>
-			<text type="string" length="1" name="group_objects_text">
-				0
-			</text>
 			<button label="显示" label_selected="显示" name="ShowGroup" />
 			<button label="归还..." label_selected="归还..." name="ReturnGroup..."
 			     tool_tip="将东东归还其主人." />
 			<text type="string" length="1" name="Owned by others:">
 				为其他人所有:
 			</text>
-			<text type="string" length="1" name="other_objects_text">
-				0
-			</text>
 			<button label="显示" label_selected="显示" name="ShowOther" />
 			<button label="归还..." label_selected="归还..." name="ReturnOther..."
 			     tool_tip="将东东归还其主人." />
 			<text type="string" length="1" name="Selected / sat upon:">
 				已选的/坐上去:
 			</text>
-			<text type="string" length="1" name="selected_objects_text">
-				0
-			</text>
 			<text type="string" length="1" name="Autoreturn other resident&amp;apos;s objects (minutes, 0 for off):">
 				自动归还其他居民的东东(分钟, 0为关闭):
 			</text>
diff --git a/indra/newview/skins/default/xui/zh/need_to_translate.xml b/indra/newview/skins/default/xui/zh/need_to_translate.xml
deleted file mode 100644
index b10fab4..0000000
--- a/indra/newview/skins/default/xui/zh/need_to_translate.xml
+++ /dev/null
@@ -1,908 +0,0 @@
-<?xml version="1.0"?>
-<?mso-application progid="Excel.Sheet"?>
-<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
- xmlns:o="urn:schemas-microsoft-com:office:office"
- xmlns:x="urn:schemas-microsoft-com:office:excel"
- xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
- xmlns:html="http://www.w3.org/TR/REC-html40">
- <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
-  <Created>1996-12-17T01:32:42Z</Created>
-  <LastSaved>2007-05-16T20:09:31Z</LastSaved>
-  <Version>11.6568</Version>
- </DocumentProperties>
- <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
-  <RemovePersonalInformation/>
- </OfficeDocumentSettings>
- <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
-  <WindowHeight>10170</WindowHeight>
-  <WindowWidth>19770</WindowWidth>
-  <WindowTopX>480</WindowTopX>
-  <WindowTopY>0</WindowTopY>
-  <AcceptLabelsInFormulas/>
-  <ProtectStructure>False</ProtectStructure>
-  <ProtectWindows>False</ProtectWindows>
- </ExcelWorkbook>
- <Styles>
-  <Style ss:ID="Default" ss:Name="Normal">
-   <Alignment ss:Vertical="Bottom"/>
-   <Borders/>
-   <Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>
-   <Interior/>
-   <NumberFormat/>
-   <Protection/>
-  </Style>
-  <Style ss:ID="s21">
-   <Font x:Family="Swiss" ss:Bold="1"/>
-  </Style>
-  <Style ss:ID="s22">
-   <Font x:Family="Swiss" ss:Bold="1"/>
-   <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
-  </Style>
-  <Style ss:ID="s23">
-   <Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
-  </Style>
- </Styles>
- <Worksheet ss:Name="Sheet1">
-  <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="62" x:FullColumns="1"
-   x:FullRows="1" ss:DefaultColumnWidth="60" ss:DefaultRowHeight="17.25">
-   <Column ss:Width="183.75"/>
-   <Column ss:Width="483.75"/>
-   <Column ss:Width="108.75"/>
-   <Column ss:Width="76.5"/>
-   <Column ss:Width="655.5"/>
-   <Column ss:Width="108.75"/>
-   <Column ss:Width="117"/>
-   <Row>
-    <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell>
-   </Row>
-   <Row>
-    <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell>
-    <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell>
-    <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell>
-    <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell>
-    <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell>
-    <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell>
-    <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell>
-   </Row>
-   <Row ss:Height="189.75">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//GrantModifyRights/message</Data></Cell>
-    <Cell ss:Index="5" ss:StyleID="s23"><Data ss:Type="String">Granting modify rights to another resident allows them to change &#10;ANY objects you may have in-world. Be VERY careful when handing &#10;out this permission.&#10;Do you want to grant modify rights for [FIRST_NAME] [LAST_NAME]?</Data></Cell>
-    <Cell ss:Index="7" ss:StyleID="s23"><Data ss:Type="String">授予另外一名居民修改的权利,则意味着允许他们修改任何你再第二人生世界里可能拥有的物品。请在执行这项许可的时候格外小心。               你真的希望授予[FIRST_NAME] [LAST_NAME]修改权利吗?</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//GrantModifyRights/Yes</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Yes</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">是的,我愿意</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//GrantModifyRights/No</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">No</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">不是,我想再考虑一下</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//RevokeModifyRights/message</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Do you want to revoke modify rights for [FIRST_NAME] [LAST_NAME]?</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">你真的希望撤回[FIRST_NAME] [LAST_NAME]的修改权利吗?</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//RevokeModifyRights/Yes</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Yes</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">是的,我愿意</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//RevokeModifyRights/No</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">No</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">不是,我想再考虑一下</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//ConfirmNotecardSave/message</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">This notecard needs to be saved before the item can be copied or viewed. Save notecard?</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">只有保存这张提示卡之后,此项物品才可以复制或查看。是否保存提示卡?</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//ConfirmNotecardSave/Save</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Save</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">是的,请保存</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//ConfirmNotecardSave/Cancel</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">取消保存</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//RemoveMultipleFromFriends/message</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Do you want to remove multiple friends from your friends list?</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">你希望从好友列表中移除若干好友吗?</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//RemoveMultipleFromFriends/Remove</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Remove</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">是的,我要移除</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//RemoveMultipleFromFriends/Cancel</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">取消</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//GrantedModifyRights/message</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">You have been granted the privilege to modify [FIRST_NAME] [LAST_NAME]'s objects.</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">你已经被授予特权,你可以任意修改[FIRST_NAME] [LAST_NAME]的东东。</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//RevokedModifyRights/message</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Your privilege to modify [FIRST_NAME] [LAST_NAME]'s objects has been revoked</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">你的特权已经被撤回,你不可以再任意修改[FIRST_NAME] [LAST_NAME]的东东。</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//OnlyCopyContentsOfSingleItem/OK</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">OK</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">好的</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//OnlyCopyContentsOfSingleItem/Cancel</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">取消</Data></Cell>
-   </Row>
-   <Row ss:Height="258.75">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//InvalidTerrainBitDepth/message</Data></Cell>
-    <Cell ss:Index="5" ss:StyleID="s23"><Data ss:Type="String">Couldn't set region textures: &#10; &#10;Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH].&#10; &#10;Replace texture [TEXTURE_NUM] with a 24 bit 512x512 or smaller image&#10;then click &quot;Set&quot; again.</Data></Cell>
-    <Cell ss:Index="7" ss:StyleID="s23"><Data ss:Type="String">无法设定区域的质地: &#10; &#10;目标质地 [TEXTURE_NUM] 的色彩格式[TEXTURE_BIT_DEPTH]无效.&#10; &#10;请把目前的目标质地[TEXTURE_NUM]更替为24比特 512x512分辨率,或者更小的显示图片,然后点击 &quot;设置&quot;.</Data></Cell>
-   </Row>
-   <Row ss:Height="258.75">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//InvalidTerrainSize/message</Data></Cell>
-    <Cell ss:Index="5" ss:StyleID="s23"><Data ss:Type="String">Couldn't set region textures: &#10; &#10;Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]. &#10; &#10;Replace texture [TEXTURE_NUM] with a 24 bit 512x512 or smaller image&#10;then click &quot;Set&quot; again.</Data></Cell>
-    <Cell ss:Index="7" ss:StyleID="s23"><Data ss:Type="String">无法设置区域的质地: &#10; &#10;目标质地[TEXTURE_NUM]的尺寸 [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]过大. &#10; &#10;请把目前的目标质地[TEXTURE_NUM]替换成24比特 512x512分辨率或者更小的显示图片,然后点击 &quot;设置&quot;.</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//MaxAllowedGroupsOnRegion/Bake</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Bake</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">执行</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//MaxAllowedGroupsOnRegion/Cancel</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">取消</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//WebLaunchSupport/message</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Contact [SECOND_LIFE] Support.</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">联系[SECOND_LIFE]支持中心.</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//WebLaunchSupport/Gotopage</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Go to page</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">翻页</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//WebLaunchSupport/Cancel</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">取消</Data></Cell>
-   </Row>
-   <Row ss:Height="396.75">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//HelpReportAbuseEmailLL/message</Data></Cell>
-    <Cell ss:Index="5" ss:StyleID="s23"><Data ss:Type="String">Use this tool to report violations of the Terms of Service &#10;and Community Standards. See: &#10;-&#10;http://secondlife.com/corporate/tos.php &#10;http://secondlife.com/corporate/cs.php &#10;-&#10;All reported abuses of the Terms of Service and Community Standards &#10;are investigated and resolved. You will receive an email informing you&#10;of the resolution when it occurs. You can also view the incident &#10;resolution on the Police Blotter at:&#10;- &#10;http://secondlife.com/community/blotter.php</Data></Cell>
-    <Cell ss:Index="7" ss:StyleID="s23"><Data ss:Type="String">使用这个工具可以报告违反服务和社区标准条例的操作。详情请见: &#10;-&#10;http://secondlife.com/corporate/tos.php &#10;http://secondlife.com/corporate/cs.php &#10;-&#10;所有对违反服务和社区标准条例的报告都会被调查并解决。你会收到一封邮件提示你解决的进展情况。同时,你可以在线查看秩序本,及时获得事件的解决情况。在线秩序本的地址是:&#10;- &#10;http://secondlife.com/community/blotter.php</Data></Cell>
-   </Row>
-   <Row ss:Height="409.5">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//HelpReportAbuseEmailEO/message</Data></Cell>
-    <Cell ss:Index="5" ss:StyleID="s23"><Data ss:Type="String">IMPORTANT: This report will go to the owner of the &#10;region you are currently in and not to Linden Lab.&#10;-&#10;As a service to residents and visitors, the owner of &#10;the region you are in has elected to receive and resolve &#10;all reports originating in this region. Linden Lab will &#10;not investigate reports you file from this location. &#10;The region owner will resolve reports based on the local &#10;rules of this region as outlined in the estate Covenant. &#10;(View covenants by going to the World menu and selecting &#10;About Land.)&#10;-&#10;The resolution of this report applies only to this Region; &#10;Residents access to other areas of Second Life will not be &#10;affected by the outcome of this report. Only Linden Lab can &#10;restrict access to the entirety of Second Life.</Data></Cell>
-    <Cell ss:Index="7" ss:StyleID="s23"><ss:Data ss:Type="String"
-      xmlns="http://www.w3.org/TR/REC-html40">重要提示: 这个报告将不会到达林登实验室处,而会发送给你目前所在区域的主人。&#10;-&#10;作为一项针对于居民和游客的服务,你所在这块区域的主人有责任接受所有来自这块区域的问题报告,并有责任解决它们。林登实验室将不会调查你从所在地点提交的问题报告。这块区域的主人将遵守土地契约,解决一些基于此块区域的本地规则的报告。(查看土地土地契约,可以进入游戏<B>世界主菜单</B><Font>,然后选择</Font><B>关于土地</B><Font>。)&#10;-&#10;报告的解决方案只在这块土地适用。其他进入第二人生其他区域的居民将不会受到这份报告输出的影响。只有林登实验室可以约束是否可以进入全部第二人生。</Font></ss:Data></Cell>
-   </Row>
-   <Row ss:Height="51.75">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//ConfirmEmptyTrash/message</Data></Cell>
-    <Cell ss:Index="5" ss:StyleID="s23"><Data ss:Type="String">Are you sure you want to permanently remove&#10;the contents of your Trash folder?</Data></Cell>
-    <Cell ss:Index="7" ss:StyleID="s23"><Data ss:Type="String">你确定要永久性删除垃圾文件夹里的内容吗?</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//ConfirmEmptyTrash/Yes</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Yes</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">使得,我要删除</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//ConfirmEmptyTrash/No</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">No</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">不是</Data></Cell>
-   </Row>
-   <Row ss:Height="207">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//CopySLURL/message</Data></Cell>
-    <Cell ss:Index="5" ss:StyleID="s23"><Data ss:Type="String">The following SLURL has been copied to your clipboard:&#10;   &#10;    [SLURL] &#10;   &#10;   Put it in a web page to give others easy access to this location or&#10;   try it out yourself by pasting it into the address bar of your web browser.</Data></Cell>
-    <Cell ss:Index="7" ss:StyleID="s23"><Data ss:Type="String">以下链接已经被复制到你的剪贴板中:&#10;   &#10;    [SLURL] &#10;   &#10;  把它加入到网页里,可以让别人更容易的进入这个地点,或者直接拉入浏览器的地址栏中,让自己进入这个地点。</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/allow_label2</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Create Objects:</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">创造东东:</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/edit group objects check</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Group</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">社团</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/allow_label3</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Object Entry:</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">进入东东:</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/all object entry check</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">All Residents</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">所有居民</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/group object entry check</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Group</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">社团</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/allow_label4</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Run Scripts:</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">运行脚本:</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/chat floater/Chat</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Chat</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">聊天</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/directory/Directory Tabs/land_sales_panel/type/MainlandSales</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">For Sale - Mainland</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">出售 - 大陆</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/directory/Directory Tabs/land_sales_panel/type/EstateSales</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">For Sale - Estate</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">出售 - 土地</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/friends/friend_list</Data></Cell>
-    <Cell><Data ss:Type="String">tool_tip</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Hold shift or control while clicking to select multiple friends</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">当点击选择多位好友时,按住shift键或者control键</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/friends/friend_list/friend_name</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Name</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">名字</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/friends/rights_container/friend_name_label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Select friend(s) to change rights...</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">选择变更权利的朋友...</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/friends/rights_container/online_status_cb</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Can see my online status</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">我的在线状态可见</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/friends/rights_container/online_status_cb</Data></Cell>
-    <Cell><Data ss:Type="String">tool_tip</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Set whether this friend see my online status in their friends list or calling cards</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">在朋友的好友列表或呼叫卡中设置我的在线状态是否对该朋友可见</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/friends/rights_container/map_status_cb</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Can see me on the map</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">我在地图中的位置可见</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/friends/rights_container/map_status_cb</Data></Cell>
-    <Cell><Data ss:Type="String">tool_tip</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Set whether this friend see my location on their map</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">设置该好友是否对我在地图中的位置可见</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/friends/rights_container/modify_status_cb</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Can modify my objects</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">可以修改我的东东</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/friends/rights_container/modify_status_cb</Data></Cell>
-    <Cell><Data ss:Type="String">tool_tip</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Set whether this friend can modify my objects</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">设置该好友是否可以修改我的东东</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/friends/rights_container/process_rights_label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Processing rights change...</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">正在处理权力变更...</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/inspect</Data></Cell>
-    <Cell><Data ss:Type="String">title</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Inspect Objects</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">检查东东</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/inspect/object_list</Data></Cell>
-    <Cell><Data ss:Type="String">tool_tip</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Select an object from this list to highlight it in-world</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">从这份列表中选择一项东东,使它在游戏世界中被突显</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/inspect/object_list/object_name</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Object Name</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">东东名称</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/inspect/object_list/owner_name</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Owner Name</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">主人名字</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/inspect/object_list/creator_name</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Creator Name</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">创造者名字</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/inspect/object_list/creation_date</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">Creation Date</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">创造时间</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/inspect/button owner</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">See Owner Profile...</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">查看主人档案...</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/inspect/button owner</Data></Cell>
-    <Cell><Data ss:Type="String">label_selected</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/inspect/button owner</Data></Cell>
-    <Cell><Data ss:Type="String">tool_tip</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">See profile of the highlighted object's owner</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">查看被突显的东东的主人名字</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/inspect/button creator</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">See Creator Profile...</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">查看创建者档案...</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/inspect/button creator</Data></Cell>
-    <Cell><Data ss:Type="String">label_selected</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/inspect/button creator</Data></Cell>
-    <Cell><Data ss:Type="String">tool_tip</Data></Cell>
-    <Cell ss:Index="5"><Data ss:Type="String">See profile of the highlighted object's original creator</Data></Cell>
-    <Cell ss:Index="7"><Data ss:Type="String">查看被突显东东的创造者的档案</Data></Cell>
-   </Row>
-  </Table>
-  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
-   <Print>
-    <ValidPrinterInfo/>
-    <PaperSizeIndex>9</PaperSizeIndex>
-    <HorizontalResolution>1200</HorizontalResolution>
-    <VerticalResolution>1200</VerticalResolution>
-   </Print>
-   <Selected/>
-   <Panes>
-    <Pane>
-     <Number>3</Number>
-     <ActiveRow>59</ActiveRow>
-     <ActiveCol>1</ActiveCol>
-    </Pane>
-   </Panes>
-   <ProtectObjects>False</ProtectObjects>
-   <ProtectScenarios>False</ProtectScenarios>
-  </WorksheetOptions>
- </Worksheet>
- <Worksheet ss:Name="Sheet2">
-  <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="56" x:FullColumns="1"
-   x:FullRows="1" ss:DefaultColumnWidth="60" ss:DefaultRowHeight="17.25">
-   <Column ss:Width="221.25"/>
-   <Column ss:Width="1187.25"/>
-   <Column ss:Width="107.25"/>
-   <Column ss:Width="549.75"/>
-   <Column ss:Width="528"/>
-   <Column ss:Width="617.25"/>
-   <Column ss:Width="117"/>
-   <Row>
-    <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell>
-   </Row>
-   <Row>
-    <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell>
-    <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell>
-    <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell>
-    <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell>
-    <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell>
-    <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell>
-    <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell>
-   </Row>
-   <Row ss:Height="51.75">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//CannotDeedLandNoRegion/message</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Unable to deed land:&#10;Cannot find the region this land is in.&#10;Please use Help -&gt; Report Bug to report this.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">Unable to deed land:&#10;Cannot find the region this land is in.&#10;Please use Tools -&gt; Report Bug to report this.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">无法转让土地:&#10;无法找到此土地所属的区域。&#10;请使用帮助 -&gt; 报告漏洞来报告此项错误。</Data></Cell>
-   </Row>
-   <Row ss:Height="51.75">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//CannotButLandRegionNotFound/message</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Unable to buy land:&#10;Cannot find the region this land is in.&#10;Please use Help -&gt; Report Bug to report this.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">Unable to buy land:&#10;Cannot find the region this land is in.&#10;Please use Tools -&gt; Report Bug to report this.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">无法购买土地:&#10;无法找到该土地所在区域。&#10;请使用帮助 -&gt; 报告漏洞来向我们报告这项错误。</Data></Cell>
-   </Row>
-   <Row ss:Height="51.75">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//CannotReleaseLandRegionNotFound/message</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Unable to abandon land:&#10;Cannot find the region this land is in.&#10;Please use Help -&gt; Report Bug to report this.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">Unable to abandon land:&#10;Cannot find the region this land is in.&#10;Please use Tools -&gt; Report Bug to report this.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">无法放弃土地:&#10;无法找到此土地所属的区域。&#10;请使用帮助 -&gt; 报告漏洞来报告这个错误。</Data></Cell>
-   </Row>
-   <Row ss:Height="51.75">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//CannotDivideLandNoRegion/message</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Unable to divide land:&#10;Cannot find the region this land is in.&#10;Please use Help -&gt; Report Bug to report this.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">Unable to divide land:&#10;Cannot find the region this land is in.&#10;Please use Tools -&gt; Report Bug to report this.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">无法划分土地:&#10; 无法找到土地所属区域。&#10;请使用帮助 -&gt; 报告漏洞来报告此项错误。</Data></Cell>
-   </Row>
-   <Row ss:Height="51.75">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//CannotJoinLandNoRegion/message</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Unable to join land:&#10;Cannot find the region this land is in.&#10;Please use Help -&gt; Report Bug to report this.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">Unable to join land:&#10;Cannot find the region this land is in.&#10;Please use Tools -&gt; Report Bug to report this.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">无法连接土地:&#10;无法找到该土地所属的区域.&#10;请使用帮助 -&gt; 报告程序漏洞,让我们知道问题所在.</Data></Cell>
-   </Row>
-   <Row ss:Height="103.5">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//CannotSaveToAssetStore/message</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Unable to save [NAME] to central asset store.&#10;This is usually a temporary failure. Please&#10;customize and save the wearable again in a&#10;few minutes. If this problem persists, please&#10;click on the 'Help | Report Bug' pull down menu&#10;and provide details about your network setup.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">Unable to save [NAME] to central asset store.&#10;This is usually a temporary failure. Please&#10;customize and save the wearable again in a&#10;few minutes. If this problem persists, please&#10;click on the 'Tools | Report Bug' pull down menu&#10;and provide details about your network setup.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">无法储存[NAME]至终属资产存储.&#10;这通常是暂时性功能障碍。请用户化后再次保存。&#10;如果问题依然存在,请点击&#10;帮助/报告漏洞并提供&#10;客户网络设置的具体信息。</Data></Cell>
-   </Row>
-   <Row ss:Height="86.25">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//AddFriend/message</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Friends can track each other on the map and &#10;will receive online status updates. &#10; &#10;Offer friendship to [NAME]?</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">Friends can give permissions to &#10;track each other on the map and &#10;receive online status updates. &#10; &#10;Offer friendship to [NAME]?</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">好友们可以在地图上互相追踪,并可以在线接受更新信息. &#10; &#10;是否发送友谊卡给[NAME]?</Data></Cell>
-   </Row>
-   <Row ss:Height="103.5">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//DownloadMacMandatory/message</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">A new version of [SECOND_LIFE] is available.&#10;[MESSAGE]&#10; &#10;You must download this update to use the system.&#10; &#10;Download to your Applications folder?</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">A new version of [SECOND_LIFE] is available.&#10;[MESSAGE]&#10;&#10;You must download this update to use the system.&#10; &#10;Download to your Applications folder?</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">[SECOND_LIFE]有新版本可用。&#10;[MESSAGE]&#10; &#10;你必须下再次更新才能运行系统。&#10;是否下载更新至应用软件文件夹?</Data></Cell>
-   </Row>
-   <Row ss:Height="155.25">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//AddClassified/message</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the&#10;Search directory for one week.&#10; &#10;Fill out your ad, then click 'Publish...' to add it to the&#10;directory.&#10; &#10;You'll be asked for a price to pay when clicking Publish.&#10;Paying more makes your ad appear higher in the list, and&#10;also appear higher when people search for keywords.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the&#10;Find directory for one week.&#10; &#10;Fill out your ad, then click 'Publish...' to add it to the&#10;directory.&#10; &#10;You'll be asked for a price to pay when clicking Publish.&#10;Paying more makes your ad appear higher in the list, and&#10;also appear higher when people search for keywords.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">分类广告会在查找名录的'Classified'栏目里保留一周时间。&#10;&#10; &#10;填写你的广告,然后点击'发布...',既添加广告至广告名录中。&#10;当点击发布时,你将被要求支付发布广告费用. 大额支付意味着你的广告会在名单较前的地方出现,并且当用关键词查找时,你的广告也出现在查询结果较高的位置上。</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//HelpEstateExternallyVisible</Data></Cell>
-    <Cell><Data ss:Type="String">title</Data></Cell>
-    <Cell><Data ss:Type="String">Visible From Mainland</Data></Cell>
-    <Cell><Data ss:Type="String">Public Access</Data></Cell>
-    <Cell><Data ss:Type="String">从大陆可视</Data></Cell>
-   </Row>
-   <Row ss:Height="69">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//HelpEstateExternallyVisible/message</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Sets whether residents who are in the Linden owned 'mainland' &#10;estates can see your estate on the world map. &#10; &#10;Default: on</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">Sets whether residents who are on other estates can enter this&#10;    estate without being on an access list.&#10; &#10;Default: on</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">设置在林登所拥有的'大陆'领地内的居民 &#10;是否能从地图上看到你的领地。 &#10; &#10;默认:可以</Data></Cell>
-   </Row>
-   <Row ss:Height="155.25">
-    <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//HelpReportBug/message</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Use this tool to report technical features that do not perform &#10;as described or expected. All bug reports are investigated and &#10;resolved. No email response will be sent, you may reply to the &#10;auto-response email to add more details to your report. &#10;If you are having a technical difficulty, please contact Support at: &#10; &#10;http://secondlife.com/community/support.php</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">Use this tool to *only* report technical features that do not perform as &#10;described or expected, please provide as much detail as possible, You &#10;may reply to the auto-response email to add more details to your report.&#10;All bug reports are investigated and assessed. No email response will be sent.&#10;-&#10;If you are having a technical difficulty, please contact Support at: &#10;http://secondlife.com/community/support.php&#10;-&#10;Note: Incomplete reports will not be investigated</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">使用这个工具报告系统中没有描述过的意外状态。所有的缺陷报告都会被调查并解决。我们不会发电子邮件回复,但是你们可以在回复系统自动发出的回复邮件中加上对你的报告的更多细节描述。如果你有技术困难,请跟我们的支持中心联系:&#10; &#10;http://secondlife.com/community/support.php</Data></Cell>
-   </Row>
-   <Row ss:Height="207">
-    <Cell><Data ss:Type="String">floater_about.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/floater_about/credits_editor</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW and many others.&#10;&#10;Thank you to the following residents for helping to ensure that this is the best version yet: Kyrah Abattoir, Icesis Anansi, Clifton Antonelli, Nargus Asturias, Justizin Austinmer, Drake Bacon, Bitzer Balderdash, McWheelie Baldwin, SuezanneC Baskerville, Sweetheart Baskerville, Logan Bauer, Malarthi Behemoth, phoenix Behemoth, Eva Bellambi, Samgame Bertrand, Woody Blair, Tin Bling, Bibi Book, Barney Boomslang, Eric Boyer, Chromal Brodsky, Kerian Bunin, Lara Bunin, BigRick Byrd, Jillian Callahan, Hypatia Callisto, Frans Charming, nathalie Christensen, Francis Chung, pizzaguy Clutterbuck, Evo Commons, Entity Cosmo, Grazel Cosmo, Tiger Crossing, Fremont Cunningham, Jaki Daligdig, Sugar Darling, Todd David, Norman Desmoulins, Gxeremio Dimsum, Happy Dimsum, Kim Dingo, Roy Domela, Cory Edo, Delu Elytis, DBDigital Epsilon, Leeza Everett, Garth FairChang, Snowflake Fairymeadow, Khamon Fate, lex Fitzcarraldo, Kitto Flora, Angel Fluffy, CrystalShard Foo, Raudf Fox, Govindira Galatea, Rizpah Galatea, Tre Giles, Gattz Gilman, Kex Godel, Armandi Goodliffe, Tsu Goodliffe, Nickolas Goodman, Damen Gorilla, Nytemyst Grace, Mhaijik Guillaume, Gleeb Gupte, Ebonfire Harbinger, Bethanee Heaney, Jenny Hicks, Sandling Honey, Victoria Jacques, Adso Krogstad, Travis Lambert, simon Lameth, Duffy Langdon, Aaron Levy, Jade Lily, Gwyneth Llewelyn, Lola Lollipop, Michi Lumin, KaiLastOfTheBrunnenG Macdonald, Jesse Malthus, Herry Maltz, Seth Mandelbrot, Raavi Mann, Shirley Marquez, Dnate Mars, Ima Mechanique, Hawk Mendicant, Mercury Metropolitan, Haravikk Mistral, Trent Mondrian, Nexus Nash, Seraph Nephilim, Lewis Nerd, Aurael Neurocam, Lex Neva, Prokofy Neva, Seagel Neville, Kate Nicholas, Didde Nielsen, Richard Noonan, crevan Nori, Maczter Oddfellow, vanler Odets, Fat Ogre, Hamncheese Omlet, Strife Onizuka, Panthar Orlowski, Jessica Ornitz, Ron Overdrive, OmniCron Overlord, Dargon Pacer, Kar Parks, Eloise Pasteur, Caliandris Pendragon, Julianna Pennyfeather, Iron Perth, Shawk Pertwee, Mera Pixel, Elle Pollack, Phoenix Psaltery, Hank Ramos, Jon Ree, Tam Ree, Zi Ree, Jon Rolland, BamBam Sachertorte, kai Sachertorte, Mily Sartre, ice Semple, Desmond Shang, DigiKatt Shaw, Felix Sholokhov, Rhyph Somme, Rain Soothsayer, Oz Spade, squeekachu Spearmann, Wesley Spengler, Belaya Statosky, eltee Statosky, Khashai Steinbeck, Draco Steinhardt, Hope Stilman, Ashen Stygian, Seifert Surface, Gigs Taggart, Dolmere Talamasca, JayJay Talamasca, Becky Tardis, Fenris Tardis, Cubey Terra, Osprey Therian, Millie Thompson, John Toonie, Charlene Trudeau, Lyr Tuppakaka, Indy Turner, Luthien Unsung, Random Unsung, Huns Valen, Valdemar Virgo, Gordon Wendt, Mike Westerburg, Wayfinder Wishbringer, Lee Wormser, Aimee Xia, nimrod Yaffle, Yiffy Yaffle, Elle74 Zaftig and many others.&#10;&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;Cg Copyright (C) 2002, NVIDIA Corporationa.&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel at haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay at cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;All rights reserved.  See licenses.txt for details.&#10;&#10;&#10;It's not a glitch, it's a feature.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, JillS, Yool, Jane and many others.&#10;&#10;Thank you to the following residents for helping to ensure that this is the best version yet: Atte Aderdeen, Alise Altman, Doomby Arrow, Rox Arten, Jesse Barnett, Smiley Barry, SuezanneC Baskerville, Glitch Braess, Dorian Caldwell, JuiceBox132 Castro, Aden Christensen, Fremont Cunningham, Zirnitra Demar, Errafel Eccleston, Cory Edo, Kitto Flora, Ashrilyn Hayashida, Elektra Hesse, Friar Jeffries, Samuel Jordan, DeLisa Junot, Howie Lament, Candide LeMay, Michi Lumin, Ikani Mahana, SignpostMarv Martin, Ksathra Mason, Console Mission, Haravikk Mistral, Usagi Musashi, Lex Neva, Jamma Newt, Blaze Nielsen, Destiny Niles, Tateru Nino, Harald Nomad, Nerk Noonan, Stumbelina Ophelia, Fledhyris Proudhon, Londyn Reatequi, Zi Ree, Hank Rucker, BamBam Sachertorte, kai Sachertorte, Sean Sao, Funk Schnook, Magnum Serpentine, Nekosune Smails, Rhyph Somme, Al Sonic, Oz Spade, Wesley Spengler, Steve Steed, Gearsawe Stonecutter, Dirk Talamasca, Dolmere Talamasca, John Taylor, Raymond Tuxing, Churchill Tweak, Huns Valen, windozer Vargas, Sabby Whiplash, Raven Wombat, Beatfox Xevious, Yiffy Yaffle, Alpha Zaius, Hewee Zetkin, Jai Zucker and many others.&#10;&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;Cg Copyright (C) 2002, NVIDIA Corporationa.&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel at haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay at cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;All rights reserved.  See licenses.txt for details.&#10;&#10;&#10;Don't hassle the hoff.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">第二人生的推出应感谢以下人物的贡献: Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW and many others.&#10;&#10;感谢以下居民,他们的帮助保证了这次第二人生的版本是有史以来最出色的: Kyrah Abattoir, Icesis Anansi, Clifton Antonelli, Nargus Asturias, Justizin Austinmer, Drake Bacon, Bitzer Balderdash, McWheelie Baldwin, SuezanneC Baskerville, Sweetheart Baskerville, Logan Bauer, Malarthi Behemoth, phoenix Behemoth, Eva Bellambi, Samgame Bertrand, Woody Blair, Tin Bling, Bibi Book, Barney Boomslang, Eric Boyer, Chromal Brodsky, Kerian Bunin, Lara Bunin, BigRick Byrd, Jillian Callahan, Hypatia Callisto, Frans Charming, nathalie Christensen, Francis Chung, pizzaguy Clutterbuck, Evo Commons, Entity Cosmo, Grazel Cosmo, Tiger Crossing, Fremont Cunningham, Jaki Daligdig, Sugar Darling, Todd David, Norman Desmoulins, Gxeremio Dimsum, Happy Dimsum, Kim Dingo, Roy Domela, Cory Edo, Delu Elytis, DBDigital Epsilon, Leeza Everett, Garth FairChang, Snowflake Fairymeadow, Khamon Fate, lex Fitzcarraldo, Kitto Flora, Angel Fluffy, CrystalShard Foo, Raudf Fox, Govindira Galatea, Rizpah Galatea, Tre Giles, Gattz Gilman, Kex Godel, Armandi Goodliffe, Tsu Goodliffe, Nickolas Goodman, Damen Gorilla, Nytemyst Grace, Mhaijik Guillaume, Gleeb Gupte, Ebonfire Harbinger, Bethanee Heaney, Jenny Hicks, Sandling Honey, Victoria Jacques, Adso Krogstad, Travis Lambert, simon Lameth, Duffy Langdon, Aaron Levy, Jade Lily, Gwyneth Llewelyn, Lola Lollipop, Michi Lumin, KaiLastOfTheBrunnenG Macdonald, Jesse Malthus, Herry Maltz, Seth Mandelbrot, Raavi Mann, Shirley Marquez, Dnate Mars, Ima Mechanique, Hawk Mendicant, Mercury Metropolitan, Haravikk Mistral, Trent Mondrian, Nexus Nash, Seraph Nephilim, Lewis Nerd, Aurael Neurocam, Lex Neva, Prokofy Neva, Seagel Neville, Kate Nicholas, Didde Nielsen, Richard Noonan, crevan Nori, Maczter Oddfellow, vanler Odets, Fat Ogre, Hamncheese Omlet, Strife Onizuka, Panthar Orlowski, Jessica Ornitz, Ron Overdrive, OmniCron Overlord, Dargon Pacer, Kar Parks, Eloise Pasteur, Caliandris Pendragon, Julianna Pennyfeather, Iron Perth, Shawk Pertwee, Mera Pixel, Elle Pollack, Phoenix Psaltery, Hank Ramos, Jon Ree, Tam Ree, Zi Ree, Jon Rolland, BamBam Sachertorte, kai Sachertorte, Mily Sartre, ice Semple, Desmond Shang, DigiKatt Shaw, Felix Sholokhov, Rhyph Somme, Rain Soothsayer, Oz Spade, squeekachu Spearmann, Wesley Spengler, Belaya Statosky, eltee Statosky, Khashai Steinbeck, Draco Steinhardt, Hope Stilman, Ashen Stygian, Seifert Surface, Gigs Taggart, Dolmere Talamasca, JayJay Talamasca, Becky Tardis, Fenris Tardis, Cubey Terra, Osprey Therian, Millie Thompson, John Toonie, Charlene Trudeau, Lyr Tuppakaka, Indy Turner, Luthien Unsung, Random Unsung, Huns Valen, Valdemar Virgo, Gordon Wendt, Mike Westerburg, Wayfinder Wishbringer, Lee Wormser, Aimee Xia, nimrod Yaffle, Yiffy Yaffle, Elle74 Zaftig and many others.&#10;&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;Cg Copyright (C) 2002, NVIDIA Corporationa.&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel at haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay at cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;All rights reserved.  查看licenses.txt获取细节.&#10;&#10;&#10;这不是一次故障,而是一个特性.</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/edit objects check</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell><Data ss:Type="String">Create Objects</Data></Cell>
-    <Cell><Data ss:Type="String">All Residents</Data></Cell>
-    <Cell><Data ss:Type="String">创造东东</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/check other scripts</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell><Data ss:Type="String">Run Other Scripts</Data></Cell>
-    <Cell><Data ss:Type="String">All Residents</Data></Cell>
-    <Cell><Data ss:Type="String">运行其它脚本</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/check group scripts</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell><Data ss:Type="String">Run Group Scripts</Data></Cell>
-    <Cell><Data ss:Type="String">Group</Data></Cell>
-    <Cell><Data ss:Type="String">运行社团脚本</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/chat floater/Mute resident</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell><Data ss:Type="String">Mute resident</Data></Cell>
-    <Cell><Data ss:Type="String">Mute</Data></Cell>
-    <Cell><Data ss:Type="String">屏蔽居民</Data></Cell>
-   </Row>
-   <Row ss:Height="34.5">
-    <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/directory/Directory Tabs/popular_panel/These are the most popular places in the world, as measured by traffic,         the amount of time people spend there.</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">These are the most popular places in the world, as measured by traffic,&#10; the amount of time people spend there.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">These are the most popular places in the world, as measured by traffic,&#10;the amount of time people spend there.</Data></Cell>
-    <Cell><Data ss:Type="String">这里有在第二人生世界里最流行的场所,由交通状况,和人们在那里花费的时间长短来衡量。</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/friends/im_btn</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell><Data ss:Type="String">IM...</Data></Cell>
-    <Cell><Data ss:Type="String">IM</Data></Cell>
-    <Cell><Data ss:Type="String">即时通...</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/friends/offer_teleport_btn</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell><Data ss:Type="String">Offer Teleport...</Data></Cell>
-    <Cell><Data ss:Type="String">Teleport...</Data></Cell>
-    <Cell><Data ss:Type="String">提供闪电传送...</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/friends/profile_btn</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell><Data ss:Type="String">Profile...</Data></Cell>
-    <Cell><Data ss:Type="String">Profile</Data></Cell>
-    <Cell><Data ss:Type="String">档案...</Data></Cell>
-   </Row>
-   <Row ss:Height="155.25">
-    <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/im_floater/live_help_dialog</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">*** Welcome to Live Help, where our wonderful volunteers assist their fellow Residents with Second Life! *** &#10;Please first check our SL Help Pages by pressing F1. &#10;If your answer isn't there, please enter your question to begin, then allow a few moments for available helpers to respond. &#10;Please don't close Live Help until you're finished. If you don't hear back, you can always try again later. &#10;NOTE: Live Helpers aren't Linden employees, so unless a person responding has the last name 'Linden', answers should be considered unofficial.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">*** Welcome to Help Request *** &#10;Please first check our SL Help Pages by pressing F1, or by accessing the Knowledge Base http://secondlife.com/knowledgebase/ &#10;If your answer is not there, please enter your question to begin, then allow a few moments for available helpers to respond.&#10;-=-=- Response times will vary, especially during peak times -=-=-</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">*** 欢迎来到在线帮助站,在这里,我们出色的志愿者们会协助他们的第二人生居民朋友们在第二人生里精彩的生活! *** &#10;请先按F1键,进入第二人生帮助页面。如果你想要的答案不在这里,请键入你的问题,点击开始,等候若干分钟后,在线的帮助者会给你回复。&#10;如果您的处理过程没有结束,请不要关闭在线帮助站的页面。如果您没有得到回应,你可以一直选择重新尝试一遍。 &#10;注意: 在线帮助者并不是林登实验室的雇员, 所以,除非回应人的姓氏为'Linden',否则回复都应视为非正式的.</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_preview_notecard.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/preview notecard/Notecard Editor</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Loading...</Data></Cell>
-    <Cell><Data ss:Type="String">Loading...</Data></Cell>
-    <Cell><Data ss:Type="String">请等待...</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_report_abuse.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/floater_report_abuse/sim_title</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Simulator:</Data></Cell>
-    <Cell><Data ss:Type="String">Region:</Data></Cell>
-    <Cell><Data ss:Type="String">模拟器:</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_report_bug.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/bug_reporter/dscr_title</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Details:</Data></Cell>
-    <Cell><Data ss:Type="String">Details: (Please provide as much information as possible)</Data></Cell>
-    <Cell><Data ss:Type="String">详细:</Data></Cell>
-   </Row>
-   <Row ss:Height="86.25">
-    <Cell><Data ss:Type="String">floater_report_bug.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/bug_reporter/details_edit</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Steps to reproduce the bug:&#10;&#10;Observed results:&#10;&#10;Expected results:</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">Steps to reproduce the bug:&#10;&#10;Observed results:&#10;&#10;Expected results:</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">修复漏洞的途径::&#10;&#10;观察的结果::</Data></Cell>
-   </Row>
-   <Row ss:Height="69">
-    <Cell><Data ss:Type="String">floater_report_bug.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/bug_reporter/bug_aviso</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">If this bug allows you to do something you should not be able &#10;to do, especially if it impacts performance or security, please &#10;select the 'Exploit' category. Thank you!</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">Note: Incomplete reports will not be investigated&#10;If this bug allows you to do something you should not be able &#10;to do, especially if it impacts performance or security, please &#10;select the 'Exploit' category. Thank you!</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">如果这个缺陷允许你执行你没有能力执行的动作,特别是一些会影响游戏表现和安全性能的时候,请选择'开发' 类别. 非常感谢!</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_script_ed_panel.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/script panel/Script Editor</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Loading...</Data></Cell>
-    <Cell><Data ss:Type="String">Loading...</Data></Cell>
-    <Cell><Data ss:Type="String">请等待...</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_top_objects.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/top_objects/id_text</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Object ID:</Data></Cell>
-    <Cell><Data ss:Type="String">Object ID:</Data></Cell>
-    <Cell><Data ss:Type="String">东东ID:</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">floater_world_map.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/worldmap/location</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Search by Region Name</Data></Cell>
-    <Cell ss:Index="6"><Data ss:Type="String">按地区名搜索</Data></Cell>
-   </Row>
-   <Row ss:Height="86.25">
-    <Cell><Data ss:Type="String">notify.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//OfferFriendship/message</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">[NAME] is offering friendship.&#10; &#10;You will be able to track each other on&#10;the map and will receive online status&#10;updates.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">[NAME] is offering friendship.&#10;      &#10;      By default, you will be able to &#10;see each other's online status.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">[NAME]正在发送好友邀请.&#10; &#10;你可以通过地图追踪彼此,并将收到好友在线状态更新。</Data></Cell>
-   </Row>
-   <Row ss:Height="103.5">
-    <Cell><Data ss:Type="String">notify.xml</Data></Cell>
-    <Cell><Data ss:Type="String">//FirstSandbox/message</Data></Cell>
-    <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">This is a sandbox region.&#10;Objects you build here may be deleted after you &#10;leave the area, and the region will be wiped &#10;every [HOURS] hours starting at [TIME] AM Pacific Time.&#10; &#10;Sandbox regions are uncommon, and are marked with signs.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">This is a sandbox region.&#10;Objects you build here may be deleted after&#10;you leave the area, Sandboxes clean on a regular basis, please refer to the information at the top of the screen next to the region name.&#10; &#10;Sandbox regions are uncommon, and are marked with signs.</Data></Cell>
-    <Cell ss:StyleID="s23"><Data ss:Type="String">这是一块沙盒区域。&#10;在这里创建的东东将在其离开这里后被删除,且此区域将每[HOURS]小时抹去一次所创建东东,始于太平洋时间早上[TIME].&#10; &#10;沙盒区域并不常见, 并会有特殊标识标出。</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_avatar.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/Panel Avatar/tab/2nd Life/online_yes</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Online: Yes</Data></Cell>
-    <Cell><Data ss:Type="String">Currently Online</Data></Cell>
-    <Cell><Data ss:Type="String">是否在线: 是</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_media_remote.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/music_remote/text</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Movie control</Data></Cell>
-    <Cell><Data ss:Type="String">Movies</Data></Cell>
-    <Cell><Data ss:Type="String">电影控制</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_music_remote.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/music_remote/text</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Music control</Data></Cell>
-    <Cell><Data ss:Type="String">Music</Data></Cell>
-    <Cell><Data ss:Type="String">音乐控制</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_preferences_chat.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/chat/arrow_keys_move_avatar_check</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell><Data ss:Type="String">Arrow keys move avatar when chatting</Data></Cell>
-    <Cell><Data ss:Type="String">Arrow keys always move avatar when chatting</Data></Cell>
-    <Cell><Data ss:Type="String">聊天时可用箭头键移动你的化身</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_preferences_general.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/general_panel/language_combobox/Chinese</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Chinese</Data></Cell>
-    <Cell><Data ss:Type="String">Chinese - Beta</Data></Cell>
-    <Cell><Data ss:Type="String">中文</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_preferences_general.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/general_panel/language_combobox/Deutsch(German)</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Deutsch (German)</Data></Cell>
-    <Cell><Data ss:Type="String">Deutsch (German) - Beta</Data></Cell>
-    <Cell><Data ss:Type="String">Deutsch (German)</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_preferences_general.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/general_panel/language_combobox/(Japanese)</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">日本語 (Japanese)</Data></Cell>
-    <Cell><Data ss:Type="String">日本語 (Japanese) - Beta</Data></Cell>
-    <Cell><Data ss:Type="String">日本語 (Japanese)</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_preferences_general.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/general_panel/language_combobox/(Korean)</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">한국어 (Korean)</Data></Cell>
-    <Cell><Data ss:Type="String">한국어 (Korean) - Beta</Data></Cell>
-    <Cell><Data ss:Type="String">한국어 (Korean)</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_preferences_im.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/im</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell><Data ss:Type="String">IM</Data></Cell>
-    <Cell><Data ss:Type="String">Communication</Data></Cell>
-    <Cell><Data ss:Type="String">即时通</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_preferences_im.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/im/text_box</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">IM Options:</Data></Cell>
-    <Cell><Data ss:Type="String">Profile Online Status:</Data></Cell>
-    <Cell><Data ss:Type="String">即时通选项:</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_preferences_im.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/im/text_box2</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Busy Mode Response:</Data></Cell>
-    <Cell><Data ss:Type="String">IM Options:</Data></Cell>
-    <Cell><Data ss:Type="String">忙碌模式的自动回复:</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_region_estate.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/Estate/externally_visible_check</Data></Cell>
-    <Cell><Data ss:Type="String">label</Data></Cell>
-    <Cell><Data ss:Type="String">Visible From Mainland</Data></Cell>
-    <Cell><Data ss:Type="String">Public Access</Data></Cell>
-    <Cell><Data ss:Type="String">从大陆可视</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/Textures/detail_texture_text</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Detail Textures (requires 512x512, 24 bit .tga files)</Data></Cell>
-    <Cell><Data ss:Type="String">Terrain Textures (requires 512x512, 24 bit .tga files)</Data></Cell>
-    <Cell><Data ss:Type="String">详细质地(要求512*512(分辨率),24bit.tga文件格式。</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/Textures/height_text_lbl5</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">1 (Low)</Data></Cell>
-    <Cell><Data ss:Type="String">Texture Elevation Ranges</Data></Cell>
-    <Cell><Data ss:Type="String">1 (低)</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/Textures/height_text_lbl6</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="Number">2</Data></Cell>
-    <Cell><Data ss:Type="String">Southwest</Data></Cell>
-    <Cell><Data ss:Type="Number">2</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/Textures/height_text_lbl7</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="Number">3</Data></Cell>
-    <Cell><Data ss:Type="String">Northwest</Data></Cell>
-    <Cell><Data ss:Type="Number">3</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/Textures/height_text_lbl8</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">4 (High)</Data></Cell>
-    <Cell><Data ss:Type="String">Southeast</Data></Cell>
-    <Cell><Data ss:Type="String">4 (高)</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/Textures/height_text_lbl9</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Texture Elevation Ranges</Data></Cell>
-    <Cell><Data ss:Type="String">Northeast</Data></Cell>
-    <Cell><Data ss:Type="String">材质范围</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/Textures/height_text_lbl10</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Southwest</Data></Cell>
-    <Cell><Data ss:Type="String">These values represent the blend range for the textures above.</Data></Cell>
-    <Cell><Data ss:Type="String">西南</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/Textures/height_text_lbl11</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Northwest</Data></Cell>
-    <Cell><Data ss:Type="String">Measured in meters, the LOW value is the MAXIMUM height of Texture #1,</Data></Cell>
-    <Cell><Data ss:Type="String">西北</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/Textures/height_text_lbl12</Data></Cell>
-    <Cell ss:Index="4"><Data ss:Type="String">Southeast</Data></Cell>
-    <Cell><Data ss:Type="String">and the HIGH value is the MINIMUM height of Texture #4.</Data></Cell>
-    <Cell><Data ss:Type="String">东南</Data></Cell>
-   </Row>
-   <Row>
-    <Cell><Data ss:Type="String">panel_toolbar.xml</Data></Cell>
-    <Cell><Data ss:Type="String">/panel_toolbar/chat_btn</Data></Cell>
-    <Cell><Data ss:Type="String">tool_tip</Data></Cell>
-    <Cell><Data ss:Type="String">Talk to people nearby. Click Chat then History to see what has been said.</Data></Cell>
-    <Cell><Data ss:Type="String">Talk to people nearby. (Enter)</Data></Cell>
-    <Cell><Data ss:Type="String">与附近的人交谈.点击交谈之后点击历史去查找交谈记录。</Data></Cell>
-   </Row>
-  </Table>
-  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
-   <Print>
-    <ValidPrinterInfo/>
-    <PaperSizeIndex>9</PaperSizeIndex>
-    <HorizontalResolution>1200</HorizontalResolution>
-    <VerticalResolution>1200</VerticalResolution>
-   </Print>
-   <TopRowVisible>33</TopRowVisible>
-   <LeftColumnVisible>5</LeftColumnVisible>
-   <Panes>
-    <Pane>
-     <Number>3</Number>
-     <ActiveRow>46</ActiveRow>
-     <ActiveCol>5</ActiveCol>
-    </Pane>
-   </Panes>
-   <ProtectObjects>False</ProtectObjects>
-   <ProtectScenarios>False</ProtectScenarios>
-  </WorksheetOptions>
- </Worksheet>
- <Worksheet ss:Name="Sheet3">
-  <Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
-   x:FullRows="1" ss:DefaultColumnWidth="60" ss:DefaultRowHeight="17.25"/>
-  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
-   <ProtectObjects>False</ProtectObjects>
-   <ProtectScenarios>False</ProtectScenarios>
-  </WorksheetOptions>
- </Worksheet>
-</Workbook>
diff --git a/indra/newview/skins/silver/xui/en-us/floater_about_land.xml b/indra/newview/skins/silver/xui/en-us/floater_about_land.xml
index d7a6540..e6034df 100644
--- a/indra/newview/skins/silver/xui/en-us/floater_about_land.xml
+++ b/indra/newview/skins/silver/xui/en-us/floater_about_land.xml
@@ -481,13 +481,17 @@ Go to World menu > About Land or select another parcel to show its details.
 			</text>
 			<check_box bottom="-40" enabled="true" follows="left|top" font="SansSerifSmall"
 			     height="16" initial_value="false" label="Edit Terrain" left="14"
-			     mouse_opaque="true" name="edit land check" radio_style="false" width="268" />
+			     mouse_opaque="true" name="edit land check" radio_style="false"
+                             tool_tip="If checked, anyone can terraform your land. It is best to leave this unchecked, as you can always edit your own land."
+                             width="268" />
 			<check_box bottom="-60" enabled="true" follows="left|top" font="SansSerifSmall"
 			     height="16" initial_value="false" label="Create Landmarks" left="14"
 			     mouse_opaque="true" name="check landmark" radio_style="false" width="268" />
 			<check_box bottom="-80" enabled="true" follows="left|top" font="SansSerifSmall"
 			     height="16" initial_value="false" label="Fly" left="14" mouse_opaque="true"
-			     name="check fly" radio_style="false" width="268" />
+			     name="check fly" radio_style="false"
+                             tool_tip="If checked, Residents can fly on your land. If unchecked, they can only fly into and over your land."
+                             width="268" />
 			<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
 			     bottom="-40" drop_shadow_visible="true" enabled="true" follows="left|top"
 			     font="SansSerifSmall" h_pad="0" halign="left" height="16" left="178"
@@ -538,11 +542,13 @@ Go to World menu > About Land or select another parcel to show its details.
 			</text>
 			<check_box bottom="-120" enabled="true" follows="left|top" font="SansSerifSmall"
 			     height="16" initial_value="false" label="Safe (no damage)" left="14"
-			     mouse_opaque="true" name="check safe" radio_style="false" width="268" />
+			     mouse_opaque="true" name="check safe" radio_style="false"
+                             tool_tip="If checked, sets the land to Safe, disabling damage combat. If cleared, damage combat is enabled."
+                             width="268" />
 			<check_box bottom="-120" enabled="true" follows="left|top" font="SansSerifSmall"
-			     height="16" initial_value="false" label="Restrict Pushing" left="178"
+			     height="16" initial_value="false" label="No Pushing" left="178"
 			     mouse_opaque="true" name="PushRestrictCheck" radio_style="false"
-			     tool_tip="llPushObject will only work through parcel owner scripts or on scripts where the pushee is the script owner."
+			     tool_tip="Prevents scripts from pushing. Checking this option may be useful for preventing disruptive behavior on your land."
 			     width="119" />
 			<check_box bottom="-140" enabled="true" follows="left|top" font="SansSerifSmall"
 			     height="16" initial_value="false"
@@ -622,7 +628,7 @@ Go to World menu > About Land or select another parcel to show its details.
 			<button bottom="-303" enabled="true" follows="left|top" font="SansSerifSmall"
 			     halign="center" height="16" label="Set" label_selected="Set" left="236"
 			     mouse_opaque="true" name="Set" scale_image="true"
-			     tool_tip="Set the landing point to your avatar&apos;s location. It must be inside this land parcel."
+			     tool_tip="Sets the landing point where visitors arrive. Sets to your avatar&apos;s location inside this parcel."
 			     width="50" />
 			<button bottom="-303" enabled="true" follows="left|top" font="SansSerifSmall"
 			     halign="center" height="16" label="Clear" label_selected="Clear" left="291"
@@ -650,10 +656,10 @@ Go to World menu > About Land or select another parcel to show its details.
 				</combo_item>
 			</combo_box>
 			<string name="push_restrict_text">
-				Restrict Pushing
+				No Pushing
 			</string>
 			<string name="push_restrict_region_text">
-				Restrict Pushing (Region Override)
+				No Pushing (Region Override)
 			</string>
 		</panel>
 		<panel border="true" bottom="-349" enabled="true" follows="left|top|right|bottom"
diff --git a/indra/newview/skins/silver/xui/en-us/panel_status_bar.xml b/indra/newview/skins/silver/xui/en-us/panel_status_bar.xml
index 3387566..a8e0f2e 100644
--- a/indra/newview/skins/silver/xui/en-us/panel_status_bar.xml
+++ b/indra/newview/skins/silver/xui/en-us/panel_status_bar.xml
@@ -75,7 +75,7 @@
 	     halign="center" height="18" image_selected="status_no_push.tga"
 	     image_unselected="status_no_push.tga" label="" label_selected="" left="521"
 	     mouse_opaque="true" name="restrictpush" scale_image="false"
-	     tool_tip="llPushObject restricted" visible="false" width="24" />
+	     tool_tip="No Pushing" visible="false" width="24" />
 	<button bottom="-22" enabled="true" follows="right|bottom" font="SansSerif"
 	     halign="center" height="18" image_selected="status_no_voice.tga"
 	     image_unselected="status_no_voice.tga" label="" label_selected=""
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 429e564..d97befb 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -51,7 +51,6 @@ class ViewerManifest(LLManifest):
             self.path("*.pem")
             self.path("*.ini")
             self.path("*.xml")
-            self.path("*.vp")
             self.path("*.db2")
 
             # include the entire shaders directory recursively
@@ -66,35 +65,35 @@ class ViewerManifest(LLManifest):
             self.path("*.tga")
             self.end_prefix("character")
 
-
         # Include our fonts
         if self.prefix(src="fonts"):
             self.path("*.ttf")
             self.path("*.txt")
             self.end_prefix("fonts")
 
-            # skins
-            if self.prefix(src="skins"):
-                    self.path("paths.xml")
-                    # include the entire textures directory recursively
-                    if self.prefix(src="*/textures"):
-                            self.path("*.tga")
-                            self.path("*.j2c")
-                            self.path("*.jpg")
-                            self.path("*.png")
-                            self.path("textures.xml")
-                            self.end_prefix("*/textures")
-                    self.path("*/xui/*/*.xml")
-                    self.path("*/*.xml")
-                    
-                    # Local HTML files (e.g. loading screen)
-                    if self.prefix(src="*/html"):
-                            self.path("*.png")
-                            self.path("*/*/*.html")
-                            self.path("*/*/*.gif")
-                            self.end_prefix("*/html")
-                    self.end_prefix("skins")
-        self.path("lsl_guide.html")
+        # skins
+        if self.prefix(src="skins"):
+                self.path("paths.xml")
+                # include the entire textures directory recursively
+                if self.prefix(src="*/textures"):
+                        self.path("*.tga")
+                        self.path("*.j2c")
+                        self.path("*.jpg")
+                        self.path("*.png")
+                        self.path("textures.xml")
+                        self.end_prefix("*/textures")
+                self.path("*/xui/*/*.xml")
+                self.path("*/*.xml")
+                
+                # Local HTML files (e.g. loading screen)
+                if self.prefix(src="*/html"):
+                        self.path("*.png")
+                        self.path("*/*/*.html")
+                        self.path("*/*/*.gif")
+                        self.end_prefix("*/html")
+                self.end_prefix("skins")
+        
+        # Files in the newview/ directory
         self.path("gpu_table.txt")
 
     def login_channel(self):
@@ -105,6 +104,8 @@ class ViewerManifest(LLManifest):
         # whether or not this is present
         return self.args.get('login_channel')
 
+    def grid(self):
+        return self.args['grid']
     def channel(self):
         return self.args['channel']
     def channel_unique(self):
@@ -117,22 +118,33 @@ class ViewerManifest(LLManifest):
     def flags_list(self):
         """ Convenience function that returns the command-line flags
         for the grid"""
-        channel_flags = ''
+
+        # Set command line flags relating to the target grid
         grid_flags = ''
         if not self.default_grid():
-            if self.default_channel():
-                # beta grid viewer
-                channel_flags = '--settings settings_beta.xml'
-            grid_flags = "--grid %(grid)s --helperuri http://preview-%(grid)s.secondlife.com/helpers/" % {'grid':self.args['grid']}
+            grid_flags = "--grid %(grid)s "\
+                         "--helperuri http://preview-%(grid)s.secondlife.com/helpers/" %\
+                           {'grid':self.grid()}
 
-        if not self.default_channel():
-            # some channel on some grid
-            channel_flags = '--settings settings_%s.xml --channel "%s"' % (self.channel_lowerword(), self.channel())
-        elif self.login_channel():
+        # set command line flags for channel
+        channel_flags = ''
+        if self.login_channel() and self.login_channel() != self.channel():
             # Report a special channel during login, but use default
             channel_flags = '--channel "%s"' % (self.login_channel())
-                        
-        return " ".join((channel_flags, grid_flags)).strip()
+        elif not self.default_channel():
+            channel_flags = '--channel "%s"' % self.channel()
+
+        # Deal with settings 
+        setting_flags = ''
+        if not self.default_channel() or not self.default_grid():
+            if self.default_grid():
+                setting_flags = '--settings settings_%s.xml'\
+                                % self.channel_lowerword()
+            else:
+                setting_flags = '--settings settings_%s_%s.xml'\
+                                % (self.grid(), self.channel_lowerword())
+                                                
+        return " ".join((channel_flags, grid_flags, setting_flags)).strip()
 
 
 class WindowsManifest(ViewerManifest):
@@ -153,10 +165,7 @@ class WindowsManifest(ViewerManifest):
         self.path(self.find_existing_file('debug/secondlife-bin.exe', 'release/secondlife-bin.exe', 'relwithdebinfo/secondlife-bin.exe'), dst=self.final_exe())
         # need to get the kdu dll from any of the build directories as well
         self.path(self.find_existing_file(
-                # *FIX:Mani we need to add support for packaging specific targets.
-                #'../llkdu/debug/llkdu.dll',
-                '../llkdu/release/llkdu.dll',
-                '../llkdu/relwithdebinfo/llkdu.dll',
+                '../llkdu/%s/llkdu.dll' % self.args['configuration'],
                 '../../libraries/i686-win32/lib/release/llkdu.dll'), 
                   dst='llkdu.dll')
         self.path(src="licenses-win32.txt", dst="licenses.txt")
@@ -174,9 +183,19 @@ class WindowsManifest(ViewerManifest):
             self.path("openjpeg.dll")
             self.end_prefix()
 
-        # Mozilla appears to force a dependency on these files so we need to ship it (CP)
-        self.path("msvcr71.dll")
-        self.path("msvcp71.dll")
+        # Mozilla appears to force a dependency on these files so we need to ship it (CP) - updated to vc8 versions (nyx)
+        # These need to be installed as a SxS assembly, currently a 'private' assembly.
+        # See http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx
+        if self.prefix(src=self.args['configuration'], dst=""):
+            if self.args['configuration'] == 'Debug':
+                self.path("msvcr80d.dll")
+                self.path("msvcp80d.dll")
+                self.path("Microsoft.VC80.DebugCRT.manifest")
+            else:
+                self.path("msvcr80.dll")
+                self.path("msvcp80.dll")
+                self.path("Microsoft.VC80.CRT.manifest")
+            self.end_prefix()
 
         # Mozilla runtime DLLs (CP)
         if self.prefix(src="../../libraries/i686-win32/lib/release", dst=""):
@@ -205,6 +224,11 @@ class WindowsManifest(ViewerManifest):
             self.path("res/*/*")
             self.end_prefix()
 
+        # Mozilla hack to get it to accept newer versions of msvc*80.dll than are listed in manifest
+        # necessary as llmozlib2-vc80.lib refers to an old version of msvc*80.dll - can be removed when new version of llmozlib is built - Nyx
+        # The config file name needs to match the exe's name.
+        self.path("SecondLife.exe.config", dst=self.final_exe() + ".config")
+
         # Vivox runtimes
         if self.prefix(src="vivox-runtime/i686-win32", dst=""):
             self.path("SLVoice.exe")
@@ -348,7 +372,7 @@ class WindowsManifest(ViewerManifest):
                 "%%INSTALL_FILES%%":self.nsi_file_commands(True),
                 "%%DELETE_FILES%%":self.nsi_file_commands(False)})
 
-        NSIS_path = 'C:\\Program Files\\NSIS\\makensis.exe'
+        NSIS_path = 'C:\\Program Files\\NSIS\\Unicode\\makensis.exe'
         self.run_command('"' + proper_windows_path(NSIS_path) + '" ' + self.dst_path_of(tempfile))
         # self.remove(self.dst_path_of(tempfile))
         self.created_path(self.dst_path_of(installer_file))
@@ -394,6 +418,7 @@ class DarwinManifest(ViewerManifest):
                     self.path("secondlife.icns")
                 else:
                     self.path("secondlife_firstlook.icns", "secondlife.icns")
+                self.path("SecondLife.nib")
                 
                 # Translations
                 self.path("English.lproj")
@@ -492,9 +517,6 @@ class DarwinManifest(ViewerManifest):
         if not os.path.exists (self.src_path_of(dmg_template)):
             dmg_template = os.path.join ('installers', 'darwin', 'release-dmg')
 
-        # To reinstate the linden scripting guide, add this to the list below:
-        #            "lsl_guide.html":"Linden Scripting Language Guide.html",
-
         for s,d in {self.get_dst_prefix():app_name + ".app",
                     os.path.join(dmg_template, "_VolumeIcon.icns"): ".VolumeIcon.icns",
                     os.path.join(dmg_template, "background.jpg"): "background.jpg",
diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt
index 3d085a7..acb571b 100644
--- a/indra/test/CMakeLists.txt
+++ b/indra/test/CMakeLists.txt
@@ -41,6 +41,7 @@ set(test_SOURCE_FILES
     lljoint_tut.cpp
     llmime_tut.cpp
     llmessageconfig_tut.cpp
+    llmodularmath_tut.cpp
     llnamevalue_tut.cpp
     llpermissions_tut.cpp
     llpipeutil.cpp
@@ -88,6 +89,11 @@ if (NOT WINDOWS)
        )
 endif (NOT WINDOWS)
 
+if (NOT DARWIN)
+  list(APPEND test_SOURCE_FILES
+    )
+endif (NOT DARWIN)
+
 set_source_files_properties(${test_HEADER_FILES}
                             PROPERTIES HEADER_FILE_ONLY TRUE)
 
@@ -105,6 +111,7 @@ target_link_libraries(test
     ${LLCOMMON_LIBRARIES}
     ${PTHREAD_LIBRARY}
     ${WINDOWS_LIBRARIES}
+    ${DL_LIBRARY}
     )
 
 if (WINDOWS)
@@ -142,6 +149,7 @@ if (EXISTS /etc/debian_version_FAIL)
       --mode=static
       --output=${CMAKE_CURRENT_BINARY_DIR}/py_test_results.txt
       --touch=${CMAKE_CURRENT_BINARY_DIR}/py_tests_ok.txt
+      --mode=static
     DEPENDS test.py
     WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
     COMMENT "Python unit tests"
diff --git a/indra/test/llapp_tut.cpp b/indra/test/llapp_tut.cpp
index 6efced4..650d03c 100644
--- a/indra/test/llapp_tut.cpp
+++ b/indra/test/llapp_tut.cpp
@@ -69,7 +69,7 @@ namespace tut
 		LLSD defaults;
 		defaults["template"] = "../../../scripts/messages/message_template.msg";
 		defaults["configdir"] = ".";
-		defaults["db_host"] = "mysql.mitra.lindenlab.com";
+		defaults["db_host"] = "mysql.shakti.lindenlab.com";
 		defaults["db_user"] = "linden";
 		defaults["db_password"] = "gomez";
 		defaults["datadir"] = "data";
diff --git a/indra/test/llblowfish_tut.cpp b/indra/test/llblowfish_tut.cpp
index ac40896..98deff5 100644
--- a/indra/test/llblowfish_tut.cpp
+++ b/indra/test/llblowfish_tut.cpp
@@ -93,7 +93,7 @@ namespace tut
 	template<> template<>
 	void blowfish_object::test<1>()
 	{
-#if !LL_LINUX
+#if LL_WINDOWS
 		skip_fail("Blowfish only supported on Linux.");
 #else
 		LLUUID blank;
@@ -108,13 +108,13 @@ namespace tut
 		dst_len = cipher.requiredEncryptionSpace(8);
 		ensure("encryption space 8",
 				(dst_len == 16)  );
-#endif // !LL_LINUX
+#endif // LL_WINDOWS
 	}
 
 	template<> template<>
 	void blowfish_object::test<2>()
 	{
-#if !LL_LINUX
+#if LL_WINDOWS
 		skip_fail("Blowfish only supported on Linux.");
 #else
 		LLUUID blank;
@@ -130,13 +130,13 @@ namespace tut
 		result.resize(count);
 
 		ensure("encrypt null key", matchFile("blowfish.1.bin", result));
-#endif // !LL_LINUX
+#endif // LL_WINDOWS
 	}
 
 	template<> template<>
 	void blowfish_object::test<3>()
 	{
-#if !LL_LINUX
+#if LL_WINDOWS
         skip_fail("Blowfish only supported on Linux.");
 #else
         // same as base64 test id
@@ -153,6 +153,6 @@ namespace tut
 		result.resize(count);
 
 		ensure("encrypt real key", matchFile("blowfish.2.bin", result));
-#endif // !LL_LINUX
+#endif // LL_WINDOWS
 	}
 }
diff --git a/indra/test/lliohttpserver_tut.cpp b/indra/test/lliohttpserver_tut.cpp
index e450cc4..38ba787 100644
--- a/indra/test/lliohttpserver_tut.cpp
+++ b/indra/test/lliohttpserver_tut.cpp
@@ -191,7 +191,7 @@ namespace tut
 			"HTTP/1.0 200 OK\r\n");
 						
 		ensure_contains("web/hello content type", result,
-			"Content-Type: application/xml\r\n");
+			"Content-Type: application/llsd+xml\r\n");
 
 		ensure_contains("web/hello content length", result,
 			"Content-Length: 36\r\n");
@@ -232,7 +232,7 @@ namespace tut
 			"HTTP/1.0 200 OK\r\n");
 						
 		ensure_contains("web/echo content type", result,
-			"Content-Type: application/xml\r\n");
+			"Content-Type: application/llsd+xml\r\n");
 
 		ensure_contains("web/echo content length", result,
 			"Content-Length: 35\r\n");
diff --git a/indra/test/llmodularmath_tut.cpp b/indra/test/llmodularmath_tut.cpp
new file mode 100644
index 0000000..190ca47
--- /dev/null
+++ b/indra/test/llmodularmath_tut.cpp
@@ -0,0 +1,80 @@
+/**
+ * @file modularmath_tut.cpp
+ * @author babbage
+ * @date 2008-09
+ * @brief llcircuit tests
+ *
+ * $LicenseInfo:firstyear=2007&license=viewergpl$
+ * 
+ * Copyright (c) 2007-2008, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+ 
+#include <tut/tut.h>
+#include "linden_common.h"
+#include "lltut.h"
+#include "llmodularmath.h"
+
+namespace tut
+{
+	struct modularmath_data
+	{
+	};
+	typedef test_group<modularmath_data> modularmath_test;
+	typedef modularmath_test::object modularmath_object;
+	tut::modularmath_test modularmath_testcase("modularmath");
+
+	template<> template<>
+	void modularmath_object::test<1>()
+	{
+		// lhs < rhs
+		const U32 lhs = 0x000001;
+		const U32 rhs = 0xFFFFFF;
+		const U32 width = 24;
+		U32 result = LLModularMath::subtract<width>(lhs, rhs); 
+		ensure_equals("diff(0x000001, 0xFFFFFF, 24)", result, 2);
+	}
+
+	template<> template<>
+	void modularmath_object::test<2>()
+	{
+		// lhs > rhs
+		const U32 lhs = 0x000002;
+		const U32 rhs = 0x000001;
+		const U32 width = 24;
+		U32 result = LLModularMath::subtract<width>(lhs, rhs); 
+		ensure_equals("diff(0x000002, 0x000001, 24)", result, 1);
+	}
+
+	template<> template<>
+	void modularmath_object::test<3>()
+	{
+		// lhs == rhs
+		const U32 lhs = 0xABCDEF;
+		const U32 rhs = 0xABCDEF;
+		const U32 width = 24;
+		U32 result = LLModularMath::subtract<width>(lhs, rhs); 
+		ensure_equals("diff(0xABCDEF, 0xABCDEF, 24)", result, 0);
+	}	
+}
diff --git a/indra/test/llsd_new_tut.cpp b/indra/test/llsd_new_tut.cpp
index 6c8d96a..8a24dab 100644
--- a/indra/test/llsd_new_tut.cpp
+++ b/indra/test/llsd_new_tut.cpp
@@ -108,7 +108,7 @@ namespace tut
 		SDCleanupCheck check;
 		
 		LLSD v;
-		
+
 		v = true;		ensureTypeAndValue("set true", v, true);
 		v = false;		ensureTypeAndValue("set false", v, false);
 		v = true;		ensureTypeAndValue("set true again", v, true);
@@ -749,6 +749,15 @@ namespace tut
 		}
 	}
 
+	template<> template<>
+	void SDTestObject::test<14>()
+		// make sure that assignment of char* NULL in a string does not crash.
+	{
+		LLSD v;
+		v = (const char*)NULL;
+		ensure("type is a string", v.isString());
+	}
+
 	/* TO DO:
 		conversion of undefined to UUID, Date, URI and Binary
 		conversion of undefined to map and array
diff --git a/indra/test/llstring_tut.cpp b/indra/test/llstring_tut.cpp
index ba6ac7c..a0fbfd1 100644
--- a/indra/test/llstring_tut.cpp
+++ b/indra/test/llstring_tut.cpp
@@ -344,13 +344,8 @@ namespace tut
 		str_val = "0";
 		ensure("2: convertToU32 failed", LLStringUtil::convertToU32(str_val, value) && value == 0);
 
-#ifndef LL_DARWIN
-		str_val = "-1"; 
-		ensure("3: convertToU32 failed", LLStringUtil::convertToU32(str_val, value) && value == 4294967295UL);
-#endif
-		
 		str_val = "4294967296"; 
-		ensure("4: convertToU32 failed", !LLStringUtil::convertToU32(str_val, value));
+		ensure("3: convertToU32 failed", !LLStringUtil::convertToU32(str_val, value));
 	}
 
 	template<> template<>
diff --git a/indra/test/math.cpp b/indra/test/math.cpp
index 405b8a3..dd35e21 100644
--- a/indra/test/math.cpp
+++ b/indra/test/math.cpp
@@ -517,6 +517,10 @@ namespace tut
 	template<> template<>
 	void line_object::test<2>()
 	{
+          /*
+            These tests fail intermittently on all platforms - see DEV-16600
+            Commenting this out until dev has time to investigate.
+            
 		// this is a test for LLLine::nearestApproach(LLLIne) method
 		// which computes the point on a line nearest another line
 
@@ -612,11 +616,13 @@ namespace tut
 			//}
 
 			// test that the errors are small
+
 			ensure("first line should accurately compute its closest approach", 
 					first_relative_error <= allowable_relative_error);
 			ensure("second line should accurately compute its closest approach", 
 					second_relative_error <= allowable_relative_error);
 		}
+          */
 	}
 
 	F32 ALMOST_PARALLEL = 0.99f;
diff --git a/indra/test/v4math_tut.cpp b/indra/test/v4math_tut.cpp
index 07b4797..8169a2b 100644
--- a/indra/test/v4math_tut.cpp
+++ b/indra/test/v4math_tut.cpp
@@ -166,14 +166,13 @@ namespace tut
 	template<> template<>
 	void v4math_object::test<8>()
 	{
-#if LL_DEBUG && LL_WINDOWS && _MSC_VER >= 1400
-		skip_fail("This fails on VS2005 debug builds!");
-#else
-#if LL_WINDOWS && _MSC_VER < 1400
-		skip_fail("This fails on VS2003!");
-#else
 		F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
-		const  F32 val[10] = {1.f,2.f,3.f,.34f,.1f,-.5f,2.f,1.23f,1.234f,.89f};
+		const  F32 val[16] = {
+            1.f,  2.f,   3.f,    0.f,
+            .34f, .1f,   -.5f,   0.f,
+            2.f,  1.23f, 1.234f, 0.f,
+            .89f, 0.f,   0.f,    0.f
+        };
 		LLMatrix4 mat(val);
 		LLVector4 vec4(x,y,z,w),vec4a;
 		vec4.rotVec(mat);
@@ -187,8 +186,6 @@ namespace tut
 		vec4c.setVec(a, b, c, d);
 		vec4c.rotVec(q);
 		ensure_equals("2:rotVec: Fail " ,vec4b, vec4c);
-#endif
-#endif
 	}
 	
 	template<> template<>
diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp
index 03f2394..89581f1 100644
--- a/indra/win_crash_logger/llcrashloggerwindows.cpp
+++ b/indra/win_crash_logger/llcrashloggerwindows.cpp
@@ -322,7 +322,7 @@ bool LLCrashLoggerWindows::mainLoop()
 	{
 		gHwndReport = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PREVREPORTBOX), 0, NULL);
 		// Ignore result
-		(void) SendDlgItemMessage(gHwndReport, IDC_CHECK_AUTO, BM_SETCHECK, 1, 0);
+		(void) SendDlgItemMessage(gHwndReport, IDC_CHECK_AUTO, BM_SETCHECK, 0, 0);
 		// Include the product name in the caption and various dialog items.
 		ProcessCaption(gHwndReport);
 		ProcessDlgItemText(gHwndReport, IDC_STATIC_MSG);
diff --git a/indra/win_crash_logger/win_crash_logger.cpp b/indra/win_crash_logger/win_crash_logger.cpp
index 773aa68..3056094 100644
--- a/indra/win_crash_logger/win_crash_logger.cpp
+++ b/indra/win_crash_logger/win_crash_logger.cpp
@@ -54,56 +54,9 @@ int APIENTRY WinMain(HINSTANCE hInstance,
 {
 	llinfos << "Starting crash reporter" << llendl;
 
-	// In Win32, we need to generate argc and argv ourselves...
-	// Note: GetCommandLine() returns a  potentially return a LPTSTR
-	// which can resolve to a LPWSTR (unicode string).
-	// (That's why it's different from lpCmdLine which is a LPSTR.)
-	// We don't currently do unicode, so call the non-unicode version
-	// directly.
-	llinfos << "Processing command line" << llendl;
-	LPSTR cmd_line_including_exe_name = GetCommandLineA();
-
-	const S32	MAX_ARGS = 100;
-	int argc = 0;
-	char *argv[MAX_ARGS];		
-
-	char *token = NULL;
-	if( cmd_line_including_exe_name[0] == '\"' )
-	{
-		// Exe name is enclosed in quotes
-		token = strtok( cmd_line_including_exe_name, "\"" );
-		argv[argc++] = token;
-		token = strtok( NULL, " \t," );
-	}
-	else
-	{
-		// Exe name is not enclosed in quotes
-		token = strtok( cmd_line_including_exe_name, " \t," );
-	}
-
-	while( (token != NULL) && (argc < MAX_ARGS) )
-	{
-		argv[argc++] = token;
-		/* Get next token: */
-		if (*(token + strlen(token) + 1) == '\"')		
-		{
-			token = strtok( NULL, "\"");
-		}
-		else
-		{
-			token = strtok( NULL, " \t," );
-		}
-	}
-
 	LLCrashLoggerWindows app;
-	bool ok = app.parseCommandOptions(argc, argv);
-	if(!ok)
-	{
-		llwarns << "Unable to parse command line." << llendl;
-	}
-	
 	app.setHandle(hInstance);
-	ok = app.init();
+	bool ok = app.init();
 	if(!ok)
 	{
 		llwarns << "Unable to initialize application." << llendl;
diff --git a/indra/win_updater/updater.cpp b/indra/win_updater/updater.cpp
index 5ea4695..bea45d1 100644
--- a/indra/win_updater/updater.cpp
+++ b/indra/win_updater/updater.cpp
@@ -30,7 +30,7 @@
  */
 
 //
-// Usage: updater -url <url> [-name <window_title>] [-program <program_name>] [-silent]
+// Usage: updater -url <url>
 //
 
 #include "linden_common.h"
@@ -45,9 +45,6 @@ DWORD gTotalBytes = -1;
 HWND gWindow = NULL;
 WCHAR gProgress[256];
 char* gUpdateURL;
-char* gProgramName;
-char* gProductName;
-bool gIsSilent;
 
 #if _DEBUG
 FILE* logfile = 0;
@@ -217,7 +214,7 @@ int WINAPI get_url_into_file(WCHAR *uri, char *path, int *cancelled)
 		fprintf(logfile,"Calling PeekMessage\n");
 		fflush(logfile);
 #endif	
-		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
+		while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
 		{
 			TranslateMessage(&msg);
 			DispatchMessage(&msg);
@@ -279,26 +276,14 @@ int parse_args(int argc, char **argv)
 
 	for (j = 1; j < argc; j++) 
 	{
-		if ((!strcmp(argv[j], "-name")) && (++j < argc)) 
-		{
-			gProductName = argv[j];
-		}
-		else if ((!strcmp(argv[j], "-url")) && (++j < argc)) 
+		if ((!strcmp(argv[j], "-url")) && (++j < argc)) 
 		{
 			gUpdateURL = argv[j];
 		}
-		else if ((!strcmp(argv[j], "-program")) && (++j < argc)) 
-		{
-			gProgramName = argv[j];
-		}
-		else if (!strcmp(argv[j], "-silent"))
-		{
-			gIsSilent = true;
-		}
 	}
 
 	// If nothing was set, let the caller know.
-	if (!gProductName && !gProgramName && !gIsSilent && !gUpdateURL)
+	if (!gUpdateURL)
 	{
 		return 1;
 	}
@@ -350,9 +335,6 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho
 	}
 
 	gUpdateURL = NULL;
-	gProgramName = NULL;
-	gProductName = NULL;
-	gIsSilent = false;
 
 	/////////////////////////////////////////
 	//
@@ -368,21 +350,10 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho
 	// Parse the command line arguments
 	//
 	int parse_args_result = parse_args(argc, argv);
-	WCHAR window_title[2048];
-	if (gProductName)
-	{
-		mbstowcs(window_title, gProductName, 2048);
-		wcscat(window_title, L" Updater");		/* Flawfinder: ignore */
-	}
-	else
-	{
-		mbstowcs(window_title, "Second Life Updater", 2048);
-	}
 	
 	WNDCLASSEX wndclassex = { 0 };
 	DEVMODE dev_mode = { 0 };
 	char update_exec_path[MAX_PATH];		/* Flawfinder: ignore */
-	char *ptr;
 
 	const int WINDOW_WIDTH = 250;
 	const int WINDOW_HEIGHT = 100;
@@ -403,7 +374,7 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho
 	EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode);
 	
 	gWindow = CreateWindowEx(NULL, win_class_name, 
-		window_title,
+		L"Second Life Updater",
 		WS_OVERLAPPEDWINDOW, 
 		CW_USEDEFAULT, 
 		CW_USEDEFAULT, 
@@ -437,24 +408,13 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho
 			L"Error", MB_OK);
 		return 1;
 	}
-	if (0 == GetTempFileNameA(update_exec_path, NULL, 0, update_exec_path))
-	{
-		MessageBox(gWindow, L"Problem with GetTempFileName()",
-			L"Error", MB_OK);
-		return 1;
-	}
-	// Hack hack hack
-	ptr = strrchr(update_exec_path, '.');
-	*(ptr + 1) = 'e';
-	*(ptr + 2) = 'x';
-	*(ptr + 3) = 'e';
-	*(ptr + 4) = 0;
+	strcat(update_exec_path, "Second_Life_Updater.exe");
 
 	WCHAR update_uri[4096];
 	mbstowcs(update_uri, gUpdateURL, 4096);
 
-	int success;
-	int cancelled;
+	int success = 0;
+	int cancelled = 0;
 
 	// Actually do the download
 #if _DEBUG
@@ -493,47 +453,24 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho
 		return 1;
 	}
 
-	// Construct some parameters.
-	char params[2048];		/* Flawfinder: ignore */
-	if (gIsSilent && gProgramName)
-	{
-		_snprintf(params, sizeof(params), "/S /P=\"%s\"", gProgramName);		/* Flawfinder: ignore */
-		params[2047] = '\0';
-	}
-	else if (gProgramName)
-	{
-		_snprintf(params, sizeof(params), "/P=\"%s\"", gProgramName);		/* Flawfinder: ignore */
-		params[2047] = '\0';
-	}
-	else if (gIsSilent)
-	{
-		sprintf(params, "/S");		/* Flawfinder: ignore */
-	}
-	else
-	{
-		params[0] = '\0';
-	}
+	// TODO: Make updates silent (with /S to NSIS)
+	//char params[256];		/* Flawfinder: ignore */
+	//sprintf(params, "/S");	/* Flawfinder: ignore */
+	//MessageBox(gWindow, 
+	//	L"Updating Second Life.\n\nSecond Life will automatically start once the update is complete.  This may take a minute...",
+	//	L"Download Complete",
+	//	MB_OK);
 		
-	if (32 >= (int) ShellExecuteA(gWindow, "open", update_exec_path, params, 
+	if (32 >= (int) ShellExecuteA(gWindow, "open", update_exec_path, NULL, 
 		"C:\\", SW_SHOWDEFAULT))
 	{
-		// No shit: less than or equal to 32 means failure
-		MessageBox(gWindow, L"ShellExecute failed.  Please try again later.", NULL, MB_OK);
+		// Less than or equal to 32 means failure
+		MessageBox(gWindow, L"Update failed.  Please try again later.", NULL, MB_OK);
 		return 1;
 	}
 
-	if (gIsSilent && gProductName)
-	{
-		WCHAR message[2048];
-		WCHAR wproduct[2048];
-		mbstowcs(wproduct, gProductName, 2048);
-
-		wsprintf(message, 
-				L"Updating %s.  %s will automatically start once the update is complete.  This may take a minute...",
-				wproduct, wproduct);
-				
-		MessageBox(gWindow, message, L"Download Complete", MB_OK);
-	}
+	// Give installer some time to open a window
+	Sleep(1000);
 
 	return 0;
 }
diff --git a/install.xml b/install.xml
index 216c854..928bdd8 100644
--- a/install.xml
+++ b/install.xml
@@ -23,9 +23,23 @@
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>85f2ed989f853beb3d6cc94413b35f1a</string>
+            <string>2ab29212a7f3acdaebf10059af816be0</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>301c05472d5d6f3303cfa1f9e4b78660</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>9c3dff3817f1105f9054401fdef1fe50</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux64-20080909.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -49,16 +63,23 @@
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>025bb5e76fd964b89c508d88d37bb802</string>
+            <string>7b07e7121a3623b2553ed36fb9024b40</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-darwin-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-darwin-20080818.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>a28fe914d3f3241c824aabba69f1d946</string>
+            <string>ce71bd658c3fa9fd7f46b7c5adacef1c</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-linux-20080818.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>45e8fca9a6e7ae7d36b0c5a21dfbe3b9</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -78,16 +99,30 @@
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>10b11783907b72712daef3ed5803d56d</string>
+            <string>abd07d760cdc7d23da3b861f34b09c92</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-darwin-20080618.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-darwin-20080812.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>b99f6bd3548c4f4613fe95320e14dbf3</string>
+            <string>7b84cd6a3c601a104d9c09e58ef2f50c</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-linux-20080618.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>e97eb40a283165e3ddc7556f698b4e01</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>1a7e1186855d48d8316ce86803095f70</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-linux64-20080909a.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -122,6 +157,20 @@
             <key>url</key>
             <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.4.0-linux-20080729.tar.bz2</uri>
           </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>247987b147e1c856d96e97d685e5b666</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.3.0-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>c4242416e0b2e642c0bf062a19a250e4</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.3.0-linux64-20080909.tar.bz2</uri>
+          </map>
           <key>windows</key>
           <map>
             <key>md5sum</key>
@@ -153,16 +202,30 @@
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>792601ce1f38067c086394842852fa11</string>
+            <string>279834a12a0ed4531fd602594eac8509</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.32.0-darwin-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.32.0-darwin-20080812.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>e65f06e2500db0bbc34506194ac49f6a</string>
+            <string>b9a943052e5525da5417d6f471d70bc5</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.32.0-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>cdc0cb3e9bfb90517507a0df591f5c0b</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.32.0-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.34.0-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>b97ae0855e77cc25b37ca63df093bb9b</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.34.0-linux64-20080909.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -186,16 +249,30 @@
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>73965ddba50e5c4d46d50a966b472626</string>
+            <string>c426dfaad3b662405e49ed3701a55d38</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-darwin-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-darwin-20080812.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>a7791ee5ca19f208808f71730c3c2feb</string>
+            <string>e6d4cd23f5df4c74072d5d0437ca999b</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>3a8475b8990d17d8c9dc2a32980d2968</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.4-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>6e9242d11d785f643f34d925a29967e7</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.4-linux64-20080909.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -206,6 +283,25 @@
           </map>
         </map>
       </map>
+      <key>dbusglib</key>
+      <map>
+        <key>copyright</key>
+        <string>Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.</string>
+        <key>description</key>
+        <string>dbus/dbus-glib: headers only</string>
+        <key>license</key>
+        <string>AFL2.1</string>
+        <key>packages</key>
+        <map>
+          <key>linux</key>
+          <map>
+            <key>md5sum</key>
+            <string>eb25444142d4102b0ce1b7ffaadb071e</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/dbusglib-linux-20080707.tar.bz2</uri>
+          </map>
+        </map>
+      </map>
       <key>elfio</key>
       <map>
         <key>license</key>
@@ -215,9 +311,16 @@
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>feb9d72c373c5dd4c6b88ed02e2b2bf0</string>
+            <string>82ea408af2f968cfe5f013ab241323ef</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/elfio-1.0.3-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>3576f904306fba0edc659eaaa1a1159e</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/elfio-1.0.3-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/elfio-1.0.3-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
           </map>
         </map>
       </map>
@@ -234,16 +337,30 @@
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>7b9380e6bac8d9ba5e6ff20da5cad91a</string>
+            <string>9c5603e328e9f543e0a599d6b25be973</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-darwin-20080617.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-darwin-20080812.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>e59d8314185e3d87d72ff90d6cff0d30</string>
+            <string>67b470fd446b08c9831d1039674eae4e</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>af1f225afe6cd0c5d2e08ff578839794</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>278c61871419b9a4d50a4f88b7922403</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-linux64-20080909.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -267,16 +384,23 @@
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>d13cc275db503492fc87c7b36c1c49d3</string>
+            <string>c7e317bec481b7efa2a0319e163dcc65</string>
             <key>url</key>
-            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-darwin-20080610.tar.bz2</uri>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-darwin-20080818.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>85caf188852f2cfede49ff12a3d928d5</string>
+            <string>abd2b4ba4ac993f19d82804af387eb7c</string>
             <key>url</key>
-            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-linux-20080610.tar.bz2</uri>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-linux-20080818.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>96eea0855dffefcbbd98e9e629b81275</string>
+            <key>url</key>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -300,6 +424,13 @@
             <key>url</key>
             <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fontconfig-2.2.3-linux-20080613.tar.bz2</uri>
           </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>53b09eee725de92b715b898388e06115</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fontconfig-2.2.3-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
         </map>
       </map>
       <key>freetype</key>
@@ -315,16 +446,30 @@
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>cd8a8f8af5a01fac015e5b0325daa2ae</string>
+            <string>694173293a483c01472a30cc7d895c5a</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-darwin-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-darwin-20080812.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>83e7aafe0807c2adec68f67b5738d856</string>
+            <string>07665d74d37c56fd884610ec80a1d19f</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>c22a667d4b6b518cc7f942e2c861ca77</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>35f6fa557ba90f9cda0a18d1af2055a4</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux64-20080909.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -355,6 +500,20 @@
           <key>linux</key>
           <map>
             <key>md5sum</key>
+            <string>23bd9a75e5a2365a827461e6c324f52b</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>865d10ce141cdc7e07334486441d3e30</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
             <string>2965646aea1d2a6aec1fbc431c02733f</string>
             <key>url</key>
             <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-linux-20080613.tar.bz2</uri>
@@ -368,6 +527,37 @@
           </map>
         </map>
       </map>
+      <key>glib</key>
+      <map>
+        <key>description</key>
+        <string>GLib is a library containing many useful C routines for things such as trees, hashes, and lists.</string>
+        <key>license</key>
+        <string>gpl</string>
+        <key>packages</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>md5sum</key>
+            <string>6cc5ce1fafd10299fdb890b3d4c3cf53</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-darwin-20080817.tar.bz2</uri>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>md5sum</key>
+            <string>2f1a9e14f9213c2c9564c1c1cfdd6d47</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-linux-20080817.tar.bz2</uri>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>md5sum</key>
+            <string>3d5e29d444dde4815b36082eedfc775a</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-windows-20080817.tar.bz2</uri>
+          </map>
+        </map>
+      </map>
       <key>google</key>
       <map>
         <key>license</key>
@@ -377,9 +567,9 @@
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>f1161282d7fc11fbe17d0aa077ee054b</string>
+            <string>40db900872612615e849f17cbdfd2c27</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google-linux-20080617.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google-linux-20080812.tar.bz2</uri>
           </map>
         </map>
       </map>
@@ -396,6 +586,20 @@
             <key>url</key>
             <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux-20080613.tar.bz2</uri>
           </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>45eaa378465831e114a7406aa4d2ef35</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>befc7520fe01250f39458f65c29bc584</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux64-20080909.tar.bz2</uri>
+          </map>
         </map>
       </map>
       <key>gtk-atk-pango-glib</key>
@@ -415,6 +619,13 @@
             <key>url</key>
             <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-linux-20080616.tar.bz</uri>
           </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>21c16a74f8fc9a62e3ab944a6eb7403d</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-linux-20080616.tar.bz</uri>
+          </map>
           <key>windows</key>
           <map>
             <key>md5sum</key>
@@ -437,23 +648,37 @@
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>7d3d2d71c08729fe881a059af1d9b938</string>
+            <string>f64c08771a4fc456db2a55b47302078b</string>
             <key>url</key>
-            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6-darwin-20080610.tar.bz2</uri>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6-darwin-20080812.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>36a892b451b5cbc8f72d6f1153f55cf8</string>
+            <string>e398a04adb84796072dcc1f5efc69f4a</string>
+            <key>url</key>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux-20080912.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>5a7821cb8aa471051e0361a74d115613</string>
             <key>url</key>
-            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6-linux-20080610.tar.bz2</uri>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>b2095827a940c791240339dac677ef2d</string>
+            <key>url</key>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux64-20080909.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
             <key>md5sum</key>
-            <string>b63a2f20df43c68062c6b8e77a2da455</string>
+            <string>f25fbb29c2275267233c79f0c68ca37f</string>
             <key>url</key>
-            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6-windows-20080611.tar.bz2</uri>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-windows-20081010.tar.bz2</uri>
           </map>
         </map>
       </map>
@@ -470,16 +695,30 @@
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>30b12debc3efce275a335b824dda22d2</string>
+            <string>8d38d74c481e9aab4518c8f2a7d52800</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-darwin-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-darwin-20080812.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>9297565a09754fdf2b58cefef60450c7</string>
+            <string>41085a9915598bba0e6bcb0da23ff929</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>3896cfbf5e44450532101f9ab833be61</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>0e7facf7d48531d20c0cd6a3c3f04021</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux64-20080909.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -503,23 +742,37 @@
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>9a91ecd80203a24fb347b1436155b013</string>
+            <string>3b40e7170dea82c1443e8d90cd44a13d</string>
             <key>url</key>
-            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-5.2.1-darwin-20080716.tar.bz2</uri>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-4.2.1-darwin-20080926.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>daadd8c268e16f8c5f6145be8596b8b8</string>
+            <string>a6d2f0995c25d7f53bd12b8ec0d6b462</string>
             <key>url</key>
-            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-5.2.1-linux-20080716.tar.bz2</uri>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-4.2.1-linux-20080930.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>0f4f1eb22ea6a4d242614d146fd176a1</string>
+            <key>url</key>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-4.2.1-linux32-20080926.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>f4e2e2b3440594527729a8c85119e508</string>
+            <key>url</key>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-5.2.1-linux64-20080926.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
             <key>md5sum</key>
-            <string>15528c24ca657b524d9ab3ccbb33c766</string>
+            <string>1b9f61140f8b599cdae5e00d21dbb177</string>
             <key>url</key>
-            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-5.2.1-windows-20080613.tar.bz2</uri>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-4.2.1-windows-20080926.tar.bz2</uri>
           </map>
         </map>
       </map>
@@ -547,6 +800,13 @@
             <key>url</key>
             <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-binaries-5.2.1-linux-20080617.tar.bz2</uri>
           </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>ca87644e377a6cf16db4ba6dbd2f8689</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-binaries-5.2.1-linux-20080617.tar.bz2</uri>
+          </map>
           <key>windows</key>
           <map>
             <key>md5sum</key>
@@ -577,16 +837,30 @@ anguage Infrstructure (CLI) international standard</string>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>df73b95b0980e631ba1ecd930120699f</string>
+            <string>9bc0f8b7d5e0ff194b6d5635daf9ae3a</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-1.2.6-linux-20080816a.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>8b5810b9b40e8ce4243487fe33b62f56</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-linux-20080722.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-1.2.6-linux32-20080926.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>451521b4cb57c35caf3efb8dcf99b99e</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-1.2.6-linux64-20080926.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
             <key>md5sum</key>
-            <string>7293312a6c76e5a38ec1b58ff87828d9</string>
+            <string>6712a09311a914752f47d5d62562a239</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-windows-20080723.tar.bz2</uri>
+            <uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-1.2.6-windows-20080903.tar.bz2</uri>
           </map>
         </map>
       </map>
@@ -603,16 +877,30 @@ anguage Infrstructure (CLI) international standard</string>
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>90488b309856a82a152348db177a44c5</string>
+            <string>edd0877544dab4c521473279ed237dcc</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-darwin-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-darwin-20080812.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>b47eca741c218e13e6838583c9169b64</string>
+            <string>0878662f8c1c695a82477f7b0c57a7af</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>3c631ee1a4556c3a28b5490a53d86603</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.15-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>fbc162f986c869d158633ccdba6ee6e4</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-linux64-20080909.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -636,9 +924,23 @@ anguage Infrstructure (CLI) international standard</string>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>0591314df0293ba948b0445b0215a18d</string>
+            <string>1464a75ec87ee28e3b4f7840e9af41e3</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.0-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.0-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>1218347dd70c3b471530793d0fc09b69</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.4.1-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>9a191dc453017b19c5803b046d82f32a</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.4.1-linux64-20080909.tar.bz2</uri>
           </map>
         </map>
       </map>
@@ -655,9 +957,16 @@ anguage Infrstructure (CLI) international standard</string>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>495f01afa67ed1ae59b7b8005cfa55ff</string>
+            <string>b5cc6062bd2f7421f606f7e1a5228829</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libuuid-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>cdc0778d924c6162c1f553274b72ba15</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libuuid-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libuuid-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
           </map>
         </map>
       </map>
@@ -674,6 +983,20 @@ anguage Infrstructure (CLI) international standard</string>
             <key>url</key>
             <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux-20080613.tar.bz2</uri>
           </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>0e16b7794811407c387d360282c5d7b3</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>921d7f980519101afb74623e29e9d175</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux64-20080909.tar.bz2</uri>
+          </map>
         </map>
       </map>
       <key>llmozlib</key>
@@ -685,9 +1008,9 @@ anguage Infrstructure (CLI) international standard</string>
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>056ad496f0ec2bf386d50f694f6bade3</string>
+            <string>6995c99b4855c4bf9301267c334aedc3</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-darwin-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-darwin-20080812.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
@@ -696,12 +1019,26 @@ anguage Infrstructure (CLI) international standard</string>
             <key>url</key>
             <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-linux-20080922.tar.bz2</uri>
           </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>0af042c01975df3b127b742f4aad0c5c</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>c2ae53462b56e0999ba386774ab0b789</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-linux64-20080909.tar.bz2</uri>
+          </map>
           <key>windows</key>
           <map>
             <key>md5sum</key>
-            <string>8c1b8881285631eb32ba541e10d07b07</string>
+            <string>42cb780c595d25881b4967292a4a0f40</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-windows-20080922.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-windows-20080828.tar.bz2</uri>
           </map>
         </map>
       </map>
@@ -718,9 +1055,23 @@ anguage Infrstructure (CLI) international standard</string>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>13802606c5f6e98af7cfa72cc85e3a92</string>
+            <string>70d0bbe1145fff29a0131349c898260e</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-7.0-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-7.0-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>854f3dae9e048305a0fe77eaee0195d6</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-6.2.1-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>56630977f9261bd82039b0da08a0685c</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-6.2.1-linux64-20081016.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -740,9 +1091,9 @@ anguage Infrstructure (CLI) international standard</string>
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>a60de9d31aa3dfab8851f8c2dfa3f8dc</string>
+            <string>df27f2db244ea2762759a06cd75ada4e</string>
             <key>url</key>
-            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/mysql-darwin-20080610.tar.bz2</uri>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/mysql-darwin-20080812.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -766,9 +1117,9 @@ anguage Infrstructure (CLI) international standard</string>
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>15df716b66bd83e2198450eed93197cd</string>
+            <string>17999c47e17f2dd9e12a22372ce8ff14</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-darwin-20080618.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-darwin-20080812.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
@@ -777,6 +1128,13 @@ anguage Infrstructure (CLI) international standard</string>
             <key>url</key>
             <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-linux-20080618.tar.bz2</uri>
           </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>c980300c14dddf47ba0c46608b29a027</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
           <key>windows</key>
           <map>
             <key>md5sum</key>
@@ -799,16 +1157,23 @@ anguage Infrstructure (CLI) international standard</string>
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>8d9bb71c06f6494cc767965145f31c63</string>
+            <string>a6843398b780645c4897c9776c688926</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-darwin-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-darwin-20080812.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>1e912aef160c1d8f46f4194942922654</string>
+            <string>df1809565b87b1dc28e3ca70db6e7d46</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>964c71e6ee22be1bcaf6d480e74cdd14</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.2.0-linux64-20080909.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -828,16 +1193,30 @@ anguage Infrstructure (CLI) international standard</string>
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>a708e7b41b91852b060bb3d62112b4d7</string>
+            <string>a7b49e0f3eedbd5de117a3524c414b3a</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-darwin-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-darwin-20080812.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>727f2a9399b7f414260a03fdf700aef4</string>
+            <string>f219ef07b02e2abb9282345c3a8f2b39</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>1037114c5b7ad906daca2b4820080b5b</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8g-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>00b23f28a2457d9dabbaff0b29ee7323</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8g-linux64-20080909.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -861,16 +1240,30 @@ anguage Infrstructure (CLI) international standard</string>
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>85b34723ab22591ebbc51c474588c2e0</string>
+            <string>ac3e0218287e084709afea06b82ae03b</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-darwin-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-darwin-20080812.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>406ceca1c85b64df18deed95f3b7854c</string>
+            <string>c333219c88462b8b22c815cd2b700218</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>dc1f50c6570cef2d45d40ccc7ac76013</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2.0-linux-i686-gcc-4.1-20080919.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>44f1bc9d47e4a54fc274c213f2cb565f</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2.0-linux64-20080909.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -924,6 +1317,13 @@ anguage Infrstructure (CLI) international standard</string>
             <key>url</key>
             <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/smartheap-6.0.2-linux-20080610.tar.bz2</uri>
           </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>499208522bf7d7843e1d014d64214e06</string>
+            <key>url</key>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/smartheap-6.0.2-linux-20080610.tar.bz2</uri>
+          </map>
           <key>windows</key>
           <map>
             <key>md5sum</key>
@@ -953,9 +1353,23 @@ anguage Infrstructure (CLI) international standard</string>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>da7872a8a5cfe5d14ceeeebe73e58d6b</string>
+            <string>1116d9ba0c34c042788421d4e520e747</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-linux-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>f410e4acdf4696c90d3fc708c41e6226</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-2006-06-22-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>728f4d8f74df8e84d0781b9ee9fc47ed</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-2006-06-22-linux64-20080909.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -1007,6 +1421,13 @@ anguage Infrstructure (CLI) international standard</string>
             <key>url</key>
             <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-linux-20080613.tar.bz2</uri>
           </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>7d6e9727edba3556015edf492d35e394</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
           <key>windows</key>
           <map>
             <key>md5sum</key>
@@ -1029,16 +1450,30 @@ anguage Infrstructure (CLI) international standard</string>
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>f3e2f3428913bf8b8d70d28a3d079811</string>
+            <string>2d3a918c88d756422c1a8139ebe15f56</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-darwin-20080613.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-darwin-20080812.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>0cc87341785bf23c253e6e69a7c16ca0</string>
+            <string>84a219199240ea70f54439c02acef0cd</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-linux-20080812.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>06ad9cbb166b89dcc0c62fd987cc34ce</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-linux-20080618.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>dc67b896c56116df8e18f2d1bbd07031</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-linux64-20080909.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -1062,16 +1497,30 @@ anguage Infrstructure (CLI) international standard</string>
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>6f5d1799ffacaec4b61d53051443c672</string>
+            <string>c844e1b05723ce078dbbd5aea9cdd3ad</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-darwin-20080618.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-darwin-20080818.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>4140bc104e828c5c33f251a2d5bfe144</string>
+            <string>806637b1834825ab8888d5e487085df8</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-linux-20080618.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-linux-20080818.tar.bz2</uri>
+          </map>
+          <key>linux32</key>
+          <map>
+            <key>md5sum</key>
+            <string>cb800ce00f9a5bdeff3371f14481fa38</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.3-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
+          </map>
+          <key>linux64</key>
+          <map>
+            <key>md5sum</key>
+            <string>4bddfb2c6dd7b1470a3ed675ac14bd9a</string>
+            <key>url</key>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.3-linux64-20080909.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
@@ -1085,6 +1534,11 @@ anguage Infrstructure (CLI) international standard</string>
     </map>
     <key>licenses</key>
     <map>
+      <key>AFL2.1</key>
+      <map>
+        <key>url</key>
+        <string>http://opensource-definition.org/licenses/afl-2.1.html</string>
+      </map>
       <key>GL</key>
       <map>
         <key>url</key>
diff --git a/scripts/install.py b/scripts/install.py
index 0cc2fad..3e8f9bb 100755
--- a/scripts/install.py
+++ b/scripts/install.py
@@ -37,6 +37,7 @@ import copy
 import md5
 import optparse
 import os
+import platform
 import pprint
 import shutil
 import sys
@@ -308,6 +309,13 @@ class Installer(object):
         "Return a list of installed packages."
         return self._installed.keys()
 
+    def detail_installed(self, name):
+        "Return file list for specific installed package."
+        filelist = []
+        for url in self._installed[name]._installed.keys():
+            filelist.extend(self._installed[name].files_in(url))
+        return filelist
+
     def _update_field(self, description, field, value, multiline=False):
         """Given a block and a field name, add or update it.
         @param description a dict containing all the details of a description.
@@ -458,7 +466,12 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""
             if not self._dryrun:
                 if os.path.exists(filename):
                     remove_dir_set.add(os.path.dirname(filename))
-                    os.remove(filename)
+                    try:
+                        os.remove(filename)
+                    except OSError:
+                        # This is just for cleanup, so we don't care
+                        # about normal failures.
+                        pass
         for dirname in remove_dir_set:
             try:
                 os.removedirs(dirname)
@@ -730,7 +743,23 @@ def _get_platform():
         'cygwin' : 'windows',
         'solaris' : 'solaris'
         }
-    return platform_map[sys.platform]
+    this_platform = platform_map[sys.platform]
+    if this_platform == 'linux':
+        if platform.architecture()[0] == '64bit':
+            # TODO -- someday when install.py accepts a platform of the form 
+            # os/arch/compiler/compiler_version then we can replace the 
+            # 'linux64' platform with 'linux/x86_64/gcc/4.1'
+            this_platform = 'linux64'
+        else:
+            gcc_version = os.popen("g++ -dumpversion", 'r').read()[:-3]
+            if gcc_version == '4.1':
+                # the 'linux32' platform is a HACK until we can figure
+                # out how to make the install.py script accept a platform of
+                # the form os/arch/compiler/compiler_version for the download
+                # and extract stage
+                #this_platform = 'linux/i686/gcc/4.1'
+                this_platform = 'linux32'
+    return this_platform
 
 def _getuser():
     "Get the user"
@@ -971,6 +1000,12 @@ Ignored if --add-installable or --add-installable-package is not specified.""")
         dest='detail_installable',
         help="Get detailed information on specified installable and exit.")
     parser.add_option(
+        '--detail-installed', 
+        type='string',
+        default=None,
+        dest='detail_installed',
+        help="Get list of files for specified installed installable and exit.")
+    parser.add_option(
         '--uninstall', 
         action='store_true',
         default=False,
@@ -1012,6 +1047,17 @@ def main():
             print "Installable '"+options.detail_installable+"' not found in",
             print "install file."
         return 0
+    if options.detail_installed:
+        try:
+            detail = installer.detail_installed(options.detail_installed)
+            #print "Detail on installed",options.detail_installed+":"
+            for line in detail:
+                print line
+        except:
+            raise
+            print "Installable '"+options.detail_installed+"' not found in ",
+            print "install file."
+        return 0
     if options.list_licenses:
         print "license list:", installer.list_licenses()
         return 0
diff --git a/scripts/template_verifier.py b/scripts/template_verifier.py
index f1f3953..d451cbf 100755
--- a/scripts/template_verifier.py
+++ b/scripts/template_verifier.py
@@ -38,13 +38,35 @@ If [FILE] [FILE] is specified, two local files will be checked against
 each other.
 """
 
-from os.path import realpath, dirname, join, exists
-setup_path = join(dirname(realpath(__file__)), "setup-path.py")
-if exists(setup_path):
-    execfile(setup_path)
+import sys
+import os.path
+
+# Look for indra/lib/python in all possible parent directories ...
+# This is an improvement over the setup-path.py method used previously:
+#  * the script may blocated anywhere inside the source tree
+#  * it doesn't depend on the current directory
+#  * it doesn't depend on another file being present.
+
+root = os.path.abspath(__file__)
+# always insert the directory of the script in the search path
+dir = os.path.dirname(root)
+if dir not in sys.path:
+    sys.path.insert(0, dir)
+
+# Now go look for indra/lib/python in the parent dies
+while root != os.path.sep:
+    root = os.path.dirname(root)
+    dir = os.path.join(root, 'indra', 'lib', 'python')
+    if os.path.isdir(dir):
+        if dir not in sys.path:
+            sys.path.insert(0, dir)
+        break
+else:
+    print >>sys.stderr, "This script is not inside a valid installation."
+    sys.exit(1)
+
 import optparse
 import os
-import sys
 import urllib
 
 from indra.ipc import compatibility

-- 
A client for connecting to 3D metaverses such as Linden Labs Secondlife(tm) and OpenSim grids



More information about the Pkg-games-commits mailing list