diff --git a/.hgtags b/.hgtags
index 86f6cb7b1b2617255d3628b7c818bc94a8ddf45c..733a7938237098fea87f2737ea4e098603ac14eb 100644
--- a/.hgtags
+++ b/.hgtags
@@ -81,3 +81,13 @@ b53a0576eec80614d7767ed72b40ed67aeff27c9 2.5.2-release
 f1827b441e05bf37c68e2c15ebc6d09e9b03f527 2.6.0-start
 f1827b441e05bf37c68e2c15ebc6d09e9b03f527 2.6.0-start
 4e9eec6a347f89b2b3f295beb72f1cf7837dff66 2.6.0-start
+9283d6d1d7eb71dfe4c330e7c9144857e7356bde 2.6.0-beta1
+9283d6d1d7eb71dfe4c330e7c9144857e7356bde DRTVWR-40_2.6.0-beta1
+c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-start
+c5bdef3aaa2744626aef3c217ce29e1900d357b3 DRTVWR-43_2.6.1-beta1
+c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1
+9e4641f4a7870c0f565a25a2971368d5a29516a1 DRTVWR-41_2.6.0-beta2
+9e4641f4a7870c0f565a25a2971368d5a29516a1 2.6.0-beta2
+56b2778c743c2a964d82e1caf11084d76a87de2c 2.6.2-start
+42f32494bac475d0737799346f6831558ae8bf5d DRTVWR-39_2.6.0-release
+42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release
diff --git a/BuildParams b/BuildParams
index c87f5a60348295ca3755f796a450a99d737e9894..ddb929406771fd19917d73f81cb27c9801b14d00 100755
--- a/BuildParams
+++ b/BuildParams
@@ -53,6 +53,7 @@ viewer-pre-beta.login_channel = "Second Life Beta Viewer"
 viewer-pre-beta.build_debug_release_separately = true
 viewer-pre-beta.build_viewer_update_version_manager = true
 
+
 # ========================================
 # Viewer Release
 # ========================================
@@ -60,21 +61,12 @@ viewer-release.viewer_channel = "Second Life Release"
 viewer-release.login_channel = "Second Life Release"
 viewer-release.build_debug_release_separately = true
 viewer-release.build_viewer_update_version_manager = true
-viewer-release.release-viewer.jira = DRTVWR-13
 
 viewer-pre-release.viewer_channel = "Second Life Release"
 viewer-pre-release.login_channel = "Second Life Release"
 viewer-pre-release.build_debug_release_separately = true
 viewer-pre-release.build_viewer_update_version_manager = true
-#viewer-pre-release.release-viewer.jira = DRTVWR-13
-
-# ========================================
-# aimee
-# ========================================
-
-viewer-development-import.build_debug_release_separately = true
-viewer-development-fixes.build_debug_release_separately = true
-viewer-development-tweaks.build_debug_release_separately = true
+viewer-pre-release.release-viewer.jira = DRTVWR-39
 
 # =======================================
 # brad
@@ -189,55 +181,11 @@ media.build_viewer_update_version_manager = false
 # oz
 # ================
 
-oz_viewer-review1_coverity.coverity_product = viewer
-
-oz_viewer-review1.build_Linux = true
-oz_viewer-review1_debug.build_Linux = false
-oz_viewer-review1_coverity.build_Linux = false
-
-oz_viewer-review1.build_Darwin = true
-oz_viewer-review1_debug.build_Darwin = false
-oz_viewer-review1_coverity.build_Darwin = false
-
-oz_viewer-review1.build_CYGWIN = true
-oz_viewer-review1.build_CYGWIN_Debug = false
-oz_viewer-review1.build_CYGWIN_RelWithDebInfo = false
-oz_viewer-review1.build_CYGWIN_Release = true
-oz_viewer-review1_debug.build_CYGWIN_Debug = true
-oz_viewer-review1_debug.build_CYGWIN_RelWithDebInfo = true
-oz_viewer-review1_debug.build_CYGWIN_Release = false
-oz_viewer-review1_coverity.build_coverity = true
-oz_viewer-review1_coverity.build_CYGWIN_Debug = false
-oz_viewer-review1_coverity.build_CYGWIN_RelWithDebInfo = false
-oz_viewer-review1_coverity.build_CYGWIN_Release = false
-
-oz_viewer-review2_coverity.coverity_product = viewer
-
-oz_viewer-review2.build_Linux = true
-oz_viewer-review2_debug.build_Linux = false
-oz_viewer-review2_coverity.build_Linux = false
-
-oz_viewer-review2.build_Darwin = true
-oz_viewer-review2_debug.build_Darwin = false
-oz_viewer-review2_coverity.build_Darwin = false
-
-oz_viewer-review2.build_CYGWIN = true
-oz_viewer-review2.build_CYGWIN_Debug = false
-oz_viewer-review2.build_CYGWIN_RelWithDebInfo = false
-oz_viewer-review2.build_CYGWIN_Release = true
-oz_viewer-review2_debug.build_CYGWIN_Debug = true
-oz_viewer-review2_debug.build_CYGWIN_RelWithDebInfo = true
-oz_viewer-review2_debug.build_CYGWIN_Release = false
-oz_viewer-review2_coverity.build_coverity = true
-oz_viewer-review2_coverity.build_CYGWIN_Debug = false
-oz_viewer-review2_coverity.build_CYGWIN_RelWithDebInfo = false
-oz_viewer-review2_coverity.build_CYGWIN_Release = false
-
-# ========================================
-# tofu
-# ========================================
-
-tofu_viewer-development-staging.email = tofu.linden@lindenlab.com
+oz-viewer-devreview.build_debug_release_separately = true
+oz_viewer-poreview.build_debug_release_separately = true
+oz-project-1.build_debug_release_separately = true
+oz-project-2.build_debug_release_separately = true
+oz-project-3.build_debug_release_separately = true
 
 # ========================================
 # enus
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 81494439cce17d2dc9c911b54ce79918ba50e394..6ceccd3ecfbf4d686c63bf4593687b0dcddc254d 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -412,7 +412,10 @@ Jonathan Yap
 	VWR-24347
 	STORM-975
 	STORM-990
+	STORM-1019
 	STORM-1020
+	STORM-1064
+	STORM-1077
 Kage Pixel
 	VWR-11
 Ken March
@@ -642,6 +645,7 @@ Robin Cornelius
 	SNOW-747
 	STORM-422
 	STORM-960
+	STORM-1019
 	VWR-2488
 	VWR-9557
 	VWR-10579
diff --git a/indra/integration_tests/CMakeLists.txt b/indra/integration_tests/CMakeLists.txt
index 67e8fbf1f2c0cd6fbaf6d9d7c9076a8281c6494a..5935f23fe9fe9ad725607b3b1a43f454b161c61b 100644
--- a/indra/integration_tests/CMakeLists.txt
+++ b/indra/integration_tests/CMakeLists.txt
@@ -1,3 +1,4 @@
 # -*- cmake -*-
 
 add_subdirectory(llui_libtest)
+add_subdirectory(llimage_libtest)
diff --git a/indra/integration_tests/llimage_libtest/CMakeLists.txt b/indra/integration_tests/llimage_libtest/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f59440be6bfc1d437f0705f247f223431f44ec22
--- /dev/null
+++ b/indra/integration_tests/llimage_libtest/CMakeLists.txt
@@ -0,0 +1,131 @@
+# -*- cmake -*-
+
+# Integration tests of the llimage library (JPEG2000, PNG, jpeg, etc... images reading and writing)
+
+project (llimage_libtest)
+
+include(00-Common)
+include(LLCommon)
+include(Linking)
+include(LLSharedLibs)
+include(LLImage)
+include(LLImageJ2COJ) 
+include(LLKDU)
+include(LLMath)
+include(LLVFS)
+
+include_directories(
+    ${LLCOMMON_INCLUDE_DIRS}
+    ${LLVFS_INCLUDE_DIRS}
+    ${LLIMAGE_INCLUDE_DIRS}
+    ${LLMATH_INCLUDE_DIRS}
+    )
+
+set(llimage_libtest_SOURCE_FILES
+    llimage_libtest.cpp
+    )
+
+set(llimage_libtest_HEADER_FILES
+    CMakeLists.txt
+    llimage_libtest.h
+    )
+
+set_source_files_properties(${llimage_libtest_HEADER_FILES}
+                            PROPERTIES HEADER_FILE_ONLY TRUE)
+
+list(APPEND llimage_libtest_SOURCE_FILES ${llimage_libtest_HEADER_FILES})
+
+add_executable(llimage_libtest
+    WIN32
+    MACOSX_BUNDLE
+    ${llimage_libtest_SOURCE_FILES}
+)
+
+set_target_properties(llimage_libtest
+    PROPERTIES
+    WIN32_EXECUTABLE
+    FALSE
+)
+
+# OS-specific libraries
+if (DARWIN)
+  include(CMakeFindFrameworks)
+  find_library(COREFOUNDATION_LIBRARY CoreFoundation)
+  set(OS_LIBRARIES ${COREFOUNDATION_LIBRARY})
+elseif (WINDOWS)
+#  set(OS_LIBRARIES)
+elseif (LINUX)
+#  set(OS_LIBRARIES)
+else (DARWIN)
+  message(FATAL_ERROR "Unknown platform")
+endif (DARWIN)
+
+# Libraries on which this application depends on
+# Sort by high-level to low-level
+target_link_libraries(llimage_libtest
+	${LLCOMMON_LIBRARIES}
+	${LLVFS_LIBRARIES}
+    ${LLIMAGE_LIBRARIES}
+    ${LLKDU_LIBRARIES}
+    ${KDU_LIBRARY}
+    ${LLIMAGEJ2COJ_LIBRARIES}
+    ${OS_LIBRARIES}
+    )
+	
+if (DARWIN)
+  # Path inside the app bundle where we'll need to copy libraries
+  set(LLIMAGE_LIBTEST_DESTINATION_DIR
+    ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llimage_libtest.app/Contents/Resources
+  )
+  # Create the Contents/Resources directory
+  add_custom_command(
+    TARGET llimage_libtest POST_BUILD
+    COMMAND ${CMAKE_COMMAND}
+    ARGS
+      -E
+      make_directory
+      ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+    COMMENT "Creating Resources directory in app bundle."
+  ) 
+else (DARWIN)
+  set(LLIMAGE_LIBTEST_DESTINATION_DIR
+    ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
+  )
+endif (DARWIN)
+
+get_target_property(BUILT_LLCOMMON llcommon LOCATION)
+add_custom_command(TARGET llimage_libtest POST_BUILD
+  COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_LLCOMMON}  ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+  DEPENDS ${BUILT_LLCOMMON}
+)
+
+if (DARWIN)
+  # Copy the required libraries to the package app
+  add_custom_command(TARGET llimage_libtest POST_BUILD
+    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libapr-1.0.3.7.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+    DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libapr-1.0.3.7.dylib
+  )
+ add_custom_command(TARGET llimage_libtest POST_BUILD
+    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libaprutil-1.0.3.8.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+    DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libaprutil-1.0.3.8.dylib
+  )
+  add_custom_command(TARGET llimage_libtest POST_BUILD
+    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libexception_handler.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+    DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libexception_handler.dylib
+  )
+  add_custom_command(TARGET llimage_libtest POST_BUILD
+    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libexpat.0.5.0.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+    DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libexpat.0.5.0.dylib
+  )
+endif (DARWIN)
+
+if (WINDOWS)
+  # Check indra/test_apps/llplugintest/CMakeLists.txt for an example of what to copy over for Windows and how
+endif (WINDOWS)
+
+# Ensure people working on the viewer don't break this library
+# *NOTE: This could be removed, or only built by TeamCity, if the build
+# and link times become too long.
+add_dependencies(viewer llimage_libtest)
+
+ll_deploy_sharedlibs_command(llimage_libtest) 
diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..365f5f758cdb9c5547814fb57fa6b151863b043a
--- /dev/null
+++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
@@ -0,0 +1,437 @@
+/** 
+ * @file llimage_libtest.cpp
+ * @author Merov Linden
+ * @brief Integration test for the llimage library
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+#include "linden_common.h"
+#include "llpointer.h"
+#include "lltimer.h"
+
+#include "llimage_libtest.h"
+
+// Linden library includes
+#include "llimage.h"
+#include "llimagejpeg.h"
+#include "llimagepng.h"
+#include "llimagebmp.h"
+#include "llimagetga.h"
+#include "llimagej2c.h"
+#include "lldir.h"
+
+// system libraries
+#include <iostream>
+
+// doc string provided when invoking the program with --help 
+static const char USAGE[] = "\n"
+"usage:\tllimage_libtest [options]\n"
+"\n"
+" -h, --help\n"
+"        Print this help\n"
+" -i, --input <file1 .. file2>\n"
+"        List of image files to load and convert. Patterns with wild cards can be used.\n"
+" -o, --output <file1 .. file2> OR <type>\n"
+"        List of image files to create (assumes same order as for input files)\n"
+"        OR 3 letters file type extension to convert each input file into.\n"
+" -log, --logmetrics <metric>\n"
+"        Log performance data for <metric>. Results in <metric>.slp\n"
+"        Note: so far, only ImageCompressionTester has been tested.\n"
+" -r, --analyzeperformance\n"
+"        Create a report comparing <metric>_baseline.slp with current <metric>.slp\n"
+"        Results in <metric>_report.csv"
+" -s, --image-stats\n"
+"        Output stats for each input and output image.\n"
+"\n";
+
+// true when all image loading is done. Used by metric logging thread to know when to stop the thread.
+static bool sAllDone = false;
+
+// Create an empty formatted image instance of the correct type from the filename
+LLPointer<LLImageFormatted> create_image(const std::string &filename)
+{
+	std::string exten = gDirUtilp->getExtension(filename);
+	U32 codec = LLImageBase::getCodecFromExtension(exten);
+	
+	LLPointer<LLImageFormatted> image;
+	switch (codec)
+	{
+		case IMG_CODEC_BMP:
+			image = new LLImageBMP();
+			break;
+		case IMG_CODEC_TGA:
+			image = new LLImageTGA();
+			break;
+		case IMG_CODEC_JPEG:
+			image = new LLImageJPEG();
+			break;
+		case IMG_CODEC_J2C:
+			image = new LLImageJ2C();
+			break;
+		case IMG_CODEC_PNG:
+			image = new LLImagePNG();
+			break;
+		default:
+			return NULL;
+	}
+	
+	return image;
+}
+
+void output_image_stats(LLPointer<LLImageFormatted> image, const std::string &filename)
+{
+	// Print out some statistical data on the image
+	std::cout << "Image stats for : " << filename << ", extension : " << image->getExtension() << std::endl;
+
+	std::cout << "    with : " << (int)(image->getWidth())       << ", height : " << (int)(image->getHeight())       << std::endl;
+	std::cout << "    comp : " << (int)(image->getComponents())  << ", levels : " << (int)(image->getDiscardLevel()) << std::endl;
+	std::cout << "    head : " << (int)(image->calcHeaderSize()) << ",   data : " << (int)(image->getDataSize())     << std::endl;
+
+	return;
+}
+
+// Load an image from file and return a raw (decompressed) instance of its data
+LLPointer<LLImageRaw> load_image(const std::string &src_filename, bool output_stats)
+{
+	LLPointer<LLImageFormatted> image = create_image(src_filename);
+
+	if (!image->load(src_filename))
+	{
+		return NULL;
+	}
+	
+	if(	(image->getComponents() != 3) && (image->getComponents() != 4) )
+	{
+		std::cout << "Image files with less than 3 or more than 4 components are not supported\n";
+		return NULL;
+	}
+	
+	if (output_stats)
+	{
+		output_image_stats(image, src_filename);
+	}
+	
+	LLPointer<LLImageRaw> raw_image = new LLImageRaw;
+	if (!image->decode(raw_image, 0.0f))
+	{
+		return NULL;
+	}
+	
+	return raw_image;
+}
+
+// Save a raw image instance into a file
+bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, bool output_stats)
+{
+	LLPointer<LLImageFormatted> image = create_image(dest_filename);
+	
+	if (!image->encode(raw_image, 0.0f))
+	{
+		return false;
+	}
+	
+	if (output_stats)
+	{
+		output_image_stats(image, dest_filename);
+	}
+
+	return image->save(dest_filename);
+}
+
+void store_input_file(std::list<std::string> &input_filenames, const std::string &path)
+{
+	// Break the incoming path in its components
+	std::string dir = gDirUtilp->getDirName(path);
+	std::string name = gDirUtilp->getBaseFileName(path);
+	std::string exten = gDirUtilp->getExtension(path);
+
+	// std::cout << "store_input_file : " << path << ", dir : " << dir << ", name : " << name << ", exten : " << exten << std::endl;
+	
+	// If extension is not an image type or "*", exit
+	// Note: we don't support complex patterns for the extension like "j??"
+	// Note: on most shells, the pattern expansion is done by the shell so that pattern matching limitation is actually not a problem
+	if ((exten.compare("*") != 0) && (LLImageBase::getCodecFromExtension(exten) == IMG_CODEC_INVALID))
+	{
+		return;
+	}
+
+	if ((name.find('*') != -1) || ((name.find('?') != -1)))
+	{
+		// If file name is a pattern, iterate to get each file name and store
+		std::string next_name;
+		while (gDirUtilp->getNextFileInDir(dir,name,next_name))
+		{
+			std::string file_name = dir + gDirUtilp->getDirDelimiter() + next_name;
+			input_filenames.push_back(file_name);
+		}
+	}
+	else
+	{
+		// Verify that the file does exist before storing 
+		if (gDirUtilp->fileExists(path))
+		{
+			input_filenames.push_back(path);
+		}
+		else
+		{
+			std::cout << "store_input_file : the file " << path << " could not be found" << std::endl;
+		}
+	}	
+}
+
+void store_output_file(std::list<std::string> &output_filenames, std::list<std::string> &input_filenames, const std::string &path)
+{
+	// Break the incoming path in its components
+	std::string dir = gDirUtilp->getDirName(path);
+	std::string name = gDirUtilp->getBaseFileName(path);
+	std::string exten = gDirUtilp->getExtension(path);
+	
+	// std::cout << "store_output_file : " << path << ", dir : " << dir << ", name : " << name << ", exten : " << exten << std::endl;
+	
+	if (dir.empty() && exten.empty())
+	{
+		// If dir and exten are empty, we interpret the name as a file extension type name and will iterate through input list to populate the output list
+		exten = name;
+		// Make sure the extension is an image type
+		if (LLImageBase::getCodecFromExtension(exten) == IMG_CODEC_INVALID)
+		{
+			return;
+		}
+		std::string delim = gDirUtilp->getDirDelimiter();
+		std::list<std::string>::iterator in_file  = input_filenames.begin();
+		std::list<std::string>::iterator end = input_filenames.end();
+		for (; in_file != end; ++in_file)
+		{
+			dir = gDirUtilp->getDirName(*in_file);
+			name = gDirUtilp->getBaseFileName(*in_file,true);
+			std::string file_name;
+			if (!dir.empty())
+			{
+				file_name = dir + delim + name + "." + exten;
+			}
+			else
+			{
+				file_name = name + "." + exten;
+			}
+			output_filenames.push_back(file_name);
+		}
+	}
+	else
+	{
+		// Make sure the extension is an image type
+		if (LLImageBase::getCodecFromExtension(exten) == IMG_CODEC_INVALID)
+		{
+			return;
+		}
+		// Store the path
+		output_filenames.push_back(path);
+	}
+}
+
+// Holds the metric gathering output in a thread safe way
+class LogThread : public LLThread
+{
+public:
+	std::string mFile;
+
+	LogThread(std::string& test_name) : LLThread("llimage_libtest log")
+	{
+		std::string file_name = test_name + std::string(".slp");
+		mFile = file_name;
+	}
+		
+	void run()
+	{
+		std::ofstream os(mFile.c_str());
+			
+		while (!sAllDone)
+		{
+			LLFastTimer::writeLog(os);
+			os.flush();
+			ms_sleep(32);
+		}
+		LLFastTimer::writeLog(os);
+		os.flush();
+		os.close();
+	}		
+};
+
+int main(int argc, char** argv)
+{
+	// List of input and output files
+	std::list<std::string> input_filenames;
+	std::list<std::string> output_filenames;
+	bool analyze_performance = false;
+	bool image_stats = false;
+
+	// Init whatever is necessary
+	ll_init_apr();
+	LLImage::initClass();
+	LogThread* fast_timer_log_thread = NULL;	// For performance and metric gathering
+
+	// Analyze command line arguments
+	for (int arg = 1; arg < argc; ++arg)
+	{
+		if (!strcmp(argv[arg], "--help") || !strcmp(argv[arg], "-h"))
+		{
+            // Send the usage to standard out
+            std::cout << USAGE << std::endl;
+			return 0;
+		}
+		else if ((!strcmp(argv[arg], "--input") || !strcmp(argv[arg], "-i")) && arg < argc-1)
+		{
+			std::string file_name = argv[arg+1];
+			while (file_name[0] != '-')		// if arg starts with '-', we consider it's not a file name but some other argument
+			{
+				// std::cout << "input file name : " << file_name << std::endl;				
+				store_input_file(input_filenames, file_name);
+				arg += 1;					// Skip that arg now we know it's a file name
+				if ((arg + 1) == argc)		// Break out of the loop if we reach the end of the arg list
+					break;
+				file_name = argv[arg+1];	// Next argument and loop over
+			}
+		}
+		else if ((!strcmp(argv[arg], "--output") || !strcmp(argv[arg], "-o")) && arg < argc-1)
+		{
+			std::string file_name = argv[arg+1];
+			while (file_name[0] != '-')		// if arg starts with '-', we consider it's not a file name but some other argument
+			{
+				// std::cout << "output file name : " << file_name << std::endl;				
+				store_output_file(output_filenames, input_filenames, file_name);
+				arg += 1;					// Skip that arg now we know it's a file name
+				if ((arg + 1) == argc)		// Break out of the loop if we reach the end of the arg list
+					break;
+				file_name = argv[arg+1];	// Next argument and loop over
+			}
+		}
+		else if (!strcmp(argv[arg], "--logmetrics") || !strcmp(argv[arg], "-log"))
+		{
+			// '--logmetrics' needs to be specified with a named test metric argument
+			// Note: for the moment, only ImageCompressionTester has been tested
+			std::string test_name;
+			if ((arg + 1) < argc)
+			{
+				test_name = argv[arg+1];
+			}
+			if (((arg + 1) >= argc) || (test_name[0] == '-'))
+			{
+				// We don't have an argument left in the arg list or the next argument is another option
+				std::cout << "No --logmetrics argument given, no perf data will be gathered" << std::endl;
+			}
+			else
+			{
+				LLFastTimer::sMetricLog = TRUE;
+				LLFastTimer::sLogName = test_name;
+				arg += 1;					// Skip that arg now we know it's a valid test name
+				if ((arg + 1) == argc)		// Break out of the loop if we reach the end of the arg list
+					break;
+			}
+		}
+		else if (!strcmp(argv[arg], "--analyzeperformance") || !strcmp(argv[arg], "-r"))
+		{
+			analyze_performance = true;
+		}
+		else if (!strcmp(argv[arg], "--image-stats") || !strcmp(argv[arg], "-s"))
+		{
+			image_stats = true;
+		}
+	}
+		
+	// Check arguments consistency. Exit with proper message if inconsistent.
+	if (input_filenames.size() == 0)
+	{
+		std::cout << "No input file, nothing to do -> exit" << std::endl;
+		return 0;
+	}
+	if (analyze_performance && !LLFastTimer::sMetricLog)
+	{
+		std::cout << "Cannot create perf report if no perf gathered (i.e. use argument -log <perf> with -r) -> exit" << std::endl;
+		return 0;
+	}
+	
+
+	// Create the logging thread if required
+	if (LLFastTimer::sMetricLog)
+	{
+		LLFastTimer::sLogLock = new LLMutex(NULL);
+		fast_timer_log_thread = new LogThread(LLFastTimer::sLogName);
+		fast_timer_log_thread->start();
+	}
+	
+	// Perform action on each input file
+	std::list<std::string>::iterator in_file  = input_filenames.begin();
+	std::list<std::string>::iterator out_file = output_filenames.begin();
+	std::list<std::string>::iterator in_end = input_filenames.end();
+	std::list<std::string>::iterator out_end = output_filenames.end();
+	for (; in_file != in_end; ++in_file)
+	{
+		// Load file
+		LLPointer<LLImageRaw> raw_image = load_image(*in_file, image_stats);
+		if (!raw_image)
+		{
+			std::cout << "Error: Image " << *in_file << " could not be loaded" << std::endl;
+			continue;
+		}
+	
+		// Save file
+		if (out_file != out_end)
+		{
+			if (!save_image(*out_file, raw_image, image_stats))
+			{
+				std::cout << "Error: Image " << *out_file << " could not be saved" << std::endl;
+			}
+			else
+			{
+				std::cout << *in_file << " -> " << *out_file << std::endl;
+			}
+			++out_file;
+		}
+	}
+
+	// Stop the perf gathering system if needed
+	if (LLFastTimer::sMetricLog)
+	{
+		LLMetricPerformanceTesterBasic::deleteTester(LLFastTimer::sLogName);
+		sAllDone = true;
+	}
+	
+	// Output perf data if requested by user
+	if (analyze_performance)
+	{
+		std::cout << "Analyzing performance" << std::endl;
+		
+		std::string baseline_name = LLFastTimer::sLogName + "_baseline.slp";
+		std::string current_name  = LLFastTimer::sLogName + ".slp"; 
+		std::string report_name   = LLFastTimer::sLogName + "_report.csv";
+		
+		LLMetricPerformanceTesterBasic::doAnalysisMetrics(baseline_name, current_name, report_name);
+	}
+	
+	// Cleanup and exit
+	LLImage::cleanupClass();
+	if (fast_timer_log_thread)
+	{
+		fast_timer_log_thread->shutdown();
+	}
+	
+	return 0;
+}
diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.h b/indra/integration_tests/llimage_libtest/llimage_libtest.h
new file mode 100644
index 0000000000000000000000000000000000000000..63f3d46b50b4710c3dc006789b35e6f065075182
--- /dev/null
+++ b/indra/integration_tests/llimage_libtest/llimage_libtest.h
@@ -0,0 +1,29 @@
+/** 
+ * @file llimage_libtest.h
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+#ifndef LLIMAGE_LIBTEST_H
+#define LLIMAGE_LIBTEST_H
+
+
+#endif
diff --git a/indra/llcommon/llmetricperformancetester.cpp b/indra/llcommon/llmetricperformancetester.cpp
index 5fa3a5ea070bfaeea313ba1a11d948d36dcc0f09..41d3eb0bf369881da267876ef9224e7bcfaf9446 100644
--- a/indra/llcommon/llmetricperformancetester.cpp
+++ b/indra/llcommon/llmetricperformancetester.cpp
@@ -63,7 +63,18 @@ BOOL LLMetricPerformanceTesterBasic::addTester(LLMetricPerformanceTesterBasic* t
 	sTesterMap.insert(std::make_pair(name, tester));
 	return TRUE;
 }
-	
+
+/*static*/ 
+void LLMetricPerformanceTesterBasic::deleteTester(std::string name)
+{
+	name_tester_map_t::iterator tester = sTesterMap.find(name);
+	if (tester != sTesterMap.end())
+	{
+		delete tester->second;
+		sTesterMap.erase(tester);
+	}
+}
+
 /*static*/ 
 LLMetricPerformanceTesterBasic* LLMetricPerformanceTesterBasic::getTester(std::string name) 
 {
@@ -83,7 +94,78 @@ BOOL LLMetricPerformanceTesterBasic::isMetricLogRequested(std::string name)
 	return (LLFastTimer::sMetricLog && ((LLFastTimer::sLogName == name) || (LLFastTimer::sLogName == DEFAULT_METRIC_NAME)));
 }
 
+/*static*/ 
+LLSD LLMetricPerformanceTesterBasic::analyzeMetricPerformanceLog(std::istream& is)
+{
+	LLSD ret;
+	LLSD cur;
+	
+	while (!is.eof() && LLSDSerialize::fromXML(cur, is))
+	{
+		for (LLSD::map_iterator iter = cur.beginMap(); iter != cur.endMap(); ++iter)
+		{
+			std::string label = iter->first;
+			
+			LLMetricPerformanceTesterBasic* tester = LLMetricPerformanceTesterBasic::getTester(iter->second["Name"].asString()) ;
+			if(tester)
+			{
+				ret[label]["Name"] = iter->second["Name"] ;
+				
+				S32 num_of_metrics = tester->getNumberOfMetrics() ;
+				for(S32 index = 0 ; index < num_of_metrics ; index++)
+				{
+					ret[label][ tester->getMetricName(index) ] = iter->second[ tester->getMetricName(index) ] ;
+				}
+			}
+		}
+	}
+	
+	return ret;
+}
+
+/*static*/ 
+void LLMetricPerformanceTesterBasic::doAnalysisMetrics(std::string baseline, std::string target, std::string output)
+{
+	if(!LLMetricPerformanceTesterBasic::hasMetricPerformanceTesters())
+	{
+		return ;
+	}
+	
+	// Open baseline and current target, exit if one is inexistent
+	std::ifstream base_is(baseline.c_str());
+	std::ifstream target_is(target.c_str());
+	if (!base_is.is_open() || !target_is.is_open())
+	{
+		llwarns << "'-analyzeperformance' error : baseline or current target file inexistent" << llendl;
+		base_is.close();
+		target_is.close();
+		return;
+	}
 	
+	//analyze baseline
+	LLSD base = analyzeMetricPerformanceLog(base_is);
+	base_is.close();
+	
+	//analyze current
+	LLSD current = analyzeMetricPerformanceLog(target_is);
+	target_is.close();
+	
+	//output comparision
+	std::ofstream os(output.c_str());
+	
+	os << "Label, Metric, Base(B), Target(T), Diff(T-B), Percentage(100*T/B)\n"; 
+	for(LLMetricPerformanceTesterBasic::name_tester_map_t::iterator iter = LLMetricPerformanceTesterBasic::sTesterMap.begin() ; 
+		iter != LLMetricPerformanceTesterBasic::sTesterMap.end() ; ++iter)
+	{
+		LLMetricPerformanceTesterBasic* tester = ((LLMetricPerformanceTesterBasic*)iter->second) ;	
+		tester->analyzePerformance(&os, &base, &current) ;
+	}
+	
+	os.flush();
+	os.close();
+}
+
+
 //----------------------------------------------------------------------------------------------
 // LLMetricPerformanceTesterBasic : Tester instance methods
 //----------------------------------------------------------------------------------------------
diff --git a/indra/llcommon/llmetricperformancetester.h b/indra/llcommon/llmetricperformancetester.h
index 1372f48dcfec7da703e21ce1412137b09c9890b4..1a18cdf36fbf3a55e31f6c7c6cf5bd6a422332ab 100644
--- a/indra/llcommon/llmetricperformancetester.h
+++ b/indra/llcommon/llmetricperformancetester.h
@@ -62,6 +62,8 @@ class LL_COMMON_API LLMetricPerformanceTesterBasic
 	 */
 	virtual void analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) ;
 
+	static void doAnalysisMetrics(std::string baseline, std::string target, std::string output) ;
+
 	/**
 	 * @return Returns the number of the test metrics in this tester instance.
 	 */
@@ -116,6 +118,7 @@ class LL_COMMON_API LLMetricPerformanceTesterBasic
 private:
 	void preOutputTestResults(LLSD* sd) ;
 	void postOutputTestResults(LLSD* sd) ;
+	static LLSD analyzeMetricPerformanceLog(std::istream& is) ;
 
 	std::string mName ;							// Name of this tester instance
 	S32 mCount ;								// Current record count
@@ -134,6 +137,12 @@ class LL_COMMON_API LLMetricPerformanceTesterBasic
 	 */
 	static LLMetricPerformanceTesterBasic* getTester(std::string name) ;
 	
+	/**
+	 * @return Delete the named tester from the list 
+	 * @param[in] name - Name of the tester instance to delete.
+	 */
+	static void deleteTester(std::string name);
+
 	/**
 	 * @return Returns TRUE if that metric *or* the default catch all metric has been requested to be logged
 	 * @param[in] name - Name of the tester queried.
diff --git a/indra/llcommon/llprocesslauncher.cpp b/indra/llcommon/llprocesslauncher.cpp
index d46188104f994a238be5cbd41b443697fdc85795..10950181fd30bf0f182d19e5954a3847eb8ec1a7 100644
--- a/indra/llcommon/llprocesslauncher.cpp
+++ b/indra/llcommon/llprocesslauncher.cpp
@@ -103,10 +103,30 @@ int LLProcessLauncher::launch(void)
 	char *args2 = new char[args.size() + 1];
 	strcpy(args2, args.c_str());
 
-	if( ! CreateProcessA( NULL, args2, NULL, NULL, FALSE, 0, NULL, mWorkingDir.c_str(), &sinfo, &pinfo ) )
+	const char * working_directory = 0;
+	if(!mWorkingDir.empty()) working_directory = mWorkingDir.c_str();
+	if( ! CreateProcessA( NULL, args2, NULL, NULL, FALSE, 0, NULL, working_directory, &sinfo, &pinfo ) )
 	{
-		// TODO: do better than returning the OS-specific error code on failure...
 		result = GetLastError();
+
+		LPTSTR error_str = 0;
+		if(
+			FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+				NULL,
+				result,
+				0,
+				(LPTSTR)&error_str,
+				0,
+				NULL) 
+			!= 0) 
+		{
+			char message[256];
+			wcstombs(message, error_str, 256);
+			message[255] = 0;
+			llwarns << "CreateProcessA failed: " << message << llendl;
+			LocalFree(error_str);
+		}
+
 		if(result == 0)
 		{
 			// Make absolutely certain we return a non-zero value on failure.
diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp
index f3cbfab77aa4b4fc7db1db06982a5412e2d9b5a6..5be5ecc492f6795e91e13660f49f677232e0110e 100644
--- a/indra/llcommon/llsdserialize.cpp
+++ b/indra/llcommon/llsdserialize.cpp
@@ -2095,11 +2095,6 @@ bool unzip_llsd(LLSD& data, std::istream& is, S32 size)
 
 	S32 ret = inflateInit(&strm);
 
-	if (ret != Z_OK)
-	{
-		llerrs << "WTF?" << llendl;
-	}
-	
 	do
 	{
 		strm.avail_out = CHUNK;
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index 117d96ffa699cb693e9b2f5ba3c337d343de3b41..488ec5b239476bbe8420eda14eab2e914a4e342c 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -29,7 +29,7 @@
 
 const S32 LL_VERSION_MAJOR = 2;
 const S32 LL_VERSION_MINOR = 6;
-const S32 LL_VERSION_PATCH = 1;
+const S32 LL_VERSION_PATCH = 3;
 const S32 LL_VERSION_BUILD = 0;
 
 const char * const LL_CHANNEL = "Second Life Developer";
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index 825b9aab1a49cefd54b092e05d869d00b15a32b7..18444f393415b572c4e20140409ea8bf753b8eb9 100644
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -266,13 +266,13 @@ class LLImageFormatted : public LLImageBase
 	// subclasses must return a prefered file extension (lowercase without a leading dot)
 	virtual std::string getExtension() = 0;
 	// calcHeaderSize() returns the maximum size of header;
-	//   0 indicates we don't know have a header and have to lead the entire file
+	//   0 indicates we don't have a header and have to read the entire file
 	virtual S32 calcHeaderSize() { return 0; };
 	// calcDataSize() returns how many bytes to read to load discard_level (including header)
 	virtual S32 calcDataSize(S32 discard_level);
 	// calcDiscardLevelBytes() returns the smallest valid discard level based on the number of input bytes
 	virtual S32 calcDiscardLevelBytes(S32 bytes);
-	// getRawDiscardLevel()by default returns mDiscardLevel, but may be overridden (LLImageJ2C)
+	// getRawDiscardLevel() by default returns mDiscardLevel, but may be overridden (LLImageJ2C)
 	virtual S8  getRawDiscardLevel() { return mDiscardLevel; }
 	
 	BOOL load(const std::string& filename);
diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp
index cb2a85fa917afa683954f342d45c488a3e284ec4..80fec7f8a04b571b8f172a1ef3e616eee9a5d1e5 100644
--- a/indra/llimage/llimagej2c.cpp
+++ b/indra/llimage/llimagej2c.cpp
@@ -474,6 +474,7 @@ LLImageCompressionTester::LLImageCompressionTester() : LLMetricPerformanceTester
 
 LLImageCompressionTester::~LLImageCompressionTester()
 {
+	outputTestResults();
 	LLImageJ2C::sTesterp = NULL;
 }
 
diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h
index 25b29ac1a825a86a1e40e681075473c4564d1a67..eea7c977fb9595222965fece31f14d586cd87829 100644
--- a/indra/llmath/llmath.h
+++ b/indra/llmath/llmath.h
@@ -29,6 +29,7 @@
 
 #include <cmath>
 #include <cstdlib>
+#include <vector>
 #include "lldefs.h"
 //#include "llstl.h" // *TODO: Remove when LLString is gone
 //#include "llstring.h" // *TODO: Remove when LLString is gone
@@ -497,6 +498,44 @@ inline F32 llgaussian(F32 x, F32 o)
 	return 1.f/(F_SQRT_TWO_PI*o)*powf(F_E, -(x*x)/(2*o*o));
 }
 
+//helper function for removing outliers
+template <class VEC_TYPE>
+inline void ll_remove_outliers(std::vector<VEC_TYPE>& data, F32 k)
+{
+	if (data.size() < 100)
+	{ //not enough samples
+		return;
+	}
+
+	VEC_TYPE Q1 = data[data.size()/4];
+	VEC_TYPE Q3 = data[data.size()-data.size()/4-1];
+
+	VEC_TYPE min = (VEC_TYPE) ((F32) Q1-k * (F32) (Q3-Q1));
+	VEC_TYPE max = (VEC_TYPE) ((F32) Q3+k * (F32) (Q3-Q1));
+
+	U32 i = 0;
+	while (i < data.size() && data[i] < min)
+	{
+		i++;
+	}
+
+	S32 j = data.size()-1;
+	while (j > 0 && data[j] > max)
+	{
+		j--;
+	}
+
+	if (j < data.size()-1)
+	{
+		data.erase(data.begin()+j, data.end());
+	}
+
+	if (i > 0)
+	{
+		data.erase(data.begin(), data.begin()+i);
+	}
+}
+
 // Include simd math header
 #include "llsimdmath.h"
 
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index c4be1763535aa8fcccadb86fcac35e1ff4adcdd2..dc360818d69b5cf3a964eb9e14ad36f233d51cbb 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -2143,72 +2143,6 @@ bool LLVolumeFace::VertexData::compareNormal(const LLVolumeFace::VertexData& rhs
 	return retval;
 }
 
-BOOL LLVolume::createVolumeFacesFromFile(const std::string& file_name)
-{
-	std::ifstream is;
-	
-	is.open(file_name.c_str(), std::ifstream::in | std::ifstream::binary);
-
-	BOOL success = createVolumeFacesFromStream(is);
-	
-	is.close();
-
-	return success;
-}
-
-BOOL LLVolume::createVolumeFacesFromStream(std::istream& is)
-{
-	mSculptLevel = -1;  // default is an error occured
-
-	LLSD header;
-	{
-		if (!LLSDSerialize::deserialize(header, is, 1024*1024*1024))
-		{
-			llwarns << "Mesh header parse error.  Not a valid mesh asset!" << llendl;
-			return FALSE;
-		}
-	}
-	
-	std::string nm[] = 
-	{
-		"lowest_lod",
-		"low_lod",
-		"medium_lod",
-		"high_lod"
-	};
-
-	S32 lod = llclamp((S32) mDetail, 0, 3);
-
-	while (lod < 4 && 
-		(header[nm[lod]]["offset"].asInteger() == -1 || 
-		header[nm[lod]]["size"].asInteger() == 0 ))
-	{
-		++lod;
-	}
-
-	if (lod >= 4)
-	{
-		lod = llclamp((S32) mDetail, 0, 3);
-
-		while (lod >= 0 && 
-				(header[nm[lod]]["offset"].asInteger() == -1 ||
-				header[nm[lod]]["size"].asInteger() == 0) )
-		{
-			--lod;
-		}
-
-		if (lod < 0)
-		{
-			llwarns << "Mesh header missing LOD offsets.  Not a valid mesh asset!" << llendl;
-			return FALSE;
-		}
-	}
-
-	is.seekg(header[nm[lod]]["offset"].asInteger(), std::ios_base::cur);
-
-	return unpackVolumeFaces(is, header[nm[lod]]["size"].asInteger());
-}
-
 bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
 {
 	//input stream is now pointing at a zlib compressed block of LLSD
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index 60b64b1285426f6921b37a7f2221490882dbda94..01bfbd858be72fd6badd82b8e0e335f68b682eba 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -1048,8 +1048,6 @@ class LLVolume : public LLRefCount
 	BOOL generate();
 	void createVolumeFaces();
 public:
-	virtual BOOL createVolumeFacesFromFile(const std::string& file_name);
-	virtual BOOL createVolumeFacesFromStream(std::istream& is);
 	virtual bool unpackVolumeFaces(std::istream& is, S32 size);
 
 	virtual void makeTetrahedron();
diff --git a/indra/llmath/m4math.cpp b/indra/llmath/m4math.cpp
index 8741400e5293360c82f2d1418d48fc6dc50e2120..bad4deb4dee87498382345aa2b8da3578c80d667 100644
--- a/indra/llmath/m4math.cpp
+++ b/indra/llmath/m4math.cpp
@@ -829,4 +829,54 @@ std::ostream& operator<<(std::ostream& s, const LLMatrix4 &a)
 	return s;
 }
 
+LLSD LLMatrix4::getValue() const
+{
+	LLSD ret;
+	
+	ret[0] = mMatrix[0][0];
+	ret[1] = mMatrix[0][1];
+	ret[2] = mMatrix[0][2];
+	ret[3] = mMatrix[0][3];
+
+	ret[4] = mMatrix[1][0];
+	ret[5] = mMatrix[1][1];
+	ret[6] = mMatrix[1][2];
+	ret[7] = mMatrix[1][3];
+
+	ret[8] = mMatrix[2][0];
+	ret[9] = mMatrix[2][1];
+	ret[10] = mMatrix[2][2];
+	ret[11] = mMatrix[2][3];
+
+	ret[12] = mMatrix[3][0];
+	ret[13] = mMatrix[3][1];
+	ret[14] = mMatrix[3][2];
+	ret[15] = mMatrix[3][3];
+
+	return ret;
+}
+
+void LLMatrix4::setValue(const LLSD& data) 
+{
+	mMatrix[0][0] = data[0].asReal();
+	mMatrix[0][1] = data[1].asReal();
+	mMatrix[0][2] = data[2].asReal();
+	mMatrix[0][3] = data[3].asReal();
+
+	mMatrix[1][0] = data[4].asReal();
+	mMatrix[1][1] = data[5].asReal();
+	mMatrix[1][2] = data[6].asReal();
+	mMatrix[1][3] = data[7].asReal();
+
+	mMatrix[2][0] = data[8].asReal();
+	mMatrix[2][1] = data[9].asReal();
+	mMatrix[2][2] = data[10].asReal();
+	mMatrix[2][3] = data[11].asReal();
+
+	mMatrix[3][0] = data[12].asReal();
+	mMatrix[3][1] = data[13].asReal();
+	mMatrix[3][2] = data[14].asReal();
+	mMatrix[3][3] = data[15].asReal();
+}
+
 
diff --git a/indra/llmath/m4math.h b/indra/llmath/m4math.h
index 3588f36758c75f8858eeb8377baf0bed311804e7..a7dce10397839e4ea21c88d59f4689d29f9193ed 100644
--- a/indra/llmath/m4math.h
+++ b/indra/llmath/m4math.h
@@ -119,6 +119,8 @@ class LLMatrix4
 
 	~LLMatrix4(void);										// Destructor
 
+	LLSD getValue() const;
+	void setValue(const LLSD&);
 
 	//////////////////////////////
 	//
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index eed82f924bf3b653274bbd1dde23be0945bda88a..5af1122451fe1da818510d5c69c25d8fe145b86b 100755
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -57,9 +57,10 @@ const int MODEL_NAMES_LENGTH = sizeof(model_names) / sizeof(std::string);
 
 LLModel::LLModel(LLVolumeParams& params, F32 detail)
 	: LLVolume(params, detail), mNormalizedScale(1,1,1), mNormalizedTranslation(0,0,0)
-	, mPelvisOffset( 0.0f )
+	, mPelvisOffset( 0.0f ), mStatus(NO_ERRORS)
 {
 	mDecompID = -1;
+	mLocalID = -1;
 }
 
 LLModel::~LLModel()
@@ -208,7 +209,7 @@ void get_dom_sources(const domInputLocalOffset_Array& inputs, S32& pos_offset, S
 	idx_stride += 1;
 }
 
-void load_face_from_dom_triangles(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domTrianglesRef& tri)
+LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domTrianglesRef& tri)
 {
 	LLVolumeFace face;
 	std::vector<LLVolumeFace::VertexData> verts;
@@ -303,7 +304,8 @@ void load_face_from_dom_triangles(std::vector<LLVolumeFace>& face_list, std::vec
 			verts.push_back(cv);
 			if (verts.size() >= 65535)
 			{
-				llerrs << "Attempted to write model exceeding 16-bit index buffer limitation." << llendl;
+				//llerrs << "Attempted to write model exceeding 16-bit index buffer limitation." << llendl;
+				return LLModel::VERTEX_NUMBER_OVERFLOW ;
 			}
 			U16 index = (U16) (verts.size()-1);
 			indices.push_back(index);
@@ -348,16 +350,17 @@ void load_face_from_dom_triangles(std::vector<LLVolumeFace>& face_list, std::vec
 		face_list.rbegin()->fillFromLegacyData(verts, indices);
 	}
 
+	return LLModel::NO_ERRORS ;
 }
 
-void load_face_from_dom_polylist(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolylistRef& poly)
+LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolylistRef& poly)
 {
 	domPRef p = poly->getP();
 	domListOfUInts& idx = p->getValue();
 
 	if (idx.getCount() == 0)
 	{
-		return;
+		return LLModel::NO_ERRORS ;
 	}
 
 	const domInputLocalOffset_Array& inputs = poly->getInput_array();
@@ -478,7 +481,8 @@ void load_face_from_dom_polylist(std::vector<LLVolumeFace>& face_list, std::vect
 				verts.push_back(cv);
 				if (verts.size() >= 65535)
 				{
-					llerrs << "Attempted to write model exceeding 16-bit index buffer limitation." << llendl;
+					//llerrs << "Attempted to write model exceeding 16-bit index buffer limitation." << llendl;
+					return LLModel::VERTEX_NUMBER_OVERFLOW ;
 				}
 				U16 index = (U16) (verts.size()-1);
 			
@@ -538,9 +542,11 @@ void load_face_from_dom_polylist(std::vector<LLVolumeFace>& face_list, std::vect
 		face_list.push_back(face);
 		face_list.rbegin()->fillFromLegacyData(verts, indices);
 	}
+
+	return LLModel::NO_ERRORS ;
 }
 
-void load_face_from_dom_polygons(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolygonsRef& poly)
+LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolygonsRef& poly)
 {
 	LLVolumeFace face;
 	std::vector<U16> indices;
@@ -653,7 +659,7 @@ void load_face_from_dom_polygons(std::vector<LLVolumeFace>& face_list, std::vect
 
 	if (verts.empty())
 	{
-		return;
+		return LLModel::NO_ERRORS;
 	}
 
 	face.mExtents[0] = verts[0].getPosition();
@@ -715,6 +721,27 @@ void load_face_from_dom_polygons(std::vector<LLVolumeFace>& face_list, std::vect
 		face_list.push_back(face);
 		face_list.rbegin()->fillFromLegacyData(new_verts, indices);
 	}
+
+	return LLModel::NO_ERRORS ;
+}
+
+//static
+std::string LLModel::getStatusString(U32 status)
+{
+	const static std::string status_strings[(S32)INVALID_STATUS] = {"status_no_error", "status_vertex_number_overflow"};
+
+	if(status < INVALID_STATUS)
+	{
+		if(status_strings[status] == std::string())
+		{
+			llerrs << "No valid status string for this status: " << (U32)status << llendl ;
+		}
+		return status_strings[status] ;
+	}
+
+	llerrs << "Invalid model status: " << (U32)status << llendl ;
+
+	return std::string() ;
 }
 
 void LLModel::addVolumeFacesFromDomMesh(domMesh* mesh)
@@ -725,7 +752,14 @@ void LLModel::addVolumeFacesFromDomMesh(domMesh* mesh)
 	{
 		domTrianglesRef& tri = tris.get(i);
 
-		load_face_from_dom_triangles(mVolumeFaces, mMaterialList, tri);
+		mStatus = load_face_from_dom_triangles(mVolumeFaces, mMaterialList, tri);
+		
+		if(mStatus != NO_ERRORS)
+		{
+			mVolumeFaces.clear() ;
+			mMaterialList.clear() ;
+			return ; //abort
+		}
 	}
 
 	domPolylist_Array& polys = mesh->getPolylist_array();
@@ -733,7 +767,14 @@ void LLModel::addVolumeFacesFromDomMesh(domMesh* mesh)
 	{
 		domPolylistRef& poly = polys.get(i);
 
-		load_face_from_dom_polylist(mVolumeFaces, mMaterialList, poly);
+		mStatus = load_face_from_dom_polylist(mVolumeFaces, mMaterialList, poly);
+
+		if(mStatus != NO_ERRORS)
+		{
+			mVolumeFaces.clear() ;
+			mMaterialList.clear() ;
+			return ; //abort
+		}
 	}
 
 	domPolygons_Array& polygons = mesh->getPolygons_array();
@@ -741,7 +782,14 @@ void LLModel::addVolumeFacesFromDomMesh(domMesh* mesh)
 	{
 		domPolygonsRef& poly = polygons.get(i);
 
-		load_face_from_dom_polygons(mVolumeFaces, mMaterialList, poly);
+		mStatus = load_face_from_dom_polygons(mVolumeFaces, mMaterialList, poly);
+
+		if(mStatus != NO_ERRORS)
+		{
+			mVolumeFaces.clear() ;
+			mMaterialList.clear() ;
+			return ; //abort
+		}
 	}
 
 }
@@ -754,7 +802,7 @@ BOOL LLModel::createVolumeFacesFromDomMesh(domMesh* mesh)
 		mMaterialList.clear();
 
 		addVolumeFacesFromDomMesh(mesh);
-
+		
 		if (getNumVolumeFaces() > 0)
 		{
 			optimizeVolumeFaces();
@@ -774,43 +822,6 @@ BOOL LLModel::createVolumeFacesFromDomMesh(domMesh* mesh)
 	return FALSE;
 }
 
-
-BOOL LLModel::createVolumeFacesFromFile(const std::string& file_name)
-{
-	DAE dae;
-	domCOLLADA* dom = dae.open(file_name);
-	if (dom)
-	{
-		daeDatabase* db = dae.getDatabase();
-
-		daeInt count = db->getElementCount(NULL, COLLADA_TYPE_MESH);
-		
-		mVolumeFaces.clear();
-		mMaterialList.clear();
-
-		for (daeInt idx = 0; idx < count; ++idx)
-		{
-			domMesh* mesh = NULL;
-
-			db->getElement((daeElement**) &mesh, idx, NULL, COLLADA_TYPE_MESH);
-			
-			if (mesh)
-			{
-				addVolumeFacesFromDomMesh(mesh);
-			}
-		}
-
-		if (getNumVolumeFaces() > 0)
-		{
-			optimizeVolumeFaces();
-			normalizeVolumeFaces();
-			return TRUE;
-		}
-	}
-
-	return FALSE;
-}
-
 void LLModel::offsetMesh( const LLVector3& pivotPoint )
 {
 	LLVector4a pivot( pivotPoint[VX], pivotPoint[VY], pivotPoint[VZ] );
@@ -1350,16 +1361,6 @@ std::string LLModel::getElementLabel(daeElement *element)
 	return std::string("object");
 }
 
-//static 
-LLModel* LLModel::loadModelFromDae(std::string filename)
-{
-	LLVolumeParams volume_params;
-	volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
-	LLModel* ret = new LLModel(volume_params, 0.f); 
-	ret->createVolumeFacesFromFile(filename);
-	return ret;
-}
-
 //static 
 LLModel* LLModel::loadModelFromDomMesh(domMesh *mesh)
 {
@@ -1379,70 +1380,6 @@ std::string LLModel::getName() const
 		return mLabel;
 }
 
-//static 
-LLSD LLModel::writeModel(
-	std::string filename,
-	LLModel* physics,
-	LLModel* high,
-	LLModel* medium,
-	LLModel* low,
-	LLModel* impostor,
-	const convex_hull_decomposition& decomp,
-	BOOL upload_skin,
-	BOOL upload_joints,
-	BOOL nowrite)
-{
-	LLModel::hull dummy_hull;
-	return writeModel(
-		filename,
-		physics,
-		high,
-		medium,
-		low,
-		impostor,
-		decomp,
-		dummy_hull,
-		upload_skin,
-		upload_joints,
-		nowrite);
-}
-
-//static 
-LLSD LLModel::writeModel(
-	std::string filename,
-	LLModel* physics,
-	LLModel* high,
-	LLModel* medium,
-	LLModel* low,
-	LLModel* impostor,
-	const convex_hull_decomposition& decomp,
-	const hull& base_hull,
-	BOOL upload_skin,
-	BOOL upload_joints,
-	BOOL nowrite)
-{
-	std::ofstream os(
-		filename.c_str(),
-		std::ofstream::out | std::ofstream::binary);
-
-	LLSD header = writeModel(
-		os,
-		physics,
-		high,
-		medium,
-		low,
-		impostor,
-		decomp,
-		base_hull,
-		upload_skin,
-		upload_joints,
-		nowrite);
-
-	os.close();
-
-	return header;
-}
-
 //static
 LLSD LLModel::writeModel(
 	std::ostream& ostr,
@@ -1451,8 +1388,7 @@ LLSD LLModel::writeModel(
 	LLModel* medium,
 	LLModel* low,
 	LLModel* impostor,
-	const convex_hull_decomposition& decomp,
-	const hull& base_hull,
+	const LLModel::Decomposition& decomp,
 	BOOL upload_skin,
 	BOOL upload_joints,
 	BOOL nowrite)
@@ -1472,164 +1408,13 @@ LLSD LLModel::writeModel(
 
 	if (skinning)
 	{ //write skinning block
-		if (high->mJointList.size() != high->mInvBindMatrix.size())
-		{
-			llerrs << "WTF?" << llendl;
-		}
-
-		for (U32 i = 0; i < high->mJointList.size(); ++i)
-		{
-			mdl["skin"]["joint_names"][i] = high->mJointList[i];
-
-			for (U32 j = 0; j < 4; j++)
-			{
-				for (U32 k = 0; k < 4; k++)
-				{
-					mdl["skin"]["inverse_bind_matrix"][i][j*4+k] = high->mInvBindMatrix[i].mMatrix[j][k]; 
-				}
-			}
-		}
-
-		for (U32 i = 0; i < 4; i++)
-		{
-			for (U32 j = 0; j < 4; j++)
-			{
-				mdl["skin"]["bind_shape_matrix"][i*4+j] = high->mBindShapeMatrix.mMatrix[i][j];
-			}
-		}
-		
-		
-		if ( upload_joints && high->mAlternateBindMatrix.size() > 0 )
-		{
-			for (U32 i = 0; i < high->mJointList.size(); ++i)
-			{
-				for (U32 j = 0; j < 4; j++)
-				{
-					for (U32 k = 0; k < 4; k++)
-					{
-						mdl["skin"]["alt_inverse_bind_matrix"][i][j*4+k] = high->mAlternateBindMatrix[i].mMatrix[j][k]; 
-					}
-				}
-			}
-
-			mdl["skin"]["pelvis_offset"] = high->mPelvisOffset;
-		}
-		
+		mdl["skin"] = high->mSkinInfo.asLLSD(upload_joints);
 	}
 
-	if (!decomp.empty() || !base_hull.empty())
+	if (!decomp.mBaseHull.empty() ||
+		!decomp.mHull.empty())		
 	{
-		//write decomposition block
-		// ["decomposition"]["HullList"] -- list of 8 bit integers, each entry represents a hull with specified number of points
-		// ["decomposition"]["PositionDomain"]["Min"/"Max"]
-		// ["decomposition"]["Position"] -- list of 16-bit integers to be decoded to given domain, encoded 3D points
-		// ["decomposition"]["Hull"] -- list of 16-bit integers to be decoded to given domain, encoded 3D points representing a single hull approximation of given shape
-		
-		
-		//get minimum and maximum
-		LLVector3 min;
-		
-		if (decomp.empty())
-		{
-			min = base_hull[0];
-		}
-		else
-		{
-			min = decomp[0][0];
-		}
-
-		LLVector3 max = min;
-
-		LLSD::Binary hulls(decomp.size());
-
-		U32 total = 0;
-
-		for (U32 i = 0; i < decomp.size(); ++i)
-		{
-			U32 size = decomp[i].size();
-			total += size;
-			hulls[i] = (U8) (size);
-
-			for (U32 j = 0; j < decomp[i].size(); ++j)
-			{
-				update_min_max(min, max, decomp[i][j]);
-			}
-
-		}
-
-		for (U32 i = 0; i < base_hull.size(); ++i)
-		{
-			update_min_max(min, max, base_hull[i]);	
-		}
-
-		mdl["decomposition"]["Min"] = min.getValue();
-		mdl["decomposition"]["Max"] = max.getValue();
-
-		if (!hulls.empty())
-		{
-			mdl["decomposition"]["HullList"] = hulls;
-		}
-
-		if (total > 0)
-		{
-			LLSD::Binary p(total*3*2);
-
-			LLVector3 range = max-min;
-
-			U32 vert_idx = 0;
-			for (U32 i = 0; i < decomp.size(); ++i)
-			{
-				for (U32 j = 0; j < decomp[i].size(); ++j)
-				{
-					for (U32 k = 0; k < 3; k++)
-					{
-						//convert to 16-bit normalized across domain
-						U16 val = (U16) (((decomp[i][j].mV[k]-min.mV[k])/range.mV[k])*65535);
-
-						U8* buff = (U8*) &val;
-						//write to binary buffer
-						p[vert_idx++] = buff[0];
-						p[vert_idx++] = buff[1];
-
-						if (vert_idx > p.size())
-						{
-							llerrs << "WTF?" << llendl;
-						}
-					}
-				}
-			}
-
-			mdl["decomposition"]["Position"] = p;
-		}
-
-		if (!base_hull.empty())
-		{
-			LLSD::Binary p(base_hull.size()*3*2);
-
-			LLVector3 range = max-min;
-
-			U32 vert_idx = 0;
-			for (U32 j = 0; j < base_hull.size(); ++j)
-			{
-				for (U32 k = 0; k < 3; k++)
-				{
-					//convert to 16-bit normalized across domain
-					U16 val = (U16) (((base_hull[j].mV[k]-min.mV[k])/range.mV[k])*65535);
-
-					U8* buff = (U8*) &val;
-					//write to binary buffer
-					p[vert_idx++] = buff[0];
-					p[vert_idx++] = buff[1];
-
-					if (vert_idx > p.size())
-					{
-						llerrs << "WTF?" << llendl;
-					}
-				}
-			}
-			
-			mdl["decomposition"]["Hull"] = p;
-		}
+		mdl["decomposition"] = decomp.asLLSD();
 	}
 
 	for (U32 idx = 0; idx < MODEL_NAMES_LENGTH; ++idx)
@@ -1896,12 +1681,6 @@ LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, BOOL nowrite)
 	return header;
 }
 
-//static 
-LLModel* LLModel::loadModelFromAsset(std::string filename, S32 lod)
-{
-	return NULL;
-}
-
 LLModel::weight_list& LLModel::getJointInfluences(const LLVector3& pos)
 {
 	weight_map::iterator iter = mSkinWeights.find(pos);
@@ -1975,27 +1754,550 @@ LLModel::weight_list& LLModel::getJointInfluences(const LLVector3& pos)
 void LLModel::setConvexHullDecomposition(
 	const LLModel::convex_hull_decomposition& decomp)
 {
-	mConvexHullDecomp = decomp;
+	mPhysics.mHull = decomp;
+	mPhysics.mMesh.clear();
+	updateHullCenters();
+}
 
-	mHullCenter.resize(mConvexHullDecomp.size());
+void LLModel::updateHullCenters()
+{
+	mHullCenter.resize(mPhysics.mHull.size());
 	mHullPoints = 0;
 	mCenterOfHullCenters.clear();
 
-	for (U32 i = 0; i < decomp.size(); ++i)
+	for (U32 i = 0; i < mPhysics.mHull.size(); ++i)
 	{
 		LLVector3 cur_center;
 
-		for (U32 j = 0; j < decomp[i].size(); ++j)
+		for (U32 j = 0; j < mPhysics.mHull[i].size(); ++j)
 		{
-			cur_center += decomp[i][j];
+			cur_center += mPhysics.mHull[i][j];
 		}
 		mCenterOfHullCenters += cur_center;
-		cur_center *= 1.f/decomp[i].size();
+		cur_center *= 1.f/mPhysics.mHull[i].size();
 		mHullCenter[i] = cur_center;
-		mHullPoints += decomp[i].size();
+		mHullPoints += mPhysics.mHull[i].size();
+	}
+
+	if (mHullPoints > 0)
+	{
+		mCenterOfHullCenters *= 1.f / mHullPoints;
+		llassert(mPhysics.asLLSD().has("HullList"));
+	}
+}
+
+bool LLModel::loadModel(std::istream& is)
+{
+	mSculptLevel = -1;  // default is an error occured
+
+	LLSD header;
+	{
+		if (!LLSDSerialize::fromBinary(header, is, 1024*1024*1024))
+		{
+			llwarns << "Mesh header parse error.  Not a valid mesh asset!" << llendl;
+			return false;
+		}
+	}
+	
+	std::string nm[] = 
+	{
+		"lowest_lod",
+		"low_lod",
+		"medium_lod",
+		"high_lod",
+		"physics_shape",
+	};
+
+	const S32 MODEL_LODS = 5;
+
+	S32 lod = llclamp((S32) mDetail, 0, MODEL_LODS);
+
+	if (header[nm[lod]]["offset"].asInteger() == -1 || 
+		header[nm[lod]]["size"].asInteger() == 0 )
+	{ //cannot load requested LOD
+		return false;
+	}
+
+	bool has_skin = header["skin"]["offset"].asInteger() >=0 &&
+					header["skin"]["size"].asInteger() > 0;
+
+	if (lod == LLModel::LOD_HIGH)
+	{ //try to load skin info and decomp info
+		std::ios::pos_type cur_pos = is.tellg();
+		loadSkinInfo(header, is);
+		is.seekg(cur_pos);
+	}
+
+	if (lod == LLModel::LOD_PHYSICS)
+	{
+		std::ios::pos_type cur_pos = is.tellg();
+		loadDecomposition(header, is);
+		is.seekg(cur_pos);
+	}
+
+	is.seekg(header[nm[lod]]["offset"].asInteger(), std::ios_base::cur);
+
+	if (unpackVolumeFaces(is, header[nm[lod]]["size"].asInteger()))
+	{
+		if (has_skin)
+		{ 
+			//build out mSkinWeight from face info
+			for (S32 i = 0; i < getNumVolumeFaces(); ++i)
+			{
+				const LLVolumeFace& face = getVolumeFace(i);
+
+				if (face.mWeights)
+				{
+					for (S32 j = 0; j < face.mNumVertices; ++j)
+					{
+						LLVector4a& w = face.mWeights[j];
+
+						std::vector<JointWeight> wght;
+
+						for (S32 k = 0; k < 4; ++k)
+						{
+							S32 idx = (S32) w[k];
+							F32 f = w[k] - idx;
+							if (f > 0.f)
+							{
+								wght.push_back(JointWeight(idx, f));
+							}
+						}
+
+						if (!wght.empty())
+						{
+							LLVector3 pos(face.mPositions[j].getF32ptr());
+							mSkinWeights[pos] = wght;
+						}
+					}
+				}
+			}
+		}
+		return true;
+	}
+
+	return false;
+
+}
+
+
+bool LLModel::loadSkinInfo(LLSD& header, std::istream &is)
+{
+	S32 offset = header["skin"]["offset"].asInteger();
+	S32 size = header["skin"]["size"].asInteger();
+
+	if (offset >= 0 && size > 0)
+	{
+		is.seekg(offset, std::ios_base::cur);
+
+		LLSD skin_data;
+
+		if (unzip_llsd(skin_data, is, size))
+		{
+			mSkinInfo.fromLLSD(skin_data);
+			return true;
+		}
+	}
+
+	return false;
+}
+
+bool LLModel::loadDecomposition(LLSD& header, std::istream& is)
+{
+	S32 offset = header["decomposition"]["offset"].asInteger();
+	S32 size = header["decomposition"]["size"].asInteger();
+
+	if (offset >= 0 && size > 0)
+	{
+		is.seekg(offset, std::ios_base::cur);
+
+		LLSD data;
+
+		if (unzip_llsd(data, is, size))
+		{
+			mPhysics.fromLLSD(data);
+			updateHullCenters();
+		}
+	}
+
+	return true;
+}
+
+
+LLMeshSkinInfo::LLMeshSkinInfo(LLSD& skin)
+{
+	fromLLSD(skin);
+}
+
+void LLMeshSkinInfo::fromLLSD(LLSD& skin)
+{
+	if (skin.has("joint_names"))
+	{
+		for (U32 i = 0; i < skin["joint_names"].size(); ++i)
+		{
+			mJointNames.push_back(skin["joint_names"][i]);
+		}
+	}
+
+	if (skin.has("inverse_bind_matrix"))
+	{
+		for (U32 i = 0; i < skin["inverse_bind_matrix"].size(); ++i)
+		{
+			LLMatrix4 mat;
+			for (U32 j = 0; j < 4; j++)
+			{
+				for (U32 k = 0; k < 4; k++)
+				{
+					mat.mMatrix[j][k] = skin["inverse_bind_matrix"][i][j*4+k].asReal();
+				}
+			}
+
+			mInvBindMatrix.push_back(mat);
+		}
+	}
+
+	if (skin.has("bind_shape_matrix"))
+	{
+		for (U32 j = 0; j < 4; j++)
+		{
+			for (U32 k = 0; k < 4; k++)
+			{
+				mBindShapeMatrix.mMatrix[j][k] = skin["bind_shape_matrix"][j*4+k].asReal();
+			}
+		}
+	}
+
+	if (skin.has("alt_inverse_bind_matrix"))
+	{
+		for (U32 i = 0; i < skin["alt_inverse_bind_matrix"].size(); ++i)
+		{
+			LLMatrix4 mat;
+			for (U32 j = 0; j < 4; j++)
+			{
+				for (U32 k = 0; k < 4; k++)
+				{
+					mat.mMatrix[j][k] = skin["alt_inverse_bind_matrix"][i][j*4+k].asReal();
+				}
+			}
+			
+			mAlternateBindMatrix.push_back(mat);
+		}
+	}
+
+	if (skin.has("pelvis_offset"))
+	{
+		mPelvisOffset = skin["pelvis_offset"].asReal();
+	}
+}
+
+LLSD LLMeshSkinInfo::asLLSD(bool include_joints) const
+{
+	LLSD ret;
+
+	for (U32 i = 0; i < mJointNames.size(); ++i)
+	{
+		ret["joint_names"][i] = mJointNames[i];
+
+		for (U32 j = 0; j < 4; j++)
+		{
+			for (U32 k = 0; k < 4; k++)
+			{
+				ret["inverse_bind_matrix"][i][j*4+k] = mInvBindMatrix[i].mMatrix[j][k]; 
+			}
+		}
+	}
+
+	for (U32 i = 0; i < 4; i++)
+	{
+		for (U32 j = 0; j < 4; j++)
+		{
+			ret["bind_shape_matrix"][i*4+j] = mBindShapeMatrix.mMatrix[i][j];
+		}
+	}
+		
+	if ( include_joints && mAlternateBindMatrix.size() > 0 )
+	{
+		for (U32 i = 0; i < mJointNames.size(); ++i)
+		{
+			for (U32 j = 0; j < 4; j++)
+			{
+				for (U32 k = 0; k < 4; k++)
+				{
+					ret["alt_inverse_bind_matrix"][i][j*4+k] = mAlternateBindMatrix[i].mMatrix[j][k]; 
+				}
+			}
+		}
+
+		ret["pelvis_offset"] = mPelvisOffset;
+	}
+
+	return ret;
+}
+
+LLModel::Decomposition::Decomposition(LLSD& data)
+{
+	fromLLSD(data);
+}
+
+void LLModel::Decomposition::fromLLSD(LLSD& decomp)
+{
+	if (decomp.has("HullList"))
+	{
+		// updated for const-correctness. gcc is picky about this type of thing - Nyx
+		const LLSD::Binary& hulls = decomp["HullList"].asBinary();
+		const LLSD::Binary& position = decomp["Position"].asBinary();
+
+		U16* p = (U16*) &position[0];
+
+		mHull.resize(hulls.size());
+
+		LLVector3 min;
+		LLVector3 max;
+		LLVector3 range;
+
+		min.setValue(decomp["Min"]);
+		max.setValue(decomp["Max"]);
+		range = max-min;
+
+		
+		for (U32 i = 0; i < hulls.size(); ++i)
+		{
+			U16 count = (hulls[i] == 0) ? 256 : hulls[i];
+			
+			std::set<U64> valid;
+
+			//must have at least 4 points
+			//llassert(count > 3);
+
+			for (U32 j = 0; j < count; ++j)
+			{
+				U64 test = (U64) p[0] | ((U64) p[1] << 16) | ((U64) p[2] << 32);
+				//point must be unique
+				//llassert(valid.find(test) == valid.end());
+				valid.insert(test);
+				mHull[i].push_back(LLVector3(
+					(F32) p[0]/65535.f*range.mV[0]+min.mV[0],
+					(F32) p[1]/65535.f*range.mV[1]+min.mV[1],
+					(F32) p[2]/65535.f*range.mV[2]+min.mV[2]));
+				p += 3;
+
+
+			}
+
+			//each hull must contain at least 4 unique points
+			//llassert(valid.size() > 3);
+		}
 	}
 
-	mCenterOfHullCenters *= 1.f / mHullPoints;
+	if (decomp.has("Hull"))
+	{
+		const LLSD::Binary& position = decomp["Hull"].asBinary();
+
+		U16* p = (U16*) &position[0];
+
+		LLVector3 min;
+		LLVector3 max;
+		LLVector3 range;
+
+		if (decomp.has("Min"))
+		{
+			min.setValue(decomp["Min"]);
+			max.setValue(decomp["Max"]);
+		}
+		else
+		{
+			min.set(-0.5f, -0.5f, -0.5f);
+			max.set(0.5f, 0.5f, 0.5f);
+		}
+
+		range = max-min;
+
+		U16 count = position.size()/6;
+		
+		for (U32 j = 0; j < count; ++j)
+		{
+			mBaseHull.push_back(LLVector3(
+				(F32) p[0]/65535.f*range.mV[0]+min.mV[0],
+				(F32) p[1]/65535.f*range.mV[1]+min.mV[1],
+				(F32) p[2]/65535.f*range.mV[2]+min.mV[2]));
+			p += 3;
+		}		 
+	}
+	else
+	{
+		//empty base hull mesh to indicate decomposition has been loaded
+		//but contains no base hull
+		mBaseHullMesh.clear();;
+	}
 }
 
+LLSD LLModel::Decomposition::asLLSD() const
+{
+	LLSD ret;
+	
+	if (mBaseHull.empty() && mHull.empty())
+	{ //nothing to write
+		return ret;
+	}
+
+	//write decomposition block
+	// ["decomposition"]["HullList"] -- list of 8 bit integers, each entry represents a hull with specified number of points
+	// ["decomposition"]["PositionDomain"]["Min"/"Max"]
+	// ["decomposition"]["Position"] -- list of 16-bit integers to be decoded to given domain, encoded 3D points
+	// ["decomposition"]["Hull"] -- list of 16-bit integers to be decoded to given domain, encoded 3D points representing a single hull approximation of given shape
+	
+	
+	//get minimum and maximum
+	LLVector3 min;
+	
+	if (mHull.empty())
+	{  
+		min = mBaseHull[0];
+	}
+	else
+	{
+		min = mHull[0][0];
+	}
+
+	LLVector3 max = min;
+
+	LLSD::Binary hulls(mHull.size());
+
+	U32 total = 0;
+
+	for (U32 i = 0; i < mHull.size(); ++i)
+	{
+		U32 size = mHull[i].size();
+		total += size;
+		hulls[i] = (U8) (size);
+
+		for (U32 j = 0; j < mHull[i].size(); ++j)
+		{
+			update_min_max(min, max, mHull[i][j]);
+		}
+	}
+
+	for (U32 i = 0; i < mBaseHull.size(); ++i)
+	{
+		update_min_max(min, max, mBaseHull[i]);	
+	}
+
+	ret["Min"] = min.getValue();
+	ret["Max"] = max.getValue();
+
+	if (!hulls.empty())
+	{
+		ret["HullList"] = hulls;
+	}
+
+	if (total > 0)
+	{
+		LLSD::Binary p(total*3*2);
+
+		LLVector3 range = max-min;
+
+		U32 vert_idx = 0;
+		
+		for (U32 i = 0; i < mHull.size(); ++i)
+		{
+			std::set<U64> valid;
+
+			llassert(!mHull[i].empty());
+
+			for (U32 j = 0; j < mHull[i].size(); ++j)
+			{
+				U64 test = 0;
+				for (U32 k = 0; k < 3; k++)
+				{
+					//convert to 16-bit normalized across domain
+					U16 val = (U16) (((mHull[i][j].mV[k]-min.mV[k])/range.mV[k])*65535);
+
+					switch (k)
+					{
+						case 0: test = test | (U64) val; break;
+						case 1: test = test | ((U64) val << 16); break;
+						case 2: test = test | ((U64) val << 32); break;
+					};
+
+					valid.insert(test);
+					
+					U8* buff = (U8*) &val;
+					//write to binary buffer
+					p[vert_idx++] = buff[0];
+					p[vert_idx++] = buff[1];
+
+					//makes sure we haven't run off the end of the array
+					llassert(vert_idx <= p.size());
+				}
+			}
+
+			//must have at least 4 unique points
+			llassert(valid.size() > 3);
+		}
+
+		ret["Position"] = p;
+	}
+
+	if (!mBaseHull.empty())
+	{
+		LLSD::Binary p(mBaseHull.size()*3*2);
+
+		LLVector3 range = max-min;
+
+		U32 vert_idx = 0;
+		for (U32 j = 0; j < mBaseHull.size(); ++j)
+		{
+			for (U32 k = 0; k < 3; k++)
+			{
+				//convert to 16-bit normalized across domain
+				U16 val = (U16) (((mBaseHull[j].mV[k]-min.mV[k])/range.mV[k])*65535);
+
+				U8* buff = (U8*) &val;
+				//write to binary buffer
+				p[vert_idx++] = buff[0];
+				p[vert_idx++] = buff[1];
+
+				if (vert_idx > p.size())
+				{
+					llerrs << "WTF?" << llendl;
+				}
+			}
+		}
+		
+		ret["Hull"] = p;
+	}
+
+	return ret;
+}
+
+void LLModel::Decomposition::merge(const LLModel::Decomposition* rhs)
+{
+	if (!rhs)
+	{
+		return;
+	}
+
+	if (mMeshID != rhs->mMeshID)
+	{
+		llerrs << "Attempted to merge with decomposition of some other mesh." << llendl;
+	}
+
+	if (mBaseHull.empty())
+	{ //take base hull and decomposition from rhs
+		mHull = rhs->mHull;
+		mBaseHull = rhs->mBaseHull;
+		mMesh = rhs->mMesh;
+		mBaseHullMesh = rhs->mBaseHullMesh;
+	}
+
+	if (mPhysicsShapeMesh.empty())
+	{ //take physics shape mesh from rhs
+		mPhysicsShapeMesh = rhs->mPhysicsShapeMesh;
+	}
+
+	if (!mHull.empty())
+	{ //verify
+		llassert(asLLSD().has("HullList"));
+	}
+}
 
diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h
index e9e33bdee51abd6abef57ff43a0b9b97a97892d8..23f4b5cb42733a0565fc4d15d19f9976266d4595 100755
--- a/indra/llprimitive/llmodel.h
+++ b/indra/llprimitive/llmodel.h
@@ -27,6 +27,7 @@
 #ifndef LL_LLMODEL_H
 #define LL_LLMODEL_H
 
+#include "llpointer.h"
 #include "llvolume.h"
 #include "v4math.h"
 #include "m4math.h"
@@ -36,6 +37,24 @@ class domMesh;
 
 #define MAX_MODEL_FACES 8
 
+
+class LLMeshSkinInfo 
+{
+public:
+	LLUUID mMeshID;
+	std::vector<std::string> mJointNames;
+	std::vector<LLMatrix4> mInvBindMatrix;
+	std::vector<LLMatrix4> mAlternateBindMatrix;
+	std::map<std::string, U32> mJointMap;
+
+	LLMeshSkinInfo() { }
+	LLMeshSkinInfo(LLSD& data);
+	void fromLLSD(LLSD& data);
+	LLSD asLLSD(bool include_joints) const;
+	LLMatrix4 mBindShapeMatrix;
+	float mPelvisOffset;
+};
+
 class LLModel : public LLVolume
 {
 public:
@@ -50,37 +69,62 @@ class LLModel : public LLVolume
 		NUM_LODS
 	};
 	
+	enum EModelStatus
+	{
+		NO_ERRORS = 0,
+		VERTEX_NUMBER_OVERFLOW, //vertex number is >= 65535.
+		INVALID_STATUS
+	} ;
+
 	//convex_hull_decomposition is a vector of convex hulls
 	//each convex hull is a set of points
-	typedef  std::vector<std::vector<LLVector3> > convex_hull_decomposition;
+	typedef std::vector<std::vector<LLVector3> > convex_hull_decomposition;
 	typedef std::vector<LLVector3> hull;
 	
+	class PhysicsMesh
+	{
+	public:
+		std::vector<LLVector3> mPositions;
+		std::vector<LLVector3> mNormals;
+
+		void clear()
+		{
+			mPositions.clear();
+			mNormals.clear();
+		}
+
+		bool empty() const
+		{
+			return mPositions.empty();
+		}
+	};
+
+	class Decomposition
+	{
+	public:
+		Decomposition() { }
+		Decomposition(LLSD& data);
+		void fromLLSD(LLSD& data);
+		LLSD asLLSD() const;
+
+		void merge(const Decomposition* rhs);
+
+		LLUUID mMeshID;
+		LLModel::convex_hull_decomposition mHull;
+		LLModel::hull mBaseHull;
+
+		std::vector<LLModel::PhysicsMesh> mMesh;
+		LLModel::PhysicsMesh mBaseHullMesh;
+		LLModel::PhysicsMesh mPhysicsShapeMesh;
+	};
+
 	LLModel(LLVolumeParams& params, F32 detail);
 	~LLModel();
 
-	static LLSD writeModel(
-		std::string filename,
-		LLModel* physics,
-		LLModel* high,
-		LLModel* medium,
-		LLModel* low,
-		LLModel* imposotr,
-		const LLModel::convex_hull_decomposition& convex_hull_decomposition,
-		const LLModel::hull& base_hull,
-		BOOL upload_skin,
-		BOOL upload_joints,
-		BOOL nowrite = FALSE);
-	static LLSD writeModel(
-		std::string filename,
-		LLModel* physics,
-		LLModel* high,
-		LLModel* medium,
-		LLModel* low,
-		LLModel* imposotr,
-		const LLModel::convex_hull_decomposition& convex_hull_decomposition,
-		BOOL upload_skin,
-		BOOL upload_joints,
-		BOOL nowrite = FALSE);
+	bool loadModel(std::istream& is);
+	bool loadSkinInfo(LLSD& header, std::istream& is);
+	bool loadDecomposition(LLSD& header, std::istream& is);
+	
 	static LLSD writeModel(
 		std::ostream& ostr,
 		LLModel* physics,
@@ -88,21 +132,21 @@ class LLModel : public LLVolume
 		LLModel* medium,
 		LLModel* low,
 		LLModel* imposotr,
-		const LLModel::convex_hull_decomposition& convex_hull_decomposition,
-		const LLModel::hull& base_hull,
+		const LLModel::Decomposition& decomp,
 		BOOL upload_skin,
 		BOOL upload_joints,
 		BOOL nowrite = FALSE);
+
 	static LLSD writeModelToStream(
 		std::ostream& ostr,
 		LLSD& mdl,
 		BOOL nowrite = FALSE);
 
-	static LLModel* loadModelFromAsset(std::string filename, S32 lod);
-	static LLModel* loadModelFromDae(std::string filename);
 	static LLModel* loadModelFromDomMesh(domMesh* mesh);
 	static std::string getElementLabel(daeElement* element);
 	std::string getName() const;
+	EModelStatus getStatus() const {return mStatus;}
+	static std::string getStatusString(U32 status) ;
 
 	void appendFaces(LLModel* model, LLMatrix4& transform, LLMatrix4& normal_transform);
 	void appendFace(const LLVolumeFace& src_face, std::string src_material, LLMatrix4& mat, LLMatrix4& norm_mat);
@@ -177,17 +221,8 @@ class LLModel : public LLVolume
 	//get list of weight influences closest to given position
 	weight_list& getJointInfluences(const LLVector3& pos);
 
-	//should always be true that mJointList[mJointMap["foo"]] == "foo"
-
-	//map of joint names to joint index
-	std::map<std::string, U32> mJointMap;
-
-	//list of joint names
-	std::vector<std::string> mJointList;
-
-	LLMatrix4 mBindShapeMatrix;
-	std::vector<LLMatrix4> mInvBindMatrix;
-	std::vector<LLMatrix4> mAlternateBindMatrix;
+	LLMeshSkinInfo mSkinInfo;
+	
 	std::string mRequestedLabel; // name requested in UI, if any.
 	std::string mLabel; // name computed from dae.
 
@@ -197,17 +232,23 @@ class LLModel : public LLVolume
 	float	mPelvisOffset;
 	// convex hull decomposition
 	S32 mDecompID;
-	convex_hull_decomposition mConvexHullDecomp;
+	
 	void setConvexHullDecomposition(
 		const convex_hull_decomposition& decomp);
+	void updateHullCenters();
 
 	LLVector3 mCenterOfHullCenters;
 	std::vector<LLVector3> mHullCenter;
 	U32 mHullPoints;
 
+	//ID for storing this model in a .slm file
+	S32 mLocalID;
+
+	Decomposition mPhysics;
+
+	EModelStatus mStatus ;
 protected:
 	void addVolumeFacesFromDomMesh(domMesh* mesh);
-	virtual BOOL createVolumeFacesFromFile(const std::string& file_name);
 	virtual BOOL createVolumeFacesFromDomMesh(domMesh *mesh);
 };
 
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index d5f0b81830853da7d314e73a78fab55b6c7a8f46..b508705759ec08fff37f1b125c367bd1698c3d64 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -1858,12 +1858,17 @@ void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor
 	}
 }
 
-LLGLUserClipPlane::LLGLUserClipPlane(const LLPlane& p, const glh::matrix4f& modelview, const glh::matrix4f& projection)
+LLGLUserClipPlane::LLGLUserClipPlane(const LLPlane& p, const glh::matrix4f& modelview, const glh::matrix4f& projection, bool apply)
 {
-	mModelview = modelview;
-	mProjection = projection;
+	mApply = apply;
 
-	setPlane(p[0], p[1], p[2], p[3]);
+	if (mApply)
+	{
+		mModelview = modelview;
+		mProjection = projection;
+
+		setPlane(p[0], p[1], p[2], p[3]);
+	}
 }
 
 void LLGLUserClipPlane::setPlane(F32 a, F32 b, F32 c, F32 d)
@@ -1894,9 +1899,12 @@ void LLGLUserClipPlane::setPlane(F32 a, F32 b, F32 c, F32 d)
 
 LLGLUserClipPlane::~LLGLUserClipPlane()
 {
-	glMatrixMode(GL_PROJECTION);
-	glPopMatrix();
-	glMatrixMode(GL_MODELVIEW);
+	if (mApply)
+	{
+		glMatrixMode(GL_PROJECTION);
+		glPopMatrix();
+		glMatrixMode(GL_MODELVIEW);
+	}
 }
 
 LLGLNamePool::LLGLNamePool()
diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h
index 0d7ba15b1268eae4c140071710db9542fadae0cf..43992d51cb0a5de1fc40fbac5368ae7bac4c1e04 100644
--- a/indra/llrender/llgl.h
+++ b/indra/llrender/llgl.h
@@ -301,12 +301,14 @@ class LLGLUserClipPlane
 {
 public:
 	
-	LLGLUserClipPlane(const LLPlane& plane, const glh::matrix4f& modelview, const glh::matrix4f& projection);
+	LLGLUserClipPlane(const LLPlane& plane, const glh::matrix4f& modelview, const glh::matrix4f& projection, bool apply = true);
 	~LLGLUserClipPlane();
 
 	void setPlane(F32 a, F32 b, F32 c, F32 d);
 
 private:
+	bool mApply;
+
 	glh::matrix4f mProjection;
 	glh::matrix4f mModelview;
 };
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 0d3f5b81bcc3b698012e5d1f3e5b8d231f362aff..73efbfc9998ea399056523caca5ac5555e589cc0 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -236,6 +236,22 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)
 	}
 }
 
+//static
+void LLVertexBuffer::drawArrays(U32 mode, const std::vector<LLVector3>& pos, const std::vector<LLVector3>& norm)
+{
+	U32 count = pos.size();
+	llassert(norm.size() >= pos.size());
+
+	unbind();
+	
+	setupClientArrays(MAP_VERTEX | MAP_NORMAL);
+
+	glVertexPointer(3, GL_FLOAT, 0, pos[0].mV);
+	glNormalPointer(GL_FLOAT, 0, norm[0].mV);
+
+	glDrawArrays(sGLMode[mode], 0, count);
+}
+
 void LLVertexBuffer::validateRange(U32 start, U32 end, U32 count, U32 indices_offset) const
 {
 	if (start >= (U32) mRequestedNumVerts ||
diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h
index 2bbc17fb12a67ed16ad7a5d9be06b736b4124edc..a9f22193f87a4601aa25b94da85ad4fdb7ded85b 100644
--- a/indra/llrender/llvertexbuffer.h
+++ b/indra/llrender/llvertexbuffer.h
@@ -56,13 +56,17 @@ class LLVBOPool : public LLGLNamePool
 	virtual GLuint allocateName()
 	{
 		GLuint name;
+		stop_glerror();
 		glGenBuffersARB(1, &name);
+		stop_glerror();
 		return name;
 	}
 
 	virtual void releaseName(GLuint name)
 	{
+		stop_glerror();
 		glDeleteBuffersARB(1, &name);
+		stop_glerror();
 	}
 };
 
@@ -97,6 +101,8 @@ class LLVertexBuffer : public LLRefCount
 	static void initClass(bool use_vbo, bool no_vbo_mapping);
 	static void cleanupClass();
 	static void setupClientArrays(U32 data_mask);
+	static void drawArrays(U32 mode, const std::vector<LLVector3>& pos, const std::vector<LLVector3>& norm);
+
  	static void clientCopy(F64 max_time = 0.005); //copy data from client to GL
 	static void unbind(); //unbind any bound vertex buffer
 
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 35e0d9d8906b7df713fd13a8f3da3672493028bd..d19e33ea5537df5dd759c54126b4015999222039 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -2869,7 +2869,7 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
 	// close callback 
 	if (p.close_callback.isProvided())
 	{
-		mCloseSignal.connect(initCommitCallback(p.close_callback));
+		setCloseCallback(initCommitCallback(p.close_callback));
 	}
 }
 
@@ -2879,6 +2879,11 @@ boost::signals2::connection LLFloater::setMinimizeCallback( const commit_signal_
 	return mMinimizeSignal->connect(cb); 
 }
 
+boost::signals2::connection LLFloater::setCloseCallback( const commit_signal_t::slot_type& cb )
+{
+	return mCloseSignal.connect(cb);
+}
+
 LLFastTimer::DeclareTimer POST_BUILD("Floater Post Build");
 
 bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::string& filename, LLXMLNodePtr output_node)
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 0e83b80c898bbdcf81bd2e635e9c296ac9d1f430..5b7b020881191258cbf728ef577f4e9128269571 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -144,6 +144,7 @@ friend class LLMultiFloater;
 	bool buildFromFile(const std::string &filename, LLXMLNodePtr output_node = NULL);
 
 	boost::signals2::connection setMinimizeCallback( const commit_signal_t::slot_type& cb );
+	boost::signals2::connection setCloseCallback( const commit_signal_t::slot_type& cb );
 
 	void initFromParams(const LLFloater::Params& p);
 	bool initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::string& filename, LLXMLNodePtr output_node = NULL);
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 32d7be377a3386a34f769fbb20876712b7b0ef3f..f0374de98f2516195e0d4651e3b3c5d7079de62c 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -1936,9 +1936,15 @@ bool LLMenuGL::scrollItems(EScrollingDirection direction)
 	{
 		item_list_t::reverse_iterator first_visible_item_iter = mItems.rend();
 
+		// Need to scroll through number of actual existing items in menu.
+		// Otherwise viewer will hang for a time needed to scroll U32_MAX
+		// times in std::advance(). STORM-659.
+		size_t nitems = mItems.size();
+		U32 scrollable_items = nitems < mMaxScrollableItems ? nitems : mMaxScrollableItems;
+
 		// Advance by mMaxScrollableItems back from the end of the list
 		// to make the last item visible.
-		std::advance(first_visible_item_iter, mMaxScrollableItems);
+		std::advance(first_visible_item_iter, scrollable_items);
 		mFirstVisibleItem = *first_visible_item_iter;
 		break;
 	}
diff --git a/indra/media_plugins/winmmshim/CMakeLists.txt b/indra/media_plugins/winmmshim/CMakeLists.txt
index 3e3a9883109e8a22c03e2f55d62913ea2a272272..bf74f818093d60144e59752d215c6f669ef01ce6 100644
--- a/indra/media_plugins/winmmshim/CMakeLists.txt
+++ b/indra/media_plugins/winmmshim/CMakeLists.txt
@@ -3,12 +3,12 @@
 project(winmm_shim)
 
 ### winmm_shim
-# *HACK - override msvcrt implementation (intialized on 00-Common) to be
-# statically linked for winmm.dll this relies on vc taking the last flag on
-# the command line
-set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
-set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT")
-set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
+# *HACK - override msvcrt implementation (intialized on 00-Common) to be
+# statically linked for winmm.dll this relies on vc taking the last flag on
+# the command line
+set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT")
+set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
 
 set(winmm_shim_SOURCE_FILES
     forwarding_api.cpp
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index cb0f1c2907ad84706a7297c3b5852b84eb2fad0f..a3e4760c83670ff424b376006dcdc5f767cc5394 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -410,6 +410,7 @@ set(viewer_SOURCE_FILES
     llremoteparcelrequest.cpp
     llsavedsettingsglue.cpp
     llsaveoutfitcombobtn.cpp
+    llsceneview.cpp
     llscreenchannel.cpp
     llscriptfloater.cpp
     llscrollingpanelparam.cpp
@@ -953,6 +954,7 @@ set(viewer_HEADER_FILES
     llrootview.h
     llsavedsettingsglue.h
     llsaveoutfitcombobtn.h
+    llsceneview.h
     llscreenchannel.h
     llscriptfloater.h
     llscrollingpanelparam.h
diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml
index 89fd4e59358ceb9aa21b6d5f4a6f605d4f5248a3..17d3d3c9c5ba339193cc300a27e8d30fa19c7d22 100644
--- a/indra/newview/app_settings/ignorable_dialogs.xml
+++ b/indra/newview/app_settings/ignorable_dialogs.xml
@@ -122,7 +122,17 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
-
+    <key>FirstSpeak</key>
+    <map>
+      <key>Comment</key>
+      <string>Shows hint for Speak button</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
     <key>FirstSit</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index f71527268199461b23b7672a956f24ef9cdcbf9d..6b1cda4bc7d6156b5c83a981ee980cfc43cf70cd 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3270,7 +3270,7 @@
     <key>FirstRunThisInstall</key>
     <map>
       <key>Comment</key>
-      <string>Specifies that you have not run the viewer since you installed the latest update</string>
+      <string>Specifies that you have not run the viewer since you performed a clean install</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -3278,7 +3278,18 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
-    <key>FirstSelectedDisabledPopups</key>
+  <key>FirstLoginThisInstall</key>
+  <map>
+    <key>Comment</key>
+    <string>Specifies that you have not logged in with the viewer since you performed a clean install</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Boolean</string>
+    <key>Value</key>
+    <integer>1</integer>
+  </map>
+  <key>FirstSelectedDisabledPopups</key>
     <map>
       <key>Comment</key>
       <string>Return false if there is not disabled popup selected in the list of floater preferences popups</string>
@@ -5512,6 +5523,17 @@
     <key>Value</key>
     <real>1</real>
   </map>
+  <key>MeshImportUseSLM</key>
+  <map>
+    <key>Comment</key>
+    <string>Use cached copy of last upload for a dae if available instead of loading dae file from scratch.</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Boolean</string>
+    <key>Value</key>
+    <real>0</real>
+  </map>
   <key>MigrateCacheDirectory</key>
     <map>
       <key>Comment</key>
@@ -7695,6 +7717,18 @@
     <key>Value</key>
     <real>0</real>
   </map>
+
+  <key>RenderDepthOfField</key>
+  <map>
+    <key>Comment</key>
+    <string>Whether to use depth of field effect when lighting and shadows are enabled</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Boolean</string>
+    <key>Value</key>
+    <integer>0</integer>
+  </map>
   
   <key>RenderSpotLightsInNondeferred</key>
   <map>
@@ -8952,7 +8986,7 @@
     <key>Type</key>
     <string>F32</string>
     <key>Value</key>
-    <real>2.0</real>
+    <real>3.0</real>
   </map>
   <key>MeshThreadCount</key>
   <map>
@@ -12517,6 +12551,17 @@
       <key>Value</key>
       <real>0.40000000596</real>
     </map>
+	<key>moapbeacon</key>
+	<map>
+		<key>Comment</key>
+		<string>Beacon / Highlight media on a prim sources</string>
+		<key>Persist</key>
+		<integer>1</integer>
+		<key>Type</key>
+		<string>Boolean</string>
+		<key>Value</key>
+		<integer>0</integer>
+	</map>
     <key>particlesbeacon</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
index 7c89c01ea4361ecb06cf08f5f405f7e58e3d1d02..7a6b40006b1382c2058cb3d99292625cb2887562 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
@@ -102,7 +102,7 @@ void main()
 		
 		float fd = depth*0.5f;
 		
-		while (sc > 1.0)
+		while (sc > 0.5)
 		{
 			dofSample(diff,w, fd, sc,sc);
 			dofSample(diff,w, fd, -sc,sc);
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 85447842e6a106ca353af0457b817e7d6a507c2f..1184c8e76cef8242298cef348b89533116d4dbb7 100755
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -2216,6 +2216,7 @@ bool LLAppViewer::initConfiguration()
 	if (gSavedSettings.getBOOL("FirstRunThisInstall"))
 	{
 		gSavedSettings.setString("SessionSettingsFile", "settings_minimal.xml");
+		gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
 	}
 
 	if (clp.hasOption("sessionsettings"))
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 1fb83fe5673727d23c1feb1b341e44843887a656..0371b7be7132e76b0a1015a334877465f6c13dc9 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -55,6 +55,7 @@
 
 #include "llviewerwindow.h"
 #include "llsdserialize.h"
+#include "llfirstuse.h"
 
 // Distance from mouse down on which drag'n'drop should be started.
 #define DRAG_START_DISTANCE 3
@@ -381,7 +382,12 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b
 	// skipped to avoid button blinking
 	if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL)
 	{
-		mSpeakBtn->setFlyoutBtnEnabled(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
+		bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
+		mSpeakBtn->setFlyoutBtnEnabled(voice_status);
+		if (voice_status)
+		{
+			LLFirstUse::speak(true);
+		}
 	}
 }
 
@@ -561,6 +567,7 @@ BOOL LLBottomTray::postBuild()
 
 	mSpeakPanel = getChild<LLPanel>("speak_panel");
 	mSpeakBtn = getChild<LLSpeakButton>("talk");
+	LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle());
 
 	// Both parts of speak button should be initially disabled because
 	// it takes some time between logging in to world and connecting to voice channel.
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index 328c3262787a2f94f83cbecb1650e892757253ac..945a760d059d51daf24628f4b9c744ca408a3dcb 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -50,6 +50,7 @@
 #include "llviewerwindow.h"
 #include "llvoicechannel.h"
 #include "llviewerparcelmgr.h"
+#include "llfirstuse.h"
 
 static void get_voice_participants_uuids(uuid_vec_t& speakers_uuids);
 void reshape_floater(LLCallFloater* floater, S32 delta_height);
@@ -170,13 +171,13 @@ BOOL LLCallFloater::postBuild()
 	updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
 	
 	updateSession();
-
 	return TRUE;
 }
 
 // virtual
 void LLCallFloater::onOpen(const LLSD& /*key*/)
 {
+	LLFirstUse::speak(false);
 }
 
 // virtual
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index d4ec377e03ddb3e606966734d30c489859ffecb3..c0c9ea145164b27d65ee4a0d0e201043e78d80d9 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -793,21 +793,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
 			if ( chat.mSourceType == CHAT_SOURCE_OBJECT && chat.mFromID.notNull())
 			{
 				// for object IMs, create a secondlife:///app/objectim SLapp
-				std::string url = LLSLURL("objectim", chat.mFromID, "").getSLURLString();
-				url += "?name=" + chat.mFromName;
-				url += "&owner=" + chat.mOwnerID.asString();
-
-				std::string slurl = args["slurl"].asString();
-				if (slurl.empty())
-				{
-				    LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
-				    if(region)
-				      {
-					LLSLURL region_slurl(region->getName(), chat.mPosAgent);
-					slurl = region_slurl.getLocationString();
-				      }
-				}
-				url += "&slurl=" + LLURI::escape(slurl);
+				std::string url = LLViewerChat::getSenderSLURL(chat, args);
 
 				// set the link for the object name to be the objectim SLapp
 				// (don't let object names with hyperlinks override our objectim Url)
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 899e0431e7c29634dd37c8e7ddd7c759151b8eca..8584885bc974e842e63d916ead326abf9e76db4d 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -213,17 +213,6 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
 		{
 			LLStyle::Params style_params_name;
 
-			std::string href;
-
-			if (mSourceType == CHAT_SOURCE_AGENT)
-			{
-				href = LLSLURL("agent", mFromID, "about").getSLURLString();
-			}
-			else
-			{
-				href = LLSLURL("object", mFromID, "inspect").getSLURLString();
-			}
-
 			LLColor4 user_name_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
 			style_params_name.color(user_name_color);
 
@@ -232,7 +221,7 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
 			style_params_name.font.name(font_name);
 			style_params_name.font.size(font_style_size);
 
-			style_params_name.link_href = href;
+			style_params_name.link_href = notification["sender_slurl"].asString();
 			style_params_name.is_link = true;
 
 			msg_text->appendText(str_sender, FALSE, style_params_name);
diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp
index 0876c3fd99632712001a80df247d6c9240374612..b6d67899f8caab23f7a69923558bbbce6d1de24c 100644
--- a/indra/newview/lldebugview.cpp
+++ b/indra/newview/lldebugview.cpp
@@ -39,7 +39,9 @@
 #include "llviewerwindow.h"
 #include "llappviewer.h"
 #include "llmemoryview.h"
+#include "llsceneview.h"
 #include "llviewertexture.h"
+
 //
 // Globals
 //
@@ -83,6 +85,13 @@ void LLDebugView::init()
 	addChild(mFastTimerView);
 	mFastTimerView->setRect(rect);
 
+	gSceneView = new LLSceneView(r);
+	gSceneView->setFollowsTop();
+	gSceneView->setFollowsLeft();
+	gSceneView->setVisible(FALSE);
+	addChild(gSceneView);
+	gSceneView->setRect(rect);
+	
 	r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f), 
 									 (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));
 	LLMemoryView::Params mp;
@@ -103,6 +112,9 @@ void LLDebugView::init()
 	addChild(gTextureView);
 	//gTextureView->reshape(r.getWidth(), r.getHeight(), TRUE);
 
+	
+
+
 	if(gAuditTexture)
 	{
 		r.set(150, rect.getHeight() - 50, 900 + LLImageGL::sTextureLoadedCounter.size() * 30, 100);
@@ -133,6 +145,7 @@ LLDebugView::~LLDebugView()
 	// These have already been deleted.  Fix the globals appropriately.
 	gDebugView = NULL;
 	gTextureView = NULL;
+	gSceneView = NULL;
 	gTextureSizeView = NULL;
 	gTextureCategoryView = NULL;
 }
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 38ff3083ce2126858797d02c87f70e03892e287e..0a642f494bca3bd9bd479ef039d7e906f49e11f3 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -660,7 +660,7 @@ BOOL LLDrawPoolBump::bindBumpMap(U8 bump_code, LLViewerTexture* texture, F32 vsi
 
 		return TRUE;
 	}
-	
+
 	return FALSE;
 }
 
@@ -1000,25 +1000,28 @@ LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedText
 		}
 
 		bump_image_map_t::iterator iter = entries_list->find(src_image->getID());
-		if (iter != entries_list->end())
+		if (iter != entries_list->end() && iter->second.notNull())
 		{
 			bump = iter->second;
 		}
 		else
 		{
 			LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,1);
-			raw->clear(0x77, 0x77, 0x77, 0xFF);
+			raw->clear(0x77, 0x77, 0xFF, 0xFF);
 
 			(*entries_list)[src_image->getID()] = LLViewerTextureManager::getLocalTexture( raw.get(), TRUE);
-			(*entries_list)[src_image->getID()]->setExplicitFormat(GL_ALPHA8, GL_ALPHA);			
-
-			// Note: this may create an LLImageGL immediately
-			src_image->setBoostLevel(LLViewerTexture::BOOST_BUMP) ;
-			src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL );
 			bump = (*entries_list)[src_image->getID()]; // In case callback was called immediately and replaced the image
+		}
 
-//			bump_total++;
-//			llinfos << "*** Creating " << (void*)bump << " " << bump_total << llendl;
+		if (!src_image->hasCallbacks())
+		{ //if image has no callbacks but resolutions don't match, trigger raw image loaded callback again
+			if (src_image->getWidth() != bump->getWidth() ||
+				src_image->getHeight() != bump->getHeight() ||
+				(LLPipeline::sRenderDeferred && bump->getComponents() != 4))
+			{
+				src_image->setBoostLevel(LLViewerTexture::BOOST_BUMP) ;
+				src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL );
+			}
 		}
 	}
 
@@ -1122,10 +1125,18 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI
 		bump_image_map_t& entries_list(bump_code == BE_BRIGHTNESS ? gBumpImageList.mBrightnessEntries : gBumpImageList.mDarknessEntries );
 		bump_image_map_t::iterator iter = entries_list.find(source_asset_id);
 
-		if (iter != entries_list.end() ||
-			iter->second.isNull() ||
-			iter->second->getWidth() != src->getWidth() ||
-			iter->second->getHeight() != src->getHeight()) // bump not cached yet or has changed resolution
+		if (iter == entries_list.end() ||
+			iter->second.isNull())
+		{ //make sure an entry exists for this image
+			LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,1);
+			raw->clear(0x77, 0x77, 0xFF, 0xFF);
+
+			entries_list[src_vi->getID()] = LLViewerTextureManager::getLocalTexture( raw.get(), TRUE);
+			iter = entries_list.find(src_vi->getID());
+		}
+
+		//if (iter->second->getWidth() != src->getWidth() ||
+		//	iter->second->getHeight() != src->getHeight()) // bump not cached yet or has changed resolution
 		{
 			LLPointer<LLImageRaw> dst_image = new LLImageRaw(src->getWidth(), src->getHeight(), 1);
 			U8* dst_data = dst_image->getData();
@@ -1251,18 +1262,10 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI
 				bump->setExplicitFormat(GL_RGBA, GL_RGBA);
 				bump->createGLTexture(0, nrm_image);
 			}
-
-			
+		
 			iter->second = bump; // derefs (and deletes) old image
 			//---------------------------------------------------
 		}
-		else
-		{
-			// entry should have been added in LLBumpImageList::getImage().
-
-			// Not a legit assertion - the bump texture could have been flushed by the bump image manager
-			//llassert(0);
-		}
 	}
 }
 
diff --git a/indra/newview/llexternaleditor.cpp b/indra/newview/llexternaleditor.cpp
index 54968841ab1521461002482ad0631f39aecfa46f..ed1d7e860a0cfa672fe78857a6b8861059c5169f 100644
--- a/indra/newview/llexternaleditor.cpp
+++ b/indra/newview/llexternaleditor.cpp
@@ -27,6 +27,7 @@
 #include "llviewerprecompiledheaders.h"
 #include "llexternaleditor.h"
 
+#include "lltrans.h"
 #include "llui.h"
 
 // static
@@ -35,13 +36,13 @@ const std::string LLExternalEditor::sFilenameMarker = "%s";
 // static
 const std::string LLExternalEditor::sSetting = "ExternalEditor";
 
-bool LLExternalEditor::setCommand(const std::string& env_var, const std::string& override)
+LLExternalEditor::EErrorCode LLExternalEditor::setCommand(const std::string& env_var, const std::string& override)
 {
 	std::string cmd = findCommand(env_var, override);
 	if (cmd.empty())
 	{
-		llwarns << "Empty editor command" << llendl;
-		return false;
+		llwarns << "Editor command is empty or not set" << llendl;
+		return EC_NOT_SPECIFIED;
 	}
 
 	// Add the filename marker if missing.
@@ -55,7 +56,7 @@ bool LLExternalEditor::setCommand(const std::string& env_var, const std::string&
 	if (tokenize(tokens, cmd) < 2) // 2 = bin + at least one arg (%s)
 	{
 		llwarns << "Error parsing editor command" << llendl;
-		return false;
+		return EC_PARSE_ERROR;
 	}
 
 	// Check executable for existence.
@@ -63,7 +64,7 @@ bool LLExternalEditor::setCommand(const std::string& env_var, const std::string&
 	if (!LLFile::isfile(bin_path))
 	{
 		llwarns << "Editor binary [" << bin_path << "] not found" << llendl;
-		return false;
+		return EC_BINARY_NOT_FOUND;
 	}
 
 	// Save command.
@@ -76,16 +77,16 @@ bool LLExternalEditor::setCommand(const std::string& env_var, const std::string&
 	}
 	llinfos << "Setting command [" << bin_path << " " << mArgs << "]" << llendl;
 
-	return true;
+	return EC_SUCCESS;
 }
 
-bool LLExternalEditor::run(const std::string& file_path)
+LLExternalEditor::EErrorCode LLExternalEditor::run(const std::string& file_path)
 {
 	std::string args = mArgs;
 	if (mProcess.getExecutable().empty() || args.empty())
 	{
 		llwarns << "Editor command not set" << llendl;
-		return false;
+		return EC_NOT_SPECIFIED;
 	}
 
 	// Substitute the filename marker in the command with the actual passed file name.
@@ -111,7 +112,22 @@ bool LLExternalEditor::run(const std::string& file_path)
 		mProcess.orphan();
 	}
 
-	return result == 0;
+	return result == 0 ? EC_SUCCESS : EC_FAILED_TO_RUN;
+}
+
+// static
+std::string LLExternalEditor::getErrorMessage(EErrorCode code)
+{
+	switch (code)
+	{
+	case EC_SUCCESS: 			return LLTrans::getString("ok");
+	case EC_NOT_SPECIFIED: 		return LLTrans::getString("ExternalEditorNotSet");
+	case EC_PARSE_ERROR:		return LLTrans::getString("ExternalEditorCommandParseError");
+	case EC_BINARY_NOT_FOUND:	return LLTrans::getString("ExternalEditorNotFound");
+	case EC_FAILED_TO_RUN:		return LLTrans::getString("ExternalEditorFailedToRun");
+	}
+
+	return LLTrans::getString("Unknown");
 }
 
 // static
diff --git a/indra/newview/llexternaleditor.h b/indra/newview/llexternaleditor.h
index 6ea210d5e222d69dfc81ed3d4d9ab23758ad520b..ef5db56c6ee056e6ed1ee560c20ae2e1abe51e92 100644
--- a/indra/newview/llexternaleditor.h
+++ b/indra/newview/llexternaleditor.h
@@ -42,6 +42,14 @@ class LLExternalEditor
 
 public:
 
+	typedef enum e_error_code {
+		EC_SUCCESS,				/// No error.
+		EC_NOT_SPECIFIED,		/// Editor path not specified.
+		EC_PARSE_ERROR,			/// Editor command parsing error.
+		EC_BINARY_NOT_FOUND,	/// Could find the editor binary (missing or not quoted).
+		EC_FAILED_TO_RUN,		/// Could not execute the editor binary.
+	} EErrorCode;
+
 	/**
 	 * Set editor command.
 	 *
@@ -51,19 +59,25 @@ class LLExternalEditor
 	 * First tries the override, then a predefined setting (sSetting),
 	 * then the environment variable.
 	 *
-	 * @return Command if found, empty string otherwise.
+	 * @return EC_SUCCESS if command is valid and refers to an existing executable,
+	 *         EC_NOT_SPECIFIED or EC_FAILED_TO_RUNan on error.
 	 *
 	 * @see sSetting
 	 */
-	bool setCommand(const std::string& env_var, const std::string& override = LLStringUtil::null);
+	EErrorCode setCommand(const std::string& env_var, const std::string& override = LLStringUtil::null);
 
 	/**
 	 * Run the editor with the given file.
 	 *
 	 * @param file_path File to edit.
-	 * @return true on success, false on error.
+	 * @return EC_SUCCESS on success, error code on error.
+	 */
+	EErrorCode run(const std::string& file_path);
+
+	/**
+	 * Get a meaningful error message for the given status code.
 	 */
-	bool run(const std::string& file_path);
+	static std::string getErrorMessage(EErrorCode code);
 
 private:
 
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 290115417faf268bda35fd5a7bea6d872b55c9e5..ae455a82873f6822c172c997784b92ba3dac4f05 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -1729,6 +1729,7 @@ BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
 	t.load3(camera->getOrigin().mV);
 	lookAt.setSub(center, t);
 	F32 dist = lookAt.getLength3().getF32();
+	dist = llmax(dist-size.getLength3().getF32(), 0.f);
 	lookAt.normalize3fast() ;	
 
 	//get area of circle around node
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 2bafb9a4a7dda1cb9ca79f9108452ef9307c7beb..35712163ebd78ebf20f129671d046c9a6d1b7edd 100755
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -1040,43 +1040,6 @@ void saveChart(const std::string& label, const char* suffix, LLImageRaw* scratch
 	result->save(out_file);
 }
 
-template <class VEC_TYPE>
-void removeOutliers(std::vector<VEC_TYPE>& data, F32 k)
-{
-	if (data.size() < 100)
-	{ //not enough samples
-		return;
-	}
-
-	VEC_TYPE Q1 = data[data.size()/4];
-	VEC_TYPE Q3 = data[data.size()-data.size()/4-1];
-
-	VEC_TYPE min = Q1-k*(Q3-Q1);
-	VEC_TYPE max = Q3+k*(Q3-Q1);
-
-	U32 i = 0;
-	while (i < data.size() && data[i] < min)
-	{
-		i++;
-	}
-
-	S32 j = data.size()-1;
-	while (j > 0 && data[j] > max)
-	{
-		j--;
-	}
-
-	if (j < data.size()-1)
-	{
-		data.erase(data.begin()+j, data.end());
-	}
-
-	if (i > 0)
-	{
-		data.erase(data.begin(), data.begin()+i);
-	}
-}
-
 //static
 void LLFastTimerView::exportCharts(const std::string& base, const std::string& target)
 {
@@ -1206,22 +1169,22 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t
 		const U32 OUTLIER_CUTOFF = 512;
 		if (base_times.size() > OUTLIER_CUTOFF)
 		{ 
-			removeOutliers(base_times, 1.f);
+			ll_remove_outliers(base_times, 1.f);
 		}
 
 		if (base_execution.size() > OUTLIER_CUTOFF)
 		{ 
-			removeOutliers(base_execution, 1.f);
+			ll_remove_outliers(base_execution, 1.f);
 		}
 
 		if (cur_times.size() > OUTLIER_CUTOFF)
 		{ 
-			removeOutliers(cur_times, 1.f);
+			ll_remove_outliers(cur_times, 1.f);
 		}
 
 		if (cur_execution.size() > OUTLIER_CUTOFF)
 		{ 
-			removeOutliers(cur_execution, 1.f);
+			ll_remove_outliers(cur_execution, 1.f);
 		}
 
 
@@ -1538,36 +1501,6 @@ void LLFastTimerView::doAnalysisDefault(std::string baseline, std::string target
 	os.close();
 }
 
-//-------------------------
-//static
-LLSD LLFastTimerView::analyzeMetricPerformanceLog(std::istream& is)
-{
-	LLSD ret;
-	LLSD cur;
-
-	while (!is.eof() && LLSDSerialize::fromXML(cur, is))
-	{
-		for (LLSD::map_iterator iter = cur.beginMap(); iter != cur.endMap(); ++iter)
-		{
-			std::string label = iter->first;
-
-			LLMetricPerformanceTesterBasic* tester = LLMetricPerformanceTesterBasic::getTester(iter->second["Name"].asString()) ;
-			if(tester)
-			{
-				ret[label]["Name"] = iter->second["Name"] ;
-
-				S32 num_of_metrics = tester->getNumberOfMetrics() ;
-				for(S32 index = 0 ; index < num_of_metrics ; index++)
-				{
-					ret[label][ tester->getMetricName(index) ] = iter->second[ tester->getMetricName(index) ] ;
-				}
-			}
-		}
-	}
-		
-	return ret;
-}
-
 //static
 void LLFastTimerView::outputAllMetrics()
 {
@@ -1582,48 +1515,6 @@ void LLFastTimerView::outputAllMetrics()
 	}
 }
 
-//static
-void LLFastTimerView::doAnalysisMetrics(std::string baseline, std::string target, std::string output)
-{
-	if(!LLMetricPerformanceTesterBasic::hasMetricPerformanceTesters())
-	{
-		return ;
-	}
-
-	// Open baseline and current target, exit if one is inexistent
-	std::ifstream base_is(baseline.c_str());
-	std::ifstream target_is(target.c_str());
-	if (!base_is.is_open() || !target_is.is_open())
-	{
-		llwarns << "'-analyzeperformance' error : baseline or current target file inexistent" << llendl;
-		base_is.close();
-		target_is.close();
-		return;
-	}
-
-	//analyze baseline
-	LLSD base = analyzeMetricPerformanceLog(base_is);
-	base_is.close();
-
-	//analyze current
-	LLSD current = analyzeMetricPerformanceLog(target_is);
-	target_is.close();
-
-	//output comparision
-	std::ofstream os(output.c_str());
-	
-	os << "Label, Metric, Base(B), Target(T), Diff(T-B), Percentage(100*T/B)\n"; 
-	for(LLMetricPerformanceTesterBasic::name_tester_map_t::iterator iter = LLMetricPerformanceTesterBasic::sTesterMap.begin() ; 
-		iter != LLMetricPerformanceTesterBasic::sTesterMap.end() ; ++iter)
-	{
-		LLMetricPerformanceTesterBasic* tester = ((LLMetricPerformanceTesterBasic*)iter->second) ;	
-		tester->analyzePerformance(&os, &base, &current) ;
-	}
-	
-	os.flush();
-	os.close();
-}
-
 //static
 void LLFastTimerView::doAnalysis(std::string baseline, std::string target, std::string output)
 {
@@ -1635,7 +1526,7 @@ void LLFastTimerView::doAnalysis(std::string baseline, std::string target, std::
 
 	if(LLFastTimer::sMetricLog)
 	{
-		doAnalysisMetrics(baseline, target, output) ;
+		LLMetricPerformanceTesterBasic::doAnalysisMetrics(baseline, target, output) ;
 		return ;
 	}
 }
diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h
index c409445d864be4abcb6929978d4cd891f8b41679..ea8251191b29e6a4fd50ca3d16d505aa1364a8e9 100644
--- a/indra/newview/llfasttimerview.h
+++ b/indra/newview/llfasttimerview.h
@@ -42,8 +42,6 @@ class LLFastTimerView : public LLFloater
 
 private:
 	static void doAnalysisDefault(std::string baseline, std::string target, std::string output) ;
-	static void doAnalysisMetrics(std::string baseline, std::string target, std::string output) ;
-	static LLSD analyzeMetricPerformanceLog(std::istream& is) ;
 	static LLSD analyzePerformanceLogDefault(std::istream& is) ;
 	static void exportCharts(const std::string& base, const std::string& target);
 
diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp
index e319418defe85f5037072632f0a3ffc0134dac50..d63685e1af291f56d2127efc28d8a581af53d3d9 100644
--- a/indra/newview/llfirstuse.cpp
+++ b/indra/newview/llfirstuse.cpp
@@ -77,6 +77,12 @@ void LLFirstUse::otherAvatarChatFirst(bool enable)
 	firstUseNotification("FirstOtherChatBeforeUser", enable, "HintChat", LLSD(), LLSD().with("target", "chat_bar").with("direction", "top_right").with("distance", 24));
 }
 
+// static
+void LLFirstUse::speak(bool enable)
+{
+	firstUseNotification("FirstSpeak", enable, "HintSpeak", LLSD(), LLSD().with("target", "speak_btn").with("direction", "top"));
+}
+
 // static
 void LLFirstUse::sit(bool enable)
 {
diff --git a/indra/newview/llfirstuse.h b/indra/newview/llfirstuse.h
index 42b2ec0c60a17278786dd36198b6189dc9d9784f..4c8c9d3cde6b00fd622014652d3cedc13e45b95f 100644
--- a/indra/newview/llfirstuse.h
+++ b/indra/newview/llfirstuse.h
@@ -68,6 +68,8 @@ object or from inventory.
 13. First time you open the debug menus (ctrl-alt-shift D)
 
 14. First time you create/edit a sculpted prim.
+
+15. Explanation of Speak&flyout buttons.
 */
 
 class LLNotification;
@@ -85,6 +87,7 @@ class LLFirstUse
 	static void resetFirstUse();
 
 	static void otherAvatarChatFirst(bool enable = true);
+	static void speak(bool enable = true);
 	static void sit(bool enable = true);
 	static void notUsingDestinationGuide(bool enable = true);
 	static void notUsingSidePanel(bool enable = true);
diff --git a/indra/newview/llfloaterbeacons.cpp b/indra/newview/llfloaterbeacons.cpp
index e24df948c42857e0bb39bf749caca6f5bb2cd139..316294a477408d700e5019d709b79232e7327aa0 100644
--- a/indra/newview/llfloaterbeacons.cpp
+++ b/indra/newview/llfloaterbeacons.cpp
@@ -48,6 +48,7 @@ LLFloaterBeacons::LLFloaterBeacons(const LLSD& seed)
 	LLPipeline::setRenderParticleBeacons(     gSavedSettings.getBOOL("particlesbeacon"));
 	LLPipeline::setRenderHighlights(          gSavedSettings.getBOOL("renderhighlights"));
 	LLPipeline::setRenderBeacons(             gSavedSettings.getBOOL("renderbeacons"));
+	LLPipeline::setRenderMOAPBeacons(		  gSavedSettings.getBOOL("moapbeacon"));
 	mCommitCallbackRegistrar.add("Beacons.UICheck",	boost::bind(&LLFloaterBeacons::onClickUICheck, this,_1));
 }
 
@@ -96,6 +97,7 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl)
 	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 == "moapbeacon")     LLPipeline::setRenderMOAPBeacons(check->get());
 	else if(name == "highlights")
 	{
 		LLPipeline::toggleRenderHighlights(NULL);
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index 45d1cc2b53dd68c1b9c4604e9cab23db3797face..641e64247bab0c98ce43a27cb51c1e2a70eee00e 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -42,7 +42,6 @@
 #include "llviewercamera.h"
 #include "lldraghandle.h"
 #include "lltextbox.h"
-#include "llviewermenu.h"
 #include "llfloaterworldmap.h"
 #include "llagent.h"
 
@@ -63,7 +62,6 @@ const S32 MAP_PADDING_BOTTOM = 0;
 
 LLFloaterMap::LLFloaterMap(const LLSD& key) 
 	: LLFloater(key),
-	  mPopupMenu(NULL),
 	  mTextBoxEast(NULL),
 	  mTextBoxNorth(NULL),
 	  mTextBoxWest(NULL),
@@ -102,17 +100,6 @@ BOOL LLFloaterMap::postBuild()
 	mTextBoxSouthWest = getChild<LLTextBox> ("floater_map_southwest");
 	mTextBoxNorthWest = getChild<LLTextBox> ("floater_map_northwest");
 
-	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
-	
-	registrar.add("Minimap.Zoom", boost::bind(&LLFloaterMap::handleZoom, this, _2));
-	registrar.add("Minimap.Tracker", boost::bind(&LLFloaterMap::handleStopTracking, this, _2));
-
-	mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_mini_map.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-	if (mPopupMenu && !LLTracker::isTracking(0))
-	{
-		mPopupMenu->setItemEnabled ("Stop Tracking", false);
-	}
-
 	stretchMiniMap(getRect().getWidth() - MAP_PADDING_LEFT - MAP_PADDING_RIGHT
 		,getRect().getHeight() - MAP_PADDING_TOP - MAP_PADDING_BOTTOM);
 
@@ -163,17 +150,6 @@ BOOL LLFloaterMap::handleDoubleClick(S32 x, S32 y, MASK mask)
 	return TRUE;
 }
 
-BOOL LLFloaterMap::handleRightMouseDown(S32 x, S32 y, MASK mask)
-{
-	if (mPopupMenu)
-	{
-		mPopupMenu->buildDrawLabels();
-		mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
-		LLMenuGL::showPopup(this, mPopupMenu, x, y);
-	}
-	return TRUE;
-}
-
 void LLFloaterMap::setDirectionPos( LLTextBox* text_box, F32 rotation )
 {
 	// Rotation is in radians.
@@ -244,11 +220,6 @@ void LLFloaterMap::draw()
 		getDragHandle()->setMouseOpaque(TRUE);
 	}
 	
-	if (LLTracker::isTracking(0))
-	{
-		mPopupMenu->setItemEnabled ("Stop Tracking", true);
-	}
-	
 	LLFloater::draw();
 }
 
@@ -315,14 +286,6 @@ void LLFloaterMap::handleZoom(const LLSD& userdata)
 	}
 }
 
-void LLFloaterMap::handleStopTracking (const LLSD& userdata)
-{
-	if (mPopupMenu)
-	{
-		mPopupMenu->setItemEnabled ("Stop Tracking", false);
-		LLTracker::stopTracking ((void*)LLTracker::isTracking(NULL));
-	}
-}
 void	LLFloaterMap::setMinimized(BOOL b)
 {
 	LLFloater::setMinimized(b);
diff --git a/indra/newview/llfloatermap.h b/indra/newview/llfloatermap.h
index 4cbb48fb3e1989335f8a4975f0386797d37f7545..5cf66a594bf249f9683f70b0621869e1e761b068 100644
--- a/indra/newview/llfloatermap.h
+++ b/indra/newview/llfloatermap.h
@@ -29,7 +29,6 @@
 
 #include "llfloater.h"
 
-class LLMenuGL;
 class LLNetMap;
 class LLTextBox;
 
@@ -44,7 +43,6 @@ class LLFloaterMap : public LLFloater
 	
 	/*virtual*/ BOOL 	postBuild();
 	/*virtual*/ BOOL	handleDoubleClick( S32 x, S32 y, MASK mask );
-	/*virtual*/ BOOL	handleRightMouseDown( S32 x, S32 y, MASK mask );
 	/*virtual*/ void	reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
 	/*virtual*/ void	draw();
 	/*virtual*/ void	onFocusLost();
@@ -54,14 +52,11 @@ class LLFloaterMap : public LLFloater
 	
 private:
 	void handleZoom(const LLSD& userdata);
-	void handleStopTracking (const LLSD& userdata);
 	void setDirectionPos( LLTextBox* text_box, F32 rotation );
 	void updateMinorDirections();
 
 	void stretchMiniMap(S32 width,S32 height);
 	
-	LLMenuGL*		mPopupMenu;
-
 	LLTextBox*		mTextBoxEast;
 	LLTextBox*		mTextBoxNorth;
 	LLTextBox*		mTextBoxWest;
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index ce977b33bb458e2b67d028fb8b9d8c7ad728eacb..a808cc47a2b90ed77305191a3fe6ebdef54047a5 100755
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -82,6 +82,7 @@
 #include "llvoavatarself.h"
 #include "pipeline.h"
 #include "lluictrlfactory.h"
+#include "llviewercontrol.h"
 #include "llviewermenu.h"
 #include "llviewermenufile.h"
 #include "llviewerregion.h"
@@ -90,6 +91,7 @@
 #include "llbutton.h"
 #include "llcheckboxctrl.h"
 #include "llradiogroup.h"
+#include "llsdserialize.h"
 #include "llsliderctrl.h"
 #include "llspinctrl.h"
 #include "lltoggleablemenu.h"
@@ -109,6 +111,8 @@ const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
 const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16;
 const S32 PREVIEW_TEXTURE_HEIGHT = 300;
 
+const F32 MAXIMUM_PIVOT_OFFSET = 64.0f;
+
 void drawBoxOutline(const LLVector3& pos, const LLVector3& size);
 
 
@@ -275,11 +279,6 @@ BOOL LLFloaterModelPreview::postBuild()
 		return FALSE;
 	}
 
-
-
-
-
-
 	childSetAction("lod_browse", onBrowseLOD, this);
 
 	childSetCommitCallback("cancel_btn", onCancel, this);
@@ -302,6 +301,8 @@ BOOL LLFloaterModelPreview::postBuild()
 	childSetAction("ok_btn", onUpload, this);
 	childDisable("ok_btn");
 
+	childSetAction("reset_btn", onReset, this);
+
 	childSetAction("clear_materials", onClearMaterials, this);
 
 	childSetCommitCallback("preview_lod_combo", onPreviewLODCommit, this);
@@ -320,8 +321,6 @@ BOOL LLFloaterModelPreview::postBuild()
 	childDisable("upload_skin");
 	childDisable("upload_joints");
 
-	childDisable("pelvis_offset");
-
 	childDisable("ok_btn");
 
 	mViewOptionMenuButton = getChild<LLMenuButton>("options_gear_btn");
@@ -382,14 +381,17 @@ BOOL LLFloaterModelPreview::postBuild()
 LLFloaterModelPreview::~LLFloaterModelPreview()
 {
 	sInstance = NULL;
-
-	const LLModelLoader *model_loader = mModelPreview->mModelLoader;
-	if (model_loader && model_loader->mResetJoints)
+	
+	if ( mModelPreview && mModelPreview->getResetJointFlag() )
 	{
 		gAgentAvatarp->resetJointPositions();
 	}
 
-	delete mModelPreview;
+	
+	if ( mModelPreview )
+	{
+		delete mModelPreview;
+	}
 
 	if (mGLName)
 	{
@@ -572,7 +574,14 @@ void LLFloaterModelPreview::draw()
 
 	if (!mModelPreview->mLoading)
 	{
-		childSetTextArg("status", "[STATUS]", getString("status_idle"));
+		if ( mModelPreview->getLoadState() > LLModelLoader::ERROR_PARSING )
+		{		
+			childSetTextArg("status", "[STATUS]", getString(LLModel::getStatusString(mModelPreview->getLoadState() - LLModelLoader::ERROR_PARSING)));
+		}
+		else
+		{
+			childSetTextArg("status", "[STATUS]", getString("status_idle"));
+		}
 	}
 
 	childSetTextArg("prim_cost", "[PRIM_COST]", llformat("%d", mModelPreview->mResourceCost));
@@ -986,7 +995,7 @@ void LLFloaterModelPreview::onMouseCaptureLostModelPreview(LLMouseHandler* handl
 // LLModelLoader
 //-----------------------------------------------------------------------------
 LLModelLoader::LLModelLoader(std::string filename, S32 lod, LLModelPreview* preview)
-: LLThread("Model Loader"), mFilename(filename), mLod(lod), mPreview(preview), mFirstTransform(TRUE), mResetJoints( FALSE )
+: LLThread("Model Loader"), mFilename(filename), mLod(lod), mPreview(preview), mFirstTransform(TRUE)
 {
 	mJointMap["mPelvis"] = "mPelvis";
 	mJointMap["mTorso"] = "mTorso";
@@ -1087,8 +1096,15 @@ LLModelLoader::LLModelLoader(std::string filename, S32 lod, LLModelPreview* prev
 
 	if (mPreview)
 	{
+		//only try to load from slm if viewer is configured to do so and this is the 
+		//initial model load (not an LoD or physics shape)
+		mTrySLM = gSavedSettings.getBOOL("MeshImportUseSLM") && mPreview->mUploadData.empty();
 		mPreview->setLoadState(STARTING);
 	}
+	else
+	{
+		mTrySLM = false;
+	}
 }
 
 void stretch_extents(LLModel* model, LLMatrix4a& mat, LLVector4a& min, LLVector4a& max, BOOL& first_transform)
@@ -1166,6 +1182,38 @@ void LLModelLoader::run()
 
 bool LLModelLoader::doLoadModel()
 {
+	//first, look for a .slm file of the same name that was modified later
+	//than the .dae
+
+	if (mTrySLM)
+	{
+		std::string filename = mFilename;
+			
+		std::string::size_type i = filename.rfind(".");
+		if (i != std::string::npos)
+		{
+			filename.replace(i, filename.size()-1, ".slm");
+			llstat slm_status;
+			if (LLFile::stat(filename, &slm_status) == 0)
+			{ //slm file exists
+				llstat dae_status;
+				if (LLFile::stat(mFilename, &dae_status) != 0 ||
+					dae_status.st_mtime < slm_status.st_mtime)
+				{
+					if (loadFromSLM(filename))
+					{ //slm successfully loaded, if this fails, fall through and
+						//try loading from dae
+
+						mLod = -1; //successfully loading from an slm implicitly sets all 
+									//LoDs
+						return true;
+					}
+				}
+			}	
+		}
+	}
+
+	//no suitable slm exists, load from the .dae file
 	DAE dae;
 	domCOLLADA* dom = dae.open(mFilename);
 	
@@ -1239,6 +1287,12 @@ bool LLModelLoader::doLoadModel()
 		{
 			LLPointer<LLModel> model = LLModel::loadModelFromDomMesh(mesh);
 			
+			if(model->getStatus() != LLModel::NO_ERRORS)
+			{
+				setLoadState(ERROR_PARSING + model->getStatus()) ;
+				return true ; //abort
+			}
+
 			if (model.notNull() && validate_model(model))
 			{
 				mModelList.push_back(model);
@@ -1287,17 +1341,19 @@ bool LLModelLoader::doLoadModel()
 						{ //get bind shape matrix
 							domFloat4x4& dom_value = bind_mat->getValue();
 							
+							LLMeshSkinInfo& skin_info = model->mSkinInfo;
+
 							for (int i = 0; i < 4; i++)
 							{
 								for(int j = 0; j < 4; j++)
 								{
-									model->mBindShapeMatrix.mMatrix[i][j] = dom_value[i + j*4];
+									skin_info.mBindShapeMatrix.mMatrix[i][j] = dom_value[i + j*4];
 								}
 							}
 							
 							LLMatrix4 trans = normalized_transformation;
-							trans *= model->mBindShapeMatrix;
-							model->mBindShapeMatrix = trans;
+							trans *= skin_info.mBindShapeMatrix;
+							skin_info.mBindShapeMatrix = trans;
 							
 						}
 						
@@ -1436,7 +1492,7 @@ bool LLModelLoader::doLoadModel()
 							xsNMTOKEN semantic = input->getSemantic();
 							
 							if (strcmp(semantic, COMMON_PROFILE_INPUT_JOINT) == 0)
-							{ //found joint source, fill model->mJointMap and model->mJointList
+							{ //found joint source, fill model->mJointMap and model->mSkinInfo.mJointNames
 								daeElement* elem = input->getSource().getElement();
 								
 								domSource* source = daeSafeCast<domSource>(elem);
@@ -1457,8 +1513,8 @@ bool LLModelLoader::doLoadModel()
 											{
 												name = mJointMap[name];
 											}
-											model->mJointList.push_back(name);
-											model->mJointMap[name] = j;
+											model->mSkinInfo.mJointNames.push_back(name);
+											model->mSkinInfo.mJointMap[name] = j;
 										}
 									}
 									else
@@ -1475,8 +1531,8 @@ bool LLModelLoader::doLoadModel()
 												{
 													name = mJointMap[name];
 												}
-												model->mJointList.push_back(name);
-												model->mJointMap[name] = j;
+												model->mSkinInfo.mJointNames.push_back(name);
+												model->mSkinInfo.mJointMap[name] = j;
 											}
 										}
 									}
@@ -1505,7 +1561,7 @@ bool LLModelLoader::doLoadModel()
 												}
 											}
 											
-											model->mInvBindMatrix.push_back(mat);
+											model->mSkinInfo.mInvBindMatrix.push_back(mat);
 										}
 									}
 								}
@@ -1516,17 +1572,17 @@ bool LLModelLoader::doLoadModel()
 						//(which means we have all the joints that are required for an avatar versus
 						//a skinned asset attached to a node in a file that contains an entire skeleton,
 						//but does not use the skeleton).
-						mPreview->setRigValid( doesJointArrayContainACompleteRig( model->mJointList ) );
-							if ( !skeletonWithNoRootNode && !model->mJointList.empty() && mPreview->isRigValid() ) 
+						mPreview->setRigValid( doesJointArrayContainACompleteRig( model->mSkinInfo.mJointNames ) );
+						if ( !skeletonWithNoRootNode && !model->mSkinInfo.mJointNames.empty() && mPreview->isRigValid() ) 
 						{
-							mResetJoints = true;
+							mPreview->setResetJointFlag( true );
 						}
 						
 						if ( !missingSkeletonOrScene )
 						{
 							//Set the joint translations on the avatar - if it's a full mapping
 							//The joints are reset in the dtor
-							if ( mResetJoints )
+							if ( mPreview->getResetJointFlag() )
 							{	
 								std::map<std::string, std::string> :: const_iterator masterJointIt = mJointMap.begin();
 								std::map<std::string, std::string> :: const_iterator masterJointItEnd = mJointMap.end();
@@ -1557,8 +1613,8 @@ bool LLModelLoader::doLoadModel()
 						//in the same order as they were stored in the joint buffer. The joints associated
 						//with the skeleton are not stored in the same order as they are in the exported joint buffer.
 						//This remaps the skeletal joints to be in the same order as the joints stored in the model.
-						std::vector<std::string> :: const_iterator jointIt  = model->mJointList.begin();
-						const int jointCnt = model->mJointList.size();
+						std::vector<std::string> :: const_iterator jointIt  = model->mSkinInfo.mJointNames.begin();
+						const int jointCnt = model->mSkinInfo.mJointNames.size();
 						for ( int i=0; i<jointCnt; ++i, ++jointIt )
 						{
 							std::string lookingForJoint = (*jointIt).c_str();
@@ -1567,9 +1623,9 @@ bool LLModelLoader::doLoadModel()
 							if ( jointTransforms.find( lookingForJoint ) != jointTransforms.end() )
 							{
 								LLMatrix4 jointTransform = jointTransforms[lookingForJoint];
-								LLMatrix4 newInverse = model->mInvBindMatrix[i];
+								LLMatrix4 newInverse = model->mSkinInfo.mInvBindMatrix[i];
 								newInverse.setTranslation( jointTransforms[lookingForJoint].getTranslation() );
-								model->mAlternateBindMatrix.push_back( newInverse );
+								model->mSkinInfo.mAlternateBindMatrix.push_back( newInverse );
 							}
 							else
 							{
@@ -1743,12 +1799,103 @@ void LLModelLoader::setLoadState(U32 state)
 	}
 }
 
+bool LLModelLoader::loadFromSLM(const std::string& filename)
+{ 
+	//only need to populate mScene with data from slm
+	llstat stat;
+
+	if (LLFile::stat(filename, &stat))
+	{ //file does not exist
+		return false;
+	}
+
+	S32 file_size = (S32) stat.st_size;
+	
+	llifstream ifstream(filename, std::ifstream::in | std::ifstream::binary);
+	LLSD data;
+	LLSDSerialize::fromBinary(data, ifstream, file_size);
+	ifstream.close();
+
+	//build model list for each LoD
+	model_list model[LLModel::NUM_LODS];
+
+	LLSD& mesh = data["mesh"];
+
+	LLVolumeParams volume_params;
+	volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+
+	for (S32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
+	{
+		for (U32 i = 0; i < mesh.size(); ++i)
+		{
+			std::stringstream str(mesh[i].asString());
+			LLPointer<LLModel> loaded_model = new LLModel(volume_params, (F32) lod);
+			if (loaded_model->loadModel(str))
+			{
+				loaded_model->mLocalID = i;
+				model[lod].push_back(loaded_model);
+
+				if (lod == LLModel::LOD_HIGH && !loaded_model->mSkinInfo.mJointNames.empty())
+				{ //check to see if rig is valid
+					mPreview->setRigValid( doesJointArrayContainACompleteRig( loaded_model->mSkinInfo.mJointNames ) );
+				}
+			}
+			else
+			{
+				llassert(model[lod].empty());
+			}
+		}
+	}	
+
+	if (model[LLModel::LOD_HIGH].empty())
+	{ //failed to load high lod
+		return false;
+	}
+
+	//load instance list
+	model_instance_list instance_list;
+
+	LLSD& instance = data["instance"];
+
+	for (U32 i = 0; i < instance.size(); ++i)
+	{
+		//deserialize instance list
+		instance_list.push_back(LLModelInstance(instance[i]));
+
+		//match up model instance pointers
+		S32 idx = instance_list[i].mLocalMeshID;
+
+		for (U32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
+		{
+			if (!model[lod].empty())
+			{
+				instance_list[i].mLOD[lod] = model[lod][idx];
+			}
+		}
+
+		instance_list[i].mModel = model[LLModel::LOD_HIGH][idx];
+	}
+
+
+	//convert instance_list to mScene
+	mFirstTransform = TRUE;
+	for (U32 i = 0; i < instance_list.size(); ++i)
+	{
+		LLModelInstance& cur_instance = instance_list[i];
+		mScene[cur_instance.mTransform].push_back(cur_instance);
+		stretch_extents(cur_instance.mModel, cur_instance.mTransform, mExtents[0], mExtents[1], mFirstTransform);
+	}
+	
+	setLoadState( DONE );
+
+	return true;
+}
+
 void LLModelLoader::loadModelCallback()
 {
 	if (mPreview)
 	{
-		mPreview->loadModelCallback(mLod);
-		mPreview->mModelLoader = NULL;
+		mPreview->loadModelCallback(mLod);	
 	}
 
 	while (!isStopped())
@@ -1756,6 +1903,12 @@ void LLModelLoader::loadModelCallback()
 		apr_sleep(100);
 	}
 
+	//cleanup model loader
+	if (mPreview)
+	{
+		mPreview->mModelLoader = NULL;
+	}
+
 	delete this;
 }
 
@@ -1781,8 +1934,19 @@ void LLModelLoader::handlePivotPoint( daeElement* pRoot )
 				if ( pTranslate )
 				{
 					extractTranslation( pTranslate, workingTransform );
-					mPreview->setModelPivot( workingTransform.getTranslation() );
-					mPreview->setHasPivot( true );
+					LLVector3 pivotTrans = workingTransform.getTranslation();
+					if ( pivotTrans[VX] > MAXIMUM_PIVOT_OFFSET || pivotTrans[VX] < -MAXIMUM_PIVOT_OFFSET || 
+						 pivotTrans[VY] > MAXIMUM_PIVOT_OFFSET || pivotTrans[VY] < -MAXIMUM_PIVOT_OFFSET || 
+						 pivotTrans[VZ] > MAXIMUM_PIVOT_OFFSET || pivotTrans[VZ] < -MAXIMUM_PIVOT_OFFSET ) 
+					{
+						llwarns<<"Asset Pivot Node contains an offset that is too large - values should be within (-"<<MAXIMUM_PIVOT_OFFSET<<","<<MAXIMUM_PIVOT_OFFSET<<")."<<llendl;
+						mPreview->setHasPivot( false );
+					}
+					else
+					{
+						mPreview->setModelPivot( pivotTrans );
+						mPreview->setHasPivot( true );					
+					}
 				}					
 			}
 		}
@@ -2293,6 +2457,7 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
 : LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex(NULL)
 , mPelvisZOffset( 0.0f )
 , mRigValid( false )
+, mResetJoints( false )
 {
 	mNeedsUpdate = TRUE;
 	mCameraDistance = 0.f;
@@ -2332,6 +2497,7 @@ LLModelPreview::~LLModelPreview()
 {
 	if (mModelLoader)
 	{
+		delete mModelLoader;
 		mModelLoader->mPreview = NULL;
 	}
 	//*HACK : *TODO : turn this back on when we understand why this crashes
@@ -2346,7 +2512,7 @@ U32 LLModelPreview::calcResourceCost()
 
 	if (mFMP && mModelLoader)
 	{
-		if ( getLoadState() != LLModelLoader::ERROR_PARSING )
+		if ( getLoadState() < LLModelLoader::ERROR_PARSING )
 		{
 			mFMP->childEnable("ok_btn");
 		}
@@ -2368,8 +2534,13 @@ U32 LLModelPreview::calcResourceCost()
 	U32 num_hulls = 0;
 
 	F32 debug_scale = mFMP ? mFMP->childGetValue("import_scale").asReal() : 1.f;
-	mPelvisZOffset = mFMP ? mFMP->childGetValue("pelvis_offset").asReal() : 32.0f;
+	mPelvisZOffset = mFMP ? mFMP->childGetValue("pelvis_offset").asReal() : 3.0f;
 	
+	if ( mFMP && mFMP->childGetValue("upload_joints").asBoolean() )
+	{
+		gAgentAvatarp->setPelvisOffset( mPelvisZOffset );
+	}
+
 	F32 streaming_cost = 0.f;
 	F32 physics_cost = 0.f;
 	for (U32 i = 0; i < mUploadData.size(); ++i)
@@ -2380,28 +2551,37 @@ U32 LLModelPreview::calcResourceCost()
 		{
 			accounted.insert(instance.mModel);
 
-			LLModel::convex_hull_decomposition& decomp =
+			LLModel::Decomposition& decomp =
 			instance.mLOD[LLModel::LOD_PHYSICS] ?
-			instance.mLOD[LLModel::LOD_PHYSICS]->mConvexHullDecomp :
-			instance.mModel->mConvexHullDecomp;
-
-			LLSD ret = LLModel::writeModel(
-										   "",
-										   instance.mLOD[4],
-										   instance.mLOD[3],
-										   instance.mLOD[2],
-										   instance.mLOD[1],
-										   instance.mLOD[0],
-										   decomp,
-										   mFMP->childGetValue("upload_skin").asBoolean(),
-										   mFMP->childGetValue("upload_joints").asBoolean(),
-										   TRUE);
+			instance.mLOD[LLModel::LOD_PHYSICS]->mPhysics :
+			instance.mModel->mPhysics;
+			
+			//update instance skin info for each lods pelvisZoffset 
+			for ( int j=0; j<LLModel::NUM_LODS; ++j )
+			{	
+				if ( instance.mLOD[j] )
+				{
+					instance.mLOD[j]->mSkinInfo.mPelvisOffset = mPelvisZOffset;
+				}
+			}
+
+			std::stringstream ostr;
+			LLSD ret = LLModel::writeModel(ostr,
+					   instance.mLOD[4],
+					   instance.mLOD[3],
+					   instance.mLOD[2],
+					   instance.mLOD[1],
+					   instance.mLOD[0],
+					   decomp,
+					   mFMP->childGetValue("upload_skin").asBoolean(),
+					   mFMP->childGetValue("upload_joints").asBoolean(),
+					   TRUE);
 			cost += gMeshRepo.calcResourceCost(ret);
 
-			num_hulls += decomp.size();
-			for (U32 i = 0; i < decomp.size(); ++i)
+			num_hulls += decomp.mHull.size();
+			for (U32 i = 0; i < decomp.mHull.size(); ++i)
 			{
-				num_points += decomp[i].size();
+				num_points += decomp.mHull[i].size();
 			}
 
 			//calculate streaming cost
@@ -2561,6 +2741,75 @@ void LLModelPreview::rebuildUploadData()
 
 }
 
+void LLModelPreview::saveUploadData(bool save_skinweights, bool save_joint_positions)
+{
+	if (!mLODFile[LLModel::LOD_HIGH].empty())
+	{
+		std::string filename = mLODFile[LLModel::LOD_HIGH];
+		
+		std::string::size_type i = filename.rfind(".");
+		if (i != std::string::npos)
+		{
+			filename.replace(i, filename.size()-1, ".slm");
+			saveUploadData(filename, save_skinweights, save_joint_positions);
+		}
+	}
+}
+
+void LLModelPreview::saveUploadData(const std::string& filename, bool save_skinweights, bool save_joint_positions)
+{
+	if (!gSavedSettings.getBOOL("MeshImportUseSLM"))
+	{
+		return;
+	}
+
+	std::set<LLPointer<LLModel> > meshes;
+	std::map<LLModel*, std::string> mesh_binary;
+
+	LLModel::hull empty_hull;
+
+	LLSD data;
+
+	S32 mesh_id = 0;
+
+	//build list of unique models and initialize local id
+	for (U32 i = 0; i < mUploadData.size(); ++i)
+	{
+		LLModelInstance& instance = mUploadData[i];
+		
+		if (meshes.find(instance.mModel) == meshes.end())
+		{
+			instance.mModel->mLocalID = mesh_id++;
+			meshes.insert(instance.mModel);
+
+			std::stringstream str;
+
+			LLModel::Decomposition& decomp =
+				instance.mLOD[LLModel::LOD_PHYSICS].notNull() ? 
+				instance.mLOD[LLModel::LOD_PHYSICS]->mPhysics : 
+				instance.mModel->mPhysics;
+
+			LLModel::writeModel(str, 
+				instance.mLOD[LLModel::LOD_PHYSICS], 
+				instance.mLOD[LLModel::LOD_HIGH], 
+				instance.mLOD[LLModel::LOD_MEDIUM], 
+				instance.mLOD[LLModel::LOD_LOW], 
+				instance.mLOD[LLModel::LOD_IMPOSTOR], 
+				decomp, 
+				save_skinweights, save_joint_positions);
+
+			
+			data["mesh"][instance.mModel->mLocalID] = str.str();
+		}
+
+		data["instance"][i] = instance.asLLSD();
+	}
+
+	llofstream out(filename, std::ios_base::out | std::ios_base::binary);
+	LLSDSerialize::toBinary(data, out);
+	out.flush();
+	out.close();
+}
 
 void LLModelPreview::clearModel(S32 lod)
 {
@@ -2617,7 +2866,7 @@ void LLModelPreview::loadModel(std::string filename, S32 lod)
 
 	setPreviewLOD(lod);
 
-	if ( getLoadState() == LLModelLoader::ERROR_PARSING )
+	if ( getLoadState() >= LLModelLoader::ERROR_PARSING )
 	{
 		mFMP->childDisable("ok_btn");
 	}
@@ -2699,44 +2948,129 @@ void LLModelPreview::loadModelCallback(S32 lod)
 	LLMutexLock lock(this);
 	if (!mModelLoader)
 	{
+		mLoading = false ;
 		return;
 	}
+	if(getLoadState() >= LLModelLoader::ERROR_PARSING)
+	{
+		mLoading = false ;
+		return ;
+	}
 
 	mModelLoader->loadTextures() ;
-	mModel[lod] = mModelLoader->mModelList;
-	mScene[lod] = mModelLoader->mScene;
-	mVertexBuffer[lod].clear();
 
-	if (lod == LLModel::LOD_PHYSICS)
-	{
-		mPhysicsMesh.clear();
-	}
+	if (lod == -1)
+	{ //populate all LoDs from model loader scene
+		mBaseModel.clear();
+		mBaseScene.clear();
 
-	setPreviewLOD(lod);
+		bool skin_weights = false;
+		bool joint_positions = false;
 
+		for (S32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
+		{ //for each LoD
 
-	if (lod == LLModel::LOD_HIGH)
-	{ //save a copy of the highest LOD for automatic LOD manipulation
-		if (mBaseModel.empty())
-		{ //first time we've loaded a model, auto-gen LoD
-			mGenLOD = true;
+			//clear scene and model info
+			mScene[lod].clear();
+			mModel[lod].clear();
+			mVertexBuffer[lod].clear();
+			
+			if (mModelLoader->mScene.begin()->second[0].mLOD[lod].notNull())
+			{ //if this LoD exists in the loaded scene
+
+				//copy scene to current LoD
+				mScene[lod] = mModelLoader->mScene;
+			
+				//touch up copied scene to look like current LoD
+				for (LLModelLoader::scene::iterator iter = mScene[lod].begin(); iter != mScene[lod].end(); ++iter)
+				{
+					LLModelLoader::model_instance_list& list = iter->second;
+
+					for (LLModelLoader::model_instance_list::iterator list_iter = list.begin(); list_iter != list.end(); ++list_iter)
+					{	
+						//override displayed model with current LoD
+						list_iter->mModel = list_iter->mLOD[lod];
+
+						//add current model to current LoD's model list (LLModel::mLocalID makes a good vector index)
+						S32 idx = list_iter->mModel->mLocalID;
+
+						if (mModel[lod].size() <= idx)
+						{ //stretch model list to fit model at given index
+							mModel[lod].resize(idx+1);
+						}
+
+						mModel[lod][idx] = list_iter->mModel;	
+						if (!list_iter->mModel->mSkinWeights.empty())
+						{
+							skin_weights = true;
+
+							if (!list_iter->mModel->mSkinInfo.mAlternateBindMatrix.empty())
+							{
+								joint_positions = true;
+							}
+						}
+					}
+				}
+			}
 		}
 
-		mBaseModel = mModel[lod];
-		clearGLODGroup();
+		if (mFMP)
+		{
+			LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) mFMP;
 
-		mBaseScene = mScene[lod];
-		mVertexBuffer[5].clear();
-	}
+			if (skin_weights)
+			{ //enable uploading/previewing of skin weights if present in .slm file
+				fmp->enableViewOption("show_skin_weight");
+				mViewOption["show_skin_weight"] = true;
+				fmp->childSetValue("upload_skin", true);
+			}
 
-	clearIncompatible(lod);
+			if (joint_positions)
+			{ 
+				fmp->enableViewOption("show_joint_positions");
+				mViewOption["show_joint_positions"] = true;
+				fmp->childSetValue("upload_joints", true);
+			}
+		}
 
-	mDirty = true;
+		//copy high lod to base scene for LoD generation
+		mBaseScene = mScene[LLModel::LOD_HIGH];
+		mBaseModel = mModel[LLModel::LOD_HIGH];
 
-	if (lod == LLModel::LOD_HIGH)
-	{
+		mDirty = true;
 		resetPreviewTarget();
 	}
+	else
+	{ //only replace given LoD
+		mModel[lod] = mModelLoader->mModelList;
+		mScene[lod] = mModelLoader->mScene;
+		mVertexBuffer[lod].clear();
+
+		setPreviewLOD(lod);
+
+		if (lod == LLModel::LOD_HIGH)
+		{ //save a copy of the highest LOD for automatic LOD manipulation
+			if (mBaseModel.empty())
+			{ //first time we've loaded a model, auto-gen LoD
+				mGenLOD = true;
+			}
+
+			mBaseModel = mModel[lod];
+			clearGLODGroup();
+
+			mBaseScene = mScene[lod];
+			mVertexBuffer[5].clear();
+		}
+
+		clearIncompatible(lod);
+
+		mDirty = true;
+
+		if (lod == LLModel::LOD_HIGH)
+		{
+			resetPreviewTarget();
+		}
+	}
 
 	mLoading = false;
 	refresh();
@@ -2746,8 +3080,12 @@ void LLModelPreview::loadModelCallback(S32 lod)
 
 void LLModelPreview::resetPreviewTarget()
 {
-	mPreviewTarget = (mModelLoader->mExtents[0] + mModelLoader->mExtents[1]) * 0.5f;
-	mPreviewScale = (mModelLoader->mExtents[1] - mModelLoader->mExtents[0]) * 0.5f;
+	if ( mModelLoader )
+	{
+		mPreviewTarget = (mModelLoader->mExtents[0] + mModelLoader->mExtents[1]) * 0.5f;
+		mPreviewScale = (mModelLoader->mExtents[1] - mModelLoader->mExtents[0]) * 0.5f;
+	}
+
 	setPreviewTarget(mPreviewScale.magVec()*2.f);
 }
 
@@ -2832,11 +3170,6 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
 		return;
 	}
 
-	if (which_lod == LLModel::LOD_PHYSICS)
-	{ //clear physics mesh map
-		mPhysicsMesh.clear();
-	}
-
 	LLVertexBuffer::unbind();
 
 	stop_gloderror();
@@ -3165,11 +3498,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
 			//of an open problem).
 			target_model->mPosition = base->mPosition;
 			target_model->mSkinWeights = base->mSkinWeights;
-			target_model->mJointMap = base->mJointMap;
-			target_model->mJointList = base->mJointList;
-			target_model->mInvBindMatrix = base->mInvBindMatrix;
-			target_model->mBindShapeMatrix = base->mBindShapeMatrix;
-			target_model->mAlternateBindMatrix = base->mAlternateBindMatrix;
+			target_model->mSkinInfo = base->mSkinInfo;
 			//copy material list
 			target_model->mMaterialList = base->mMaterialList;
 
@@ -3362,7 +3691,7 @@ void LLModelPreview::updateStatusMessages()
 		}
 	}
 
-	bool errorStateFromLoader = getLoadState() == LLModelLoader::ERROR_PARSING ? true : false;
+	bool errorStateFromLoader = getLoadState() >= LLModelLoader::ERROR_PARSING ? true : false;
 
 	bool skinAndRigOk = true;
 	bool uploadingSkin = mFMP->childGetValue("upload_skin").asBoolean();
@@ -3389,7 +3718,7 @@ void LLModelPreview::updateStatusMessages()
 		LLModel* model = mModel[LLModel::LOD_PHYSICS][i];
 		S32 cur_submeshes = model->getNumVolumeFaces();
 
-		LLModel::convex_hull_decomposition& decomp = model->mConvexHullDecomp;
+		LLModel::convex_hull_decomposition& decomp = model->mPhysics.mHull;
 
 		if (!decomp.empty())
 		{
@@ -3968,9 +4297,9 @@ BOOL LLModelPreview::render()
 						glColor4fv(instance.mMaterial[i].mDiffuseColor.mV);
 						if (i < instance.mMaterial.size() && instance.mMaterial[i].mDiffuseMap.notNull())
 						{
-							gGL.getTexUnit(0)->bind(instance.mMaterial[i].mDiffuseMap, true);
 							if (instance.mMaterial[i].mDiffuseMap->getDiscardLevel() > -1)
 							{
+								gGL.getTexUnit(0)->bind(instance.mMaterial[i].mDiffuseMap, true);
 								mTextureSet.insert(instance.mMaterial[i].mDiffuseMap.get());
 							}
 						}
@@ -4026,12 +4355,17 @@ BOOL LLModelPreview::render()
 					{
 						LLMutexLock(decomp->mMutex);
 
-						std::map<LLPointer<LLModel>, std::vector<LLPointer<LLVertexBuffer> > >::iterator iter =
-							mPhysicsMesh.find(model);
-						if (iter != mPhysicsMesh.end())
+						LLModel::Decomposition& physics = model->mPhysics;
+
+						if (physics.mMesh.empty())
+						{ //build vertex buffer for physics mesh
+							gMeshRepo.buildPhysicsMesh(physics);
+						}
+							
+						if (!physics.mMesh.empty())
 						{ //render hull instead of mesh
 							render_mesh = false;
-							for (U32 i = 0; i < iter->second.size(); ++i)
+							for (U32 i = 0; i < physics.mMesh.size(); ++i)
 							{
 								if (explode > 0.f)
 								{
@@ -4050,14 +4384,8 @@ BOOL LLModelPreview::render()
 									hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 255));
 								}
 
-								LLVertexBuffer* buff = iter->second[i];
-								if (buff)
-								{
-									buff->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL);
-
 									glColor4ubv(hull_colors[i].mV);
-									buff->drawArrays(LLRender::TRIANGLES, 0, buff->getNumVerts());
-								}
+								LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);
 
 								if (explode > 0.f)
 								{
@@ -4141,12 +4469,12 @@ BOOL LLModelPreview::render()
 
 							//build matrix palette
 							LLMatrix4 mat[64];
-							for (U32 j = 0; j < model->mJointList.size(); ++j)
+							for (U32 j = 0; j < model->mSkinInfo.mJointNames.size(); ++j)
 							{
-								LLJoint* joint = avatar->getJoint(model->mJointList[j]);
+								LLJoint* joint = avatar->getJoint(model->mSkinInfo.mJointNames[j]);
 								if (joint)
 								{
-									mat[j] = model->mInvBindMatrix[j];
+									mat[j] = model->mSkinInfo.mInvBindMatrix[j];
 									mat[j] *= joint->getWorldMatrix();
 								}
 							}
@@ -4187,7 +4515,7 @@ BOOL LLModelPreview::render()
 								//VECTORIZE THIS
 								LLVector3 v(face.mPositions[j].getF32ptr());
 
-								v = v * model->mBindShapeMatrix;
+								v = v * model->mSkinInfo.mBindShapeMatrix;
 								v = v * final_mat;
 
 								position[j] = v;
@@ -4266,9 +4594,12 @@ void LLModelPreview::setPreviewLOD(S32 lod)
 		mFMP->childSetTextArg("lod_table_footer", "[DETAIL]", mFMP->getString(lod_name[mPreviewLOD]));
 		mFMP->childSetText("lod_file", mLODFile[mPreviewLOD]);
 
-		// the wizard has two lod drop downs
+		// the wizard has three lod drop downs
 		LLComboBox* combo_box2 = mFMP->getChild<LLComboBox>("preview_lod_combo2");
 		combo_box2->setCurrentByIndex((NUM_LOD-1)-mPreviewLOD); // combo box list of lods is in reverse order
+		
+		LLComboBox* combo_box3 = mFMP->getChild<LLComboBox>("preview_lod_combo3");
+		combo_box3->setCurrentByIndex((NUM_LOD-1)-mPreviewLOD); // combo box list of lods is in reverse order
 
 		LLColor4 highlight_color = LLUIColorTable::instance().getColor("MeshImportTableHighlightColor");
 		LLColor4 normal_color = LLUIColorTable::instance().getColor("MeshImportTableNormalColor");
@@ -4303,6 +4634,17 @@ void LLFloaterModelPreview::onBrowseLOD(void* data)
 	mp->loadModel(mp->mModelPreview->mPreviewLOD);
 }
 
+//static
+void LLFloaterModelPreview::onReset(void* user_data)
+{
+	assert_main_thread();
+
+	LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) user_data;
+	LLModelPreview* mp = fmp->mModelPreview;
+	std::string filename = mp->mLODFile[3]; 
+	mp->loadModel(filename,3);
+}
+
 //static
 void LLFloaterModelPreview::onUpload(void* user_data)
 {
@@ -4317,8 +4659,13 @@ void LLFloaterModelPreview::onUpload(void* user_data)
 	
 	mp->mModelPreview->rebuildUploadData();
 
+	bool upload_skinweights = mp->childGetValue("upload_skin").asBoolean();
+	bool upload_joint_positions = mp->childGetValue("upload_joints").asBoolean();
+
+	mp->mModelPreview->saveUploadData(upload_skinweights, upload_joint_positions);
+
 	gMeshRepo.uploadModel(mp->mModelPreview->mUploadData, mp->mModelPreview->mPreviewScale,
-						  mp->childGetValue("upload_textures").asBoolean(), mp->childGetValue("upload_skin"), mp->childGetValue("upload_joints"));
+						  mp->childGetValue("upload_textures").asBoolean(), upload_skinweights, upload_joint_positions);
 
 	mp->closeFloater(false);
 }
@@ -4429,7 +4776,6 @@ void LLFloaterModelPreview::DecompRequest::completed()
 			{
 				if (sInstance->mModelPreview)
 				{
-					sInstance->mModelPreview->mPhysicsMesh[mModel] = mHullMesh;
 					sInstance->mModelPreview->mDirty = true;
 					LLFloaterModelPreview::sInstance->mModelPreview->refresh();
 				}
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index 910a45f9fe5ac969a07a92afe89726229c568164..dc6a33d0ab4820e8df7bb35cd38293b9bdda8014 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -66,7 +66,7 @@ class LLModelLoader : public LLThread
 		GENERATING_VERTEX_BUFFERS,
 		GENERATING_LOD,
 		DONE,
-		ERROR_PARSING, //basically loading failed
+		ERROR_PARSING //basically loading failed
 	} eLoadState;
 
 	U32 mState;
@@ -76,6 +76,7 @@ class LLModelLoader : public LLThread
 	LLMatrix4 mTransform;
 	BOOL mFirstTransform;
 	LLVector3 mExtents[2];
+	bool mTrySLM;
 
 	std::map<daeElement*, LLPointer<LLModel> > mModel;
 	
@@ -97,6 +98,7 @@ class LLModelLoader : public LLThread
 
 	virtual void run();
 	bool doLoadModel();
+	bool loadFromSLM(const std::string& filename);
 	void loadModelCallback();
 
 	void loadTextures() ; //called in the main thread.
@@ -124,7 +126,6 @@ class LLModelLoader : public LLThread
 	//map of avatar joints as named in COLLADA assets to internal joint names
 	std::map<std::string, std::string> mJointMap;
 	std::deque<std::string> mMasterJointList;
-	bool mResetJoints;
 };
 
 class LLFloaterModelPreview : public LLFloater
@@ -161,6 +162,8 @@ class LLFloaterModelPreview : public LLFloater
 	
 	static void onBrowseLOD(void* data);
 	
+	static void onReset(void* data);
+
 	static void onUpload(void* data);
 	
 	static void onClearMaterials(void* data);
@@ -288,6 +291,8 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
 	void clearMaterials();
 	U32 calcResourceCost();
 	void rebuildUploadData();
+	void saveUploadData(bool save_skinweights, bool save_joint_poisitions);
+	void saveUploadData(const std::string& filename, bool save_skinweights, bool save_joint_poisitions);
 	void clearIncompatible(S32 lod);
 	void updateStatusMessages();
 	void clearGLODGroup();
@@ -306,6 +311,9 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
 	void setLoadState( U32 state ) { mLoadState = state; }
 	U32 getLoadState() { return mLoadState; }
 		
+	void setResetJointFlag( bool state ) { mResetJoints = state; }
+	bool getResetJointFlag( void ) { return mResetJoints; }
+
  protected:
 	friend class LLModelLoader;
 	friend class LLFloaterModelPreview;
@@ -332,7 +340,7 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
 	std::string mLODFile[LLModel::NUM_LODS];
 	bool		mLoading;
 	U32			mLoadState;
-
+	bool		mResetJoints;
 	std::map<std::string, bool> mViewOption;
 
 	//GLOD object parameters (must rebuild object if these change)
@@ -354,8 +362,7 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
 	U32 mGroup;
 	std::map<LLPointer<LLModel>, U32> mObject;
 	U32 mMaxTriangleLimit;
-	std::map<LLPointer<LLModel>, std::vector<LLPointer<LLVertexBuffer> > > mPhysicsMesh;
-
+	
 	LLMeshUploadThread::instance_list mUploadData;
 	std::set<LLViewerFetchedTexture* > mTextureSet;
 
diff --git a/indra/newview/llfloatermodelwizard.cpp b/indra/newview/llfloatermodelwizard.cpp
index eafea1fe03cf7019f1ab5586de075a008cda0dda..faf81dbc5c3cef62fb519439de92b04c2c101c41 100644
--- a/indra/newview/llfloatermodelwizard.cpp
+++ b/indra/newview/llfloatermodelwizard.cpp
@@ -46,6 +46,7 @@ static	const std::string stateNames[]={
 	"choose_file",
 	"optimize",
 	"physics",
+	"physics2",
 	"review",
 	"upload"};
 
@@ -58,6 +59,7 @@ LLFloaterModelWizard::LLFloaterModelWizard(const LLSD& key)
 	mCommitCallbackRegistrar.add("Wizard.Choose", boost::bind(&LLFloaterModelWizard::setState, this, CHOOSE_FILE));
 	mCommitCallbackRegistrar.add("Wizard.Optimize", boost::bind(&LLFloaterModelWizard::setState, this, OPTIMIZE));
 	mCommitCallbackRegistrar.add("Wizard.Physics", boost::bind(&LLFloaterModelWizard::setState, this, PHYSICS));
+	mCommitCallbackRegistrar.add("Wizard.Physics2", boost::bind(&LLFloaterModelWizard::setState, this, PHYSICS2));
 	mCommitCallbackRegistrar.add("Wizard.Review", boost::bind(&LLFloaterModelWizard::setState, this, REVIEW));
 	mCommitCallbackRegistrar.add("Wizard.Upload", boost::bind(&LLFloaterModelWizard::setState, this, UPLOAD));
 }
@@ -125,15 +127,29 @@ void LLFloaterModelWizard::setState(int state)
 		getChildView("cancel")->setVisible(true);
 	}
 
-	if (state == REVIEW)
+	if (state == PHYSICS2)
 	{
 		if (mLastEnabledState < state)
 		{
 			executePhysicsStage("Decompose");
 		}
-		
+
 		mModelPreview->mViewOption["show_physics"] = true;
 
+		getChildView("next")->setVisible(true);
+		getChildView("next")->setEnabled(true);
+		getChildView("upload")->setVisible(false);
+		getChildView("close")->setVisible(false);
+		getChildView("back")->setVisible(true);
+		getChildView("back")->setEnabled(true);
+		getChildView("cancel")->setVisible(true);
+	}
+
+	if (state == REVIEW)
+	{
+		
+		mModelPreview->mViewOption["show_physics"] = false;
+
 		getChildView("close")->setVisible(false);
 		getChildView("next")->setVisible(false);
 		getChildView("back")->setVisible(true);
@@ -182,6 +198,18 @@ void LLFloaterModelWizard::updateButtons()
 			button->setEnabled(FALSE);
 		}
 	}
+
+	LLButton *physics_button = getChild<LLButton>(stateNames[PHYSICS]+"_btn");
+	
+	if (mState == PHYSICS2)
+	{
+		physics_button->setVisible(false);
+	}
+	else
+	{
+		physics_button->setVisible(true);
+	}
+
 }
 
 void LLFloaterModelWizard::loadModel()
@@ -457,7 +485,6 @@ void LLFloaterModelWizard::DecompRequest::completed()
 	{
 		if (sInstance->mModelPreview)
 		{
-			sInstance->mModelPreview->mPhysicsMesh[mModel] = mHullMesh;
 			sInstance->mModelPreview->mDirty = true;
 			LLFloaterModelWizard::sInstance->mModelPreview->refresh();
 		}
@@ -486,6 +513,7 @@ BOOL LLFloaterModelWizard::postBuild()
 	getChild<LLUICtrl>("next")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickNext, this));
 	getChild<LLUICtrl>("preview_lod_combo")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onPreviewLODCommit, this, _1));
 	getChild<LLUICtrl>("preview_lod_combo2")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onPreviewLODCommit, this, _1));
+	getChild<LLUICtrl>("preview_lod_combo3")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onPreviewLODCommit, this, _1));
 	getChild<LLUICtrl>("accuracy_slider")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onAccuracyPerformance, this, _2));
 	getChild<LLUICtrl>("upload")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onUpload, this));
 	getChild<LLUICtrl>("physics_slider")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onPhysicsChanged, this));
@@ -502,6 +530,7 @@ BOOL LLFloaterModelWizard::postBuild()
 	mModelPreview->setPreviewTarget(16.f);
 	mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelWizard::setDetails, this, _1, _2, _3, _4, _5));
 	mModelPreview->setModelLoadedCallback(boost::bind(&LLFloaterModelWizard::modelLoadedCallback, this));
+	mModelPreview->mViewOption["show_textures"] = true;
 
 	center();
 
@@ -552,7 +581,7 @@ void LLFloaterModelWizard::onUpload()
 	mModelPreview->rebuildUploadData();
 	
 	gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale, 
-						  childGetValue("upload_textures").asBoolean(), childGetValue("upload_skin"), childGetValue("upload_joints"));
+						  true, false, false);
 	
 	setState(UPLOAD);
 	
diff --git a/indra/newview/llfloatermodelwizard.h b/indra/newview/llfloatermodelwizard.h
index 50e4ab1a96ae48cf29b0a2f3766b8986db282cac..b166d262957cda56ea19b470ccef545516e5fbd1 100644
--- a/indra/newview/llfloatermodelwizard.h
+++ b/indra/newview/llfloatermodelwizard.h
@@ -80,6 +80,7 @@ class LLFloaterModelWizard : public LLFloater
 		CHOOSE_FILE = 0,
 		OPTIMIZE,
 		PHYSICS,
+		PHYSICS2,
 		REVIEW,
 		UPLOAD
 	};
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index a90bacf41dab86da3492c9ac24f208bccc8a3ca0..5172370890585de4bd2bc33513df994e49ea437f 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -1046,11 +1046,13 @@ void LLFloaterPreference::refreshEnabledState()
 	ctrl_deferred->setEnabled(enabled);
 	
 	LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
+	LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
 	LLComboBox* ctrl_shadow = getChild<LLComboBox>("ShadowDetail");
 
 	enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO") && (ctrl_deferred->get() ? TRUE : FALSE);
 		
 	ctrl_ssao->setEnabled(enabled);
+	ctrl_dof->setEnabled(enabled);
 
 	enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail");
 
@@ -1074,6 +1076,7 @@ void LLFloaterPreference::disableUnavailableSettings()
 	LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders");
 	LLComboBox* ctrl_shadows = getChild<LLComboBox>("ShadowDetail");
 	LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
+	LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
 
 	// if vertex shaders off, disable all shader related products
 	if(!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable"))
@@ -1099,6 +1102,9 @@ void LLFloaterPreference::disableUnavailableSettings()
 		ctrl_ssao->setEnabled(FALSE);
 		ctrl_ssao->setValue(FALSE);
 
+		ctrl_dof->setEnabled(FALSE);
+		ctrl_dof->setValue(FALSE);
+
 		ctrl_deferred->setEnabled(FALSE);
 		ctrl_deferred->setValue(FALSE);
 	}
@@ -1116,6 +1122,9 @@ void LLFloaterPreference::disableUnavailableSettings()
 		ctrl_ssao->setEnabled(FALSE);
 		ctrl_ssao->setValue(FALSE);
 
+		ctrl_dof->setEnabled(FALSE);
+		ctrl_dof->setValue(FALSE);
+
 		ctrl_deferred->setEnabled(FALSE);
 		ctrl_deferred->setValue(FALSE);
 	}
@@ -1130,6 +1139,9 @@ void LLFloaterPreference::disableUnavailableSettings()
 		ctrl_ssao->setEnabled(FALSE);
 		ctrl_ssao->setValue(FALSE);
 
+		ctrl_dof->setEnabled(FALSE);
+		ctrl_dof->setValue(FALSE);
+
 		ctrl_deferred->setEnabled(FALSE);
 		ctrl_deferred->setValue(FALSE);
 	}
@@ -1171,6 +1183,9 @@ void LLFloaterPreference::disableUnavailableSettings()
 		ctrl_ssao->setEnabled(FALSE);
 		ctrl_ssao->setValue(FALSE);
 
+		ctrl_dof->setEnabled(FALSE);
+		ctrl_dof->setValue(FALSE);
+
 		ctrl_deferred->setEnabled(FALSE);
 		ctrl_deferred->setValue(FALSE);
 	}
diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp
index ada0dcf5691f008529761f3ae567e8ce0fe5b257..c7fab2573f29dfffaa97471fbad3059ec4b18e93 100644
--- a/indra/newview/llfloaterregiondebugconsole.cpp
+++ b/indra/newview/llfloaterregiondebugconsole.cpp
@@ -58,8 +58,6 @@ namespace
 {
 	// Signal used to notify the floater of responses from the asynchronous
 	// API.
-	typedef boost::signals2::signal<
-		void (const std::string& output)> console_reply_signal_t;
 	console_reply_signal_t sConsoleReplySignal;
 
 	const std::string PROMPT("\n\n> ");
@@ -132,6 +130,11 @@ namespace
 	};
 }
 
+boost::signals2::connection LLFloaterRegionDebugConsole::setConsoleReplyCallback(const console_reply_signal_t::slot_type& cb)
+{
+	return sConsoleReplySignal.connect(cb);
+}
+
 LLFloaterRegionDebugConsole::LLFloaterRegionDebugConsole(LLSD const & key)
 : LLFloater(key), mOutput(NULL)
 {
diff --git a/indra/newview/llfloaterregiondebugconsole.h b/indra/newview/llfloaterregiondebugconsole.h
index 3aa525724efd36b89597a63263e246b1750bbaa6..fd3af4152e94873d083257bf58a31b6de7e1893a 100644
--- a/indra/newview/llfloaterregiondebugconsole.h
+++ b/indra/newview/llfloaterregiondebugconsole.h
@@ -35,6 +35,9 @@
 
 class LLTextEditor;
 
+typedef boost::signals2::signal<
+	void (const std::string& output)> console_reply_signal_t;
+
 class LLFloaterRegionDebugConsole : public LLFloater, public LLHTTPClient::Responder
 {
 public:
@@ -48,6 +51,8 @@ class LLFloaterRegionDebugConsole : public LLFloater, public LLHTTPClient::Respo
 
 	LLTextEditor * mOutput;
 
+	static boost::signals2::connection setConsoleReplyCallback(const console_reply_signal_t::slot_type& cb);
+
  private:
 	void onReplyReceived(const std::string& output);
 
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 7792b3fb40932cac3553781e9f96856843fb90c1..34fda493754dda653f2fa98e4dbed3c6374d2e0c 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -53,6 +53,7 @@
 #include "llfloatertopobjects.h" // added to fix SL-32336
 #include "llfloatergroups.h"
 #include "llfloaterreg.h"
+#include "llfloaterregiondebugconsole.h"
 #include "llfloatertelehub.h"
 #include "llfloaterwindlight.h"
 #include "llinventorymodel.h"
@@ -159,9 +160,30 @@ bool estate_dispatch_initialized = false;
 //S32 LLFloaterRegionInfo::sRequestSerial = 0;
 LLUUID LLFloaterRegionInfo::sRequestInvoice;
 
+
+void LLFloaterRegionInfo::onConsoleReplyReceived(const std::string& output)
+{
+	llwarns << "here is what they're giving us:  " << output << llendl;
+
+	if (output.find("FALSE") != std::string::npos)
+	{
+		getChild<LLUICtrl>("mesh_rez_enabled_check")->setValue(FALSE);
+	}
+	else
+	{
+		getChild<LLUICtrl>("mesh_rez_enabled_check")->setValue(TRUE);
+	}
+}
+
+
 LLFloaterRegionInfo::LLFloaterRegionInfo(const LLSD& seed)
 	: LLFloater(seed)
 {
+	mConsoleReplySignalConnection = LLFloaterRegionDebugConsole::setConsoleReplyCallback(
+	boost::bind(
+		&LLFloaterRegionInfo::onConsoleReplyReceived,
+		this,
+		_1));
 }
 
 BOOL LLFloaterRegionInfo::postBuild()
@@ -211,12 +233,14 @@ BOOL LLFloaterRegionInfo::postBuild()
 
 LLFloaterRegionInfo::~LLFloaterRegionInfo()
 {
+	mConsoleReplySignalConnection.disconnect();
 }
 
 void LLFloaterRegionInfo::onOpen(const LLSD& key)
 {
 	refreshFromRegion(gAgent.getRegion());
 	requestRegionInfo();
+	requestMeshRezInfo();
 }
 
 // static
@@ -584,6 +608,7 @@ BOOL LLPanelRegionGeneralInfo::postBuild()
 	initCtrl("access_combo");
 	initCtrl("restrict_pushobject");
 	initCtrl("block_parcel_search_check");
+	initCtrl("mesh_rez_enabled_check");
 
 	childSetAction("kick_btn", boost::bind(&LLPanelRegionGeneralInfo::onClickKick, this));
 	childSetAction("kick_all_btn", onClickKickAll, this);
@@ -691,7 +716,42 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L
 	return false;
 }
 
+class ConsoleRequestResponder : public LLHTTPClient::Responder
+{
+public:
+	/*virtual*/
+	void error(U32 status, const std::string& reason)
+	{
+		llwarns << "requesting mesh_rez_enabled failed" << llendl;
+	}
+};
+
+
+// called if this request times out.
+class ConsoleUpdateResponder : public LLHTTPClient::Responder
+{
+public:
+	/* virtual */
+	void error(U32 status, const std::string& reason)
+	{
+		llwarns << "Updating mesh enabled region setting failed" << llendl;
+	}
+};
+
+void LLFloaterRegionInfo::requestMeshRezInfo()
+{
+	std::string sim_console_url = gAgent.getRegion()->getCapability("SimConsoleAsync");
 
+	if (!sim_console_url.empty())
+	{
+		std::string request_str = "get mesh_rez_enabled";
+		
+		LLHTTPClient::post(
+			sim_console_url,
+			LLSD(request_str),
+			new ConsoleRequestResponder);
+	}
+}
 
 // setregioninfo
 // strings[0] = 'Y' - block terraform, 'N' - not
@@ -764,6 +824,27 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()
 		sendEstateOwnerMessage(gMessageSystem, "setregioninfo", invoice, strings);
 	}
 
+	std::string sim_console_url = gAgent.getRegion()->getCapability("SimConsoleAsync");
+
+	if (!sim_console_url.empty())
+	{
+		std::string update_str = "set mesh_rez_enabled ";
+		if (getChild<LLUICtrl>("mesh_rez_enabled_check")->getValue().asBoolean())
+		{
+			update_str += "true";
+		}
+		else
+		{
+			update_str += "false";
+		}
+
+		LLHTTPClient::post(
+			sim_console_url,
+			LLSD(update_str),
+			new ConsoleUpdateResponder);
+	}
+
+
 	// if we changed access levels, tell user about it
 	LLViewerRegion* region = gAgent.getRegion();
 	if (region && (getChild<LLUICtrl>("access_combo")->getValue().asInteger() != region->getSimAccess()) )
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index c0758fa92d31efb39f990872eb54f6283eee4a4a..2b87c27fcf378ce52e0053e775d85258f19d5360 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -84,11 +84,16 @@ class LLFloaterRegionInfo : public LLFloater
 	virtual void refresh();
 	
 	void requestRegionInfo();
+	void requestMeshRezInfo();
 
 private:
 	
 	LLFloaterRegionInfo(const LLSD& seed);
 	~LLFloaterRegionInfo();
+
+	void onConsoleReplyReceived(const std::string& output);
+
+	boost::signals2::connection mConsoleReplySignalConnection;;
 	
 protected:
 	void refreshFromRegion(LLViewerRegion* region);
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 257970aaaf7d700b38d1687bc7d4f887a8a8cec5..73c1f99fa04df5f167f70e598e2440589fd596a8 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -787,7 +787,9 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
 		getChildView("Strength:")->setVisible( land_visible);
 	}
 
-	bool show_mesh_cost = !gAgent.getRegion()->getCapability("GetMesh").empty() && gSavedSettings.getBOOL("MeshEnabled");
+	bool show_mesh_cost = gAgent.getRegion() && 
+		                  !gAgent.getRegion()->getCapability("GetMesh").empty() && 
+						  gSavedSettings.getBOOL("MeshEnabled");
 
 	getChildView("obj_count")->setVisible( !land_visible && !show_mesh_cost);
 	getChildView("prim_count")->setVisible( !land_visible && !show_mesh_cost);
diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index 2aaf403d5f76348bcf4fcf37af4a2013c14e4a66..19f6038b56b6f434bd0d33765d0ada3ed7955e83 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -185,7 +185,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
 			have_extended_data = true;
 			msg->getU32("DataExtended", "TimeStamp", time_stamp, block);
 			msg->getF32("DataExtended", "MonoScore", mono_score, block);
-			msg->getS32(_PREHASH_ReportData,"PublicURLs",public_urls,block);
+			msg->getS32("DataExtended", "PublicURLs", public_urls, block);
 		}
 
 		LLSD element;
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index 11b3379814a52d3de44e343675abd7196417e5e9..0d8601410a1413677a645d24a3143315722f41d0 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -1037,18 +1037,29 @@ void LLFloaterUIPreview::onClickEditFloater()
 			cmd_override = bin + " " + args;
 		}
 	}
-	if (!mExternalEditor.setCommand("LL_XUI_EDITOR", cmd_override))
+
+	LLExternalEditor::EErrorCode status = mExternalEditor.setCommand("LL_XUI_EDITOR", cmd_override);
+	if (status != LLExternalEditor::EC_SUCCESS)
 	{
-		std::string warning = "Select an editor by setting the environment variable LL_XUI_EDITOR "
-			"or the ExternalEditor setting or specifying its path in the \"Editor Path\" field.";
+		std::string warning;
+
+		if (status == LLExternalEditor::EC_NOT_SPECIFIED) // Use custom message for this error.
+		{
+			warning = getString("ExternalEditorNotSet");
+		}
+		else
+		{
+			warning = LLExternalEditor::getErrorMessage(status);
+		}
+
 		popupAndPrintWarning(warning);
 		return;
 	}
 
 	// Run the editor.
-	if (!mExternalEditor.run(file_path))
+	if (mExternalEditor.run(file_path) != LLExternalEditor::EC_SUCCESS)
 	{
-		popupAndPrintWarning("Failed to run editor");
+		popupAndPrintWarning(LLExternalEditor::getErrorMessage(status));
 		return;
 	}
 }
diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index 70e789f490992adbae3e74f603cb7ffa46cc5248..11401d6c68b82761ea85ca8030dcdfe633e3fb07 100644
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -95,6 +95,36 @@ const LLUUID& get_folder_uuid(const LLUUID& parentFolderUUID, LLInventoryCollect
 	return (cats_count >= 1) ? cats.get(0)->getUUID() : LLUUID::null;
 }
 
+/**
+ * Class LLFindAgentCallingCard
+ *
+ * An inventory collector functor for checking that agent's own calling card
+ * exists within the Calling Cards category and its sub-folders.
+ */
+class LLFindAgentCallingCard : public LLInventoryCollectFunctor
+{
+public:
+	LLFindAgentCallingCard() : mIsAgentCallingCardFound(false) {}
+	virtual ~LLFindAgentCallingCard() {}
+	virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
+	bool isAgentCallingCardFound() { return mIsAgentCallingCardFound; }
+
+private:
+	bool mIsAgentCallingCardFound;
+};
+
+bool LLFindAgentCallingCard::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+	if (mIsAgentCallingCardFound) return true;
+
+	if (item && item->getType() == LLAssetType::AT_CALLINGCARD && item->getCreatorUUID() == gAgentID)
+	{
+		mIsAgentCallingCardFound = true;
+	}
+
+	return mIsAgentCallingCardFound;
+}
+
 /**
  * Class for fetching initial friend cards data
  *
@@ -449,32 +479,22 @@ void LLFriendCardsManager::syncFriendsFolder()
 	LLAvatarTracker::instance().copyBuddyList(all_buddies);
 
 	// 1. Check if own calling card exists
+	const LLUUID calling_cards_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
+
 	LLInventoryModel::cat_array_t cats;
 	LLInventoryModel::item_array_t items;
-
-	LLUUID friends_all_folder_id = findFriendAllSubfolderUUIDImpl();
-	gInventory.collectDescendents(friends_all_folder_id, cats, items, LLInventoryModel::EXCLUDE_TRASH);
-
-	bool own_callingcard_found = false;
-	LLInventoryModel::item_array_t::const_iterator it;
-	for (it = items.begin(); it != items.end(); ++it)
-	{
-		if ((*it)->getCreatorUUID() == gAgentID)
-		{
-			own_callingcard_found = true;
-			break;
-		}
-	}
+	LLFindAgentCallingCard collector;
+	gInventory.collectDescendentsIf(calling_cards_folder_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, collector);
 
 	// Create own calling card if it was not found in Friends/All folder
-	if (!own_callingcard_found)
+	if (!collector.isAgentCallingCardFound())
 	{
 		LLAvatarName av_name;
 		LLAvatarNameCache::get( gAgentID, &av_name );
 
 		create_inventory_item(gAgentID,
 							  gAgent.getSessionID(),
-							  friends_all_folder_id,
+							  calling_cards_folder_id,
 							  LLTransactionID::tnull,
 							  av_name.getCompleteName(),
 							  gAgentID.asString(),
diff --git a/indra/newview/llhudeffectblob.cpp b/indra/newview/llhudeffectblob.cpp
index 26e8251899a56de46ffcb1f59315dadd297b06b6..d8687eed8db022ba8267a0863b73c231d1d1b0db 100644
--- a/indra/newview/llhudeffectblob.cpp
+++ b/indra/newview/llhudeffectblob.cpp
@@ -30,13 +30,14 @@
 
 #include "llagent.h"
 #include "llviewercamera.h"
-#include "llrendersphere.h"
+#include "llui.h"
 
 LLHUDEffectBlob::LLHUDEffectBlob(const U8 type) 
 :	LLHUDEffect(type), 
 	mPixelSize(10)
 {
 	mTimer.start();
+	mImage = LLUI::getUIImage("Camera_Drag_Dot");
 }
 
 LLHUDEffectBlob::~LLHUDEffectBlob()
@@ -58,18 +59,29 @@ void LLHUDEffectBlob::render()
 	LLViewerCamera::instance().getPixelVectors(pos_agent, pixel_up, pixel_right);
 
 	LLGLSPipelineAlpha gls_pipeline_alpha;
-	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+	gGL.getTexUnit(0)->bind(mImage->getImage());
 
 	LLColor4U color = mColor;
 	color.mV[VALPHA] = (U8)clamp_rescale(time, 0.f, mDuration, 255.f, 0.f);
-	glColor4ubv(color.mV);
+	gGL.color4ubv(color.mV);
 
-	glPushMatrix();
-	glTranslatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
-	F32 scale = pixel_up.magVec() * (F32)mPixelSize;
-	glScalef(scale, scale, scale);
-	gSphere.render(0);
-	glPopMatrix();
+	{ gGL.pushMatrix();
+		gGL.translatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
+		LLVector3 u_scale = pixel_right * (F32)mPixelSize;
+		LLVector3 v_scale = pixel_up * (F32)mPixelSize;
+		
+		{ gGL.begin(LLRender::QUADS);
+			gGL.texCoord2f(0.f, 1.f);
+			gGL.vertex3fv((v_scale - u_scale).mV);
+			gGL.texCoord2f(0.f, 0.f);
+			gGL.vertex3fv((-v_scale - u_scale).mV);
+			gGL.texCoord2f(1.f, 0.f);
+			gGL.vertex3fv((-v_scale + u_scale).mV);
+			gGL.texCoord2f(1.f, 1.f);
+			gGL.vertex3fv((v_scale + u_scale).mV);
+		} gGL.end();
+
+	} gGL.popMatrix();
 }
 
 void LLHUDEffectBlob::renderForTimer()
diff --git a/indra/newview/llhudeffectblob.h b/indra/newview/llhudeffectblob.h
index 5b0703cdaade6b8678cc0cf0581b3267c3b7d0c5..f4c1691108fded588d05c7c4335f275f0b28e32d 100644
--- a/indra/newview/llhudeffectblob.h
+++ b/indra/newview/llhudeffectblob.h
@@ -28,6 +28,7 @@
 #define LL_LLHUDEFFECTBLOB_H
 
 #include "llhudeffect.h"
+#include "lluiimage.h"
 
 class LLHUDEffectBlob : public LLHUDEffect
 {
@@ -45,6 +46,7 @@ class LLHUDEffectBlob : public LLHUDEffect
 private:
 	S32				mPixelSize;
 	LLFrameTimer	mTimer;
+	LLPointer<LLUIImage> mImage;
 };
 
 #endif // LL_LLHUDEFFECTBLOB_H
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 53835f0166ebed6a4cb51644243d84661d3f8527..4cf2e723ec6df3088ccbcc0bd737c98f6f1a81a6 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -631,6 +631,12 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
 		return mask;
 	}
 
+	// We're hiding mesh types
+	if (item->getType() == LLAssetType::AT_MESH)
+	{
+		return mask;
+	}
+
 	LLViewerInventoryItem* old_item = getItem(item->getUUID());
 	LLPointer<LLViewerInventoryItem> new_item;
 	if(old_item)
@@ -1272,6 +1278,12 @@ void LLInventoryModel::addCategory(LLViewerInventoryCategory* category)
 	//llinfos << "LLInventoryModel::addCategory()" << llendl;
 	if(category)
 	{
+		// We aren't displaying the Meshes folder
+		if (category->mPreferredType == LLFolderType::FT_MESH)
+		{
+			return;
+		}
+
 		// try to localize default names first. See EXT-8319, EXT-7051.
 		category->localizeName();
 
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 93e773d33bdf4e2703fbd00772240a27cde4b5da..e20e918a2a70f95bbb61dd5bea211e09296003bc 100755
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -28,7 +28,7 @@
 
 #include "apr_pools.h"
 #include "apr_dso.h"
-
+#include "llhttpstatuscodes.h"
 #include "llmeshrepository.h"
 
 #include "llagent.h"
@@ -108,19 +108,13 @@ U32 get_volume_memory_size(const LLVolume* volume)
 	return indices*2+vertices*11+sizeof(LLVolume)+sizeof(LLVolumeFace)*volume->getNumVolumeFaces();
 }
 
-LLVertexBuffer* get_vertex_buffer_from_mesh(LLCDMeshData& mesh, F32 scale = 1.f)
+void get_vertex_buffer_from_mesh(LLCDMeshData& mesh, LLModel::PhysicsMesh& res, F32 scale = 1.f)
 {
-	LLVertexBuffer* buff = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL, 0);
-	buff->allocateBuffer(mesh.mNumTriangles*3, 0, true);
-
-	LLStrider<LLVector3> pos;
-	LLStrider<LLVector3> norm;
+	res.mPositions.clear();
+	res.mNormals.clear();
 	
-	buff->getVertexStrider(pos);
-	buff->getNormalStrider(norm);
-
 	const F32* v = mesh.mVertexBase;
-	
+
 	if (mesh.mIndexType == LLCDMeshData::INT_16)
 	{
 		U16* idx = (U16*) mesh.mIndexBase;
@@ -139,13 +133,13 @@ LLVertexBuffer* get_vertex_buffer_from_mesh(LLCDMeshData& mesh, F32 scale = 1.f)
 			LLVector3 n = (v1-v0)%(v2-v0);
 			n.normalize();
 
-			*pos++ = v0*scale;
-			*pos++ = v1*scale;
-			*pos++ = v2*scale;
+			res.mPositions.push_back(v0*scale);
+			res.mPositions.push_back(v1*scale);
+			res.mPositions.push_back(v2*scale);
 
-			*norm++ = n;
-			*norm++ = n;
-			*norm++ = n;			
+			res.mNormals.push_back(n);
+			res.mNormals.push_back(n);
+			res.mNormals.push_back(n);			
 		}
 	}
 	else
@@ -166,17 +160,15 @@ LLVertexBuffer* get_vertex_buffer_from_mesh(LLCDMeshData& mesh, F32 scale = 1.f)
 			LLVector3 n = (v1-v0)%(v2-v0);
 			n.normalize();
 
-			*(pos++) = v0*scale;
-			*(pos++) = v1*scale;
-			*(pos++) = v2*scale;
+			res.mPositions.push_back(v0*scale);
+			res.mPositions.push_back(v1*scale);
+			res.mPositions.push_back(v2*scale);
 
-			*(norm++) = n;
-			*(norm++) = n;
-			*(norm++) = n;			
+			res.mNormals.push_back(n);
+			res.mNormals.push_back(n);
+			res.mNormals.push_back(n);			
 		}
 	}
-
-	return buff;
 }
 
 S32 LLMeshRepoThread::sActiveHeaderRequests = 0;
@@ -291,17 +283,21 @@ class LLMeshCostResponder : public LLCurl::Responder
 		}
 		else
 		{
-			llwarns << status << ": " << reason << llendl;
-			llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
+			llwarns << status << ": " << reason << llendl;			
 			
-			if (status == 499)
+			if (status == HTTP_INTERNAL_ERROR)
 			{
+				llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
 				mThread->uploadModel(mData);
 			}
-			else if (status == 400)
+			else if (status == HTTP_BAD_REQUEST)
 			{
 				llwarns << "Status 400 received from server, giving up." << llendl;
 			}
+			else if (status == HTTP_NOT_FOUND)
+			{
+				llwarns <<"Status 404 received, server is disconnected, giving up." << llendl ;
+			}
 			else
 			{
 				llerrs << "Unhandled status " << status << llendl;
@@ -1107,66 +1103,9 @@ bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 dat
 	}
 	
 	{
-		LLMeshSkinInfo info;
+		LLMeshSkinInfo info(skin);
 		info.mMeshID = mesh_id;
 
-		if (skin.has("joint_names"))
-		{
-			for (U32 i = 0; i < skin["joint_names"].size(); ++i)
-			{
-				info.mJointNames.push_back(skin["joint_names"][i]);
-			}
-		}
-
-		if (skin.has("inverse_bind_matrix"))
-		{
-			for (U32 i = 0; i < skin["inverse_bind_matrix"].size(); ++i)
-			{
-				LLMatrix4 mat;
-				for (U32 j = 0; j < 4; j++)
-				{
-					for (U32 k = 0; k < 4; k++)
-					{
-						mat.mMatrix[j][k] = skin["inverse_bind_matrix"][i][j*4+k].asReal();
-					}
-				}
-
-				info.mInvBindMatrix.push_back(mat);
-			}
-		}
-
-		if (skin.has("bind_shape_matrix"))
-		{
-			for (U32 j = 0; j < 4; j++)
-			{
-				for (U32 k = 0; k < 4; k++)
-				{
-					info.mBindShapeMatrix.mMatrix[j][k] = skin["bind_shape_matrix"][j*4+k].asReal();
-				}
-			}
-		}
-
-		if (skin.has("alt_inverse_bind_matrix"))
-		{
-			for (U32 i = 0; i < skin["alt_inverse_bind_matrix"].size(); ++i)
-			{
-				LLMatrix4 mat;
-				for (U32 j = 0; j < 4; j++)
-				{
-					for (U32 k = 0; k < 4; k++)
-					{
-						mat.mMatrix[j][k] = skin["alt_inverse_bind_matrix"][i][j*4+k].asReal();
-					}
-				}
-				
-				info.mAlternateBindMatrix.push_back(mat);
-			}
-		}
-
-		if (skin.has("pelvis_offset"))
-		{
-			info.mPelvisOffset = skin["pelvis_offset"].asReal();
-		}
 		//llinfos<<"info pelvis offset"<<info.mPelvisOffset<<llendl;
 		mSkinInfoQ.push(info);
 	}
@@ -1179,7 +1118,7 @@ bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S3
 	LLSD decomp;
 
 	if (data_size > 0)
-	{
+	{ 
 		std::string res_str((char*) data, data_size);
 
 		std::istringstream stream(res_str);
@@ -1192,119 +1131,8 @@ bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S3
 	}
 	
 	{
-		LLMeshDecomposition* d = new LLMeshDecomposition();
+		LLModel::Decomposition* d = new LLModel::Decomposition(decomp);
 		d->mMeshID = mesh_id;
-
-		if (decomp.has("HullList"))
-		{
-			// updated for const-correctness. gcc is picky about this type of thing - Nyx
-			const LLSD::Binary& hulls = decomp["HullList"].asBinary();
-			const LLSD::Binary& position = decomp["Position"].asBinary();
-
-			U16* p = (U16*) &position[0];
-
-			d->mHull.resize(hulls.size());
-
-			LLVector3 min;
-			LLVector3 max;
-			LLVector3 range;
-
-			min.setValue(decomp["Min"]);
-			max.setValue(decomp["Max"]);
-			range = max-min;
-
-			for (U32 i = 0; i < hulls.size(); ++i)
-			{
-				U16 count = (hulls[i] == 0) ? 256 : hulls[i];
-				
-				for (U32 j = 0; j < count; ++j)
-				{
-					d->mHull[i].push_back(LLVector3(
-						(F32) p[0]/65535.f*range.mV[0]+min.mV[0],
-						(F32) p[1]/65535.f*range.mV[1]+min.mV[1],
-						(F32) p[2]/65535.f*range.mV[2]+min.mV[2]));
-					p += 3;
-				}		 
-
-			}
-				
-			//get mesh for decomposition
-			for (U32 i = 0; i < d->mHull.size(); ++i)
-			{
-				LLCDHull hull;
-				hull.mNumVertices = d->mHull[i].size();
-				hull.mVertexBase = d->mHull[i][0].mV;
-				hull.mVertexStrideBytes = 12;
-
-				LLCDMeshData mesh;
-				LLCDResult res = LLCD_OK;
-				if (LLConvexDecomposition::getInstance() != NULL)
-				{
-					res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
-				}
-				if (res != LLCD_OK)
-				{
-					llwarns << "could not get mesh from hull from convex decomposition lib." << llendl;
-					return false;
-				}
-
-
-				d->mMesh.push_back(get_vertex_buffer_from_mesh(mesh));
-			}	
-		}
-
-		if (decomp.has("Hull"))
-		{
-			const LLSD::Binary& position = decomp["Hull"].asBinary();
-
-			U16* p = (U16*) &position[0];
-
-			LLVector3 min;
-			LLVector3 max;
-			LLVector3 range;
-
-			min.setValue(decomp["Min"]);
-			max.setValue(decomp["Max"]);
-			range = max-min;
-
-			U16 count = position.size()/6;
-			
-			for (U32 j = 0; j < count; ++j)
-			{
-				d->mBaseHull.push_back(LLVector3(
-					(F32) p[0]/65535.f*range.mV[0]+min.mV[0],
-					(F32) p[1]/65535.f*range.mV[1]+min.mV[1],
-					(F32) p[2]/65535.f*range.mV[2]+min.mV[2]));
-				p += 3;
-			}		 
-				
-			//get mesh for decomposition
-			LLCDHull hull;
-			hull.mNumVertices = d->mBaseHull.size();
-			hull.mVertexBase = d->mBaseHull[0].mV;
-			hull.mVertexStrideBytes = 12;
-
-			LLCDMeshData mesh;
-			LLCDResult res = LLCD_OK;
-			if (LLConvexDecomposition::getInstance() != NULL)
-			{
-				res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
-			}
-			if (res != LLCD_OK)
-			{
-				llwarns << "could not get mesh from hull from convex decomposition lib." << llendl;
-				return false;
-			}
-
-			d->mBaseHullMesh = get_vertex_buffer_from_mesh(mesh);
-		}
-		else
-		{
-			//empty vertex buffer to indicate decomposition has been fetched
-			//but contains no base hull
-			d->mBaseHullMesh = new LLVertexBuffer(0, 0);
-		}
-
 		mDecompositionQ.push(d);
 	}
 
@@ -1315,12 +1143,12 @@ bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32
 {
 	LLSD physics_shape;
 
-	LLMeshDecomposition* d = new LLMeshDecomposition();
+	LLModel::Decomposition* d = new LLModel::Decomposition();
 	d->mMeshID = mesh_id;
 
 	if (data == NULL)
 	{ //no data, no physics shape exists
-		d->mPhysicsShapeMesh = new LLVertexBuffer(0,0);
+		d->mPhysicsShapeMesh.clear();
 	}
 	else
 	{
@@ -1344,33 +1172,22 @@ bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32
 				index_count += face.mNumIndices;
 			}
 
-			d->mPhysicsShapeMesh = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX, 0);
-
-			d->mPhysicsShapeMesh->allocateBuffer(vertex_count, index_count, true);
+			d->mPhysicsShapeMesh.clear();
 
-			LLStrider<LLVector3> pos;
-			LLStrider<U16> idx;
+			std::vector<LLVector3>& pos = d->mPhysicsShapeMesh.mPositions;
+			std::vector<LLVector3>& norm = d->mPhysicsShapeMesh.mNormals;
 
-			d->mPhysicsShapeMesh->getVertexStrider(pos);
-			d->mPhysicsShapeMesh->getIndexStrider(idx);
-
-			S32 idx_offset = 0;
 			for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
 			{
 				const LLVolumeFace& face = volume->getVolumeFace(i);
-				if (idx_offset + face.mNumIndices > 65535)
-				{ //avoid 16-bit index overflow
-					continue;
-				}
-
-				LLVector4a::memcpyNonAliased16(pos[idx_offset].mV, face.mPositions[0].getF32ptr(), face.mNumVertices*sizeof(LLVector4a));
 			
 				for (S32 i = 0; i < face.mNumIndices; ++i)
 				{
-					*idx++ = face.mIndices[i] + idx_offset;
-				}
+					U16 idx = face.mIndices[i];
 
-				idx_offset += face.mNumVertices;
+					pos.push_back(LLVector3(face.mPositions[idx].getF32ptr()));
+					norm.push_back(LLVector3(face.mNormals[idx].getF32ptr()));				
+				}			
 			}
 		}
 	}
@@ -1381,7 +1198,8 @@ bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32
 
 LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures,
 										bool upload_skin, bool upload_joints)
-: LLThread("mesh upload")
+: LLThread("mesh upload"),
+	mDiscarded(FALSE)
 {
 	mInstanceList = data;
 	mUploadTextures = upload_textures;
@@ -1475,8 +1293,26 @@ void LLMeshUploadThread::preStart()
 	}
 }
 
+void LLMeshUploadThread::discard()
+{
+	LLMutexLock lock(mMutex) ;
+	mDiscarded = TRUE ;
+}
+
+BOOL LLMeshUploadThread::isDiscarded()
+{
+	LLMutexLock lock(mMutex) ;
+	return mDiscarded ;
+}
+
 void LLMeshUploadThread::run()
 {
+	if(isDiscarded())
+	{
+		mFinished = true;
+		return ;
+	}
+	
 	mCurlRequest = new LLCurlRequest();	
 
 	std::set<LLViewerTexture* > textures;
@@ -1605,7 +1441,7 @@ void LLMeshUploadThread::run()
 	
 		tcount = llmin(count+PUSH_PER_PROCESS, 100);
 
-		while (!mInstanceQ.empty() && count < tcount)
+		while (!mInstanceQ.empty() && count < tcount && !isDiscarded())
 		{ //create any objects waiting for upload
 			count++;
 			object_asset["objects"].append(createObject(mInstanceQ.front()));
@@ -1614,7 +1450,7 @@ void LLMeshUploadThread::run()
 			
 		mCurlRequest->process();
 			
-		done = mInstanceQ.empty() && mConfirmedQ.empty() && mUploadQ.empty();
+		done = isDiscarded() || (mInstanceQ.empty() && mConfirmedQ.empty() && mUploadQ.empty());
 	}
 	while (!done || mCurlRequest->getQueued() > 0);
 
@@ -1629,7 +1465,10 @@ void LLMeshUploadThread::run()
 		object_asset["permissions"] = object_asset["objects"][0]["permissions"];
 	}
 
-	LLHTTPClient::post(url, object_asset, new LLHTTPClient::Responder());
+	if(!isDiscarded())
+	{
+		LLHTTPClient::post(url, object_asset, new LLHTTPClient::Responder());
+	}
 
 	mFinished = true;
 }
@@ -1696,8 +1535,6 @@ void LLMeshRepoThread::notifyLoadedMeshes()
 
 S32 LLMeshRepoThread::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod) 
 { //only ever called from main thread
-	lod = llclamp(lod, 0, 3);
-
 	LLMutexLock lock(mHeaderMutex);
 	mesh_header_map::iterator iter = mMeshHeader.find(mesh_params.getSculptID());
 
@@ -1705,40 +1542,48 @@ S32 LLMeshRepoThread::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lo
 	{
 		LLSD& header = iter->second;
 
-		if (header.has("404"))
-		{
-			return -1;
-		}
+		return LLMeshRepository::getActualMeshLOD(header, lod);
+	}
 
-		if (header[header_lod[lod]]["size"].asInteger() > 0)
-		{
-			return lod;
-		}
+	return lod;
+}
 
-		//search down to find the next available lower lod
-		for (S32 i = lod-1; i >= 0; --i)
+//static
+S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod)
+{
+	lod = llclamp(lod, 0, 3);
+
+	if (header.has("404"))
+	{
+		return -1;
+	}
+
+	if (header[header_lod[lod]]["size"].asInteger() > 0)
+	{
+		return lod;
+	}
+
+	//search down to find the next available lower lod
+	for (S32 i = lod-1; i >= 0; --i)
+	{
+		if (header[header_lod[i]]["size"].asInteger() > 0)
 		{
-			if (header[header_lod[i]]["size"].asInteger() > 0)
-			{
-				return i;
-			}
+			return i;
 		}
+	}
 
-		//search up to find then ext available higher lod
-		for (S32 i = lod+1; i < 4; ++i)
+	//search up to find then ext available higher lod
+	for (S32 i = lod+1; i < 4; ++i)
+	{
+		if (header[header_lod[i]]["size"].asInteger() > 0)
 		{
-			if (header[header_lod[i]]["size"].asInteger() > 0)
-			{
-				return i;
-			}
+			return i;
 		}
-
-		//header exists and no good lod found, treat as 404
-		header["404"] = 1;
-		return -1;
 	}
 
-	return lod;
+	//header exists and no good lod found, treat as 404
+	header["404"] = 1;
+	return -1;
 }
 
 U32 LLMeshRepoThread::getResourceCost(const LLUUID& mesh_id)
@@ -2132,6 +1977,12 @@ void LLMeshRepository::shutdown()
 {
 	llinfos << "Shutting down mesh repository." << llendl;
 
+	for (U32 i = 0; i < mUploads.size(); ++i)
+	{
+		llinfos << "Discard the pending mesh uploads " << llendl;
+		mUploads[i]->discard() ; //discard the uploading requests.
+	}
+
 	mThread->mSignal->signal();
 	
 	while (!mThread->isStopped())
@@ -2453,33 +2304,7 @@ void LLMeshRepository::notifySkinInfoReceived(LLMeshSkinInfo& info)
 	mLoadingSkins.erase(info.mMeshID);
 }
 
-void LLMeshDecomposition::merge(const LLMeshDecomposition* rhs)
-{
-	if (!rhs)
-	{
-		return;
-	}
-
-	if (mMeshID != rhs->mMeshID)
-	{
-		llerrs << "Attempted to merge with decomposition of some other mesh." << llendl;
-	}
-
-	if (mBaseHull.empty())
-	{ //take base hull and decomposition from rhs
-		mHull = rhs->mHull;
-		mBaseHull = rhs->mBaseHull;
-		mMesh = rhs->mMesh;
-		mBaseHullMesh = rhs->mBaseHullMesh;
-	}
-
-	if (mPhysicsShapeMesh.isNull())
-	{ //take physics shape mesh from rhs
-		mPhysicsShapeMesh = rhs->mPhysicsShapeMesh;
-	}
-}
-
-void LLMeshRepository::notifyDecompositionReceived(LLMeshDecomposition* decomp)
+void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decomp)
 {
 	decomposition_map::iterator iter = mDecompositionMap.find(decomp->mMeshID);
 	if (iter == mDecompositionMap.end())
@@ -2621,7 +2446,7 @@ void LLMeshRepository::fetchPhysicsShape(const LLUUID& mesh_id)
 {
 	if (mesh_id.notNull())
 	{
-		LLMeshDecomposition* decomp = NULL;
+		LLModel::Decomposition* decomp = NULL;
 		decomposition_map::iterator iter = mDecompositionMap.find(mesh_id);
 		if (iter != mDecompositionMap.end())
 		{
@@ -2629,7 +2454,7 @@ void LLMeshRepository::fetchPhysicsShape(const LLUUID& mesh_id)
 		}
 		
 		//decomposition block hasn't been fetched yet
-		if (!decomp || decomp->mPhysicsShapeMesh.isNull())
+		if (!decomp || decomp->mPhysicsShapeMesh.empty())
 		{
 			LLMutexLock lock(mMeshMutex);
 			//add volume to list of loading meshes
@@ -2644,9 +2469,9 @@ void LLMeshRepository::fetchPhysicsShape(const LLUUID& mesh_id)
 
 }
 
-const LLMeshDecomposition* LLMeshRepository::getDecomposition(const LLUUID& mesh_id)
+LLModel::Decomposition* LLMeshRepository::getDecomposition(const LLUUID& mesh_id)
 {
-	LLMeshDecomposition* ret = NULL;
+	LLModel::Decomposition* ret = NULL;
 
 	if (mesh_id.notNull())
 	{
@@ -2657,7 +2482,7 @@ const LLMeshDecomposition* LLMeshRepository::getDecomposition(const LLUUID& mesh
 		}
 		
 		//decomposition block hasn't been fetched yet
-		if (!ret || ret->mBaseHullMesh.isNull())
+		if (!ret || ret->mBaseHullMesh.empty())
 		{
 			LLMutexLock lock(mMeshMutex);
 			//add volume to list of loading meshes
@@ -2695,12 +2520,12 @@ bool LLMeshRepository::hasPhysicsShape(const LLUUID& mesh_id)
 	return mesh.has("physics_shape") && mesh["physics_shape"].has("size") && (mesh["physics_shape"]["size"].asInteger() > 0);
 }
 
-const LLSD& LLMeshRepository::getMeshHeader(const LLUUID& mesh_id)
+LLSD& LLMeshRepository::getMeshHeader(const LLUUID& mesh_id)
 {
 	return mThread->getMeshHeader(mesh_id);
 }
 
-const LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)
+LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)
 {
 	static LLSD dummy_ret;
 	if (mesh_id.notNull())
@@ -2750,15 +2575,18 @@ S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod)
 
 void LLMeshUploadThread::sendCostRequest(LLMeshUploadData& data)
 {
+	if(isDiscarded())
+	{
+		return ;
+	}
+
 	//write model file to memory buffer
 	std::stringstream ostr;
 
-	LLModel::convex_hull_decomposition& decomp =
+	LLModel::Decomposition& decomp =
 		data.mModel[LLModel::LOD_PHYSICS].notNull() ? 
-		data.mModel[LLModel::LOD_PHYSICS]->mConvexHullDecomp : 
-		data.mBaseModel->mConvexHullDecomp;
-
-	LLModel::hull dummy_hull;
+		data.mModel[LLModel::LOD_PHYSICS]->mPhysics : 
+		data.mBaseModel->mPhysics;
 
 	LLSD header = LLModel::writeModel(
 		ostr,
@@ -2768,7 +2596,6 @@ void LLMeshUploadThread::sendCostRequest(LLMeshUploadData& data)
 		data.mModel[LLModel::LOD_LOW],
 		data.mModel[LLModel::LOD_IMPOSTOR], 
 		decomp,
-		dummy_hull,
 		mUploadSkin,
 		mUploadJoints,
 		true);
@@ -2808,6 +2635,11 @@ void LLMeshUploadThread::sendCostRequest(LLMeshUploadData& data)
 
 void LLMeshUploadThread::sendCostRequest(LLTextureUploadData& data)
 {
+	if(isDiscarded())
+	{
+		return ;
+	}
+
 	if (data.mTexture && data.mTexture->getDiscardLevel() >= 0)
 	{
 		LLSD asset_resources = LLSD::emptyMap();
@@ -2840,14 +2672,21 @@ void LLMeshUploadThread::sendCostRequest(LLTextureUploadData& data)
 
 void LLMeshUploadThread::doUploadModel(LLMeshUploadData& data)
 {
+	if(isDiscarded())
+	{
+		return ;
+	}
+
 	if (!data.mRSVP.empty())
 	{
 		std::stringstream ostr;
 
-		LLModel::convex_hull_decomposition& decomp =
+		LLModel::Decomposition& decomp =
 			data.mModel[LLModel::LOD_PHYSICS].notNull() ? 
-			data.mModel[LLModel::LOD_PHYSICS]->mConvexHullDecomp : 
-			data.mBaseModel->mConvexHullDecomp;
+			data.mModel[LLModel::LOD_PHYSICS]->mPhysics : 
+			data.mBaseModel->mPhysics;
+
+		decomp.mBaseHull = mHullMap[data.mBaseModel];
 
 		LLModel::writeModel(
 			ostr,  
@@ -2857,7 +2696,6 @@ void LLMeshUploadThread::doUploadModel(LLMeshUploadData& data)
 			data.mModel[LLModel::LOD_LOW],
 			data.mModel[LLModel::LOD_IMPOSTOR], 
 			decomp,
-			mHullMap[data.mBaseModel],
 			mUploadSkin,
 			mUploadJoints);
 
@@ -2872,6 +2710,11 @@ void LLMeshUploadThread::doUploadModel(LLMeshUploadData& data)
 
 void LLMeshUploadThread::doUploadTexture(LLTextureUploadData& data)
 {
+	if(isDiscarded())
+	{
+		return ;
+	}
+
 	if (!data.mRSVP.empty())
 	{
 		std::stringstream ostr;
@@ -3100,17 +2943,36 @@ void LLMeshRepository::uploadError(LLSD& args)
 }
 
 //static
-F32 LLMeshRepository::getStreamingCost(const LLSD& header, F32 radius)
+F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod)
 {
-	F32 dlowest = llmin(radius/0.06f, 256.f);
-	F32 dlow = llmin(radius/0.24f, 256.f);
-	F32 dmid = llmin(radius/1.0f, 256.f);
+	F32 dlowest = llmin(radius/0.03f, 256.f);
+	F32 dlow = llmin(radius/0.06f, 256.f);
+	F32 dmid = llmin(radius/0.24f, 256.f);
 	
 	F32 bytes_lowest = header["lowest_lod"]["size"].asReal()/1024.f;
 	F32 bytes_low = header["low_lod"]["size"].asReal()/1024.f;
 	F32 bytes_mid = header["medium_lod"]["size"].asReal()/1024.f;
 	F32 bytes_high = header["high_lod"]["size"].asReal()/1024.f;
 
+	if (bytes)
+	{
+		*bytes = 0;
+		*bytes += header["lowest_lod"]["size"].asInteger();
+		*bytes += header["low_lod"]["size"].asInteger();
+		*bytes += header["medium_lod"]["size"].asInteger();
+		*bytes += header["high_lod"]["size"].asInteger();
+	}
+
+
+	if (bytes_visible)
+	{
+		lod = LLMeshRepository::getActualMeshLOD(header, lod);
+		if (lod >= 0 && lod <= 3)
+		{
+			*bytes_visible = header[header_lod[lod]]["size"].asInteger();
+		}
+	}
+
 	if (bytes_high == 0.f)
 	{
 		return 0.f;
@@ -3360,7 +3222,7 @@ void LLPhysicsDecomp::doDecomposition()
 			// if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
 			LLConvexDecomposition::getInstance()->getMeshFromStage(stage, i, &mesh);
 
-			mCurRequest->mHullMesh[i] = get_vertex_buffer_from_mesh(mesh);
+			get_vertex_buffer_from_mesh(mesh, mCurRequest->mHullMesh[i]);
 			
 			mMutex->lock();
 			mCurRequest->mHull[i] = p;
@@ -3584,3 +3446,95 @@ void LLPhysicsDecomp::Request::setStatusMessage(const std::string& msg)
 	mStatusMessage = msg;
 }
 
+LLModelInstance::LLModelInstance(LLSD& data)
+{
+	mLocalMeshID = data["mesh_id"].asInteger();
+	mLabel = data["label"].asString();
+	mTransform.setValue(data["transform"]);
+
+	for (U32 i = 0; i < data["material"].size(); ++i)
+	{
+		mMaterial.push_back(LLImportMaterial(data["material"][i]));
+	}
+}
+
+
+LLSD LLModelInstance::asLLSD()
+{	
+	LLSD ret;
+
+	ret["mesh_id"] = mModel->mLocalID;
+	ret["label"] = mLabel;
+	ret["transform"] = mTransform.getValue();
+	
+	for (U32 i = 0; i < mMaterial.size(); ++i)
+	{
+		ret["material"][i] = mMaterial[i].asLLSD();
+	}
+
+	return ret;
+}
+
+LLImportMaterial::LLImportMaterial(LLSD& data)
+{
+	mDiffuseMapFilename = data["diffuse"]["filename"].asString();
+	mDiffuseMapLabel = data["diffuse"]["label"].asString();
+	mDiffuseColor.setValue(data["diffuse"]["color"]);
+	mFullbright = data["fullbright"].asBoolean();
+}
+
+
+LLSD LLImportMaterial::asLLSD()
+{
+	LLSD ret;
+
+	ret["diffuse"]["filename"] = mDiffuseMapFilename;
+	ret["diffuse"]["label"] = mDiffuseMapLabel;
+	ret["diffuse"]["color"] = mDiffuseColor.getValue();
+	ret["fullbright"] = mFullbright;
+	
+	return ret;
+}
+
+void LLMeshRepository::buildPhysicsMesh(LLModel::Decomposition& decomp)
+{
+	decomp.mMesh.resize(decomp.mHull.size());
+
+	for (U32 i = 0; i < decomp.mHull.size(); ++i)
+	{
+		LLCDHull hull;
+		hull.mNumVertices = decomp.mHull[i].size();
+		hull.mVertexBase = decomp.mHull[i][0].mV;
+		hull.mVertexStrideBytes = 12;
+
+		LLCDMeshData mesh;
+		LLCDResult res = LLCD_OK;
+		if (LLConvexDecomposition::getInstance() != NULL)
+		{
+			res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
+		}
+		if (res == LLCD_OK)
+		{
+			get_vertex_buffer_from_mesh(mesh, decomp.mMesh[i]);
+		}
+	}
+
+	if (!decomp.mBaseHull.empty() && decomp.mBaseHullMesh.empty())
+	{ //get mesh for base hull
+		LLCDHull hull;
+		hull.mNumVertices = decomp.mBaseHull.size();
+		hull.mVertexBase = decomp.mBaseHull[0].mV;
+		hull.mVertexStrideBytes = 12;
+
+		LLCDMeshData mesh;
+		LLCDResult res = LLCD_OK;
+		if (LLConvexDecomposition::getInstance() != NULL)
+		{
+			res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
+		}
+		if (res == LLCD_OK)
+		{
+			get_vertex_buffer_from_mesh(mesh, decomp.mBaseHullMesh);
+		}
+	}
+}
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index ccdcc03310fa38c3c1ffaa2f2f24a24d2cfd21bc..5983a282a23a707da2518b569927c4bf8bf756ea 100644
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -101,6 +101,10 @@ class LLImportMaterial
 	{ 
 		mDiffuseColor.set(1,1,1,1);
 	}
+
+	LLImportMaterial(LLSD& data);
+
+	LLSD asLLSD();
 };
 
 class LLModelInstance 
@@ -112,6 +116,7 @@ class LLModelInstance
 	std::string mLabel;
 
 	LLUUID mMeshID;
+	S32 mLocalMeshID;
 
 	LLMatrix4 mTransform;
 	std::vector<LLImportMaterial> mMaterial;
@@ -119,35 +124,12 @@ class LLModelInstance
 	LLModelInstance(LLModel* model, const std::string& label, LLMatrix4& transform, std::vector<LLImportMaterial>& materials)
 		: mModel(model), mLabel(label), mTransform(transform), mMaterial(materials)
 	{
+		mLocalMeshID = -1;
 	}
-};
-
-class LLMeshSkinInfo 
-{
-public:
-	LLUUID mMeshID;
-	std::vector<std::string> mJointNames;
-	std::vector<LLMatrix4> mInvBindMatrix;
-	std::vector<LLMatrix4> mAlternateBindMatrix;
-	
-	LLMatrix4 mBindShapeMatrix;
-	float mPelvisOffset;
-};
-
-class LLMeshDecomposition
-{
-public:
-	LLMeshDecomposition() { }
 
-	void merge(const LLMeshDecomposition* rhs);
+	LLModelInstance(LLSD& data);
 
-	LLUUID mMeshID;
-	LLModel::convex_hull_decomposition mHull;
-	LLModel::hull mBaseHull;
-
-	std::vector<LLPointer<LLVertexBuffer> > mMesh;
-	LLPointer<LLVertexBuffer> mBaseHullMesh;
-	LLPointer<LLVertexBuffer> mPhysicsShapeMesh;
+	LLSD asLLSD();
 };
 
 class LLPhysicsDecomp : public LLThread
@@ -168,7 +150,7 @@ class LLPhysicsDecomp : public LLThread
 				
 		//output state
 		std::string mStatusMessage;
-		std::vector<LLPointer<LLVertexBuffer> > mHullMesh;
+		std::vector<LLModel::PhysicsMesh> mHullMesh;
 		LLModel::convex_hull_decomposition mHull;
 		
 		//status message callback, called from decomposition thread
@@ -303,7 +285,7 @@ class LLMeshRepoThread : public LLThread
 	std::set<LLUUID> mPhysicsShapeRequests;
 
 	//queue of completed Decomposition info requests
-	std::queue<LLMeshDecomposition*> mDecompositionQ;
+	std::queue<LLModel::Decomposition*> mDecompositionQ;
 
 	//queue of requested headers
 	std::queue<HeaderRequest> mHeaderReqQ;
@@ -336,7 +318,7 @@ class LLMeshRepoThread : public LLThread
 	bool skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
 	bool decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
 	bool physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
-	const LLSD& getMeshHeader(const LLUUID& mesh_id);
+	LLSD& getMeshHeader(const LLUUID& mesh_id);
 
 	void notifyLoadedMeshes();
 	S32 getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
@@ -395,11 +377,12 @@ class LLMeshUploadThread : public LLThread
 	S32				mPendingConfirmations;
 	S32				mPendingUploads;
 	S32				mPendingCost;
-	bool			mFinished;
 	LLVector3		mOrigin;
+	bool			mFinished;	
 	bool			mUploadTextures;
 	bool			mUploadSkin;
 	bool			mUploadJoints;
+	BOOL            mDiscarded ;
 
 	LLHost			mHost;
 	std::string		mUploadObjectAssetCapability;
@@ -435,7 +418,8 @@ class LLMeshUploadThread : public LLThread
 	bool finished() { return mFinished; }
 	virtual void run();
 	void preStart();
-	
+	void discard() ;
+	BOOL isDiscarded();
 };
 
 class LLMeshRepository
@@ -450,7 +434,7 @@ class LLMeshRepository
 	static U32 sCacheBytesWritten;
 	static U32 sPeakKbps;
 	
-	static F32 getStreamingCost(const LLSD& header, F32 radius);
+	static F32 getStreamingCost(LLSD& header, F32 radius, S32* bytes = NULL, S32* visible_bytes = NULL, S32 detail = -1);
 
 	LLMeshRepository();
 
@@ -465,18 +449,21 @@ class LLMeshRepository
 	void notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVolume* volume);
 	void notifyMeshUnavailable(const LLVolumeParams& mesh_params, S32 lod);
 	void notifySkinInfoReceived(LLMeshSkinInfo& info);
-	void notifyDecompositionReceived(LLMeshDecomposition* info);
+	void notifyDecompositionReceived(LLModel::Decomposition* info);
 
 	S32 getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
+	static S32 getActualMeshLOD(LLSD& header, S32 lod);
 	U32 calcResourceCost(LLSD& header);
 	U32 getResourceCost(const LLUUID& mesh_params);
 	const LLMeshSkinInfo* getSkinInfo(const LLUUID& mesh_id);
-	const LLMeshDecomposition* getDecomposition(const LLUUID& mesh_id);
+	LLModel::Decomposition* getDecomposition(const LLUUID& mesh_id);
 	void fetchPhysicsShape(const LLUUID& mesh_id);
 	bool hasPhysicsShape(const LLUUID& mesh_id);
 	
 	void buildHull(const LLVolumeParams& params, S32 detail);
-	const LLSD& getMeshHeader(const LLUUID& mesh_id);
+	void buildPhysicsMesh(LLModel::Decomposition& decomp);
+
+	LLSD& getMeshHeader(const LLUUID& mesh_id);
 
 	void uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
 			bool upload_skin, bool upload_joints);
@@ -489,7 +476,7 @@ class LLMeshRepository
 	typedef std::map<LLUUID, LLMeshSkinInfo> skin_map;
 	skin_map mSkinMap;
 
-	typedef std::map<LLUUID, LLMeshDecomposition*> decomposition_map;
+	typedef std::map<LLUUID, LLModel::Decomposition*> decomposition_map;
 	decomposition_map mDecompositionMap;
 
 	LLMutex*					mMeshMutex;
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 836ae9a0cfc49f7cbf88e0a214c0041828387736..162e465fef8d3573b35ffbc671243651267783cd 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -157,6 +157,16 @@ BOOL LLGestureComboList::handleKeyHere(KEY key, MASK mask)
 	return handled; 		
 }
 
+void LLGestureComboList::draw()
+{
+	LLUICtrl::draw();
+
+	if(mButton->getToggleState())
+	{
+		showList();
+	}
+}
+
 void LLGestureComboList::showList()
 {
 	LLRect rect = mList->getRect();
@@ -180,6 +190,7 @@ void LLGestureComboList::showList()
 	// Show the list and push the button down
 	mButton->setToggleState(TRUE);
 	mList->setVisible(TRUE);
+	sendChildToFront(mList);
 	LLUI::addPopup(mList);
 }
 
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h
index 033d1dd5a2c8d1962d23fb210888fad8774b5223..96ab45071b2251bae53191f2c49927379d4416aa 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llnearbychatbar.h
@@ -72,6 +72,8 @@ class LLGestureComboList
 	virtual void	hideList();
 	virtual BOOL	handleKeyHere(KEY key, MASK mask);
 
+	virtual void	draw();
+
 	S32				getCurrentIndex() const;
 	void			onItemSelected(const LLSD& data);
 	void			sortByName(bool ascending = true);
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index de5439e4e03e5a88002a454a74e790cd503548db..0d9daeb44ead9302fbb14c5b818ec880ab4ee8ae 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -558,6 +558,7 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
 	}
 	*/
 
+	// Add a nearby chat toast.
 	LLUUID id;
 	id.generate();
 
@@ -583,6 +584,10 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
 		notification["text_color"] = r_color_name;
 		notification["color_alpha"] = r_color_alpha;
 		notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;
+
+		// Pass sender info so that it can be rendered properly (STORM-1021).
+		notification["sender_slurl"] = LLViewerChat::getSenderSLURL(chat_msg, args);
+
 		channel->addNotification(notification);	
 	}
 
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index e29078c5457248232e22286bf6467146c0da1d0f..981b4dbee3afc964ffb1c5d1a5a2f91ebb54d2a8 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -112,10 +112,6 @@ BOOL LLNetMap::postBuild()
 	registrar.add("Minimap.Tracker", boost::bind(&LLNetMap::handleStopTracking, this, _2));
 
 	mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_mini_map.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-	if (mPopupMenu && !LLTracker::isTracking(0))
-	{
-		mPopupMenu->setItemEnabled ("Stop Tracking", false);
-	}
 	return TRUE;
 }
 
@@ -510,13 +506,6 @@ void LLNetMap::draw()
 	gGL.popUIMatrix();
 
 	LLUICtrl::draw();
-
-	if (LLTracker::isTracking(0))
-	{
-		mPopupMenu->setItemEnabled ("Stop Tracking", true);
-	}
-	
-
 }
 
 void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent)
@@ -886,6 +875,7 @@ BOOL LLNetMap::handleRightMouseDown(S32 x, S32 y, MASK mask)
 	{
 		mPopupMenu->buildDrawLabels();
 		mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
+		mPopupMenu->setItemEnabled("Stop Tracking", LLTracker::isTracking(0));
 		LLMenuGL::showPopup(this, mPopupMenu, x, y);
 	}
 	return TRUE;
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index b472698a49b96f88327968e09f2708af5621f281..903cf4780df7658ab55538e2f517b0a6cfed8267 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -1,1183 +1,1183 @@
-/** 
- * @file llpanellogin.cpp
- * @brief Login dialog and logo display
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llpanellogin.h"
-
-#include "indra_constants.h"		// for key and mask constants
-#include "llfloaterreg.h"
-#include "llfontgl.h"
-#include "llmd5.h"
-#include "llsecondlifeurls.h"
-#include "v4color.h"
-
-#include "llappviewer.h"
-#include "llbutton.h"
-#include "llcheckboxctrl.h"
-#include "llcommandhandler.h"		// for secondlife:///app/login/
-#include "llcombobox.h"
-#include "llcurl.h"
-#include "llviewercontrol.h"
-#include "llfloaterpreference.h"
-#include "llfocusmgr.h"
-#include "lllineeditor.h"
-#include "llnotificationsutil.h"
-#include "llsecapi.h"
-#include "llstartup.h"
-#include "lltextbox.h"
-#include "llui.h"
-#include "lluiconstants.h"
-#include "llslurl.h"
-#include "llversioninfo.h"
-#include "llviewerhelp.h"
-#include "llviewertexturelist.h"
-#include "llviewermenu.h"			// for handle_preferences()
-#include "llviewernetwork.h"
-#include "llviewerwindow.h"			// to link into child list
-#include "lluictrlfactory.h"
-#include "llhttpclient.h"
-#include "llweb.h"
-#include "llmediactrl.h"
-#include "llrootview.h"
-
-#include "llfloatertos.h"
-#include "lltrans.h"
-#include "llglheaders.h"
-#include "llpanelloginlistener.h"
-
-#if LL_WINDOWS
-#pragma warning(disable: 4355)      // 'this' used in initializer list
-#endif  // LL_WINDOWS
-
-#include "llsdserialize.h"
-
-const S32 BLACK_BORDER_HEIGHT = 160;
-const S32 MAX_PASSWORD = 16;
-
-LLPanelLogin *LLPanelLogin::sInstance = NULL;
-BOOL LLPanelLogin::sCapslockDidNotification = FALSE;
-
-
-class LLLoginRefreshHandler : public LLCommandHandler
-{
-public:
-	// don't allow from external browsers
-	LLLoginRefreshHandler() : LLCommandHandler("login_refresh", UNTRUSTED_BLOCK) { }
-	bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web)
-	{	
-		if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP)
-		{
-			LLPanelLogin::loadLoginPage();
-		}	
-		return true;
-	}
-};
-
-LLLoginRefreshHandler gLoginRefreshHandler;
-
-
-// helper class that trys to download a URL from a web site and calls a method 
-// on parent class indicating if the web server is working or not
-class LLIamHereLogin : public LLHTTPClient::Responder
-{
-	private:
-		LLIamHereLogin( LLPanelLogin* parent ) :
-		   mParent( parent )
-		{}
-
-		LLPanelLogin* mParent;
-
-	public:
-		static boost::intrusive_ptr< LLIamHereLogin > build( LLPanelLogin* parent )
-		{
-			return boost::intrusive_ptr< LLIamHereLogin >( new LLIamHereLogin( parent ) );
-		};
-
-		virtual void  setParent( LLPanelLogin* parentIn )
-		{
-			mParent = parentIn;
-		};
-
-		// We don't actually expect LLSD back, so need to override completedRaw
-		virtual void completedRaw(U32 status, const std::string& reason,
-								  const LLChannelDescriptors& channels,
-								  const LLIOPipe::buffer_ptr_t& buffer)
-		{
-			completed(status, reason, LLSD()); // will call result() or error()
-		}
-	
-		virtual void result( const LLSD& content )
-		{
-			if ( mParent )
-				mParent->setSiteIsAlive( true );
-		};
-
-		virtual void error( U32 status, const std::string& reason )
-		{
-			if ( mParent )
-				mParent->setSiteIsAlive( false );
-		};
-};
-
-// this is global and not a class member to keep crud out of the header file
-namespace {
-	boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0;
-};
-
-
-//---------------------------------------------------------------------------
-// Public methods
-//---------------------------------------------------------------------------
-LLPanelLogin::LLPanelLogin(const LLRect &rect,
-						 BOOL show_server,
-						 void (*callback)(S32 option, void* user_data),
-						 void *cb_data)
-:	LLPanel(),
-	mLogoImage(),
-	mCallback(callback),
-	mCallbackData(cb_data),
-	mHtmlAvailable( TRUE ),
-	mListener(new LLPanelLoginListener(this))
-{
-	setBackgroundVisible(FALSE);
-	setBackgroundOpaque(TRUE);
-
-	// instance management
-	if (LLPanelLogin::sInstance)
-	{
-		llwarns << "Duplicate instance of login view deleted" << llendl;
-		// Don't leave bad pointer in gFocusMgr
-		gFocusMgr.setDefaultKeyboardFocus(NULL);
-
-		delete LLPanelLogin::sInstance;
-	}
-
-	mPasswordModified = FALSE;
-	LLPanelLogin::sInstance = this;
-
-	LLView* login_holder = gViewerWindow->getLoginPanelHolder();
-	if (login_holder)
-	{
-		login_holder->addChild(this);
-	}
-
-	// Logo
-	mLogoImage = LLUI::getUIImage("startup_logo");
-
-	buildFromFile( "panel_login.xml");
-	
-	// Legacy login web page is hidden under the menu bar.
-	// Adjust reg-in-client web browser widget to not be hidden.
-	if (gSavedSettings.getBOOL("RegInClient"))
-	{
-		reshape(rect.getWidth(), rect.getHeight() - MENU_BAR_HEIGHT);
-	}
-	else
-	{
-		reshape(rect.getWidth(), rect.getHeight());
-	}
-
-	getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this);
-
-	// change z sort of clickable text to be behind buttons
-	//sendChildToBack(getChildView("channel_text"));
-	sendChildToBack(getChildView("forgot_password_text"));
-
-	if(LLStartUp::getStartSLURL().getType() != LLSLURL::LOCATION)
-	{
-		LLSLURL slurl(gSavedSettings.getString("LoginLocation"));
-		LLStartUp::setStartSLURL(slurl);
-	}
-	updateLocationCombo(false);
-
-	gSavedSettings.getControl("SessionSettingsFile")->getSignal()->connect(boost::bind(&onModeChange));
-
-	LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
-	server_choice_combo->setCommitCallback(onSelectServer, NULL);
-	server_choice_combo->setFocusLostCallback(boost::bind(onServerComboLostFocus, _1));
-	updateServerCombo();
-
-	childSetAction("connect_btn", onClickConnect, this);
-
-	getChild<LLPanel>("login")->setDefaultBtn("connect_btn");
-
-	std::string channel = LLVersionInfo::getChannel();
-	std::string version = llformat("%s (%d)",
-								   LLVersionInfo::getShortVersion().c_str(),
-								   LLVersionInfo::getBuild());
-	//LLTextBox* channel_text = getChild<LLTextBox>("channel_text");
-	//channel_text->setTextArg("[CHANNEL]", channel); // though not displayed
-	//channel_text->setTextArg("[VERSION]", version);
-	//channel_text->setClickedCallback(onClickVersion, this);
-	
-	LLTextBox* forgot_password_text = getChild<LLTextBox>("forgot_password_text");
-	forgot_password_text->setClickedCallback(onClickForgotPassword, NULL);
-
-	LLTextBox* create_new_account_text = getChild<LLTextBox>("create_new_account_text");
-	create_new_account_text->setClickedCallback(onClickNewAccount, NULL);
-
-	LLTextBox* need_help_text = getChild<LLTextBox>("login_help");
-	need_help_text->setClickedCallback(onClickHelp, NULL);
-	
-	// get the web browser control
-	LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
-	web_browser->addObserver(this);
-	
-	// Clear the browser's cache to avoid any potential for the cache messing up the login screen.
-	web_browser->clearCache();
-
-	reshapeBrowser();
-
-	// kick off a request to grab the url manually
-	gResponsePtr = LLIamHereLogin::build( this );
-
-	LLHTTPClient::head( LLGridManager::getInstance()->getLoginPage(), gResponsePtr );
-
-	// Show last logged in user favorites in "Start at" combo.
-	addUsersWithFavoritesToUsername();
-	getChild<LLComboBox>("username_combo")->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this));
-
-	updateLocationCombo(false);
-
-}
-
-void LLPanelLogin::addUsersWithFavoritesToUsername()
-{
-	LLComboBox* combo = getChild<LLComboBox>("username_combo");
-	if (!combo) return;
-	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
-	LLSD fav_llsd;
-	llifstream file;
-	file.open(filename);
-	if (!file.is_open()) return;
-	LLSDSerialize::fromXML(fav_llsd, file);
-	for (LLSD::map_const_iterator iter = fav_llsd.beginMap();
-		iter != fav_llsd.endMap(); ++iter)
-	{
-		combo->add(iter->first);
-	}
-}
-
-void LLPanelLogin::addFavoritesToStartLocation()
-{
-	LLComboBox* combo = getChild<LLComboBox>("start_location_combo");
-	if (!combo) return;
-	int num_items = combo->getItemCount();
-	for (int i = num_items - 1; i > 2; i--)
-	{
-		combo->remove(i);
-	}
-	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
-	LLSD fav_llsd;
-	llifstream file;
-	file.open(filename);
-	if (!file.is_open()) return;
-	LLSDSerialize::fromXML(fav_llsd, file);
-	for (LLSD::map_const_iterator iter = fav_llsd.beginMap();
-		iter != fav_llsd.endMap(); ++iter)
-	{
-		if(iter->first != getChild<LLComboBox>("username_combo")->getSimple()) continue;
-		combo->addSeparator();
-		LLSD user_llsd = iter->second;
-		for (LLSD::array_const_iterator iter1 = user_llsd.beginArray();
-			iter1 != user_llsd.endArray(); ++iter1)
-		{
-			std::string label = (*iter1)["name"].asString();
-			std::string value = (*iter1)["slurl"].asString();
-			if(label != "" && value != "")
-			{
-				combo->add(label, value);
-			}
-		}
-		break;
-	}
-}
-
-// force the size to be correct (XML doesn't seem to be sufficient to do this)
-// (with some padding so the other login screen doesn't show through)
-void LLPanelLogin::reshapeBrowser()
-{
-	LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
-	LLRect rect = gViewerWindow->getWindowRectScaled();
-	LLRect html_rect;
-	html_rect.setCenterAndSize(
-		rect.getCenterX() - 2, rect.getCenterY() + 40,
-		rect.getWidth() + 6, rect.getHeight() - 78 );
-	web_browser->setRect( html_rect );
-	web_browser->reshape( html_rect.getWidth(), html_rect.getHeight(), TRUE );
-	reshape( rect.getWidth(), rect.getHeight(), 1 );
-}
-
-void LLPanelLogin::setSiteIsAlive( bool alive )
-{
-	LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
-	// if the contents of the site was retrieved
-	if ( alive )
-	{
-		if ( web_browser )
-		{
-			loadLoginPage();
-			
-			// mark as available
-			mHtmlAvailable = TRUE;
-		}
-	}
-	else
-	// the site is not available (missing page, server down, other badness)
-	{
-		if ( web_browser )
-		{
-			// hide browser control (revealing default one)
-			web_browser->setVisible( FALSE );
-
-			// mark as unavailable
-			mHtmlAvailable = FALSE;
-		}
-	}
-}
-
-
-LLPanelLogin::~LLPanelLogin()
-{
-	LLPanelLogin::sInstance = NULL;
-
-	// tell the responder we're not here anymore
-	if ( gResponsePtr )
-		gResponsePtr->setParent( 0 );
-
-	//// We know we're done with the image, so be rid of it.
-	//gTextureList.deleteImage( mLogoImage );
-
-	// Controls having keyboard focus by default
-	// must reset it on destroy. (EXT-2748)
-	gFocusMgr.setDefaultKeyboardFocus(NULL);
-}
-
-// virtual
-void LLPanelLogin::draw()
-{
-	glPushMatrix();
-	{
-		F32 image_aspect = 1.333333f;
-		F32 view_aspect = (F32)getRect().getWidth() / (F32)getRect().getHeight();
-		// stretch image to maintain aspect ratio
-		if (image_aspect > view_aspect)
-		{
-			glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * getRect().getWidth(), 0.f, 0.f);
-			glScalef(image_aspect / view_aspect, 1.f, 1.f);
-		}
-
-		S32 width = getRect().getWidth();
-		S32 height = getRect().getHeight();
-
-		if ( mHtmlAvailable )
-		{
-			if (getChild<LLView>("login_widgets")->getVisible())
-			{
-				// draw a background box in black
-				gl_rect_2d( 0, height - 264, width, 264, LLColor4::black );
-				// draw the bottom part of the background image
-				// just the blue background to the native client UI
-				mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight());
-			}
-		}
-		else
-		{
-			// the HTML login page is not available so default to the original screen
-			S32 offscreen_part = height / 3;
-			mLogoImage->draw(0, -offscreen_part, width, height+offscreen_part);
-		};
-	}
-	glPopMatrix();
-
-	LLPanel::draw();
-}
-
-// virtual
-BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask)
-{
-	if ( KEY_F1 == key )
-	{
-		LLViewerHelp* vhelp = LLViewerHelp::getInstance();
-		vhelp->showTopic(vhelp->f1HelpTopic());
-		return TRUE;
-	}
-
-	return LLPanel::handleKeyHere(key, mask);
-}
-
-// virtual 
-void LLPanelLogin::setFocus(BOOL b)
-{
-	if(b != hasFocus())
-	{
-		if(b)
-		{
-			LLPanelLogin::giveFocus();
-		}
-		else
-		{
-			LLPanel::setFocus(b);
-		}
-	}
-}
-
-// static
-void LLPanelLogin::giveFocus()
-{
-	if( sInstance )
-	{
-		// Grab focus and move cursor to first blank input field
-		std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
-		std::string pass = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
-
-		BOOL have_username = !username.empty();
-		BOOL have_pass = !pass.empty();
-
-		LLLineEditor* edit = NULL;
-		LLComboBox* combo = NULL;
-		if (have_username && !have_pass)
-		{
-			// User saved his name but not his password.  Move
-			// focus to password field.
-			edit = sInstance->getChild<LLLineEditor>("password_edit");
-		}
-		else
-		{
-			// User doesn't have a name, so start there.
-			combo = sInstance->getChild<LLComboBox>("username_combo");
-		}
-
-		if (edit)
-		{
-			edit->setFocus(TRUE);
-			edit->selectAll();
-		}
-		else if (combo)
-		{
-			combo->setFocus(TRUE);
-		}
-	}
-}
-
-// static
-void LLPanelLogin::showLoginWidgets()
-{
-	// *NOTE: Mani - This may or may not be obselete code.
-	// It seems to be part of the defunct? reg-in-client project.
-	sInstance->getChildView("login_widgets")->setVisible( true);
-	LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
-	sInstance->reshapeBrowser();
-	// *TODO: Append all the usual login parameters, like first_login=Y etc.
-	std::string splash_screen_url = LLGridManager::getInstance()->getLoginPage();
-	web_browser->navigateTo( splash_screen_url, "text/html" );
-	LLUICtrl* username_combo = sInstance->getChild<LLUICtrl>("username_combo");
-	username_combo->setFocus(TRUE);
-}
-
-// static
-void LLPanelLogin::show(const LLRect &rect,
-						BOOL show_server,
-						void (*callback)(S32 option, void* user_data),
-						void* callback_data)
-{
-	new LLPanelLogin(rect, show_server, callback, callback_data);
-
-	if( !gFocusMgr.getKeyboardFocus() )
-	{
-		// Grab focus and move cursor to first enabled control
-		sInstance->setFocus(TRUE);
-	}
-
-	// Make sure that focus always goes here (and use the latest sInstance that was just created)
-	gFocusMgr.setDefaultKeyboardFocus(sInstance);
-}
-
-// static
-void LLPanelLogin::setFields(LLPointer<LLCredential> credential,
-							 BOOL remember)
-{
-	if (!sInstance)
-	{
-		llwarns << "Attempted fillFields with no login view shown" << llendl;
-		return;
-	}
-	LL_INFOS("Credentials") << "Setting login fields to " << *credential << LL_ENDL;
-
-	LLSD identifier = credential->getIdentifier();
-	if((std::string)identifier["type"] == "agent") 
-	{
-		std::string firstname = identifier["first_name"].asString();
-		std::string lastname = identifier["last_name"].asString();
-	    std::string login_id = firstname;
-	    if (!lastname.empty() && lastname != "Resident")
-	    {
-		    // support traditional First Last name SLURLs
-		    login_id += " ";
-		    login_id += lastname;
-	    }
-		sInstance->getChild<LLComboBox>("username_combo")->setLabel(login_id);	
-	}
-	else if((std::string)identifier["type"] == "account")
-	{
-		sInstance->getChild<LLComboBox>("username_combo")->setLabel((std::string)identifier["account_name"]);		
-	}
-	else
-	{
-	  sInstance->getChild<LLComboBox>("username_combo")->setLabel(std::string());	
-	}
-	sInstance->addFavoritesToStartLocation();
-	// if the password exists in the credential, set the password field with
-	// a filler to get some stars
-	LLSD authenticator = credential->getAuthenticator();
-	LL_INFOS("Credentials") << "Setting authenticator field " << authenticator["type"].asString() << LL_ENDL;
-	if(authenticator.isMap() && 
-	   authenticator.has("secret") && 
-	   (authenticator["secret"].asString().size() > 0))
-	{
-		
-		// This is a MD5 hex digest of a password.
-		// We don't actually use the password input field, 
-		// fill it with MAX_PASSWORD characters so we get a 
-		// nice row of asterixes.
-		const std::string filler("123456789!123456");
-		sInstance->getChild<LLUICtrl>("password_edit")->setValue(std::string("123456789!123456"));
-	}
-	else
-	{
-		sInstance->getChild<LLUICtrl>("password_edit")->setValue(std::string());		
-	}
-	sInstance->getChild<LLUICtrl>("remember_check")->setValue(remember);
-}
-
-
-// static
-void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
-							 BOOL& remember)
-{
-	if (!sInstance)
-	{
-		llwarns << "Attempted getFields with no login view shown" << llendl;
-		return;
-	}
-	
-	// load the credential so we can pass back the stored password or hash if the user did
-	// not modify the password field.
-	
-	credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
-
-	LLSD identifier = LLSD::emptyMap();
-	LLSD authenticator = LLSD::emptyMap();
-	
-	if(credential.notNull())
-	{
-		authenticator = credential->getAuthenticator();
-	}
-
-	std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
-	LLStringUtil::trim(username);
-	std::string password = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
-
-	LL_INFOS2("Credentials", "Authentication") << "retrieving username:" << username << LL_ENDL;
-	// determine if the username is a first/last form or not.
-	size_t separator_index = username.find_first_of(' ');
-	if (separator_index == username.npos
-		&& !LLGridManager::getInstance()->isSystemGrid())
-	{
-		LL_INFOS2("Credentials", "Authentication") << "account: " << username << LL_ENDL;
-		// single username, so this is a 'clear' identifier
-		identifier["type"] = CRED_IDENTIFIER_TYPE_ACCOUNT;
-		identifier["account_name"] = username;
-		
-		if (LLPanelLogin::sInstance->mPasswordModified)
-		{
-			authenticator = LLSD::emptyMap();
-			// password is plaintext
-			authenticator["type"] = CRED_AUTHENTICATOR_TYPE_CLEAR;
-			authenticator["secret"] = password;
-		}
-	}
-	else
-	{
-		// Be lenient in terms of what separators we allow for two-word names
-		// and allow legacy users to login with firstname.lastname
-		separator_index = username.find_first_of(" ._");
-		std::string first = username.substr(0, separator_index);
-		std::string last;
-		if (separator_index != username.npos)
-		{
-			last = username.substr(separator_index+1, username.npos);
-		LLStringUtil::trim(last);
-		}
-		else
-		{
-			// ...on Linden grids, single username users as considered to have
-			// last name "Resident"
-			// *TODO: Make login.cgi support "account_name" like above
-			last = "Resident";
-		}
-		
-		if (last.find_first_of(' ') == last.npos)
-		{
-			LL_INFOS2("Credentials", "Authentication") << "agent: " << username << LL_ENDL;
-			// traditional firstname / lastname
-			identifier["type"] = CRED_IDENTIFIER_TYPE_AGENT;
-			identifier["first_name"] = first;
-			identifier["last_name"] = last;
-		
-			if (LLPanelLogin::sInstance->mPasswordModified)
-			{
-				authenticator = LLSD::emptyMap();
-				authenticator["type"] = CRED_AUTHENTICATOR_TYPE_HASH;
-				authenticator["algorithm"] = "md5";
-				LLMD5 pass((const U8 *)password.c_str());
-				char md5pass[33];               /* Flawfinder: ignore */
-				pass.hex_digest(md5pass);
-				authenticator["secret"] = md5pass;
-			}
-		}
-	}
-	credential = gSecAPIHandler->createCredential(LLGridManager::getInstance()->getGrid(), identifier, authenticator);
-	remember = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
-}
-
-// static
-BOOL LLPanelLogin::isGridComboDirty()
-{
-	BOOL user_picked = FALSE;
-	if (!sInstance)
-	{
-		llwarns << "Attempted getServer with no login view shown" << llendl;
-	}
-	else
-	{
-		LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
-		user_picked = combo->isDirty();
-	}
-	return user_picked;
-}
-
-// static
-BOOL LLPanelLogin::areCredentialFieldsDirty()
-{
-	if (!sInstance)
-	{
-		llwarns << "Attempted getServer with no login view shown" << llendl;
-	}
-	else
-	{
-		std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
-		LLStringUtil::trim(username);
-		std::string password = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
-		LLComboBox* combo = sInstance->getChild<LLComboBox>("username_combo");
-		if(combo && combo->isDirty())
-		{
-			return true;
-		}
-		LLLineEditor* ctrl = sInstance->getChild<LLLineEditor>("password_edit");
-		if(ctrl && ctrl->isDirty()) 
-		{
-			return true;
-		}
-	}
-	return false;	
-}
-
-
-// static
-void LLPanelLogin::updateLocationCombo( bool force_visible )
-{
-	if (!sInstance) 
-	{
-		return;
-	}	
-	
-	LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
-	
-	switch(LLStartUp::getStartSLURL().getType())
-	{
-		case LLSLURL::LOCATION:
-		{
-			
-			combo->setCurrentByIndex( 2 );	
-			combo->setTextEntry(LLStartUp::getStartSLURL().getLocationString());	
-			break;
-		}
-		case LLSLURL::HOME_LOCATION:
-			combo->setCurrentByIndex(1);
-			break;
-		default:
-			combo->setCurrentByIndex(0);
-			break;
-	}
-	
-	BOOL show_start = TRUE;
-	
-	if ( ! force_visible )
-		show_start = gSavedSettings.getBOOL("ShowStartLocation");
-	
-	sInstance->getChildView("start_location_combo")->setVisible( show_start);
-	sInstance->getChildView("start_location_text")->setVisible( show_start);
-	
-	BOOL show_server = gSavedSettings.getBOOL("ForceShowGrid");
-	sInstance->getChildView("server_combo_text")->setVisible( show_server);	
-	sInstance->getChildView("server_combo")->setVisible( show_server);
-}
-
-// static
-void LLPanelLogin::updateStartSLURL()
-{
-	if (!sInstance) return;
-	
-	LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
-	S32 index = combo->getCurrentIndex();
-	
-	switch (index)
-	{
-		case 0:
-		{
-			LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_LAST));
-			break;
-		}			
-		case 1:
-		{
-			LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));
-			break;
-		}
-		default:
-		{
-			LLSLURL slurl = LLSLURL(combo->getValue().asString());
-			if(slurl.getType() == LLSLURL::LOCATION)
-			{
-				// we've changed the grid, so update the grid selection
-				LLStartUp::setStartSLURL(slurl);
-			}
-			break;
-		}			
-	}
-}
-
-
-void LLPanelLogin::setLocation(const LLSLURL& slurl)
-{
-	LLStartUp::setStartSLURL(slurl);
-	updateServer();
-}
-
-// static
-void LLPanelLogin::closePanel()
-{
-	if (sInstance)
-	{
-		LLPanelLogin::sInstance->getParent()->removeChild( LLPanelLogin::sInstance );
-
-		delete sInstance;
-		sInstance = NULL;
-	}
-}
-
-// static
-void LLPanelLogin::setAlwaysRefresh(bool refresh)
-{
-	if (LLStartUp::getStartupState() >= STATE_LOGIN_CLEANUP) return;
-
-	LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
-
-	if (web_browser)
-	{
-		web_browser->setAlwaysRefresh(refresh);
-	}
-}
-
-
-
-void LLPanelLogin::loadLoginPage()
-{
-	if (!sInstance) return;
-	
-	std::ostringstream oStr;
-
-	std::string login_page = LLGridManager::getInstance()->getLoginPage();
-
-	oStr << login_page;
-	
-	// Use the right delimeter depending on how LLURI parses the URL
-	LLURI login_page_uri = LLURI(login_page);
-	
-	std::string first_query_delimiter = "&";
-	if (login_page_uri.queryMap().size() == 0)
-	{
-		first_query_delimiter = "?";
-	}
-
-	// Language
-	std::string language = LLUI::getLanguage();
-	oStr << first_query_delimiter<<"lang=" << language;
-	
-	// First Login?
-	if (gSavedSettings.getBOOL("FirstLoginThisInstall"))
-	{
-		oStr << "&firstlogin=TRUE";
-	}
-
-	// Channel and Version
-	std::string version = llformat("%s (%d)",
-								   LLVersionInfo::getShortVersion().c_str(),
-								   LLVersionInfo::getBuild());
-
-	char* curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0);
-	char* curl_version = curl_escape(version.c_str(), 0);
-
-	oStr << "&channel=" << curl_channel;
-	oStr << "&version=" << curl_version;
-
-	curl_free(curl_channel);
-	curl_free(curl_version);
-
-	// Grid
-	char* curl_grid = curl_escape(LLGridManager::getInstance()->getGridLabel().c_str(), 0);
-	oStr << "&grid=" << curl_grid;
-	curl_free(curl_grid);
-	
-	// add OS info
-	char * os_info = curl_escape(LLAppViewer::instance()->getOSInfo().getOSStringSimple().c_str(), 0);
-	oStr << "&os=" << os_info;
-	curl_free(os_info);
-	
-	
-	gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid());
-	gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor());
-	
-	LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
-
-	// navigate to the "real" page
-	if (gSavedSettings.getBOOL("RegInClient"))
-	{
-		web_browser->setFocus(TRUE);
-		login_page = sInstance->getString("reg_in_client_url");
-		web_browser->navigateTo(login_page, "text/html");
-	}
-	else
-	{
-		web_browser->navigateTo( oStr.str(), "text/html" );
-	}
-}
-
-void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event)
-{
-	if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
-	{
-		LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
-		if (web_browser)
-		{
-			// *HACK HACK HACK HACK!
-			/* Stuff a Tab key into the browser now so that the first field will
-			** get the focus!  The embedded javascript on the page that properly
-			** sets the initial focus in a real web browser is not working inside
-			** the viewer, so this is an UGLY HACK WORKAROUND for now.
-			*/
-			// Commented out as it's not reliable
-			//web_browser->handleKey(KEY_TAB, MASK_NONE, false);
-		}
-	}
-}
-
-//---------------------------------------------------------------------------
-// Protected methods
-//---------------------------------------------------------------------------
-
-// static
-void LLPanelLogin::onClickConnect(void *)
-{
-	if (sInstance && sInstance->mCallback)
-	{
-		// tell the responder we're not here anymore
-		if ( gResponsePtr )
-			gResponsePtr->setParent( 0 );
-
-		// JC - Make sure the fields all get committed.
-		sInstance->setFocus(FALSE);
-
-		LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
-		LLSD combo_val = combo->getSelectedValue();
-		if (combo_val.isUndefined())
-		{
-			combo_val = combo->getValue();
-		}
-		if(combo_val.isUndefined())
-		{
-			LLNotificationsUtil::add("StartRegionEmpty");
-			return;
-		}		
-		try
-		{
-			LLGridManager::getInstance()->setGridChoice(combo_val.asString());
-		}
-		catch (LLInvalidGridName ex)
-		{
-			LLSD args;
-			args["GRID"] = combo_val.asString();
-			LLNotificationsUtil::add("InvalidGrid", args);
-			return;
-		}
-		updateStartSLURL();
-		std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
-
-		
-		if(username.empty())
-		{
-			// user must type in something into the username field
-			LLNotificationsUtil::add("MustHaveAccountToLogIn");
-		}
-		else
-		{
-			LLPointer<LLCredential> cred;
-			BOOL remember;
-			getFields(cred, remember);
-			std::string identifier_type;
-			cred->identifierType(identifier_type);
-			LLSD allowed_credential_types;
-			LLGridManager::getInstance()->getLoginIdentifierTypes(allowed_credential_types);
-			
-			// check the typed in credential type against the credential types expected by the server.
-			for(LLSD::array_iterator i = allowed_credential_types.beginArray();
-				i != allowed_credential_types.endArray();
-				i++)
-			{
-				
-				if(i->asString() == identifier_type)
-				{
-					// yay correct credential type
-					sInstance->mCallback(0, sInstance->mCallbackData);
-					return;
-				}
-			}
-			
-			// Right now, maingrid is the only thing that is picky about
-			// credential format, as it doesn't yet allow account (single username)
-			// format creds.  - Rox.  James, we wanna fix the message when we change
-			// this.
-			LLNotificationsUtil::add("InvalidCredentialFormat");			
-		}
-	}
-}
-
-/*
-// static
-bool LLPanelLogin::newAccountAlertCallback(const LLSD& notification, const LLSD& response)
-{
-	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-	if (0 == option)
-	{
-		llinfos << "Going to account creation URL" << llendl;
-		LLWeb::loadURLExternal( LLNotifications::instance().getGlobalString("CREATE_ACCOUNT_URL")); 
-	}
-	else
-	{
-		sInstance->setFocus(TRUE);
-	}
-	return false;
-}
-*/
-
-// static
-void LLPanelLogin::onClickNewAccount(void*)
-{
-	LLWeb::loadURLExternal(sInstance->getString("create_account_url"));
-}
-
-
-// static
-void LLPanelLogin::onClickVersion(void*)
-{
-	LLFloaterReg::showInstance("sl_about"); 
-}
-
-//static
-void LLPanelLogin::onClickForgotPassword(void*)
-{
-	if (sInstance )
-	{
-		LLWeb::loadURLExternal(sInstance->getString( "forgot_password_url" ));
-	}
-}
-
-//static
-void LLPanelLogin::onClickHelp(void*)
-{
-	if (sInstance)
-	{
-		LLViewerHelp* vhelp = LLViewerHelp::getInstance();
-		vhelp->showTopic(vhelp->preLoginTopic());
-	}
-}
-
-// static
-void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
-{
-	LLPanelLogin *This = (LLPanelLogin *) user_data;
-	This->mPasswordModified = TRUE;
-	if (gKeyboard->getKeyDown(KEY_CAPSLOCK) && sCapslockDidNotification == FALSE)
-	{
-// *TODO: use another way to notify user about enabled caps lock, see EXT-6858
-		sCapslockDidNotification = TRUE;
-	}
-}
-
-
-void LLPanelLogin::updateServer()
-{
-	try 
-	{
-
-		updateServerCombo();	
-		// if they've selected another grid, we should load the credentials
-		// for that grid and set them to the UI.
-		if(sInstance && !sInstance->areCredentialFieldsDirty())
-		{
-			LLPointer<LLCredential> credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());	
-			bool remember = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
-			sInstance->setFields(credential, remember);
-		}
-		// grid changed so show new splash screen (possibly)
-		loadLoginPage();
-		updateLocationCombo(LLStartUp::getStartSLURL().getType() == LLSLURL::LOCATION);
-	}
-	catch (LLInvalidGridName ex)
-	{
-		// do nothing
-	}
-}
-
-void LLPanelLogin::updateServerCombo()
-{
-	if (!sInstance) 
-	{
-		return;	
-	}
-	// We add all of the possible values, sorted, and then add a bar and the current value at the top
-	LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");	
-	server_choice_combo->removeall();
-
-	std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids(!gSavedSettings.getBOOL("ShowBetaGrids"));
-
-	for (std::map<std::string, std::string>::iterator grid_choice = known_grids.begin();
-		 grid_choice != known_grids.end();
-		 grid_choice++)
-	{
-		if (!grid_choice->first.empty())
-		{
-			server_choice_combo->add(grid_choice->second, grid_choice->first);
-		}
-	}
-	server_choice_combo->sortByName();
-	
-	server_choice_combo->addSeparator(ADD_TOP);
-	
-	server_choice_combo->add(LLGridManager::getInstance()->getGridLabel(), 
-		LLGridManager::getInstance()->getGrid(), ADD_TOP);	
-	
-	server_choice_combo->selectFirstItem();	
-}
-
-// static
-void LLPanelLogin::onSelectServer(LLUICtrl*, void*)
-{
-	// *NOTE: The paramters for this method are ignored. 
-	// LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*)
-	// calls this method.
-	LL_INFOS("AppInit") << "onSelectServer" << LL_ENDL;
-	// The user twiddled with the grid choice ui.
-	// apply the selection to the grid setting.
-	LLPointer<LLCredential> credential;
-	
-	LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
-	LLSD combo_val = combo->getSelectedValue();
-	if (combo_val.isUndefined())
-	{
-		combo_val = combo->getValue();
-	}
-	
-	combo = sInstance->getChild<LLComboBox>("start_location_combo");	
-	combo->setCurrentByIndex(1);
-	LLStartUp::setStartSLURL(LLSLURL(gSavedSettings.getString("LoginLocation")));
-	LLGridManager::getInstance()->setGridChoice(combo_val.asString());
-	// This new selection will override preset uris
-	// from the command line.
-	updateServer();
-	updateLocationCombo(false);
-	updateLoginPanelLinks();
-}
-
-void LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe)
-{
-	if (!sInstance)
-	{
-		return;
-	}
-
-	LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
-	if(fe == combo)
-	{
-		onSelectServer(combo, NULL);	
-	}
-}
-
-void LLPanelLogin::updateLoginPanelLinks()
-{
-	LLSD grid_data;
-	LLGridManager::getInstance()->getGridInfo(grid_data);
-	bool system_grid = grid_data.has(GRID_IS_SYSTEM_GRID_VALUE);
-	
-	// need to call through sInstance, as it's called from onSelectServer, which
-	// is static.
-	sInstance->getChildView("create_new_account_text")->setVisible( system_grid);
-	sInstance->getChildView("forgot_password_text")->setVisible( system_grid);
-}
-
-//static
-void LLPanelLogin::onModeChange()
-{
-	LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(&onModeChangeConfirm, _1, _2));
-}
-
-//static
-void LLPanelLogin::onModeChangeConfirm(const LLSD& notification, const LLSD& response)
-{
-	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-	switch (option)
-	{
-	case 0:
-		LLAppViewer::instance()->requestQuit();
-		break;
-	case 1:
-		// do nothing
-		break;
-	default:
-		break;
-	}
-}
+/** 
+ * @file llpanellogin.cpp
+ * @brief Login dialog and logo display
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanellogin.h"
+
+#include "indra_constants.h"		// for key and mask constants
+#include "llfloaterreg.h"
+#include "llfontgl.h"
+#include "llmd5.h"
+#include "llsecondlifeurls.h"
+#include "v4color.h"
+
+#include "llappviewer.h"
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcommandhandler.h"		// for secondlife:///app/login/
+#include "llcombobox.h"
+#include "llcurl.h"
+#include "llviewercontrol.h"
+#include "llfloaterpreference.h"
+#include "llfocusmgr.h"
+#include "lllineeditor.h"
+#include "llnotificationsutil.h"
+#include "llsecapi.h"
+#include "llstartup.h"
+#include "lltextbox.h"
+#include "llui.h"
+#include "lluiconstants.h"
+#include "llslurl.h"
+#include "llversioninfo.h"
+#include "llviewerhelp.h"
+#include "llviewertexturelist.h"
+#include "llviewermenu.h"			// for handle_preferences()
+#include "llviewernetwork.h"
+#include "llviewerwindow.h"			// to link into child list
+#include "lluictrlfactory.h"
+#include "llhttpclient.h"
+#include "llweb.h"
+#include "llmediactrl.h"
+#include "llrootview.h"
+
+#include "llfloatertos.h"
+#include "lltrans.h"
+#include "llglheaders.h"
+#include "llpanelloginlistener.h"
+
+#if LL_WINDOWS
+#pragma warning(disable: 4355)      // 'this' used in initializer list
+#endif  // LL_WINDOWS
+
+#include "llsdserialize.h"
+
+const S32 BLACK_BORDER_HEIGHT = 160;
+const S32 MAX_PASSWORD = 16;
+
+LLPanelLogin *LLPanelLogin::sInstance = NULL;
+BOOL LLPanelLogin::sCapslockDidNotification = FALSE;
+
+
+class LLLoginRefreshHandler : public LLCommandHandler
+{
+public:
+	// don't allow from external browsers
+	LLLoginRefreshHandler() : LLCommandHandler("login_refresh", UNTRUSTED_BLOCK) { }
+	bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web)
+	{	
+		if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP)
+		{
+			LLPanelLogin::loadLoginPage();
+		}	
+		return true;
+	}
+};
+
+LLLoginRefreshHandler gLoginRefreshHandler;
+
+
+// helper class that trys to download a URL from a web site and calls a method 
+// on parent class indicating if the web server is working or not
+class LLIamHereLogin : public LLHTTPClient::Responder
+{
+	private:
+		LLIamHereLogin( LLPanelLogin* parent ) :
+		   mParent( parent )
+		{}
+
+		LLPanelLogin* mParent;
+
+	public:
+		static boost::intrusive_ptr< LLIamHereLogin > build( LLPanelLogin* parent )
+		{
+			return boost::intrusive_ptr< LLIamHereLogin >( new LLIamHereLogin( parent ) );
+		};
+
+		virtual void  setParent( LLPanelLogin* parentIn )
+		{
+			mParent = parentIn;
+		};
+
+		// We don't actually expect LLSD back, so need to override completedRaw
+		virtual void completedRaw(U32 status, const std::string& reason,
+								  const LLChannelDescriptors& channels,
+								  const LLIOPipe::buffer_ptr_t& buffer)
+		{
+			completed(status, reason, LLSD()); // will call result() or error()
+		}
+	
+		virtual void result( const LLSD& content )
+		{
+			if ( mParent )
+				mParent->setSiteIsAlive( true );
+		};
+
+		virtual void error( U32 status, const std::string& reason )
+		{
+			if ( mParent )
+				mParent->setSiteIsAlive( false );
+		};
+};
+
+// this is global and not a class member to keep crud out of the header file
+namespace {
+	boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0;
+};
+
+
+//---------------------------------------------------------------------------
+// Public methods
+//---------------------------------------------------------------------------
+LLPanelLogin::LLPanelLogin(const LLRect &rect,
+						 BOOL show_server,
+						 void (*callback)(S32 option, void* user_data),
+						 void *cb_data)
+:	LLPanel(),
+	mLogoImage(),
+	mCallback(callback),
+	mCallbackData(cb_data),
+	mHtmlAvailable( TRUE ),
+	mListener(new LLPanelLoginListener(this))
+{
+	setBackgroundVisible(FALSE);
+	setBackgroundOpaque(TRUE);
+
+	// instance management
+	if (LLPanelLogin::sInstance)
+	{
+		llwarns << "Duplicate instance of login view deleted" << llendl;
+		// Don't leave bad pointer in gFocusMgr
+		gFocusMgr.setDefaultKeyboardFocus(NULL);
+
+		delete LLPanelLogin::sInstance;
+	}
+
+	mPasswordModified = FALSE;
+	LLPanelLogin::sInstance = this;
+
+	LLView* login_holder = gViewerWindow->getLoginPanelHolder();
+	if (login_holder)
+	{
+		login_holder->addChild(this);
+	}
+
+	// Logo
+	mLogoImage = LLUI::getUIImage("startup_logo");
+
+	buildFromFile( "panel_login.xml");
+	
+	// Legacy login web page is hidden under the menu bar.
+	// Adjust reg-in-client web browser widget to not be hidden.
+	if (gSavedSettings.getBOOL("RegInClient"))
+	{
+		reshape(rect.getWidth(), rect.getHeight() - MENU_BAR_HEIGHT);
+	}
+	else
+	{
+		reshape(rect.getWidth(), rect.getHeight());
+	}
+
+	getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this);
+
+	// change z sort of clickable text to be behind buttons
+	//sendChildToBack(getChildView("channel_text"));
+	sendChildToBack(getChildView("forgot_password_text"));
+
+	if(LLStartUp::getStartSLURL().getType() != LLSLURL::LOCATION)
+	{
+		LLSLURL slurl(gSavedSettings.getString("LoginLocation"));
+		LLStartUp::setStartSLURL(slurl);
+	}
+	updateLocationCombo(false);
+
+	gSavedSettings.getControl("SessionSettingsFile")->getSignal()->connect(boost::bind(&onModeChange));
+
+	LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
+	server_choice_combo->setCommitCallback(onSelectServer, NULL);
+	server_choice_combo->setFocusLostCallback(boost::bind(onServerComboLostFocus, _1));
+	updateServerCombo();
+
+	childSetAction("connect_btn", onClickConnect, this);
+
+	getChild<LLPanel>("login")->setDefaultBtn("connect_btn");
+
+	std::string channel = LLVersionInfo::getChannel();
+	std::string version = llformat("%s (%d)",
+								   LLVersionInfo::getShortVersion().c_str(),
+								   LLVersionInfo::getBuild());
+	//LLTextBox* channel_text = getChild<LLTextBox>("channel_text");
+	//channel_text->setTextArg("[CHANNEL]", channel); // though not displayed
+	//channel_text->setTextArg("[VERSION]", version);
+	//channel_text->setClickedCallback(onClickVersion, this);
+	
+	LLTextBox* forgot_password_text = getChild<LLTextBox>("forgot_password_text");
+	forgot_password_text->setClickedCallback(onClickForgotPassword, NULL);
+
+	LLTextBox* create_new_account_text = getChild<LLTextBox>("create_new_account_text");
+	create_new_account_text->setClickedCallback(onClickNewAccount, NULL);
+
+	LLTextBox* need_help_text = getChild<LLTextBox>("login_help");
+	need_help_text->setClickedCallback(onClickHelp, NULL);
+	
+	// get the web browser control
+	LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
+	web_browser->addObserver(this);
+	
+	// Clear the browser's cache to avoid any potential for the cache messing up the login screen.
+	web_browser->clearCache();
+
+	reshapeBrowser();
+
+	// kick off a request to grab the url manually
+	gResponsePtr = LLIamHereLogin::build( this );
+
+	LLHTTPClient::head( LLGridManager::getInstance()->getLoginPage(), gResponsePtr );
+
+	// Show last logged in user favorites in "Start at" combo.
+	addUsersWithFavoritesToUsername();
+	getChild<LLComboBox>("username_combo")->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this));
+
+	updateLocationCombo(false);
+
+}
+
+void LLPanelLogin::addUsersWithFavoritesToUsername()
+{
+	LLComboBox* combo = getChild<LLComboBox>("username_combo");
+	if (!combo) return;
+	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
+	LLSD fav_llsd;
+	llifstream file;
+	file.open(filename);
+	if (!file.is_open()) return;
+	LLSDSerialize::fromXML(fav_llsd, file);
+	for (LLSD::map_const_iterator iter = fav_llsd.beginMap();
+		iter != fav_llsd.endMap(); ++iter)
+	{
+		combo->add(iter->first);
+	}
+}
+
+void LLPanelLogin::addFavoritesToStartLocation()
+{
+	LLComboBox* combo = getChild<LLComboBox>("start_location_combo");
+	if (!combo) return;
+	int num_items = combo->getItemCount();
+	for (int i = num_items - 1; i > 2; i--)
+	{
+		combo->remove(i);
+	}
+	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
+	LLSD fav_llsd;
+	llifstream file;
+	file.open(filename);
+	if (!file.is_open()) return;
+	LLSDSerialize::fromXML(fav_llsd, file);
+	for (LLSD::map_const_iterator iter = fav_llsd.beginMap();
+		iter != fav_llsd.endMap(); ++iter)
+	{
+		if(iter->first != getChild<LLComboBox>("username_combo")->getSimple()) continue;
+		combo->addSeparator();
+		LLSD user_llsd = iter->second;
+		for (LLSD::array_const_iterator iter1 = user_llsd.beginArray();
+			iter1 != user_llsd.endArray(); ++iter1)
+		{
+			std::string label = (*iter1)["name"].asString();
+			std::string value = (*iter1)["slurl"].asString();
+			if(label != "" && value != "")
+			{
+				combo->add(label, value);
+			}
+		}
+		break;
+	}
+}
+
+// force the size to be correct (XML doesn't seem to be sufficient to do this)
+// (with some padding so the other login screen doesn't show through)
+void LLPanelLogin::reshapeBrowser()
+{
+	LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
+	LLRect rect = gViewerWindow->getWindowRectScaled();
+	LLRect html_rect;
+	html_rect.setCenterAndSize(
+		rect.getCenterX() - 2, rect.getCenterY() + 40,
+		rect.getWidth() + 6, rect.getHeight() - 78 );
+	web_browser->setRect( html_rect );
+	web_browser->reshape( html_rect.getWidth(), html_rect.getHeight(), TRUE );
+	reshape( rect.getWidth(), rect.getHeight(), 1 );
+}
+
+void LLPanelLogin::setSiteIsAlive( bool alive )
+{
+	LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
+	// if the contents of the site was retrieved
+	if ( alive )
+	{
+		if ( web_browser )
+		{
+			loadLoginPage();
+			
+			// mark as available
+			mHtmlAvailable = TRUE;
+		}
+	}
+	else
+	// the site is not available (missing page, server down, other badness)
+	{
+		if ( web_browser )
+		{
+			// hide browser control (revealing default one)
+			web_browser->setVisible( FALSE );
+
+			// mark as unavailable
+			mHtmlAvailable = FALSE;
+		}
+	}
+}
+
+
+LLPanelLogin::~LLPanelLogin()
+{
+	LLPanelLogin::sInstance = NULL;
+
+	// tell the responder we're not here anymore
+	if ( gResponsePtr )
+		gResponsePtr->setParent( 0 );
+
+	//// We know we're done with the image, so be rid of it.
+	//gTextureList.deleteImage( mLogoImage );
+
+	// Controls having keyboard focus by default
+	// must reset it on destroy. (EXT-2748)
+	gFocusMgr.setDefaultKeyboardFocus(NULL);
+}
+
+// virtual
+void LLPanelLogin::draw()
+{
+	glPushMatrix();
+	{
+		F32 image_aspect = 1.333333f;
+		F32 view_aspect = (F32)getRect().getWidth() / (F32)getRect().getHeight();
+		// stretch image to maintain aspect ratio
+		if (image_aspect > view_aspect)
+		{
+			glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * getRect().getWidth(), 0.f, 0.f);
+			glScalef(image_aspect / view_aspect, 1.f, 1.f);
+		}
+
+		S32 width = getRect().getWidth();
+		S32 height = getRect().getHeight();
+
+		if ( mHtmlAvailable )
+		{
+			if (getChild<LLView>("login_widgets")->getVisible())
+			{
+				// draw a background box in black
+				gl_rect_2d( 0, height - 264, width, 264, LLColor4::black );
+				// draw the bottom part of the background image
+				// just the blue background to the native client UI
+				mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight());
+			}
+		}
+		else
+		{
+			// the HTML login page is not available so default to the original screen
+			S32 offscreen_part = height / 3;
+			mLogoImage->draw(0, -offscreen_part, width, height+offscreen_part);
+		};
+	}
+	glPopMatrix();
+
+	LLPanel::draw();
+}
+
+// virtual
+BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask)
+{
+	if ( KEY_F1 == key )
+	{
+		LLViewerHelp* vhelp = LLViewerHelp::getInstance();
+		vhelp->showTopic(vhelp->f1HelpTopic());
+		return TRUE;
+	}
+
+	return LLPanel::handleKeyHere(key, mask);
+}
+
+// virtual 
+void LLPanelLogin::setFocus(BOOL b)
+{
+	if(b != hasFocus())
+	{
+		if(b)
+		{
+			LLPanelLogin::giveFocus();
+		}
+		else
+		{
+			LLPanel::setFocus(b);
+		}
+	}
+}
+
+// static
+void LLPanelLogin::giveFocus()
+{
+	if( sInstance )
+	{
+		// Grab focus and move cursor to first blank input field
+		std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
+		std::string pass = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
+
+		BOOL have_username = !username.empty();
+		BOOL have_pass = !pass.empty();
+
+		LLLineEditor* edit = NULL;
+		LLComboBox* combo = NULL;
+		if (have_username && !have_pass)
+		{
+			// User saved his name but not his password.  Move
+			// focus to password field.
+			edit = sInstance->getChild<LLLineEditor>("password_edit");
+		}
+		else
+		{
+			// User doesn't have a name, so start there.
+			combo = sInstance->getChild<LLComboBox>("username_combo");
+		}
+
+		if (edit)
+		{
+			edit->setFocus(TRUE);
+			edit->selectAll();
+		}
+		else if (combo)
+		{
+			combo->setFocus(TRUE);
+		}
+	}
+}
+
+// static
+void LLPanelLogin::showLoginWidgets()
+{
+	// *NOTE: Mani - This may or may not be obselete code.
+	// It seems to be part of the defunct? reg-in-client project.
+	sInstance->getChildView("login_widgets")->setVisible( true);
+	LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
+	sInstance->reshapeBrowser();
+	// *TODO: Append all the usual login parameters, like first_login=Y etc.
+	std::string splash_screen_url = LLGridManager::getInstance()->getLoginPage();
+	web_browser->navigateTo( splash_screen_url, "text/html" );
+	LLUICtrl* username_combo = sInstance->getChild<LLUICtrl>("username_combo");
+	username_combo->setFocus(TRUE);
+}
+
+// static
+void LLPanelLogin::show(const LLRect &rect,
+						BOOL show_server,
+						void (*callback)(S32 option, void* user_data),
+						void* callback_data)
+{
+	new LLPanelLogin(rect, show_server, callback, callback_data);
+
+	if( !gFocusMgr.getKeyboardFocus() )
+	{
+		// Grab focus and move cursor to first enabled control
+		sInstance->setFocus(TRUE);
+	}
+
+	// Make sure that focus always goes here (and use the latest sInstance that was just created)
+	gFocusMgr.setDefaultKeyboardFocus(sInstance);
+}
+
+// static
+void LLPanelLogin::setFields(LLPointer<LLCredential> credential,
+							 BOOL remember)
+{
+	if (!sInstance)
+	{
+		llwarns << "Attempted fillFields with no login view shown" << llendl;
+		return;
+	}
+	LL_INFOS("Credentials") << "Setting login fields to " << *credential << LL_ENDL;
+
+	LLSD identifier = credential->getIdentifier();
+	if((std::string)identifier["type"] == "agent") 
+	{
+		std::string firstname = identifier["first_name"].asString();
+		std::string lastname = identifier["last_name"].asString();
+	    std::string login_id = firstname;
+	    if (!lastname.empty() && lastname != "Resident")
+	    {
+		    // support traditional First Last name SLURLs
+		    login_id += " ";
+		    login_id += lastname;
+	    }
+		sInstance->getChild<LLComboBox>("username_combo")->setLabel(login_id);	
+	}
+	else if((std::string)identifier["type"] == "account")
+	{
+		sInstance->getChild<LLComboBox>("username_combo")->setLabel((std::string)identifier["account_name"]);		
+	}
+	else
+	{
+	  sInstance->getChild<LLComboBox>("username_combo")->setLabel(std::string());	
+	}
+	sInstance->addFavoritesToStartLocation();
+	// if the password exists in the credential, set the password field with
+	// a filler to get some stars
+	LLSD authenticator = credential->getAuthenticator();
+	LL_INFOS("Credentials") << "Setting authenticator field " << authenticator["type"].asString() << LL_ENDL;
+	if(authenticator.isMap() && 
+	   authenticator.has("secret") && 
+	   (authenticator["secret"].asString().size() > 0))
+	{
+		
+		// This is a MD5 hex digest of a password.
+		// We don't actually use the password input field, 
+		// fill it with MAX_PASSWORD characters so we get a 
+		// nice row of asterixes.
+		const std::string filler("123456789!123456");
+		sInstance->getChild<LLUICtrl>("password_edit")->setValue(std::string("123456789!123456"));
+	}
+	else
+	{
+		sInstance->getChild<LLUICtrl>("password_edit")->setValue(std::string());		
+	}
+	sInstance->getChild<LLUICtrl>("remember_check")->setValue(remember);
+}
+
+
+// static
+void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
+							 BOOL& remember)
+{
+	if (!sInstance)
+	{
+		llwarns << "Attempted getFields with no login view shown" << llendl;
+		return;
+	}
+	
+	// load the credential so we can pass back the stored password or hash if the user did
+	// not modify the password field.
+	
+	credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
+
+	LLSD identifier = LLSD::emptyMap();
+	LLSD authenticator = LLSD::emptyMap();
+	
+	if(credential.notNull())
+	{
+		authenticator = credential->getAuthenticator();
+	}
+
+	std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
+	LLStringUtil::trim(username);
+	std::string password = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
+
+	LL_INFOS2("Credentials", "Authentication") << "retrieving username:" << username << LL_ENDL;
+	// determine if the username is a first/last form or not.
+	size_t separator_index = username.find_first_of(' ');
+	if (separator_index == username.npos
+		&& !LLGridManager::getInstance()->isSystemGrid())
+	{
+		LL_INFOS2("Credentials", "Authentication") << "account: " << username << LL_ENDL;
+		// single username, so this is a 'clear' identifier
+		identifier["type"] = CRED_IDENTIFIER_TYPE_ACCOUNT;
+		identifier["account_name"] = username;
+		
+		if (LLPanelLogin::sInstance->mPasswordModified)
+		{
+			authenticator = LLSD::emptyMap();
+			// password is plaintext
+			authenticator["type"] = CRED_AUTHENTICATOR_TYPE_CLEAR;
+			authenticator["secret"] = password;
+		}
+	}
+	else
+	{
+		// Be lenient in terms of what separators we allow for two-word names
+		// and allow legacy users to login with firstname.lastname
+		separator_index = username.find_first_of(" ._");
+		std::string first = username.substr(0, separator_index);
+		std::string last;
+		if (separator_index != username.npos)
+		{
+			last = username.substr(separator_index+1, username.npos);
+		LLStringUtil::trim(last);
+		}
+		else
+		{
+			// ...on Linden grids, single username users as considered to have
+			// last name "Resident"
+			// *TODO: Make login.cgi support "account_name" like above
+			last = "Resident";
+		}
+		
+		if (last.find_first_of(' ') == last.npos)
+		{
+			LL_INFOS2("Credentials", "Authentication") << "agent: " << username << LL_ENDL;
+			// traditional firstname / lastname
+			identifier["type"] = CRED_IDENTIFIER_TYPE_AGENT;
+			identifier["first_name"] = first;
+			identifier["last_name"] = last;
+		
+			if (LLPanelLogin::sInstance->mPasswordModified)
+			{
+				authenticator = LLSD::emptyMap();
+				authenticator["type"] = CRED_AUTHENTICATOR_TYPE_HASH;
+				authenticator["algorithm"] = "md5";
+				LLMD5 pass((const U8 *)password.c_str());
+				char md5pass[33];               /* Flawfinder: ignore */
+				pass.hex_digest(md5pass);
+				authenticator["secret"] = md5pass;
+			}
+		}
+	}
+	credential = gSecAPIHandler->createCredential(LLGridManager::getInstance()->getGrid(), identifier, authenticator);
+	remember = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
+}
+
+// static
+BOOL LLPanelLogin::isGridComboDirty()
+{
+	BOOL user_picked = FALSE;
+	if (!sInstance)
+	{
+		llwarns << "Attempted getServer with no login view shown" << llendl;
+	}
+	else
+	{
+		LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
+		user_picked = combo->isDirty();
+	}
+	return user_picked;
+}
+
+// static
+BOOL LLPanelLogin::areCredentialFieldsDirty()
+{
+	if (!sInstance)
+	{
+		llwarns << "Attempted getServer with no login view shown" << llendl;
+	}
+	else
+	{
+		std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
+		LLStringUtil::trim(username);
+		std::string password = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
+		LLComboBox* combo = sInstance->getChild<LLComboBox>("username_combo");
+		if(combo && combo->isDirty())
+		{
+			return true;
+		}
+		LLLineEditor* ctrl = sInstance->getChild<LLLineEditor>("password_edit");
+		if(ctrl && ctrl->isDirty()) 
+		{
+			return true;
+		}
+	}
+	return false;	
+}
+
+
+// static
+void LLPanelLogin::updateLocationCombo( bool force_visible )
+{
+	if (!sInstance) 
+	{
+		return;
+	}	
+	
+	LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
+	
+	switch(LLStartUp::getStartSLURL().getType())
+	{
+		case LLSLURL::LOCATION:
+		{
+			
+			combo->setCurrentByIndex( 2 );	
+			combo->setTextEntry(LLStartUp::getStartSLURL().getLocationString());	
+			break;
+		}
+		case LLSLURL::HOME_LOCATION:
+			combo->setCurrentByIndex(1);
+			break;
+		default:
+			combo->setCurrentByIndex(0);
+			break;
+	}
+	
+	BOOL show_start = TRUE;
+	
+	if ( ! force_visible )
+		show_start = gSavedSettings.getBOOL("ShowStartLocation");
+	
+	sInstance->getChildView("start_location_combo")->setVisible( show_start);
+	sInstance->getChildView("start_location_text")->setVisible( show_start);
+	
+	BOOL show_server = gSavedSettings.getBOOL("ForceShowGrid");
+	sInstance->getChildView("server_combo_text")->setVisible( show_server);	
+	sInstance->getChildView("server_combo")->setVisible( show_server);
+}
+
+// static
+void LLPanelLogin::updateStartSLURL()
+{
+	if (!sInstance) return;
+	
+	LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
+	S32 index = combo->getCurrentIndex();
+	
+	switch (index)
+	{
+		case 0:
+		{
+			LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_LAST));
+			break;
+		}			
+		case 1:
+		{
+			LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));
+			break;
+		}
+		default:
+		{
+			LLSLURL slurl = LLSLURL(combo->getValue().asString());
+			if(slurl.getType() == LLSLURL::LOCATION)
+			{
+				// we've changed the grid, so update the grid selection
+				LLStartUp::setStartSLURL(slurl);
+			}
+			break;
+		}			
+	}
+}
+
+
+void LLPanelLogin::setLocation(const LLSLURL& slurl)
+{
+	LLStartUp::setStartSLURL(slurl);
+	updateServer();
+}
+
+// static
+void LLPanelLogin::closePanel()
+{
+	if (sInstance)
+	{
+		LLPanelLogin::sInstance->getParent()->removeChild( LLPanelLogin::sInstance );
+
+		delete sInstance;
+		sInstance = NULL;
+	}
+}
+
+// static
+void LLPanelLogin::setAlwaysRefresh(bool refresh)
+{
+	if (LLStartUp::getStartupState() >= STATE_LOGIN_CLEANUP) return;
+
+	LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
+
+	if (web_browser)
+	{
+		web_browser->setAlwaysRefresh(refresh);
+	}
+}
+
+
+
+void LLPanelLogin::loadLoginPage()
+{
+	if (!sInstance) return;
+	
+	std::ostringstream oStr;
+
+	std::string login_page = LLGridManager::getInstance()->getLoginPage();
+
+	oStr << login_page;
+	
+	// Use the right delimeter depending on how LLURI parses the URL
+	LLURI login_page_uri = LLURI(login_page);
+	
+	std::string first_query_delimiter = "&";
+	if (login_page_uri.queryMap().size() == 0)
+	{
+		first_query_delimiter = "?";
+	}
+
+	// Language
+	std::string language = LLUI::getLanguage();
+	oStr << first_query_delimiter<<"lang=" << language;
+	
+	// First Login?
+	if (gSavedSettings.getBOOL("FirstLoginThisInstall"))
+	{
+		oStr << "&firstlogin=TRUE";
+	}
+
+	// Channel and Version
+	std::string version = llformat("%s (%d)",
+								   LLVersionInfo::getShortVersion().c_str(),
+								   LLVersionInfo::getBuild());
+
+	char* curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0);
+	char* curl_version = curl_escape(version.c_str(), 0);
+
+	oStr << "&channel=" << curl_channel;
+	oStr << "&version=" << curl_version;
+
+	curl_free(curl_channel);
+	curl_free(curl_version);
+
+	// Grid
+	char* curl_grid = curl_escape(LLGridManager::getInstance()->getGridLabel().c_str(), 0);
+	oStr << "&grid=" << curl_grid;
+	curl_free(curl_grid);
+	
+	// add OS info
+	char * os_info = curl_escape(LLAppViewer::instance()->getOSInfo().getOSStringSimple().c_str(), 0);
+	oStr << "&os=" << os_info;
+	curl_free(os_info);
+	
+	
+	gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid());
+	gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor());
+	
+	LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
+
+	// navigate to the "real" page
+	if (gSavedSettings.getBOOL("RegInClient"))
+	{
+		web_browser->setFocus(TRUE);
+		login_page = sInstance->getString("reg_in_client_url");
+		web_browser->navigateTo(login_page, "text/html");
+	}
+	else
+	{
+		web_browser->navigateTo( oStr.str(), "text/html" );
+	}
+}
+
+void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event)
+{
+	if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
+	{
+		LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
+		if (web_browser)
+		{
+			// *HACK HACK HACK HACK!
+			/* Stuff a Tab key into the browser now so that the first field will
+			** get the focus!  The embedded javascript on the page that properly
+			** sets the initial focus in a real web browser is not working inside
+			** the viewer, so this is an UGLY HACK WORKAROUND for now.
+			*/
+			// Commented out as it's not reliable
+			//web_browser->handleKey(KEY_TAB, MASK_NONE, false);
+		}
+	}
+}
+
+//---------------------------------------------------------------------------
+// Protected methods
+//---------------------------------------------------------------------------
+
+// static
+void LLPanelLogin::onClickConnect(void *)
+{
+	if (sInstance && sInstance->mCallback)
+	{
+		// tell the responder we're not here anymore
+		if ( gResponsePtr )
+			gResponsePtr->setParent( 0 );
+
+		// JC - Make sure the fields all get committed.
+		sInstance->setFocus(FALSE);
+
+		LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
+		LLSD combo_val = combo->getSelectedValue();
+		if (combo_val.isUndefined())
+		{
+			combo_val = combo->getValue();
+		}
+		if(combo_val.isUndefined())
+		{
+			LLNotificationsUtil::add("StartRegionEmpty");
+			return;
+		}		
+		try
+		{
+			LLGridManager::getInstance()->setGridChoice(combo_val.asString());
+		}
+		catch (LLInvalidGridName ex)
+		{
+			LLSD args;
+			args["GRID"] = combo_val.asString();
+			LLNotificationsUtil::add("InvalidGrid", args);
+			return;
+		}
+		updateStartSLURL();
+		std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
+
+		
+		if(username.empty())
+		{
+			// user must type in something into the username field
+			LLNotificationsUtil::add("MustHaveAccountToLogIn");
+		}
+		else
+		{
+			LLPointer<LLCredential> cred;
+			BOOL remember;
+			getFields(cred, remember);
+			std::string identifier_type;
+			cred->identifierType(identifier_type);
+			LLSD allowed_credential_types;
+			LLGridManager::getInstance()->getLoginIdentifierTypes(allowed_credential_types);
+			
+			// check the typed in credential type against the credential types expected by the server.
+			for(LLSD::array_iterator i = allowed_credential_types.beginArray();
+				i != allowed_credential_types.endArray();
+				i++)
+			{
+				
+				if(i->asString() == identifier_type)
+				{
+					// yay correct credential type
+					sInstance->mCallback(0, sInstance->mCallbackData);
+					return;
+				}
+			}
+			
+			// Right now, maingrid is the only thing that is picky about
+			// credential format, as it doesn't yet allow account (single username)
+			// format creds.  - Rox.  James, we wanna fix the message when we change
+			// this.
+			LLNotificationsUtil::add("InvalidCredentialFormat");			
+		}
+	}
+}
+
+/*
+// static
+bool LLPanelLogin::newAccountAlertCallback(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+	if (0 == option)
+	{
+		llinfos << "Going to account creation URL" << llendl;
+		LLWeb::loadURLExternal( LLNotifications::instance().getGlobalString("CREATE_ACCOUNT_URL")); 
+	}
+	else
+	{
+		sInstance->setFocus(TRUE);
+	}
+	return false;
+}
+*/
+
+// static
+void LLPanelLogin::onClickNewAccount(void*)
+{
+	LLWeb::loadURLExternal(sInstance->getString("create_account_url"));
+}
+
+
+// static
+void LLPanelLogin::onClickVersion(void*)
+{
+	LLFloaterReg::showInstance("sl_about"); 
+}
+
+//static
+void LLPanelLogin::onClickForgotPassword(void*)
+{
+	if (sInstance )
+	{
+		LLWeb::loadURLExternal(sInstance->getString( "forgot_password_url" ));
+	}
+}
+
+//static
+void LLPanelLogin::onClickHelp(void*)
+{
+	if (sInstance)
+	{
+		LLViewerHelp* vhelp = LLViewerHelp::getInstance();
+		vhelp->showTopic(vhelp->preLoginTopic());
+	}
+}
+
+// static
+void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
+{
+	LLPanelLogin *This = (LLPanelLogin *) user_data;
+	This->mPasswordModified = TRUE;
+	if (gKeyboard->getKeyDown(KEY_CAPSLOCK) && sCapslockDidNotification == FALSE)
+	{
+// *TODO: use another way to notify user about enabled caps lock, see EXT-6858
+		sCapslockDidNotification = TRUE;
+	}
+}
+
+
+void LLPanelLogin::updateServer()
+{
+	try 
+	{
+
+		updateServerCombo();	
+		// if they've selected another grid, we should load the credentials
+		// for that grid and set them to the UI.
+		if(sInstance && !sInstance->areCredentialFieldsDirty())
+		{
+			LLPointer<LLCredential> credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());	
+			bool remember = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
+			sInstance->setFields(credential, remember);
+		}
+		// grid changed so show new splash screen (possibly)
+		loadLoginPage();
+		updateLocationCombo(LLStartUp::getStartSLURL().getType() == LLSLURL::LOCATION);
+	}
+	catch (LLInvalidGridName ex)
+	{
+		// do nothing
+	}
+}
+
+void LLPanelLogin::updateServerCombo()
+{
+	if (!sInstance) 
+	{
+		return;	
+	}
+	// We add all of the possible values, sorted, and then add a bar and the current value at the top
+	LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");	
+	server_choice_combo->removeall();
+
+	std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids(!gSavedSettings.getBOOL("ShowBetaGrids"));
+
+	for (std::map<std::string, std::string>::iterator grid_choice = known_grids.begin();
+		 grid_choice != known_grids.end();
+		 grid_choice++)
+	{
+		if (!grid_choice->first.empty())
+		{
+			server_choice_combo->add(grid_choice->second, grid_choice->first);
+		}
+	}
+	server_choice_combo->sortByName();
+	
+	server_choice_combo->addSeparator(ADD_TOP);
+	
+	server_choice_combo->add(LLGridManager::getInstance()->getGridLabel(), 
+		LLGridManager::getInstance()->getGrid(), ADD_TOP);	
+	
+	server_choice_combo->selectFirstItem();	
+}
+
+// static
+void LLPanelLogin::onSelectServer(LLUICtrl*, void*)
+{
+	// *NOTE: The paramters for this method are ignored. 
+	// LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*)
+	// calls this method.
+	LL_INFOS("AppInit") << "onSelectServer" << LL_ENDL;
+	// The user twiddled with the grid choice ui.
+	// apply the selection to the grid setting.
+	LLPointer<LLCredential> credential;
+	
+	LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
+	LLSD combo_val = combo->getSelectedValue();
+	if (combo_val.isUndefined())
+	{
+		combo_val = combo->getValue();
+	}
+	
+	combo = sInstance->getChild<LLComboBox>("start_location_combo");	
+	combo->setCurrentByIndex(1);
+	LLStartUp::setStartSLURL(LLSLURL(gSavedSettings.getString("LoginLocation")));
+	LLGridManager::getInstance()->setGridChoice(combo_val.asString());
+	// This new selection will override preset uris
+	// from the command line.
+	updateServer();
+	updateLocationCombo(false);
+	updateLoginPanelLinks();
+}
+
+void LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe)
+{
+	if (!sInstance)
+	{
+		return;
+	}
+
+	LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
+	if(fe == combo)
+	{
+		onSelectServer(combo, NULL);	
+	}
+}
+
+void LLPanelLogin::updateLoginPanelLinks()
+{
+	LLSD grid_data;
+	LLGridManager::getInstance()->getGridInfo(grid_data);
+	bool system_grid = grid_data.has(GRID_IS_SYSTEM_GRID_VALUE);
+	
+	// need to call through sInstance, as it's called from onSelectServer, which
+	// is static.
+	sInstance->getChildView("create_new_account_text")->setVisible( system_grid);
+	sInstance->getChildView("forgot_password_text")->setVisible( system_grid);
+}
+
+//static
+void LLPanelLogin::onModeChange()
+{
+	LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(&onModeChangeConfirm, _1, _2));
+}
+
+//static
+void LLPanelLogin::onModeChangeConfirm(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+	switch (option)
+	{
+	case 0:
+		LLAppViewer::instance()->requestQuit();
+		break;
+	case 1:
+		// do nothing
+		break;
+	default:
+		break;
+	}
+}
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 0300ea0c928e276d75bbd63b9b1d7796cbcbe198..64af6c2157b97cf1d6cdea643288cd6ec9de8a27 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -67,7 +67,6 @@
 #include "pipeline.h"
 #include "llviewercontrol.h"
 #include "lluictrlfactory.h"
-#include "llmeshrepository.h"
 //#include "llfirstuse.h"
 
 #include "lldrawpool.h"
@@ -132,27 +131,7 @@ BOOL	LLPanelObject::postBuild()
 	// Phantom checkbox
 	mCheckPhantom = getChild<LLCheckBoxCtrl>("Phantom Checkbox Ctrl");
 	childSetCommitCallback("Phantom Checkbox Ctrl",onCommitPhantom,this);
-	
-	// PhysicsShapeType combobox
-	mComboPhysicsShapeType = getChild<LLComboBox>("Physics Shape Type Combo Ctrl");
-	mComboPhysicsShapeType->setCommitCallback(boost::bind(&LLPanelObject::sendPhysicsShapeType, this, _1, mComboPhysicsShapeType));
-	
-	// PhysicsGravity
-	mSpinPhysicsGravity = getChild<LLSpinCtrl>("Physics Gravity");
-	mSpinPhysicsGravity->setCommitCallback(boost::bind(&LLPanelObject::sendPhysicsGravity, this, _1, mSpinPhysicsGravity));
-
-	// PhysicsFriction
-	mSpinPhysicsFriction = getChild<LLSpinCtrl>("Physics Friction");
-	mSpinPhysicsFriction->setCommitCallback(boost::bind(&LLPanelObject::sendPhysicsFriction, this, _1, mSpinPhysicsFriction));
-
-	// PhysicsDensity
-	mSpinPhysicsDensity = getChild<LLSpinCtrl>("Physics Density");
-	mSpinPhysicsDensity->setCommitCallback(boost::bind(&LLPanelObject::sendPhysicsDensity, this, _1, mSpinPhysicsDensity));
-
-	// PhysicsRestitution
-	mSpinPhysicsRestitution = getChild<LLSpinCtrl>("Physics Restitution");
-	mSpinPhysicsRestitution->setCommitCallback(boost::bind(&LLPanelObject::sendPhysicsRestitution, this, _1, mSpinPhysicsRestitution));
-
+       
 
 	// Position
 	mLabelPosition = getChild<LLTextBox>("label position");
@@ -541,19 +520,7 @@ void LLPanelObject::getState( )
 	mCheckPhantom->set( mIsPhantom );
 	mCheckPhantom->setEnabled( roots_selected>0 && editable && !is_flexible );
 
-	
-	mSpinPhysicsGravity->set(objectp->getPhysicsGravity());
-	mSpinPhysicsGravity->setEnabled(editable);
-
-	mSpinPhysicsFriction->set(objectp->getPhysicsFriction());
-	mSpinPhysicsFriction->setEnabled(editable);
-	
-	mSpinPhysicsDensity->set(objectp->getPhysicsDensity());
-	mSpinPhysicsDensity->setEnabled(editable);
-	
-	mSpinPhysicsRestitution->set(objectp->getPhysicsRestitution());
-	mSpinPhysicsRestitution->setEnabled(editable);
-
+       
 #if 0 // 1.9.2
 	mCastShadows = root_objectp->flagCastShadows();
 	mCheckCastShadows->set( mCastShadows );
@@ -1132,15 +1099,13 @@ void LLPanelObject::getState( )
 	mCtrlSculptInvert->setVisible(sculpt_texture_visible);
 
 
-	// update the physics shape combo to include allowed physics shapes
-	mComboPhysicsShapeType->removeall();
-	mComboPhysicsShapeType->add(getString("None"), LLSD(1));
-	
 	// sculpt texture
 
 	if (selected_item == MI_SCULPT)
 	{
-        LLUUID id;
+
+
+		LLUUID id;
 		LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
 
 		
@@ -1152,27 +1117,29 @@ void LLPanelObject::getState( )
 				mSculptTypeRevert    = sculpt_params->getSculptType();
 			}
 		
+			U8 sculpt_type = sculpt_params->getSculptType();
+			U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK;
+			BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT;
+			BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR;
+			isMesh = (sculpt_stitching == LL_SCULPT_TYPE_MESH);
+
 			LLTextureCtrl*  mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
 			if(mTextureCtrl)
 			{
 				mTextureCtrl->setTentative(FALSE);
-				mTextureCtrl->setEnabled(editable);
+				mTextureCtrl->setEnabled(editable && !isMesh);
 				if (editable)
 					mTextureCtrl->setImageAssetID(sculpt_params->getSculptTexture());
 				else
 					mTextureCtrl->setImageAssetID(LLUUID::null);
 			}
 
-			U8 sculpt_type = sculpt_params->getSculptType();
-			U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK;
-			BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT;
-			BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR;
-			isMesh = (sculpt_stitching == LL_SCULPT_TYPE_MESH);
+			mComboBaseType->setEnabled(!isMesh);
 			
 			if (mCtrlSculptType)
 			{
 				mCtrlSculptType->setCurrentByIndex(sculpt_stitching);
-				mCtrlSculptType->setEnabled(editable);
+				mCtrlSculptType->setEnabled(editable && !isMesh);
 			}
 
 			if (mCtrlSculptMirror)
@@ -1199,27 +1166,6 @@ void LLPanelObject::getState( )
 		mSculptTextureRevert = LLUUID::null;		
 	}
 
-	if(isMesh && objectp)
-	{
-		const LLVolumeParams &volume_params = objectp->getVolume()->getParams();
-		LLUUID mesh_id = volume_params.getSculptID();
-		if(gMeshRepo.hasPhysicsShape(mesh_id))
-		{
-			// if a mesh contains an uploaded or decomposed physics mesh,
-			// allow 'Prim'
-			mComboPhysicsShapeType->add(getString("Prim"), LLSD(0));			
-		}
-	}
-	else
-	{
-		// simple prims always allow physics shape prim
-		mComboPhysicsShapeType->add(getString("Prim"), LLSD(0));	
-	}
-	mComboPhysicsShapeType->add(getString("Convex Hull"), LLSD(2));	
-	mComboPhysicsShapeType->setValue(LLSD(objectp->getPhysicsShapeType()));
-	mComboPhysicsShapeType->setEnabled(editable);
-										
-	
 	//----------------------------------------------------------------------------
 
 	mObject = objectp;
@@ -1282,48 +1228,6 @@ void LLPanelObject::sendIsPhantom()
 	}
 }
 
-void LLPanelObject::sendPhysicsShapeType(LLUICtrl* ctrl, void* userdata)
-{
-	U8 type = ctrl->getValue().asInteger();
-	LLSelectMgr::getInstance()->selectionSetPhysicsType(type);
-
-	refreshCost();
-}
-
-void LLPanelObject::sendPhysicsGravity(LLUICtrl* ctrl, void* userdata)
-{
-	F32 val = ctrl->getValue().asReal();
-	LLSelectMgr::getInstance()->selectionSetGravity(val);
-}
-
-void LLPanelObject::sendPhysicsFriction(LLUICtrl* ctrl, void* userdata)
-{
-	F32 val = ctrl->getValue().asReal();
-	LLSelectMgr::getInstance()->selectionSetFriction(val);
-}
-
-void LLPanelObject::sendPhysicsRestitution(LLUICtrl* ctrl, void* userdata)
-{
-	F32 val = ctrl->getValue().asReal();
-	LLSelectMgr::getInstance()->selectionSetRestitution(val);
-}
-
-void LLPanelObject::sendPhysicsDensity(LLUICtrl* ctrl, void* userdata)
-{
-	F32 val = ctrl->getValue().asReal();
-	LLSelectMgr::getInstance()->selectionSetDensity(val);
-}
-
-void LLPanelObject::refreshCost()
-{
-	LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
-	
-	if (obj)
-	{
-		obj->getObjectCost();
-	}
-}
-
 void LLPanelObject::sendCastShadows()
 {
 	BOOL value = mCheckCastShadows->get();
@@ -1924,31 +1828,23 @@ void LLPanelObject::refresh()
 	}
 	
 	bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") && 
+					   gAgent.getRegion() &&
 					   !gAgent.getRegion()->getCapability("GetMesh").empty();
 
-	getChildView("label physicsshapetype")->setVisible(enable_mesh);
-	getChildView("Physics Shape Type Combo Ctrl")->setVisible(enable_mesh);
-	getChildView("Physics Gravity")->setVisible(enable_mesh);
-	getChildView("Physics Material Override")->setVisible(enable_mesh);
-	getChildView("Physics Friction")->setVisible(enable_mesh);
-	getChildView("Physics Density")->setVisible(enable_mesh);
-	getChildView("Physics Restitution")->setVisible(enable_mesh);
-
 	F32 max_scale = get_default_max_prim_scale(LLPickInfo::isFlora(mObject));
 
 	getChild<LLSpinCtrl>("Scale X")->setMaxValue(max_scale);
 	getChild<LLSpinCtrl>("Scale Y")->setMaxValue(max_scale);
 	getChild<LLSpinCtrl>("Scale Z")->setMaxValue(max_scale);
 
-	LLComboBox* sculpt_combo = getChild<LLComboBox>("sculpt type control");
-	BOOL found = sculpt_combo->itemExists("Mesh");
+	BOOL found = mCtrlSculptType->itemExists("Mesh");
 	if (enable_mesh && !found)
 	{
-		sculpt_combo->add("Mesh");
+		mCtrlSculptType->add("Mesh");
 	}
 	else if (!enable_mesh && found)
 	{
-		sculpt_combo->remove("Mesh");
+		mCtrlSculptType->remove("Mesh");
 	}
 }
 
@@ -2037,11 +1933,6 @@ void LLPanelObject::clearCtrls()
 	mCheckPhantom	->set(FALSE);
 	mCheckPhantom	->setEnabled( FALSE );
 	
-	mSpinPhysicsGravity->setEnabled(FALSE);
-	mSpinPhysicsFriction->setEnabled(FALSE);
-	mSpinPhysicsDensity->setEnabled(FALSE);
-	mSpinPhysicsRestitution->setEnabled(FALSE);
-							 
 #if 0 // 1.9.2
 	mCheckCastShadows->set(FALSE);
 	mCheckCastShadows->setEnabled( FALSE );
diff --git a/indra/newview/llpanelobject.h b/indra/newview/llpanelobject.h
index 54bb5df8bfe0c28187ae8c2a74e634854b841c7a..e2f2a4400d7fecbabc6c4868894bf08c7b261404 100644
--- a/indra/newview/llpanelobject.h
+++ b/indra/newview/llpanelobject.h
@@ -62,15 +62,14 @@ class LLPanelObject : public LLPanel
 	static void 	onCommitPosition(		LLUICtrl* ctrl, void* userdata);
 	static void 	onCommitScale(			LLUICtrl* ctrl, void* userdata);
 	static void 	onCommitRotation(		LLUICtrl* ctrl, void* userdata);
-	static void 	onCommitPhysics(		LLUICtrl* ctrl, void* userdata);
 	static void 	onCommitTemporary(		LLUICtrl* ctrl, void* userdata);
 	static void 	onCommitPhantom(		LLUICtrl* ctrl, void* userdata);
-	static void     onCommitPhysicsParam(       LLUICtrl* ctrl, void* userdata);
 	static void 	onCommitCastShadows(	LLUICtrl* ctrl, void* userdata);
+	static void 	onCommitPhysics(		LLUICtrl* ctrl, void* userdata);
+	static void 	onCommitMaterial(		LLUICtrl* ctrl, void* userdata);
 
 	static void 	onCommitParametric(LLUICtrl* ctrl, void* userdata);
 
-	static void 	onCommitMaterial(		LLUICtrl* ctrl, void* userdata);
 
 	void     		onCommitSculpt(const LLSD& data);
 	void     		onCancelSculpt(const LLSD& data);
@@ -81,7 +80,6 @@ class LLPanelObject : public LLPanel
 	
 protected:
 	void			getState();
-	void			refreshCost();
 
 	void			sendRotation(BOOL btn_down);
 	void			sendScale(BOOL btn_down);
@@ -89,11 +87,6 @@ class LLPanelObject : public LLPanel
 	void			sendIsPhysical();
 	void			sendIsTemporary();
 	void			sendIsPhantom();
-	void            sendPhysicsShapeType(LLUICtrl* ctrl, void* userdata);
-	void            sendPhysicsGravity(LLUICtrl* ctrl, void* userdata);
-	void            sendPhysicsFriction(LLUICtrl* ctrl, void* userdata);
-	void            sendPhysicsRestitution(LLUICtrl* ctrl, void* userdata);
-	void            sendPhysicsDensity(LLUICtrl* ctrl, void* userdata);
 
 	void			sendCastShadows();
 	void            sendSculpt();
@@ -167,12 +160,6 @@ class LLPanelObject : public LLPanel
 	LLCheckBoxCtrl	*mCheckPhantom;
 	LLCheckBoxCtrl	*mCheckCastShadows;
 
-	LLComboBox*     mComboPhysicsShapeType;
-	LLSpinCtrl*     mSpinPhysicsGravity;
-	LLSpinCtrl*     mSpinPhysicsFriction;
-	LLSpinCtrl*     mSpinPhysicsDensity;
-	LLSpinCtrl*     mSpinPhysicsRestitution;
-
 	LLTextureCtrl   *mCtrlSculptTexture;
 	LLTextBox       *mLabelSculptType;
 	LLComboBox      *mCtrlSculptType;
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index 065c4d0b92f3987f9fa555efd994eb8bc3d70d5d..c443814c89bdbcf3ec91ed3502f5e6893ad8e1a3 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -71,6 +71,11 @@
 #include "lldrawpool.h"
 #include "lluictrlfactory.h"
 
+// For mesh physics
+#include "llagent.h"
+#include "llviewercontrol.h"
+#include "llmeshrepository.h"
+
 // "Features" Tab
 
 BOOL	LLPanelVolume::postBuild()
@@ -129,6 +134,29 @@ BOOL	LLPanelVolume::postBuild()
 		getChild<LLUICtrl>("Light Ambiance")->setValidateBeforeCommit( precommitValidate);
 	}
 	
+	// PHYSICS Parameters
+	{
+		// PhysicsShapeType combobox
+		mComboPhysicsShapeType = getChild<LLComboBox>("Physics Shape Type Combo Ctrl");
+		mComboPhysicsShapeType->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsShapeType, this, _1, mComboPhysicsShapeType));
+	
+		// PhysicsGravity
+		mSpinPhysicsGravity = getChild<LLSpinCtrl>("Physics Gravity");
+		mSpinPhysicsGravity->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsGravity, this, _1, mSpinPhysicsGravity));
+
+		// PhysicsFriction
+		mSpinPhysicsFriction = getChild<LLSpinCtrl>("Physics Friction");
+		mSpinPhysicsFriction->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsFriction, this, _1, mSpinPhysicsFriction));
+
+		// PhysicsDensity
+		mSpinPhysicsDensity = getChild<LLSpinCtrl>("Physics Density");
+		mSpinPhysicsDensity->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsDensity, this, _1, mSpinPhysicsDensity));
+
+		// PhysicsRestitution
+		mSpinPhysicsRestitution = getChild<LLSpinCtrl>("Physics Restitution");
+		mSpinPhysicsRestitution->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsRestitution, this, _1, mSpinPhysicsRestitution));
+	}
+	
 	// Start with everyone disabled
 	clearCtrls();
 
@@ -351,6 +379,54 @@ void LLPanelVolume::getState( )
 		getChildView("FlexForceZ")->setEnabled(false);
 	}
 	
+	// Physics properties
+	
+	mSpinPhysicsGravity->set(objectp->getPhysicsGravity());
+	mSpinPhysicsGravity->setEnabled(editable);
+
+	mSpinPhysicsFriction->set(objectp->getPhysicsFriction());
+	mSpinPhysicsFriction->setEnabled(editable);
+	
+	mSpinPhysicsDensity->set(objectp->getPhysicsDensity());
+	mSpinPhysicsDensity->setEnabled(editable);
+	
+	mSpinPhysicsRestitution->set(objectp->getPhysicsRestitution());
+	mSpinPhysicsRestitution->setEnabled(editable);
+
+	// update the physics shape combo to include allowed physics shapes
+	mComboPhysicsShapeType->removeall();
+	mComboPhysicsShapeType->add(getString("None"), LLSD(1));
+
+	BOOL isMesh = FALSE;
+	LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+	if (sculpt_params)
+	{
+		U8 sculpt_type = sculpt_params->getSculptType();
+		U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK;
+		isMesh = (sculpt_stitching == LL_SCULPT_TYPE_MESH);
+	}
+
+	if(isMesh && objectp)
+	{
+		const LLVolumeParams &volume_params = objectp->getVolume()->getParams();
+		LLUUID mesh_id = volume_params.getSculptID();
+		if(gMeshRepo.hasPhysicsShape(mesh_id))
+		{
+			// if a mesh contains an uploaded or decomposed physics mesh,
+			// allow 'Prim'
+			mComboPhysicsShapeType->add(getString("Prim"), LLSD(0));			
+		}
+	}
+	else
+	{
+		// simple prims always allow physics shape prim
+		mComboPhysicsShapeType->add(getString("Prim"), LLSD(0));	
+	}
+
+	mComboPhysicsShapeType->add(getString("Convex Hull"), LLSD(2));	
+	mComboPhysicsShapeType->setValue(LLSD(objectp->getPhysicsShapeType()));
+	mComboPhysicsShapeType->setEnabled(editable);
+
 	mObject = objectp;
 	mRootObject = root_objectp;
 }
@@ -384,6 +460,17 @@ void LLPanelVolume::refresh()
 	getChildView("Light Ambiance")->setVisible( visible);
 	getChildView("light texture control")->setVisible( visible);
 
+	bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") && 
+					   gAgent.getRegion() &&
+					   !gAgent.getRegion()->getCapability("GetMesh").empty();
+
+	getChildView("label physicsshapetype")->setVisible(enable_mesh);
+	getChildView("Physics Shape Type Combo Ctrl")->setVisible(enable_mesh);
+	getChildView("Physics Gravity")->setVisible(enable_mesh);
+	getChildView("Physics Material Override")->setVisible(enable_mesh);
+	getChildView("Physics Friction")->setVisible(enable_mesh);
+	getChildView("Physics Density")->setVisible(enable_mesh);
+	getChildView("Physics Restitution")->setVisible(enable_mesh);
 }
 
 
@@ -430,6 +517,11 @@ void LLPanelVolume::clearCtrls()
 	getChildView("FlexForceX")->setEnabled(false);
 	getChildView("FlexForceY")->setEnabled(false);
 	getChildView("FlexForceZ")->setEnabled(false);
+
+	mSpinPhysicsGravity->setEnabled(FALSE);
+	mSpinPhysicsFriction->setEnabled(FALSE);
+	mSpinPhysicsDensity->setEnabled(FALSE);
+	mSpinPhysicsRestitution->setEnabled(FALSE);
 }
 
 //
@@ -482,6 +574,48 @@ void LLPanelVolume::sendIsFlexible()
 	llinfos << "update flexible sent" << llendl;
 }
 
+void LLPanelVolume::sendPhysicsShapeType(LLUICtrl* ctrl, void* userdata)
+{
+	U8 type = ctrl->getValue().asInteger();
+	LLSelectMgr::getInstance()->selectionSetPhysicsType(type);
+
+	refreshCost();
+}
+
+void LLPanelVolume::sendPhysicsGravity(LLUICtrl* ctrl, void* userdata)
+{
+	F32 val = ctrl->getValue().asReal();
+	LLSelectMgr::getInstance()->selectionSetGravity(val);
+}
+
+void LLPanelVolume::sendPhysicsFriction(LLUICtrl* ctrl, void* userdata)
+{
+	F32 val = ctrl->getValue().asReal();
+	LLSelectMgr::getInstance()->selectionSetFriction(val);
+}
+
+void LLPanelVolume::sendPhysicsRestitution(LLUICtrl* ctrl, void* userdata)
+{
+	F32 val = ctrl->getValue().asReal();
+	LLSelectMgr::getInstance()->selectionSetRestitution(val);
+}
+
+void LLPanelVolume::sendPhysicsDensity(LLUICtrl* ctrl, void* userdata)
+{
+	F32 val = ctrl->getValue().asReal();
+	LLSelectMgr::getInstance()->selectionSetDensity(val);
+}
+
+void LLPanelVolume::refreshCost()
+{
+	LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
+	
+	if (obj)
+	{
+		obj->getObjectCost();
+	}
+}
+
 void LLPanelVolume::onLightCancelColor(const LLSD& data)
 {
 	LLColorSwatchCtrl*	LightColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch");
diff --git a/indra/newview/llpanelvolume.h b/indra/newview/llpanelvolume.h
index 90a2abda25e3ec1798662ae0431be90f1449fa67..776a2c1f4abcfc8f36f941f775bd04997acaa785 100644
--- a/indra/newview/llpanelvolume.h
+++ b/indra/newview/llpanelvolume.h
@@ -64,6 +64,8 @@ class LLPanelVolume : public LLPanel
 	static void 	onCommitIsFlexible(		LLUICtrl* ctrl, void* userdata);
 	static void 	onCommitFlexible(		LLUICtrl* ctrl, void* userdata);
 
+	static void     onCommitPhysicsParam(       LLUICtrl* ctrl, void* userdata);
+
 	void		onLightCancelColor(const LLSD& data);
 	void		onLightSelectColor(const LLSD& data);
 
@@ -73,8 +75,15 @@ class LLPanelVolume : public LLPanel
 
 protected:
 	void			getState();
+	void			refreshCost();
 
 protected:
+	void            sendPhysicsShapeType(LLUICtrl* ctrl, void* userdata);
+	void            sendPhysicsGravity(LLUICtrl* ctrl, void* userdata);
+	void            sendPhysicsFriction(LLUICtrl* ctrl, void* userdata);
+	void            sendPhysicsRestitution(LLUICtrl* ctrl, void* userdata);
+	void            sendPhysicsDensity(LLUICtrl* ctrl, void* userdata);
+
 /*
 	LLTextBox*		mLabelSelectSingleMessage;
 	// Light
@@ -99,6 +108,12 @@ class LLPanelVolume : public LLPanel
 	LLUUID			mLightSavedTexture;
 	LLPointer<LLViewerObject> mObject;
 	LLPointer<LLViewerObject> mRootObject;
+
+	LLComboBox*     mComboPhysicsShapeType;
+	LLSpinCtrl*     mSpinPhysicsGravity;
+	LLSpinCtrl*     mSpinPhysicsFriction;
+	LLSpinCtrl*     mSpinPhysicsDensity;
+	LLSpinCtrl*     mSpinPhysicsRestitution;
 };
 
 #endif
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 22ff362b5a66d5c2c3869e78a7614ff7d1ed45e2..b19bf5d234c36544e12aee92ac14709ccc038add 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -956,16 +956,31 @@ void LLScriptEdCore::openInExternalEditor()
 	// Open it in external editor.
 	{
 		LLExternalEditor ed;
+		LLExternalEditor::EErrorCode status;
+		std::string msg;
 
-		if (!ed.setCommand("LL_SCRIPT_EDITOR"))
+		status = ed.setCommand("LL_SCRIPT_EDITOR");
+		if (status != LLExternalEditor::EC_SUCCESS)
 		{
-			std::string msg = "Select an editor by setting the environment variable LL_SCRIPT_EDITOR "
-				"or the ExternalEditor setting"; // *TODO: localize
+			if (status == LLExternalEditor::EC_NOT_SPECIFIED) // Use custom message for this error.
+			{
+				msg = getString("external_editor_not_set");
+			}
+			else
+			{
+				msg = LLExternalEditor::getErrorMessage(status);
+			}
+
 			LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg));
 			return;
 		}
 
-		ed.run(filename);
+		status = ed.run(filename);
+		if (status != LLExternalEditor::EC_SUCCESS)
+		{
+			msg = LLExternalEditor::getErrorMessage(status);
+			LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg));
+		}
 	}
 }
 
diff --git a/indra/newview/llsceneview.cpp b/indra/newview/llsceneview.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8e8fc9dd25958ba55a18bdfe9328763e405f8fcc
--- /dev/null
+++ b/indra/newview/llsceneview.cpp
@@ -0,0 +1,429 @@
+/** 
+ * @file llsceneview.cpp
+ * @brief LLSceneView class implementation
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llsceneview.h"
+#include "llviewerwindow.h"
+#include "pipeline.h"
+#include "llviewerobjectlist.h"
+#include "llviewerregion.h"
+#include "llagent.h"
+#include "llvolumemgr.h"
+
+LLSceneView* gSceneView = NULL;
+
+//borrow this helper function from llfasttimerview.cpp
+template <class VEC_TYPE>
+void removeOutliers(std::vector<VEC_TYPE>& data, F32 k);
+
+
+LLSceneView::LLSceneView(const LLRect& rect)
+	:	LLFloater(LLSD())
+{
+	setRect(rect);
+	setVisible(FALSE);
+	
+	setCanMinimize(false);
+	setCanClose(true);
+}
+
+void LLSceneView::onClickCloseBtn()
+{
+	setVisible(false);
+}
+
+
+void LLSceneView::draw()
+{
+	S32 margin = 10;
+	S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f);
+	S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f);
+	
+	LLRect new_rect;
+	new_rect.setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height);
+	setRect(new_rect);
+
+	// Draw the window background
+	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));
+	
+
+	//aggregate some statistics
+
+	//object sizes
+	std::vector<F32> size[2];
+
+	//triangle counts
+	std::vector<S32> triangles[2]; 
+	std::vector<S32> visible_triangles[2];
+	S32 total_visible_triangles[] = {0, 0};
+	S32 total_triangles[] = {0, 0};
+	
+	//streaming cost
+	std::vector<F32> streaming_cost[2];
+	F32 total_streaming[] = { 0.f, 0.f };
+
+	//physics cost
+	std::vector<F32> physics_cost[2];
+	F32 total_physics[] = { 0.f, 0.f };
+	
+
+	U32 object_count = 0;
+
+	LLViewerRegion* region = gAgent.getRegion();
+	if (region)
+	{
+		for (U32 i = 0; i < gObjectList.getNumObjects(); ++i)
+		{
+			LLViewerObject* object = gObjectList.getObject(i);
+			
+			if (object && 
+				object->getVolume()&&
+				object->getRegion() == region)
+			{
+				U32 idx = object->isAttachment() ? 1 : 0;
+
+				LLVolume* volume = object->getVolume();
+				object_count++;
+				
+				F32 radius = object->getScale().magVec();
+				size[idx].push_back(radius);
+
+				S32 visible = volume->getNumTriangles();
+				S32 high_triangles = object->getHighLODTriangleCount();
+
+				total_visible_triangles[idx] += visible;
+				total_triangles[idx] += high_triangles;
+
+				visible_triangles[idx].push_back(visible);
+				triangles[idx].push_back(high_triangles);
+
+				F32 streaming = object->getStreamingCost();
+				total_streaming[idx] += streaming;
+				streaming_cost[idx].push_back(streaming);
+
+				F32 physics = object->getPhysicsCost();
+				total_physics[idx] += physics;
+				physics_cost[idx].push_back(physics);
+			}
+		}
+	}
+
+	const char* category[] =
+	{
+		"Region",
+		"Attachment"
+	};
+
+	S32 graph_pos[4];
+
+	for (U32 i = 0; i < 4; ++i)
+	{
+		graph_pos[i] = new_rect.getHeight()/4*(i+1);
+	}
+
+	for (U32 idx = 0; idx < 2; idx++)
+	{
+		if (!size[idx].empty())
+		{ //display graph of object sizes
+			std::sort(size[idx].begin(), size[idx].end());
+
+			ll_remove_outliers(size[idx], 1.f);
+
+			LLRect size_rect;
+			
+			if (idx == 0)
+			{
+				size_rect = LLRect(margin, graph_pos[0]-margin, new_rect.getWidth()/2-margin, margin*2);
+			}
+			else
+			{
+				size_rect = LLRect(margin+new_rect.getWidth()/2, graph_pos[0]-margin, new_rect.getWidth()-margin, margin*2);
+			}
+
+			gl_rect_2d(size_rect, LLColor4::white, false);
+
+			F32 size_domain[] = { 128.f, 0.f };
+			
+			//get domain of sizes
+			for (U32 i = 0; i < size[idx].size(); ++i)
+			{
+				size_domain[0] = llmin(size_domain[0], size[idx][i]);
+				size_domain[1] = llmax(size_domain[1], size[idx][i]);
+			}
+
+			F32 size_range = size_domain[1]-size_domain[0];
+			
+			U32 count = size[idx].size();
+
+			F32 total = 0.f;
+
+			gGL.begin(LLRender::LINE_STRIP);
+
+			for (U32 i = 0; i < count; ++i)
+			{
+				F32 rad = size[idx][i];
+				total += rad;	
+				F32 y = (rad-size_domain[0])/size_range*size_rect.getHeight()+size_rect.mBottom;
+				F32 x = (F32) i / count * size_rect.getWidth() + size_rect.mLeft;
+
+				gGL.vertex2f(x,y);
+
+				if (i%4096 == 0)
+				{
+					gGL.end();
+					gGL.flush();
+					gGL.begin(LLRender::LINE_STRIP);
+				}
+			}
+
+			gGL.end();
+			gGL.flush();
+
+			std::string label = llformat("%s Object Sizes (m) -- [%.1f, %.1f] Mean: %.1f  Median: %.1f -- %d samples",
+											category[idx], size_domain[0], size_domain[1], total/count, size[idx][count/2], count);
+
+			LLFontGL::getFontMonospace()->renderUTF8(label,
+											0 , size_rect.mLeft, size_rect.mTop+margin, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+
+		}
+	}
+
+	for (U32 idx = 0; idx < 2; ++idx)
+	{
+		if (!triangles[idx].empty())
+		{ //plot graph of visible/total triangles
+			std::sort(triangles[idx].begin(), triangles[idx].end());
+			
+			ll_remove_outliers(triangles[idx], 1.f);
+			
+			LLRect tri_rect;
+			if (idx == 0)
+			{
+				tri_rect = LLRect(margin, graph_pos[1]-margin, new_rect.getWidth()/2-margin, graph_pos[0]+margin);
+			}
+			else
+			{
+				tri_rect = LLRect(new_rect.getWidth()/2+margin, graph_pos[1]-margin, new_rect.getWidth()-margin, graph_pos[0]+margin);
+			}
+
+			gl_rect_2d(tri_rect, LLColor4::white, false);
+
+			S32 tri_domain[] = { 65536, 0 };
+						
+			//get domain of triangle counts
+			for (U32 i = 0; i < triangles[idx].size(); ++i)
+			{
+				tri_domain[0] = llmin(tri_domain[0], triangles[idx][i]);
+				tri_domain[1] = llmax(tri_domain[1], triangles[idx][i]);		
+			}
+
+			U32 triangle_range = tri_domain[1]-tri_domain[0];
+
+			U32 count = triangles[idx].size();
+
+			U32 total = 0;
+
+			gGL.begin(LLRender::LINE_STRIP);
+			//plot triangles
+			for (U32 i = 0; i < count; ++i)
+			{
+				U32 tri_count = triangles[idx][i];
+				total += tri_count;	
+				F32 y = (F32) (tri_count-tri_domain[0])/triangle_range*tri_rect.getHeight()+tri_rect.mBottom;
+				F32 x = (F32) i / count * tri_rect.getWidth() + tri_rect.mLeft;
+
+				gGL.vertex2f(x,y);
+
+				if (i%4096 == 0)
+				{
+					gGL.end();
+					gGL.flush();
+					gGL.begin(LLRender::LINE_STRIP);
+				}
+			}
+
+			gGL.end();
+			gGL.flush();
+
+			U32 total_visible = 0;
+			count = visible_triangles[idx].size();
+
+			for (U32 i = 0; i < count; ++i)
+			{
+				U32 tri_count = visible_triangles[idx][i];
+				total_visible += tri_count;	
+			}
+
+			std::string label = llformat("%s Object Triangle Counts (Ktris) -- [%.2f, %.2f] Mean: %.2f  Median: %.2f  Visible: %.2f/%.2f",
+											category[idx], tri_domain[0]/1024.f, tri_domain[1]/1024.f, (total/count)/1024.f, triangles[idx][count/2]/1024.f, total_visible_triangles[idx]/1024.f, total_triangles[idx]/1024.f);
+
+			LLFontGL::getFontMonospace()->renderUTF8(label,
+											0 , tri_rect.mLeft, tri_rect.mTop+margin, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+
+		}
+	}
+
+	for (U32 idx = 0; idx < 2; ++idx)
+	{
+		if (!streaming_cost[idx].empty())
+		{ //plot graph of streaming cost
+			std::sort(streaming_cost[idx].begin(), streaming_cost[idx].end());
+			
+			ll_remove_outliers(streaming_cost[idx], 1.f);
+			
+			LLRect tri_rect;
+			if (idx == 0)
+			{
+				tri_rect = LLRect(margin, graph_pos[2]-margin, new_rect.getWidth()/2-margin, graph_pos[1]+margin);
+			}
+			else
+			{
+				tri_rect = LLRect(new_rect.getWidth()/2+margin, graph_pos[2]-margin, new_rect.getWidth()-margin, graph_pos[1]+margin);
+			}
+
+			gl_rect_2d(tri_rect, LLColor4::white, false);
+
+			F32 streaming_domain[] = { 65536, 0 };
+						
+			//get domain of triangle counts
+			for (U32 i = 0; i < streaming_cost[idx].size(); ++i)
+			{
+				streaming_domain[0] = llmin(streaming_domain[0], streaming_cost[idx][i]);
+				streaming_domain[1] = llmax(streaming_domain[1], streaming_cost[idx][i]);		
+			}
+
+			F32 cost_range = streaming_domain[1]-streaming_domain[0];
+
+			U32 count = streaming_cost[idx].size();
+
+			F32 total = 0;
+
+			gGL.begin(LLRender::LINE_STRIP);
+			//plot triangles
+			for (U32 i = 0; i < count; ++i)
+			{
+				F32 sc = streaming_cost[idx][i];
+				total += sc;	
+				F32 y = (F32) (sc-streaming_domain[0])/cost_range*tri_rect.getHeight()+tri_rect.mBottom;
+				F32 x = (F32) i / count * tri_rect.getWidth() + tri_rect.mLeft;
+
+				gGL.vertex2f(x,y);
+
+				if (i%4096 == 0)
+				{
+					gGL.end();
+					gGL.flush();
+					gGL.begin(LLRender::LINE_STRIP);
+				}
+			}
+
+			gGL.end();
+			gGL.flush();
+
+			std::string label = llformat("%s Object Streaming Cost -- [%.2f, %.2f] Mean: %.2f  Total: %.2f",
+											category[idx], streaming_domain[0], streaming_domain[1], total/count, total_streaming[idx]);
+
+			LLFontGL::getFontMonospace()->renderUTF8(label,
+											0 , tri_rect.mLeft, tri_rect.mTop+margin, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+
+		}
+	}
+
+	for (U32 idx = 0; idx < 2; ++idx)
+	{
+		if (!physics_cost[idx].empty())
+		{ //plot graph of physics cost
+			std::sort(physics_cost[idx].begin(), physics_cost[idx].end());
+			
+			ll_remove_outliers(physics_cost[idx], 1.f);
+			
+			LLRect tri_rect;
+			if (idx == 0)
+			{
+				tri_rect = LLRect(margin, graph_pos[3]-margin, new_rect.getWidth()/2-margin, graph_pos[2]+margin);
+			}
+			else
+			{
+				tri_rect = LLRect(new_rect.getWidth()/2+margin, graph_pos[3]-margin, new_rect.getWidth()-margin, graph_pos[2]+margin);
+			}
+
+			gl_rect_2d(tri_rect, LLColor4::white, false);
+
+			F32 physics_domain[] = { 65536, 0 };
+						
+			//get domain of triangle counts
+			for (U32 i = 0; i < physics_cost[idx].size(); ++i)
+			{
+				physics_domain[0] = llmin(physics_domain[0], physics_cost[idx][i]);
+				physics_domain[1] = llmax(physics_domain[1], physics_cost[idx][i]);		
+			}
+
+			F32 cost_range = physics_domain[1]-physics_domain[0];
+
+			U32 count = physics_cost[idx].size();
+
+			F32 total = 0;
+
+			gGL.begin(LLRender::LINE_STRIP);
+			//plot triangles
+			for (U32 i = 0; i < count; ++i)
+			{
+				F32 pc = physics_cost[idx][i];
+				total += pc;	
+				F32 y = (F32) (pc-physics_domain[0])/cost_range*tri_rect.getHeight()+tri_rect.mBottom;
+				F32 x = (F32) i / count * tri_rect.getWidth() + tri_rect.mLeft;
+
+				gGL.vertex2f(x,y);
+
+				if (i%4096 == 0)
+				{
+					gGL.end();
+					gGL.flush();
+					gGL.begin(LLRender::LINE_STRIP);
+				}
+			}
+
+			gGL.end();
+			gGL.flush();
+
+			std::string label = llformat("%s Object Physics Cost -- [%.2f, %.2f] Mean: %.2f  Total: %.2f",
+											category[idx], physics_domain[0], physics_domain[1], total/count, total_physics[idx]);
+
+			LLFontGL::getFontMonospace()->renderUTF8(label,
+											0 , tri_rect.mLeft, tri_rect.mTop+margin, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+
+		}
+	}
+
+	
+	
+
+	LLView::draw();
+}
+
+
diff --git a/indra/newview/llsceneview.h b/indra/newview/llsceneview.h
new file mode 100644
index 0000000000000000000000000000000000000000..2a3a14bbee45571dd6dee59bc3ab2633dfa7a380
--- /dev/null
+++ b/indra/newview/llsceneview.h
@@ -0,0 +1,48 @@
+/** 
+ * @file llsceneview.h
+ * @brief LLSceneView class header file
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSCENEVIEW_H
+#define LL_LLSCENEVIEW_H
+
+#include "llfloater.h"
+
+
+class LLSceneView : public LLFloater
+{
+public:
+	LLSceneView(const LLRect& rect);
+
+	virtual void draw();
+	
+protected:
+	virtual void onClickCloseBtn();
+
+
+};
+
+extern LLSceneView* gSceneView;
+
+#endif // LL_LLSCENEVIEW_H
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index b139ba361e4b62c4239f534f5d0d584f94e8c8d9..78ffc7908dff330a945780dfce806a1beb58d98b 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -6374,7 +6374,7 @@ BOOL LLObjectSelection::isEmpty() const
 //-----------------------------------------------------------------------------
 // getObjectCount() - returns number of non null objects
 //-----------------------------------------------------------------------------
-S32 LLObjectSelection::getObjectCount(BOOL mesh_adjust)
+S32 LLObjectSelection::getObjectCount()
 {
 	cleanupNodes();
 	S32 count = mList.size();
@@ -6478,7 +6478,7 @@ F32 LLObjectSelection::getSelectedLinksetPhysicsCost()
 	return cost;
 }
 
-F32 LLObjectSelection::getSelectedObjectStreamingCost()
+F32 LLObjectSelection::getSelectedObjectStreamingCost(S32* total_bytes, S32* visible_bytes)
 {
 	F32 cost = 0.f;
 	for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
@@ -6488,7 +6488,19 @@ F32 LLObjectSelection::getSelectedObjectStreamingCost()
 		
 		if (object)
 		{
-			cost += object->getStreamingCost();
+			S32 bytes = 0;
+			S32 visible = 0;
+			cost += object->getStreamingCost(&bytes, &visible);
+
+			if (total_bytes)
+			{
+				*total_bytes += bytes;
+			}
+
+			if (visible_bytes)
+			{
+				*visible_bytes += visible;
+			}
 		}
 	}
 
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 031898d7c5525a419b305d65f23d3c96c9796a6f..166616e13e03e96ee1716ae54bcead366b0bca1e 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -278,14 +278,14 @@ class LLObjectSelection : public LLRefCount
 	LLSelectNode* findNode(LLViewerObject* objectp);
 
 	// count members
-	S32 getObjectCount(BOOL mesh_adjust = FALSE);
+	S32 getObjectCount();
 	F32 getSelectedObjectCost();
 	F32 getSelectedLinksetCost();
 	F32 getSelectedPhysicsCost();
 	F32 getSelectedLinksetPhysicsCost();
 	S32 getSelectedObjectRenderCost();
 	
-	F32 getSelectedObjectStreamingCost();
+	F32 getSelectedObjectStreamingCost(S32* total_bytes = NULL, S32* visible_bytes = NULL);
 	U32 getSelectedObjectTriangleCount();
 
 	S32 getTECount();
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 8aaa7f0e13b3aa5acd9136ccbd0535ca5bf8f4d8..fcd200d24aef3ed3e8cfbe1d0e7a3fff9fb36969 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -96,6 +96,7 @@ bool	LLSideTray::instanceCreated	()
 
 class LLSideTrayTab: public LLPanel
 {
+	LOG_CLASS(LLSideTrayTab);
 	friend class LLUICtrlFactory;
 	friend class LLSideTray;
 public:
@@ -122,6 +123,8 @@ class LLSideTrayTab: public LLPanel
 	void			undock(LLFloater* floater_tab);
 
 	LLSideTray*		getSideTray();
+
+	void			onFloaterClose(LLSD::Boolean app_quitting);
 	
 public:
 	virtual ~LLSideTrayTab();
@@ -140,6 +143,8 @@ class LLSideTrayTab: public LLPanel
 	void			onOpen		(const LLSD& key);
 	
 	void			toggleTabDocked();
+	void			setDocked(bool dock);
+	bool			isDocked() const;
 
 	BOOL			handleScrollWheel(S32 x, S32 y, S32 clicks);
 
@@ -151,6 +156,7 @@ class LLSideTrayTab: public LLPanel
 	std::string	mDescription;
 	
 	LLView*	mMainPanel;
+	boost::signals2::connection mFloaterCloseConn;
 };
 
 LLSideTrayTab::LLSideTrayTab(const Params& p)
@@ -271,6 +277,35 @@ void LLSideTrayTab::toggleTabDocked()
 	LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
 }
 
+// Same as toggleTabDocked() apart from making sure that we do exactly what we want.
+void LLSideTrayTab::setDocked(bool dock)
+{
+	if (isDocked() == dock)
+	{
+		llwarns << "Tab " << getName() << " is already " << (dock ? "docked" : "undocked") << llendl;
+		return;
+	}
+
+	toggleTabDocked();
+}
+
+bool LLSideTrayTab::isDocked() const
+{
+	return dynamic_cast<LLSideTray*>(getParent()) != NULL;
+}
+
+void LLSideTrayTab::onFloaterClose(LLSD::Boolean app_quitting)
+{
+	// If user presses Ctrl-Shift-W, handle that gracefully by docking all
+	// undocked tabs before their floaters get destroyed (STORM-1016).
+
+	// Don't dock on quit for the current dock state to be correctly saved.
+	if (app_quitting) return;
+
+	lldebugs << "Forcibly docking tab " << getName() << llendl;
+	setDocked(true);
+}
+
 BOOL LLSideTrayTab::handleScrollWheel(S32 x, S32 y, S32 clicks)
 {
 	// Let children handle the event
@@ -294,6 +329,7 @@ void LLSideTrayTab::dock(LLFloater* floater_tab)
 		return;
 	}
 
+	mFloaterCloseConn.disconnect();
 	setRect(side_tray->getLocalRect());
 	reshape(getRect().getWidth(), getRect().getHeight());
 
@@ -342,6 +378,7 @@ void LLSideTrayTab::undock(LLFloater* floater_tab)
 	}
 
 	floater_tab->addChild(this);
+	mFloaterCloseConn = floater_tab->setCloseCallback(boost::bind(&LLSideTrayTab::onFloaterClose, this, _2));
 	floater_tab->setTitle(mTabTitle);
 	floater_tab->setName(getName());
 
@@ -649,7 +686,7 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel
 		LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
 		if (!floater_tab) return NULL;
 
-		floater_tab->openFloater(panel_name);
+		floater_tab->openFloater(tab_name);
 	}
 
 	LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(view->getParent());
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 5e7af6bbb3e08547fe08c65890b8f308e69903d6..65f7d299bc92d5b7e5b01f65365fd31e809fd113 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -2961,31 +2961,21 @@ S32 get_physics_detail(const LLVolumeParams& volume_params, const LLVector3& sca
 void renderMeshBaseHull(LLVOVolume* volume, U32 data_mask, LLColor4& color, LLColor4& line_color)
 {
 	LLUUID mesh_id = volume->getVolume()->getParams().getSculptID();
-	const LLMeshDecomposition* decomp = gMeshRepo.getDecomposition(mesh_id);
+	LLModel::Decomposition* decomp = gMeshRepo.getDecomposition(mesh_id);
 
 	const LLVector3 center(0,0,0);
 	const LLVector3 size(0.25f,0.25f,0.25f);
 
 	if (decomp)
 	{		
-		LLVertexBuffer* buff = decomp->mBaseHullMesh;
-
-		if (buff && buff->getNumVerts() > 0)
+		if (!decomp->mBaseHullMesh.empty())
 		{
-			buff->setBuffer(data_mask);
-
-		/*	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-			glColor4fv(line_color.mV);
-			buff->drawArrays(LLRender::TRIANGLES, 0, buff->getNumVerts());
-			glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);*/
-
-			{
-				glColor4fv(color.mV);
-				buff->drawArrays(LLRender::TRIANGLES, 0, buff->getNumVerts());
-			}
+			glColor4fv(color.mV);
+			LLVertexBuffer::drawArrays(LLRender::TRIANGLES, decomp->mBaseHullMesh.mPositions, decomp->mBaseHullMesh.mNormals);
 		}
 		else
 		{
+			gMeshRepo.buildPhysicsMesh(*decomp);
 			gGL.color3f(0,1,1);
 			drawBoxOutline(center, size);
 		}
@@ -2998,19 +2988,16 @@ void renderMeshBaseHull(LLVOVolume* volume, U32 data_mask, LLColor4& color, LLCo
 	}
 }
 
-void render_hull(LLVertexBuffer* buff, U32 data_mask, const LLColor4& color, const LLColor4& line_color)
+void render_hull(LLModel::PhysicsMesh& mesh, const LLColor4& color, const LLColor4& line_color)
 {
-	buff->setBuffer(data_mask);
-
 	glColor4fv(color.mV);
-	buff->drawArrays(LLRender::TRIANGLES, 0, buff->getNumVerts());
-
+	LLVertexBuffer::drawArrays(LLRender::TRIANGLES, mesh.mPositions, mesh.mNormals);
 	LLGLEnable offset(GL_POLYGON_OFFSET_LINE);
 	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 	glPolygonOffset(3.f, 3.f);
 	glLineWidth(3.f);
 	glColor4fv(line_color.mV);
-	buff->drawArrays(LLRender::TRIANGLES, 0, buff->getNumVerts());
+	LLVertexBuffer::drawArrays(LLRender::TRIANGLES, mesh.mPositions, mesh.mNormals);
 	glLineWidth(1.f);
 	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
 }
@@ -3075,7 +3062,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
 	if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::USER_MESH)
 	{
 		LLUUID mesh_id = volume->getVolume()->getParams().getSculptID();
-		const LLMeshDecomposition* decomp = gMeshRepo.getDecomposition(mesh_id);
+		LLModel::Decomposition* decomp = gMeshRepo.getDecomposition(mesh_id);
 			
 		if (decomp)
 		{ //render a physics based mesh
@@ -3084,27 +3071,33 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
 
 			if (!decomp->mHull.empty())
 			{ //decomposition exists, use that
-				for (U32 i = 0; i < decomp->mHull.size(); ++i)
+
+				if (decomp->mMesh.empty())
+				{
+					gMeshRepo.buildPhysicsMesh(*decomp);
+				}
+
+				for (U32 i = 0; i < decomp->mMesh.size(); ++i)
 				{		
-					render_hull(decomp->mMesh[i], data_mask, color, line_color);
+					render_hull(decomp->mMesh[i], color, line_color);
 				}
 			}
-			else if (decomp->mPhysicsShapeMesh.notNull() && decomp->mPhysicsShapeMesh->getNumVerts() > 0)
+			else if (!decomp->mPhysicsShapeMesh.empty())
 			{ 
 				//decomp has physics mesh, render that mesh
 				glColor4fv(color.mV);
-				pushBufferVerts(decomp->mPhysicsShapeMesh, data_mask);
-				
+				LLVertexBuffer::drawArrays(LLRender::TRIANGLES, decomp->mPhysicsShapeMesh.mPositions, decomp->mPhysicsShapeMesh.mNormals);
+								
 				glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 				glColor4fv(line_color.mV);
-				pushBufferVerts(decomp->mPhysicsShapeMesh, data_mask);
+				LLVertexBuffer::drawArrays(LLRender::TRIANGLES, decomp->mPhysicsShapeMesh.mPositions, decomp->mPhysicsShapeMesh.mNormals);
 				glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
 			}
 			else
 			{ //no mesh or decomposition, render base hull
 				renderMeshBaseHull(volume, data_mask, color, line_color);
 
-				if (decomp->mPhysicsShapeMesh.isNull())
+				if (decomp->mPhysicsShapeMesh.empty())
 				{
 					//attempt to fetch physics shape mesh if available
 					gMeshRepo.fetchPhysicsShape(mesh_id);
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
index c76ecae4a2b513d613ae616999d6f489269a9ddc..d52e0a6c8683c2214a138974eb73ed6c53b3e4fb 100644
--- a/indra/newview/llspeakbutton.cpp
+++ b/indra/newview/llspeakbutton.cpp
@@ -38,6 +38,7 @@
 #include "llspeakbutton.h"
 
 #include "llbottomtray.h"
+#include "llfirstuse.h"
 
 static LLDefaultChildRegistry::Register<LLSpeakButton> t1("talk_button");
 
@@ -176,6 +177,7 @@ void LLSpeakButton::onMouseDown_SpeakBtn()
 {
 	bool down = true;
 	LLVoiceClient::getInstance()->inputUserControlState(down); // this method knows/care about whether this translates into a toggle-to-talk or down-to-talk
+	LLFirstUse::speak(false);
 }
 void LLSpeakButton::onMouseUp_SpeakBtn()
 {
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 86087ba0a1729174263706c42d05d68272e090ac..87b33980d6a9b9fcec9a1abadc856b6cc2a4cc63 100755
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -749,8 +749,6 @@ bool idle_startup()
 			}     
 			LLPanelLogin::giveFocus();
 
-			gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
-
 			LLStartUp::setStartupState( STATE_LOGIN_WAIT );		// Wait for user input
 		}
 		else
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 582f50ba3747d55de2bf604e920bdc335c370497..9549f180df661e8302bb08a95dce1b6b717fc18e 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -83,7 +83,7 @@ LLToolPie::LLToolPie()
 	mMouseOutsideSlop( false ),
 	mMouseSteerX(-1),
 	mMouseSteerY(-1),
-	mAbortClickToWalk(false),
+	mBlockClickToWalk(false),
 	mClickAction(0),
 	mClickActionBuyEnabled( gSavedSettings.getBOOL("ClickActionBuyEnabled") ),
 	mClickActionPayEnabled( gSavedSettings.getBOOL("ClickActionPayEnabled") )
@@ -303,7 +303,7 @@ BOOL LLToolPie::handleLeftClickPick()
 	if (gFocusMgr.getKeyboardFocus())
 	{
 		// don't click to walk on attempt to give focus to world
-		mAbortClickToWalk = true;
+		mBlockClickToWalk = true;
 		gFocusMgr.setKeyboardFocus(NULL);
 	}
 
@@ -625,7 +625,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
 	// let media have first pass at click
 	if (handleMediaMouseUp() || LLViewerMediaFocus::getInstance()->getFocus())
 	{
-		mAbortClickToWalk = true;
+		mBlockClickToWalk = true;
 	}
 	stopCameraSteering();
 	mMouseButtonDown = false;
@@ -633,7 +633,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
 	if (click_action == CLICK_ACTION_NONE				// not doing 1-click action
 		&& gSavedSettings.getBOOL("ClickToWalk")		// click to walk enabled
 		&& !gAgent.getFlying()							// don't auto-navigate while flying until that works
-		&& !mAbortClickToWalk							// another behavior hasn't cancelled click to walk
+		&& !mBlockClickToWalk							// another behavior hasn't cancelled click to walk
 		&& !mPick.mPosGlobal.isExactlyZero()			// valid coordinates for pick
 		&& (mPick.mPickType == LLPickInfo::PICK_LAND	// we clicked on land
 			|| mPick.mObjectID.notNull()))				// or on an object
@@ -658,11 +658,11 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
 		mAutoPilotDestination = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
 		mAutoPilotDestination->setPositionGlobal(mPick.mPosGlobal);
 		mAutoPilotDestination->setPixelSize(5);
-		mAutoPilotDestination->setColor(LLColor4U(50, 50, 200));
+		mAutoPilotDestination->setColor(LLColor4U(170, 210, 190));
 		mAutoPilotDestination->setDuration(3.f);
 
 		handle_go_to();
-		mAbortClickToWalk = false;
+		mBlockClickToWalk = false;
 
 		return TRUE;
 	}
@@ -675,7 +675,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
 	LLToolMgr::getInstance()->clearTransientTool();
 	gAgentCamera.setLookAt(LOOKAT_TARGET_CONVERSATION, obj); // maybe look at object/person clicked on
 
-	mAbortClickToWalk = false;
+	mBlockClickToWalk = false;
 	return LLTool::handleMouseUp(x, y, mask);
 }
 
@@ -1298,7 +1298,8 @@ void LLToolPie::VisitHomePage(const LLPickInfo& info)
 
 void LLToolPie::handleSelect()
 {
-	mAbortClickToWalk = true;	
+	// tool is reselected when app gets focus, etc.
+	mBlockClickToWalk = true;	
 }
 
 void LLToolPie::handleDeselect()
@@ -1738,7 +1739,7 @@ bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_di
 void LLToolPie::startCameraSteering()
 {
 	mMouseOutsideSlop = true;
-	mAbortClickToWalk = true;
+	mBlockClickToWalk = true;
 
 	if (gAgentCamera.getFocusOnAvatar())
 	{
@@ -1777,7 +1778,7 @@ void LLToolPie::startCameraSteering()
 		if (mMouseSteerGrabPoint) { mMouseSteerGrabPoint->markDead(); }
 		mMouseSteerGrabPoint = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
 		mMouseSteerGrabPoint->setPositionGlobal(mSteerPick.mPosGlobal);
-		mMouseSteerGrabPoint->setColor(LLColor4U(50, 50, 200));
+		mMouseSteerGrabPoint->setColor(LLColor4U(170, 210, 190));
 		mMouseSteerGrabPoint->setPixelSize(5);
 		mMouseSteerGrabPoint->setDuration(2.f);
 	}
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index 22e77a31594aa6606f31d3972c5a420e03b277c3..22359a6db841d665a2053a6de8bb3ae7d671bf97 100644
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -66,6 +66,7 @@ class LLToolPie : public LLTool, public LLSingleton<LLToolPie>
 	LLViewerObject*		getClickActionObject() { return mClickActionObject; }
 	LLObjectSelection*	getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }
 	void 				resetSelection();
+	void				blockClickToWalk() { mBlockClickToWalk = true; }
 	
 	static void			selectionPropertiesReceived();
 
@@ -105,7 +106,7 @@ class LLToolPie : public LLTool, public LLSingleton<LLToolPie>
 	LLPointer<LLHUDEffectBlob>	mAutoPilotDestination;
 	LLPointer<LLHUDEffectBlob>	mMouseSteerGrabPoint;
 	bool				mClockwise;			
-	bool				mAbortClickToWalk;
+	bool				mBlockClickToWalk;
 	LLUUID				mMediaMouseCaptureID;
 	LLPickInfo			mPick;
 	LLPickInfo			mHoverPick;
diff --git a/indra/newview/lltracker.h b/indra/newview/lltracker.h
index c0c154abe831dde4c86fd6518625f44bf8cf1b20..8e916af31580582017c4771049cfea962c495ffc 100644
--- a/indra/newview/lltracker.h
+++ b/indra/newview/lltracker.h
@@ -75,7 +75,7 @@ class LLTracker
 	// these are static so that they can be used a callbacks
 	static ETrackingStatus getTrackingStatus() { return instance()->mTrackingStatus; }
 	static ETrackingLocationType getTrackedLocationType() { return instance()->mTrackingLocationType; }
-	static BOOL isTracking(void*) { return (BOOL) instance()->mTrackingStatus; }
+	static BOOL isTracking(void*) { return instance()->mTrackingStatus != TRACKING_NOTHING; }
 	static void stopTracking(void*);
 	static void clearFocus();
 	
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
index 0af850a46b015b2de2e60d9c2cb4d7328e0a101a..286b16bab2ede0749a22b2ffbc91f679fd0c5856 100644
--- a/indra/newview/llviewerchat.cpp
+++ b/indra/newview/llviewerchat.cpp
@@ -31,6 +31,8 @@
 #include "llagent.h" 	// gAgent		
 #include "lluicolortable.h"
 #include "llviewercontrol.h" // gSavedSettings
+#include "llviewerregion.h"
+#include "llworld.h"
 #include "llinstantmessage.h" //SYSTEM_FROM
 
 // LLViewerChat
@@ -214,3 +216,43 @@ void LLViewerChat::formatChatMsg(const LLChat& chat, std::string& formated_msg)
 
 }
 
+//static
+std::string LLViewerChat::getSenderSLURL(const LLChat& chat, const LLSD& args)
+{
+	switch (chat.mSourceType)
+	{
+	case CHAT_SOURCE_AGENT:
+		return LLSLURL("agent", chat.mFromID, "about").getSLURLString();
+
+	case CHAT_SOURCE_OBJECT:
+		return getObjectImSLURL(chat, args);
+
+	default:
+		llwarns << "Getting SLURL for an unsupported sender type: " << chat.mSourceType << llendl;
+	}
+
+	return LLStringUtil::null;
+}
+
+//static
+std::string LLViewerChat::getObjectImSLURL(const LLChat& chat, const LLSD& args)
+{
+	std::string url = LLSLURL("objectim", chat.mFromID, "").getSLURLString();
+	url += "?name=" + chat.mFromName;
+	url += "&owner=" + chat.mOwnerID.asString();
+
+	std::string slurl = args["slurl"].asString();
+	if (slurl.empty())
+	{
+		LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
+		if(region)
+		{
+			LLSLURL region_slurl(region->getName(), chat.mPosAgent);
+			slurl = region_slurl.getLocationString();
+		}
+	}
+
+	url += "&slurl=" + LLURI::escape(slurl);
+
+	return url;
+}
diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h
index a9f9a98960f06b60cc7c07d7ae390bbca65b83d4..0f15d29f04ec3a0a8f884d328d4b9cd78b3193dc 100644
--- a/indra/newview/llviewerchat.h
+++ b/indra/newview/llviewerchat.h
@@ -40,6 +40,10 @@ class LLViewerChat
 	static LLFontGL* getChatFont();
 	static S32 getChatFontSize();
 	static void formatChatMsg(const LLChat& chat, std::string& formated_msg);
+	static std::string getSenderSLURL(const LLChat& chat, const LLSD& args);
+
+private:
+	static std::string getObjectImSLURL(const LLChat& chat, const LLSD& args);
 
 };
 
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index b45d1aa3a6d3c81223fc34d3ef720f58f983978f..ba48ad45172ca79d9804b7dc1898861a4ce01caa 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -1024,7 +1024,7 @@ void render_hud_attachments()
 		gPipeline.renderGeom(hud_cam);
 
 		LLSpatialGroup::sNoDelete = FALSE;
-		gPipeline.clearReferences();
+		//gPipeline.clearReferences();
 
 		render_hud_elements();
 
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 26b6ffa19ea75211817231665b583f88f15b3209..674fa91d4ddf2bf689cdbaebdc320af3cdb05633 100755
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -76,6 +76,7 @@
 #include "llmoveview.h"
 #include "llparcel.h"
 #include "llrootview.h"
+#include "llsceneview.h"
 #include "llselectmgr.h"
 #include "llsidetray.h"
 #include "llstatusbar.h"
@@ -515,6 +516,11 @@ class LLAdvancedToggleConsole : public view_listener_t
 		{
 			toggle_visibility( (void*)gDebugView->mFastTimerView );
 		}
+		else if ("scene view" == console_type)
+		{
+			toggle_visibility( (void*)gSceneView);
+		}
+
 #if MEM_TRACK_MEM
 		else if ("memory view" == console_type)
 		{
@@ -550,6 +556,10 @@ class LLAdvancedCheckConsole : public view_listener_t
 		{
 			new_value = get_visibility( (void*)gDebugView->mFastTimerView );
 		}
+		else if ("scene view" == console_type)
+		{
+			new_value = get_visibility( (void*) gSceneView);
+		}
 #if MEM_TRACK_MEM
 		else if ("memory view" == console_type)
 		{
@@ -845,37 +855,50 @@ class LLAdvancedCheckFeature : public view_listener_t
 void toggle_destination_and_avatar_picker(const LLSD& show)
 {
 	S32 panel_idx = show.isDefined() ? show.asInteger() : -1;
-	LLView* container = gViewerWindow->getRootView()->getChildView("avatar_picker_and_destination_guide_container");
+	LLView* container = gViewerWindow->getRootView()->findChildView("avatar_picker_and_destination_guide_container");
+	if (!container) return;
+
 	LLMediaCtrl* destinations = container->findChild<LLMediaCtrl>("destination_guide_contents");
 	LLMediaCtrl* avatar_picker = container->findChild<LLMediaCtrl>("avatar_picker_contents");
+	if (!destinations || !avatar_picker) return;
+
 	LLButton* avatar_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("avatar_btn");
 	LLButton* destination_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("destination_btn");
 
 	switch(panel_idx)
 	{
 	case 0:
-		container->setVisible(true);
-		destinations->setVisible(true);
-		avatar_picker->setVisible(false);
-		LLFirstUse::notUsingDestinationGuide(false);
-		avatar_btn->setToggleState(false);
-		destination_btn->setToggleState(true);
+		if (!destinations->getVisible())
+		{
+			container->setVisible(true);
+			destinations->setVisible(true);
+			avatar_picker->setVisible(false);
+			LLFirstUse::notUsingDestinationGuide(false);
+			avatar_btn->setToggleState(false);
+			destination_btn->setToggleState(true);
+			return;
+		}
 		break;
 	case 1:
-		container->setVisible(true);
-		destinations->setVisible(false);
-		avatar_picker->setVisible(true);
-		avatar_btn->setToggleState(true);
-		destination_btn->setToggleState(false);
+		if (!avatar_picker->getVisible())
+		{	
+			container->setVisible(true);
+			destinations->setVisible(false);
+			avatar_picker->setVisible(true);
+			avatar_btn->setToggleState(true);
+			destination_btn->setToggleState(false);
+			return;
+		}
 		break;
 	default:
-		container->setVisible(false);
-		destinations->setVisible(false);
-		avatar_picker->setVisible(false);
-		avatar_btn->setToggleState(false);
-		destination_btn->setToggleState(false);
 		break;
 	}
+
+	container->setVisible(false);
+	destinations->setVisible(false);
+	avatar_picker->setVisible(false);
+	avatar_btn->setToggleState(false);
+	destination_btn->setToggleState(false);
 };
 
 
@@ -7166,7 +7189,13 @@ LLViewerMenuHolderGL::LLViewerMenuHolderGL(const LLViewerMenuHolderGL::Params& p
 
 BOOL LLViewerMenuHolderGL::hideMenus()
 {
-	BOOL handled = LLMenuHolderGL::hideMenus();
+	BOOL handled = FALSE;
+	
+	if (LLMenuHolderGL::hideMenus())
+	{
+		LLToolPie::instance().blockClickToWalk();
+		handled = TRUE;
+	}
 
 	// drop pie menu selection
 	mParcelSelection = NULL;
@@ -7336,6 +7365,11 @@ class LLViewToggleBeacon : public view_listener_t
 			LLPipeline::toggleRenderPhysicalBeacons(NULL);
 			gSavedSettings.setBOOL( "physicalbeacon", LLPipeline::getRenderPhysicalBeacons(NULL) );
 		}
+		else if (beacon == "moapbeacon")
+		{
+			LLPipeline::toggleRenderMOAPBeacons(NULL);
+			gSavedSettings.setBOOL( "moapbeacon", LLPipeline::getRenderMOAPBeacons(NULL) );
+		}
 		else if (beacon == "soundsbeacon")
 		{
 			LLPipeline::toggleRenderSoundBeacons(NULL);
@@ -7395,6 +7429,11 @@ class LLViewCheckBeaconEnabled : public view_listener_t
 			new_value = gSavedSettings.getBOOL( "scriptsbeacon");
 			LLPipeline::setRenderScriptedBeacons(new_value);
 		}
+		else if (beacon == "moapbeacon")
+		{
+			new_value = gSavedSettings.getBOOL( "moapbeacon");
+			LLPipeline::setRenderMOAPBeacons(new_value);
+		}
 		else if (beacon == "physicalbeacon")
 		{
 			new_value = gSavedSettings.getBOOL( "physicalbeacon");
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index bcdc774c5e1b81930fcea735ac22680320ac5b38..a5b59e8281929c4be873d2cdcc59093b4c175660 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -240,6 +240,9 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
 	mState(0),
 	mMedia(NULL),
 	mClickAction(0),
+	mObjectCost(0),
+	mLinksetCost(0),
+	mPhysicsCost(0),
 	mLinksetPhysicsCost(0.f),
 	mCostStale(true),
 	mPhysicsShapeUnknown(true),
@@ -3134,7 +3137,7 @@ F32 LLViewerObject::getLinksetPhysicsCost()
 	return mLinksetPhysicsCost;
 }
 
-F32 LLViewerObject::getStreamingCost()
+F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes)
 {
 	return 0.f;
 }
@@ -3144,6 +3147,11 @@ U32 LLViewerObject::getTriangleCount()
 	return 0;
 }
 
+U32 LLViewerObject::getHighLODTriangleCount()
+{
+	return 0;
+}
+
 void LLViewerObject::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax)
 {
 	LLVector4a center;
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 2b2b7bd59dafe93be64f76b6c56af1c015462c2f..e417343becb07402ec4755c4fd80ca198b260cfe 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -326,8 +326,9 @@ class LLViewerObject : public LLPrimitive, public LLRefCount, public LLGLUpdate
 	
 	virtual void setScale(const LLVector3 &scale, BOOL damped = FALSE);
 
-	virtual F32 getStreamingCost();
+	virtual F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL);
 	virtual U32 getTriangleCount();
+	virtual U32 getHighLODTriangleCount();
 
 	void setObjectCost(F32 cost);
 	F32 getObjectCost();
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index f1acd34e1191793bb541050fcee9d8e4452cb7be..bde35ee33dd3dd790861d062186f4e44d44b18c1 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -493,6 +493,10 @@ class LLDebugText
 			{
 				F32 cost = 0.f;
 				S32 count = 0;
+				S32 object_count = 0;
+				S32 total_bytes = 0;
+				S32 visible_bytes = 0;
+
 				const char* label = "Region";
 				if (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 0)
 				{ //region
@@ -506,8 +510,13 @@ class LLDebugText
 								object->getRegion() == region &&
 								object->getVolume())
 							{
-								cost += object->getStreamingCost();
+								object_count++;
+								S32 bytes = 0;	
+								S32 visible = 0;
+								cost += object->getStreamingCost(&bytes, &visible);
 								count += object->getTriangleCount();
+								total_bytes += bytes;
+								visible_bytes += visible;
 							}
 						}
 					}
@@ -515,12 +524,16 @@ class LLDebugText
 				else
 				{
 					label = "Selection";
-					cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectStreamingCost();
+					cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectStreamingCost(&total_bytes, &visible_bytes);
 					count = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectTriangleCount();
+					object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
 				}
 					
-				addText(xpos,ypos, llformat("%s streaming cost: %.1f (%.1f KTris)",
-							label, cost, count/1000.f));
+				addText(xpos,ypos, llformat("%s streaming cost: %.1f", label, cost));
+				ypos += y_inc;
+
+				addText(xpos, ypos, llformat("    %.1f KTris, %.1f/%.1f KB, %d objects",
+										count/1024.f, visible_bytes/1024.f, total_bytes/1024.f, object_count));
 				ypos += y_inc;
 			
 			}
@@ -656,21 +669,30 @@ class LLDebugText
 		// only display these messages if we are actually rendering beacons at this moment
 		if (LLPipeline::getRenderBeacons(NULL) && LLFloaterReg::instanceVisible("beacons"))
 		{
-			if (LLPipeline::getRenderParticleBeacons(NULL))
+			if (LLPipeline::getRenderMOAPBeacons(NULL))
 			{
-				addText(xpos, ypos, beacon_particle);
+				addText(xpos, ypos, "Viewing media beacons (white)");
 				ypos += y_inc;
 			}
+
 			if (LLPipeline::toggleRenderTypeControlNegated((void*)LLPipeline::RENDER_TYPE_PARTICLES))
 			{
 				addText(xpos, ypos, particle_hiding);
 				ypos += y_inc;
 			}
-			if (LLPipeline::getRenderPhysicalBeacons(NULL))
+
+			if (LLPipeline::getRenderParticleBeacons(NULL))
 			{
-				addText(xpos, ypos, beacon_physical);
+				addText(xpos, ypos, "Viewing particle beacons (blue)");
 				ypos += y_inc;
 			}
+
+			if (LLPipeline::getRenderSoundBeacons(NULL))
+			{
+				addText(xpos, ypos, "Viewing sound beacons (yellow)");
+				ypos += y_inc;
+			}
+
 			if (LLPipeline::getRenderScriptedBeacons(NULL))
 			{
 				addText(xpos, ypos, beacon_scripted);
@@ -682,9 +704,10 @@ class LLDebugText
 					addText(xpos, ypos, beacon_scripted_touch);
 					ypos += y_inc;
 				}
-			if (LLPipeline::getRenderSoundBeacons(NULL))
+
+			if (LLPipeline::getRenderPhysicalBeacons(NULL))
 			{
-				addText(xpos, ypos, beacon_sound);
+				addText(xpos, ypos, "Viewing physical object beacons (green)");
 				ypos += y_inc;
 			}
 		}
@@ -1930,6 +1953,11 @@ void LLViewerWindow::initWorldUI()
 		avatar_picker->navigateTo(gSavedSettings.getString("AvatarPickerURL"), "text/html");
 	}
 
+	if (gSavedSettings.getBOOL("FirstLoginThisInstall"))
+	{
+		toggle_destination_and_avatar_picker(0);
+		gSavedSettings.setBOOL("FirstLoginThisInstall", FALSE);
+	}
 }
 
 // Destroy the UI
@@ -3718,7 +3746,7 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
 	LLVector3 mouse_world_start = mouse_point_global;
 	LLVector3 mouse_world_end   = mouse_point_global + mouse_direction_global * depth;
 
-	//gDebugRaycastIntersection = mouse_world_end;
+	gDebugRaycastIntersection = mouse_world_end;
 
 	if (start)
 	{
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 5f0e4bcded0842a16a4c4b03581bc6bc590f7aeb..71706f0146669571b7b082caff2ff8fd5356d28e 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -762,6 +762,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
 	mPelvisOffset = LLVector3(0.0f,0.0f,0.0f);
 	mLastPelvisToFoot = 0.0f;
 	mPelvisFixup = 0.0f;
+	mLastPelvisFixup = 0.0f;
 }
 
 //------------------------------------------------------------------------
@@ -1333,7 +1334,17 @@ const LLVector3 LLVOAvatar::getRenderPosition() const
 	}
 	else if (isRoot())
 	{
-		return mDrawable->getPositionAgent();
+		if ( !mHasPelvisOffset )
+		{
+			return mDrawable->getPositionAgent();
+		}
+		else
+		{
+			//Apply a pelvis fixup (as defined by the avs skin)
+			LLVector3 pos = mDrawable->getPositionAgent();
+			pos[VZ] += mPelvisFixup;
+			return pos;
+		}
 	}
 	else
 	{
@@ -3795,6 +3806,7 @@ void LLVOAvatar::setPelvisOffset( bool hasOffset, const LLVector3& offsetAmount,
 		//Store off last pelvis to foot value
 		mLastPelvisToFoot = mPelvisToFoot;
 		mPelvisOffset	  = offsetAmount;
+		mLastPelvisFixup  = mPelvisFixup;
 		mPelvisFixup	  = pelvisFixup;
 	}
 }
@@ -3810,6 +3822,15 @@ void LLVOAvatar::postPelvisSetRecalc( void )
 	updateHeadOffset();
 }
 //------------------------------------------------------------------------
+// pelisPoke
+//------------------------------------------------------------------------
+void LLVOAvatar::setPelvisOffset( F32 pelvisFixupAmount )
+{	
+	mHasPelvisOffset  = true;
+	mLastPelvisFixup  = mPelvisFixup;	
+	mPelvisFixup	  = pelvisFixupAmount;	
+}
+//------------------------------------------------------------------------
 // updateVisibility()
 //------------------------------------------------------------------------
 void LLVOAvatar::updateVisibility()
@@ -4947,6 +4968,7 @@ void LLVOAvatar::resetJointPositions( void )
 		mSkeleton[i].setId( LLUUID::null );
 	}
 	mHasPelvisOffset = false;
+	mPelvisFixup	 = mLastPelvisFixup;
 }
 //-----------------------------------------------------------------------------
 // resetSpecificJointPosition
@@ -5006,6 +5028,7 @@ void LLVOAvatar::resetJointPositionsToDefault( void )
 	}
 	//make sure we don't apply the joint offset
 	mHasPelvisOffset = false;
+	mPelvisFixup	 = mLastPelvisFixup;
 	postPelvisSetRecalc();
 }
 //-----------------------------------------------------------------------------
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 7209b9f1e5a330f0524f17861e6adacc104c805e..edec1b480aa8fadcc40a72f82900854607e85e73 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -295,11 +295,13 @@ class LLVOAvatar :
 	void				setPelvisOffset( bool hasOffset, const LLVector3& translation, F32 offset ) ;
 	bool				hasPelvisOffset( void ) { return mHasPelvisOffset; }
 	void				postPelvisSetRecalc( void );
+	void				setPelvisOffset( F32 pelvixFixupAmount );
 
 	bool				mHasPelvisOffset;
 	LLVector3			mPelvisOffset;
 	F32					mLastPelvisToFoot;
 	F32					mPelvisFixup;
+	F32					mLastPelvisFixup;
 
 	LLVector3			mHeadOffset; // current head position
 	LLViewerJoint		mRoot;
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 43d8b9d356cce4d72d07a4259bb3e1cd2900ae65..45277265df73b31eccd17a69275a3a75283648c8 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -3082,15 +3082,15 @@ U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const
 
 }
 
-F32 LLVOVolume::getStreamingCost()
+F32 LLVOVolume::getStreamingCost(S32* bytes, S32* visible_bytes)
 {
 	if (isMesh())
 	{	
-		const LLSD& header = gMeshRepo.getMeshHeader(getVolume()->getParams().getSculptID());
+		LLSD& header = gMeshRepo.getMeshHeader(getVolume()->getParams().getSculptID());
 
 		F32 radius = getScale().length();
 		
-		return LLMeshRepository::getStreamingCost(header, radius);
+		return LLMeshRepository::getStreamingCost(header, radius, bytes, visible_bytes, mLOD);
 	}
 		
 	return 0.f;
@@ -3108,6 +3108,36 @@ U32 LLVOVolume::getTriangleCount()
 	return count;
 }
 
+U32 LLVOVolume::getHighLODTriangleCount()
+{
+	U32 ret = 0;
+
+	LLVolume* volume = getVolume();
+
+	if (!isSculpted())
+	{
+		LLVolume* ref = LLPrimitive::getVolumeManager()->refVolume(volume->getParams(), 3);
+		ret = ref->getNumTriangles();
+		LLPrimitive::getVolumeManager()->unrefVolume(ref);
+	}
+	else if (isMesh())
+	{
+		LLVolume* ref = LLPrimitive::getVolumeManager()->refVolume(volume->getParams(), 3);
+		if (ref->isTetrahedron() || ref->getNumVolumeFaces() == 0)
+		{
+			gMeshRepo.loadMesh(this, volume->getParams(), LLModel::LOD_HIGH);
+		}
+		ret = ref->getNumTriangles();
+		LLPrimitive::getVolumeManager()->unrefVolume(ref);
+	}
+	else
+	{ //default sculpts have a constant number of triangles
+		ret = 31*2*31;  //31 rows of 31 columns of quads for a 32x32 vertex patch
+	}
+
+	return ret;
+}
+
 //static
 void LLVOVolume::preUpdateGeom()
 {
@@ -3941,7 +3971,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 						if ( bindCnt > 0 )
 						{					
 							const int jointCnt = pSkinData->mJointNames.size();
-							const int pelvisZOffset = pSkinData->mPelvisOffset;
+							const F32 pelvisZOffset = pSkinData->mPelvisOffset;
 							bool fullRig = (jointCnt>=20) ? true : false;
 							if ( fullRig )
 							{
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index b09243055c1ed3d14f6e6f8106c39ee565e896d6..fc00f0c0d0da3bcd6830e8597c6a104393fc7f5c 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -130,8 +130,9 @@ class LLVOVolume : public LLViewerObject
 	const LLMatrix3&	getRelativeXformInvTrans() const		{ return mRelativeXformInvTrans; }
 	/*virtual*/	const LLMatrix4	getRenderMatrix() const;
 				U32 	getRenderCost(std::set<LLUUID> &textures) const;
-	/*virtual*/	F32		getStreamingCost();
+	/*virtual*/	F32		getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL);
 	/*virtual*/ U32		getTriangleCount();
+	/*virtual*/ U32		getHighLODTriangleCount();
 	/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, 
 										  S32 face = -1,                        // which face to check, -1 = ALL_SIDES
 										  BOOL pick_transparent = FALSE,
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 24486a74115b74e597d1c050873c7f52e7690a0c..d18e1de60cb5fca5807e63de349c5226a6533fa6 100755
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -240,6 +240,16 @@ glh::matrix4f glh_get_current_projection()
 	return glh_copy_matrix(gGLProjection);
 }
 
+glh::matrix4f glh_get_last_modelview()
+{
+	return glh_copy_matrix(gGLLastModelView);
+}
+
+glh::matrix4f glh_get_last_projection()
+{
+	return glh_copy_matrix(gGLLastProjection);
+}
+
 void glh_copy_matrix(const glh::matrix4f& src, GLdouble* dst)
 {
 	for (U32 i = 0; i < 16; i++)
@@ -277,6 +287,7 @@ S32		LLPipeline::sCompiles = 0;
 BOOL	LLPipeline::sPickAvatar = TRUE;
 BOOL	LLPipeline::sDynamicLOD = TRUE;
 BOOL	LLPipeline::sShowHUDAttachments = TRUE;
+BOOL	LLPipeline::sRenderMOAPBeacons = FALSE;
 BOOL	LLPipeline::sRenderPhysicalBeacons = TRUE;
 BOOL	LLPipeline::sRenderScriptedBeacons = FALSE;
 BOOL	LLPipeline::sRenderScriptedTouchBeacons = TRUE;
@@ -825,7 +836,6 @@ void LLPipeline::releaseGLBuffers()
 		mGlow[i].release();
 	}
 
-	gBumpImageList.destroyGL();
 	LLVOAvatar::resetImpostors();
 }
 
@@ -948,8 +958,6 @@ void LLPipeline::createGLBuffers()
 			addDeferredAttachments(mGIMap);
 		}
 	}
-
-	gBumpImageList.restoreGL();
 }
 
 void LLPipeline::restoreGL() 
@@ -1912,7 +1920,7 @@ BOOL LLPipeline::getVisibleExtents(LLCamera& camera, LLVector3& min, LLVector3&
 
 static LLFastTimer::DeclareTimer FTM_CULL("Object Culling");
 
-void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip)
+void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip, LLPlane* planep)
 {
 	LLFastTimer t(FTM_CULL);
 	LLMemType mt_uc(LLMemType::MTYPE_PIPELINE_UPDATE_CULL);
@@ -1932,6 +1940,11 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
 		mScreen.bindTarget();
 	}
 
+	if (sUseOcclusion > 1)
+	{
+		gGL.setColorMask(false, false);
+	}
+
 	glMatrixMode(GL_PROJECTION);
 	glPushMatrix();
 	glLoadMatrixd(gGLLastProjection);
@@ -1946,10 +1959,37 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
 	LLGLDisable test(GL_ALPHA_TEST);
 	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
-	if (sUseOcclusion > 1)
+
+	//setup a clip plane in projection matrix for reflection renders (prevents flickering from occlusion culling)
+	LLViewerRegion* region = gAgent.getRegion();
+	LLPlane plane;
+
+	if (planep)
 	{
-		gGL.setColorMask(false, false);
+		plane = *planep;
+	}
+	else 
+	{
+		if (region)
+		{
+			LLVector3 pnorm;
+			F32 height = region->getWaterHeight();
+			if (water_clip < 0)
+			{ //camera is above water, clip plane points up
+				pnorm.setVec(0,0,1);
+				plane.setVec(pnorm, -height);
+			}
+			else if (water_clip > 0)
+			{	//camera is below water, clip plane points down
+				pnorm = LLVector3(0,0,-1);
+				plane.setVec(pnorm, height);
+			}
+		}
 	}
+	
+	glh::matrix4f modelview = glh_get_last_modelview();
+	glh::matrix4f proj = glh_get_last_projection();
+	LLGLUserClipPlane clip(plane, modelview, proj, water_clip != 0 && LLPipeline::sReflectionRender);
 
 	LLGLDepthTest depth(GL_TRUE, GL_FALSE);
 
@@ -2883,6 +2923,42 @@ void renderPhysicalBeacons(LLDrawable* drawablep)
 	}
 }
 
+void renderMOAPBeacons(LLDrawable* drawablep)
+{
+	LLViewerObject *vobj = drawablep->getVObj();
+
+	if(!vobj || vobj->isAvatar())
+		return;
+
+	BOOL beacon=FALSE;
+	U8 tecount=vobj->getNumTEs();
+	for(int x=0;x<tecount;x++)
+	{
+		if(vobj->getTE(x)->hasMedia())
+		{
+			beacon=TRUE;
+			break;
+		}
+	}
+	if(beacon==TRUE)
+	{
+		if (gPipeline.sRenderBeacons)
+		{
+			gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 1.f, 1.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
+		}
+
+		if (gPipeline.sRenderHighlight)
+		{
+			S32 face_id;
+			S32 count = drawablep->getNumFaces();
+			for (face_id = 0; face_id < count; face_id++)
+			{
+				gPipeline.mHighlightFaces.push_back(drawablep->getFace(face_id) );
+			}
+		}
+	}
+}
+
 void renderParticleBeacons(LLDrawable* drawablep)
 {
 	// Look for attachments, objects, etc.
@@ -3075,6 +3151,11 @@ void LLPipeline::postSort(LLCamera& camera)
 			forAllVisibleDrawables(renderPhysicalBeacons);
 		}
 
+		if(sRenderMOAPBeacons)
+		{
+			forAllVisibleDrawables(renderMOAPBeacons);
+		}
+
 		if (sRenderParticleBeacons)
 		{
 			forAllVisibleDrawables(renderParticleBeacons);
@@ -5498,6 +5579,24 @@ BOOL LLPipeline::getRenderScriptedTouchBeacons(void*)
 	return sRenderScriptedTouchBeacons;
 }
 
+// static
+void LLPipeline::setRenderMOAPBeacons(BOOL val)
+{
+	sRenderMOAPBeacons = val;
+}
+
+// static
+void LLPipeline::toggleRenderMOAPBeacons(void*)
+{
+	sRenderMOAPBeacons = !sRenderMOAPBeacons;
+}
+
+// static
+BOOL LLPipeline::getRenderMOAPBeacons(void*)
+{
+	return sRenderMOAPBeacons;
+}
+
 // static
 void LLPipeline::setRenderPhysicalBeacons(BOOL val)
 {
@@ -6257,8 +6356,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
 		F32 fnumber = gSavedSettings.getF32("CameraFNumber");
 		F32 default_focal_length = gSavedSettings.getF32("CameraFocalLength");
 
-		if (LLToolMgr::getInstance()->inBuildMode())
-		{ //squish focal length when in build mode so DoF doesn't make editing objects difficult
+		if (LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField"))
+		{ //squish focal length when in build mode (or if DoF is disabled) so DoF doesn't make editing objects difficult
 			default_focal_length = 5.f;
 		}
 
@@ -7830,18 +7929,13 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 					gPipeline.pushRenderTypeMask();
 					gPipeline.andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY,
 						LLPipeline::RENDER_TYPE_WL_SKY,
+						LLPipeline::RENDER_TYPE_CLOUDS,
 						LLPipeline::END_RENDER_TYPES);
 
 					static LLCullResult result;
 					updateCull(camera, result);
 					stateSort(camera, result);
 
-					andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY,
-						LLPipeline::RENDER_TYPE_CLOUDS,
-						LLPipeline::RENDER_TYPE_WL_SKY,
-						LLPipeline::END_RENDER_TYPES);
-
-					//bad pop here 
 					renderGeom(camera, TRUE);
 
 					gPipeline.popRenderTypeMask();
@@ -7874,7 +7968,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 
 					LLGLUserClipPlane clip_plane(plane, mat, projection);
 					LLGLDisable cull(GL_CULL_FACE);
-					updateCull(camera, ref_result, 1);
+					updateCull(camera, ref_result, -water_clip, &plane);
 					stateSort(camera, ref_result);
 				}	
 
@@ -7931,9 +8025,11 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 			{
 				//clip out geometry on the same side of water as the camera
 				mat = glh_get_current_modelview();
-				LLGLUserClipPlane clip_plane(LLPlane(-pnorm, -(pd+pad)), mat, projection);
+				LLPlane plane(-pnorm, -(pd+pad));
+
+				LLGLUserClipPlane clip_plane(plane, mat, projection);
 				static LLCullResult result;
-				updateCull(camera, result, water_clip);
+				updateCull(camera, result, water_clip, &plane);
 				stateSort(camera, result);
 
 				gGL.setColorMask(true, true);
@@ -8728,7 +8824,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
 		near_clip = -max.mV[2];
 		F32 far_clip = -min.mV[2]*2.f;
 
-		far_clip = llmin(far_clip, 128.f);
+		//far_clip = llmin(far_clip, 128.f);
 		far_clip = llmin(far_clip, camera.getFar());
 
 		F32 range = far_clip-near_clip;
@@ -9078,7 +9174,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
 			}
 		}
 
-		shadow_cam.setFar(128.f);
+		//shadow_cam.setFar(128.f);
 		shadow_cam.setOriginAndLookAt(eye, up, center);
 
 		shadow_cam.setOrigin(0,0,0);
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index be58af947c43dfa4d715a1900ec0c442dac3e327..0cf3fde562747685740e5840908fe727b0ce34d5 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -208,7 +208,7 @@ class LLPipeline
 	BOOL visibleObjectsInFrustum(LLCamera& camera);
 	BOOL getVisibleExtents(LLCamera& camera, LLVector3 &min, LLVector3& max);
 	BOOL getVisiblePointCloud(LLCamera& camera, LLVector3 &min, LLVector3& max, std::vector<LLVector3>& fp, LLVector3 light_dir = LLVector3(0,0,0));
-	void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0);  //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane
+	void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0, LLPlane* plane = NULL);  //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane
 	void createObjects(F32 max_dtime);
 	void createObject(LLViewerObject* vobj);
 	void updateGeom(F32 max_dtime);
@@ -331,6 +331,10 @@ class LLPipeline
 	static void toggleRenderSoundBeacons(void* data);
 	static BOOL getRenderSoundBeacons(void* data);
 
+	static void setRenderMOAPBeacons(BOOL val);
+	static void toggleRenderMOAPBeacons(void * data);
+	static BOOL getRenderMOAPBeacons(void * data);
+
 	static void setRenderPhysicalBeacons(BOOL val);
 	static void toggleRenderPhysicalBeacons(void* data);
 	static BOOL getRenderPhysicalBeacons(void* data);
@@ -728,6 +732,7 @@ class LLPipeline
 	S32						mLightingDetail;
 		
 	static BOOL				sRenderPhysicalBeacons;
+	static BOOL				sRenderMOAPBeacons;
 	static BOOL				sRenderScriptedTouchBeacons;
 	static BOOL				sRenderScriptedBeacons;
 	static BOOL				sRenderParticleBeacons;
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 87d8e54a897dc8efd11b7eeecd2e5fefb64d80f6..bfcf130e3334d980c164757272a7cc88b9efd05a 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -696,4 +696,5 @@ with the same filename but different name
 
   <texture name="Yellow_Gradient" file_name="windows/yellow_gradient.png"/>
   <texture name="Popup_Caution" file_name="icons/pop_up_caution.png"/>
+  <texture name="Camera_Drag_Dot" file_name="world/CameraDragDot.png"/>
 </textures>
diff --git a/indra/newview/skins/default/textures/world/CameraDragDot.png b/indra/newview/skins/default/textures/world/CameraDragDot.png
new file mode 100644
index 0000000000000000000000000000000000000000..57698e19560dc119f045667b0ae3d49e611d3b36
Binary files /dev/null and b/indra/newview/skins/default/textures/world/CameraDragDot.png differ
diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml
index 8783b520136a84db6a1076cc3a30121386c6eec7..2d8459479a227a31d62e7a15d143e1c001077964 100644
--- a/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -348,6 +348,7 @@ Nur große Parzellen können in der Suche aufgeführt werden.
 				<combo_box.item label="Parks und Natur" name="item9"/>
 				<combo_box.item label="Wohngebiet" name="item10"/>
 				<combo_box.item label="Shopping" name="item11"/>
+				<combo_box.item label="Vermietung" name="item13"/>
 				<combo_box.item label="Sonstige" name="item12"/>
 			</combo_box>
 			<combo_box name="land category">
@@ -362,6 +363,7 @@ Nur große Parzellen können in der Suche aufgeführt werden.
 				<combo_box.item label="Parks und Natur" name="item9"/>
 				<combo_box.item label="Wohngebiet" name="item10"/>
 				<combo_box.item label="Shopping" name="item11"/>
+				<combo_box.item label="Vermietung" name="item13"/>
 				<combo_box.item label="Sonstige" name="item12"/>
 			</combo_box>
 			<check_box label="Moderater Inhalt" name="MatureCheck" tool_tip=""/>
@@ -437,7 +439,7 @@ Nur große Parzellen können in der Suche aufgeführt werden.
 				(Durch Grundbesitz festgelegt)
 			</panel.string>
 			<panel.string name="allow_public_access">
-				Öffentlichen Zugang erlauben ([MATURITY])
+				Öffentlichen Zugang erlauben ([MATURITY]) (Hinweis: Bei Deaktivierung dieser Option werden Bannlinien generiert)
 			</panel.string>
 			<panel.string name="estate_override">
 				Eine oder mehrere dieser Optionen gelten auf Grundbesitzebene
diff --git a/indra/newview/skins/default/xui/de/floater_map.xml b/indra/newview/skins/default/xui/de/floater_map.xml
index 217a641dec2e40c715be36600b992a8894335e95..f6d9db8d53a9c2d15ec27db4e13f84ccc0f53ad1 100644
--- a/indra/newview/skins/default/xui/de/floater_map.xml
+++ b/indra/newview/skins/default/xui/de/floater_map.xml
@@ -1,32 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="Map" title="">
-	<floater.string name="mini_map_north">
-		N
-	</floater.string>
-	<floater.string name="mini_map_east">
-		O
-	</floater.string>
-	<floater.string name="mini_map_west">
-		W
-	</floater.string>
-	<floater.string name="mini_map_south">
-		S
-	</floater.string>
-	<floater.string name="mini_map_southeast">
-		SO
-	</floater.string>
-	<floater.string name="mini_map_northeast">
-		NO
-	</floater.string>
-	<floater.string name="mini_map_southwest">
-		SW
-	</floater.string>
-	<floater.string name="mini_map_northwest">
-		NW
-	</floater.string>
 	<floater.string name="ToolTipMsg">
 		[REGION](Doppelklicken, um Karte zu öffnen; Umschalt-Taste gedrückt halten und ziehen, um zu schwenken)
 	</floater.string>
+	<floater.string name="AltToolTipMsg">
+		[REGION](Doppelklicken, um zu teleportieren; Umschalttaste gedrückt halten und ziehen, um zu schwenken)
+	</floater.string>
 	<floater.string name="mini_map_caption">
 		MINI-KARTE
 	</floater.string>
diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml
index d201fc327cc670e02eb8c33d5430fce449ec16b0..d95d674df2d5bc255d7d863e68a005e24703234f 100644
--- a/indra/newview/skins/default/xui/de/floater_tools.xml
+++ b/indra/newview/skins/default/xui/de/floater_tools.xml
@@ -64,6 +64,8 @@
 		<radio_item label="Fläche auswählen" name="radio select face"/>
 	</radio_group>
 	<check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/>
+	<button label="Link" name="link_btn"/>
+	<button label="Verknüpfung auflösen" name="unlink_btn"/>
 	<text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für dieses Objekt">
 		þ: [COUNT]
 	</text>
diff --git a/indra/newview/skins/default/xui/de/menu_attachment_self.xml b/indra/newview/skins/default/xui/de/menu_attachment_self.xml
index 644fc68ba4e8c389b6e38723692ba005552c605c..325d52a22ec7bab82e16069396d376c0e38d70c8 100644
--- a/indra/newview/skins/default/xui/de/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/de/menu_attachment_self.xml
@@ -5,7 +5,7 @@
 	<menu_item_call label="Abnehmen" name="Detach"/>
 	<menu_item_call label="Hinsetzen" name="Sit Down Here"/>
 	<menu_item_call label="Aufstehen" name="Stand Up"/>
-	<menu_item_call label="Outfit ändern" name="Change Outfit"/>
+	<menu_item_call label="Mein Aussehen" name="Change Outfit"/>
 	<menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/>
 	<menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
 	<menu_item_call label="Meine Freunde" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/de/menu_avatar_self.xml b/indra/newview/skins/default/xui/de/menu_avatar_self.xml
index 582c76ac94556ad4c55655cb7dd2f18694aaaa84..40557b7ad83ecb4b6f413eca325f561e01c345b7 100644
--- a/indra/newview/skins/default/xui/de/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/de/menu_avatar_self.xml
@@ -21,7 +21,7 @@
 		<context_menu label="Abnehmen" name="Object Detach"/>
 		<menu_item_call label="Alles abnehmen" name="Detach All"/>
 	</context_menu>
-	<menu_item_call label="Outfit ändern" name="Chenge Outfit"/>
+	<menu_item_call label="Mein Aussehen" name="Chenge Outfit"/>
 	<menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/>
 	<menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
 	<menu_item_call label="Meine Freunde" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/de/menu_bottomtray.xml b/indra/newview/skins/default/xui/de/menu_bottomtray.xml
index 6c4308286a6127315f61ef644ec6bba56a4d2564..660cd2eaf346f15233f2f74ecc83ebfd1ec989e0 100644
--- a/indra/newview/skins/default/xui/de/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/de/menu_bottomtray.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu name="hide_camera_move_controls_menu">
+	<menu_item_check label="Voice aktiviert" name="EnableVoiceChat"/>
 	<menu_item_check label="Schaltfläche Gesten" name="ShowGestureButton"/>
 	<menu_item_check label="Schaltfläche Bewegungssteuerung" name="ShowMoveButton"/>
 	<menu_item_check label="Schaltfläche Ansicht" name="ShowCameraButton"/>
 	<menu_item_check label="Schaltfläche Foto" name="ShowSnapshotButton"/>
-	<menu_item_check label="Schaltfläche „Seitenleiste“" name="ShowSidebarButton"/>
 	<menu_item_check label="Schaltfläche „Bauen“" name="ShowBuildButton"/>
 	<menu_item_check label="Schaltfläche „Suchen“" name="ShowSearchButton"/>
 	<menu_item_check label="Schaltfläche „Karte“" name="ShowWorldMapButton"/>
diff --git a/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml
index edad34a1d5a627375e17d7a9e46a71bec0d499c1..641a0ceebe926d50b72f0ee459856d6525453649 100644
--- a/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
 	<menu_item_call label="Profil anzeigen" name="view_profile"/>
 	<menu_item_call label="Freund hinzufügen" name="add_friend"/>
 	<menu_item_call label="IM" name="im"/>
@@ -11,9 +11,11 @@
 	<menu_item_call label="Melden" name="report"/>
 	<menu_item_call label="Einfrieren" name="freeze"/>
 	<menu_item_call label="Hinauswerfen" name="eject"/>
+	<menu_item_call label="Hinauswerfen" name="kick"/>
+	<menu_item_call label="CSR" name="csr"/>
 	<menu_item_call label="Fehler in Texturen beseitigen" name="debug"/>
 	<menu_item_call label="Auf Karte anzeigen" name="find_on_map"/>
 	<menu_item_call label="Hineinzoomen" name="zoom_in"/>
 	<menu_item_call label="Bezahlen" name="pay"/>
 	<menu_item_call label="Teilen" name="share"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml
index 851a96cc0997e4407964b42670548c61bdfac843..5979194bfb557c770e31c611210c31f99b6cb533 100644
--- a/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
-	<menu_item_call label="Hinsetzen" name="sit_down_here"/>
-	<menu_item_call label="Aufstehen" name="stand_up"/>
-	<menu_item_call label="Outfit ändern" name="change_outfit"/>
-	<menu_item_call label="Mein Profil" name="my_profile"/>
-	<menu_item_call label="Meine Freunde" name="my_friends"/>
-	<menu_item_call label="Meine Gruppen" name="my_groups"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Menu">
+	<menu_item_call label="Hinsetzen" name="Sit Down Here"/>
+	<menu_item_call label="Aufstehen" name="Stand Up"/>
+	<context_menu label="Ausziehen" name="Take Off &gt;">
+		<context_menu label="Kleidung" name="Clothes &gt;">
+			<menu_item_call label="Hemd" name="Shirt"/>
+			<menu_item_call label="Hose" name="Pants"/>
+			<menu_item_call label="Rock" name="Skirt"/>
+			<menu_item_call label="Schuhe" name="Shoes"/>
+			<menu_item_call label="Strümpfe" name="Socks"/>
+			<menu_item_call label="Jacke" name="Jacket"/>
+			<menu_item_call label="Handschuhe" name="Gloves"/>
+			<menu_item_call label="Unterhemd" name="Self Undershirt"/>
+			<menu_item_call label="Unterhose" name="Self Underpants"/>
+			<menu_item_call label="Tätowierung" name="Self Tattoo"/>
+			<menu_item_call label="Alpha" name="Self Alpha"/>
+			<menu_item_call label="Alle Kleider" name="All Clothes"/>
+		</context_menu>
+		<context_menu label="HUD" name="Object Detach HUD"/>
+		<context_menu label="Abnehmen" name="Object Detach"/>
+		<menu_item_call label="Alles abnehmen" name="Detach All"/>
+	</context_menu>
+	<menu_item_call label="Outfit ändern" name="Chenge Outfit"/>
+	<menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/>
+	<menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
+	<menu_item_call label="Meine Freunde" name="Friends..."/>
+	<menu_item_call label="Meine Gruppen" name="Groups..."/>
+	<menu_item_call label="Mein Profil" name="Profile..."/>
 	<menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml
index df86a5cf71c13ec4c1461fd839996793ce168c1c..48dec3e856cb60f9f07f9ef5612d56cc830bb903 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml
@@ -3,6 +3,7 @@
 	<menu_item_call label="Neues Inventar-Fenster" name="new_window"/>
 	<menu_item_check label="Nach Name sortieren" name="sort_by_name"/>
 	<menu_item_check label="Nach aktuellesten Objekten sortieren" name="sort_by_recent"/>
+	<menu_item_check label="Ordner immer nach Namen sortieren" name="sort_folders_by_name"/>
 	<menu_item_check label="Systemordner nach oben" name="sort_system_folders_to_top"/>
 	<menu_item_call label="Filter anzeigen" name="show_filters"/>
 	<menu_item_call label="Filter zurücksetzen" name="reset_filters"/>
diff --git a/indra/newview/skins/default/xui/de/menu_object.xml b/indra/newview/skins/default/xui/de/menu_object.xml
index 19057d4228df5b65f1acc49d69ed108a53a55d5f..412bd3ac04e68bdce09f43b0931952bff6212379 100644
--- a/indra/newview/skins/default/xui/de/menu_object.xml
+++ b/indra/newview/skins/default/xui/de/menu_object.xml
@@ -16,14 +16,14 @@
 		<context_menu label="Anhängen" name="Object Attach"/>
 		<context_menu label="HUD anhängen" name="Object Attach HUD"/>
 	</context_menu>
-	<context_menu label="Entfernen" name="Remove">
+	<context_menu label="Verwalten" name="Remove">
 		<menu_item_call label="Missbrauch melden" name="Report Abuse..."/>
 		<menu_item_call label="Ignorieren" name="Object Mute"/>
 		<menu_item_call label="Zurückgeben" name="Return..."/>
-		<menu_item_call label="Löschen" name="Delete"/>
 	</context_menu>
 	<menu_item_call label="Nehmen" name="Pie Object Take"/>
 	<menu_item_call label="Kopie nehmen" name="Take Copy"/>
 	<menu_item_call label="Bezahlen" name="Pay..."/>
 	<menu_item_call label="Kaufen" name="Buy..."/>
+	<menu_item_call label="Löschen" name="Delete"/>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/de/menu_places_gear_folder.xml
index 132d3f6466d15e1d3ad35f1fa1b227131cf865bf..892f075d3c2858ebc3ea65703381b69e7a72981e 100644
--- a/indra/newview/skins/default/xui/de/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/de/menu_places_gear_folder.xml
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<toggleable_menu name="menu_folder_gear">
 	<menu_item_call label="Landmarke hinzufügen" name="add_landmark"/>
 	<menu_item_call label="Ordner hinzufügen" name="add_folder"/>
+	<menu_item_call label="Objekt wiederherstellen" name="restore_item"/>
 	<menu_item_call label="Ausschneiden" name="cut"/>
 	<menu_item_call label="Kopieren" name="copy_folder"/>
 	<menu_item_call label="Einfügen" name="paste"/>
@@ -12,4 +13,4 @@
 	<menu_item_call label="Alle Ordner aufklappen" name="expand_all"/>
 	<menu_item_call label="Alle Ordner schließen" name="collapse_all"/>
 	<menu_item_check label="Nach Datum sortieren" name="sort_by_date"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml
index 6af4d644af0846da036362727929c9950572786a..8955f797a24af231ada74bf18fd534517d70b484 100644
--- a/indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml
@@ -1,10 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<toggleable_menu name="menu_ladmark_gear">
 	<menu_item_call label="Teleportieren" name="teleport"/>
 	<menu_item_call label="Weitere Informationen" name="more_info"/>
 	<menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
 	<menu_item_call label="Landmarke hinzufügen" name="add_landmark"/>
 	<menu_item_call label="Ordner hinzufügen" name="add_folder"/>
+	<menu_item_call label="Objekt wiederherstellen" name="restore_item"/>
 	<menu_item_call label="Ausschneiden" name="cut"/>
 	<menu_item_call label="Landmarke kopieren" name="copy_landmark"/>
 	<menu_item_call label="SLurl kopieren" name="copy_slurl"/>
@@ -15,4 +16,4 @@
 	<menu_item_call label="Alle Ordner schließen" name="collapse_all"/>
 	<menu_item_check label="Nach Datum sortieren" name="sort_by_date"/>
 	<menu_item_call label="Auswahl erstellen" name="create_pick"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index 4a043e1233ff30b15cc47b1fd333c009217b488b..17bcb013cc9e208389ad4a931c29a68374e5c457 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -7,7 +7,7 @@
 		</menu_item_call>
 		<menu_item_call label="L$ kaufen" name="Buy and Sell L$"/>
 		<menu_item_call label="Mein Profil" name="Profile"/>
-		<menu_item_call label="Outfit ändern" name="ChangeOutfit"/>
+		<menu_item_call label="Mein Aussehen" name="ChangeOutfit"/>
 		<menu_item_check label="Mein Inventar" name="Inventory"/>
 		<menu_item_check label="Mein Inventar" name="ShowSidetrayInventory"/>
 		<menu_item_check label="Meine Gesten" name="Gestures"/>
@@ -35,6 +35,7 @@
 	<menu label="Welt" name="World">
 		<menu_item_check label="Minikarte" name="Mini-Map"/>
 		<menu_item_check label="Karte" name="World Map"/>
+		<menu_item_check label="Suchen" name="Search"/>
 		<menu_item_call label="Foto" name="Take Snapshot"/>
 		<menu_item_call label="Landmarke für diesen Ort setzen" name="Create Landmark Here"/>
 		<menu label="Ortsprofil" name="Land">
@@ -228,8 +229,10 @@
 		<menu label="Info anzeigen" name="Display Info">
 			<menu_item_check label="Zeit anzeigen" name="Show Time"/>
 			<menu_item_check label="Render-Info anzeigen" name="Show Render Info"/>
+			<menu_item_check label="Texturinfos anzeigen" name="Show Texture Info"/>
 			<menu_item_check label="Matrizen anzeigen" name="Show Matrices"/>
 			<menu_item_check label="Farbe unter Cursor anzeigen" name="Show Color Under Cursor"/>
+			<menu_item_check label="Speicher anzeigen" name="Show Memory"/>
 			<menu_item_check label="Akutalisierungen an Objekten anzeigen" name="Show Updates"/>
 		</menu>
 		<menu label="Fehler erzwingen" name="Force Errors">
@@ -254,6 +257,7 @@
 			<menu_item_check label="Shadow Frusta" name="Shadow Frusta"/>
 			<menu_item_check label="Okklusion" name="Occlusion"/>
 			<menu_item_check label="Bündel rendern" name="Render Batches"/>
+			<menu_item_check label="Typ aktualisieren" name="Update Type"/>
 			<menu_item_check label="Texture-Anim" name="Texture Anim"/>
 			<menu_item_check label="Textur-Priorität" name="Texture Priority"/>
 			<menu_item_check label="Texturbereich" name="Texture Area"/>
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index b0ad989a59bc801675bec7cf355bacaa16c0e042..3c63c093d28731c3c3d02d550f0a7edc1cc227f8 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -72,9 +72,9 @@ Fehlerdetails: The notification called &apos;[_NAME]&apos; was not found in noti
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
 	<notification name="LoginFailedNoNetwork">
-		Eine Verbindung zum [SECOND_LIFE_GRID] konnte nicht hergestellt werden.
-&apos;[DIAGNOSTIC]&apos;
-Bitte vergewissern Sie sich, dass Ihre Internetverbindung funktioniert.
+		Verbindung nicht möglich zum [SECOND_LIFE_GRID].
+    &apos;[DIAGNOSTIC]&apos;
+Stellen Sie sicher, dass Ihre Internetverbindung funktioniert.
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
 	<notification name="MessageTemplateNotFound">
@@ -340,13 +340,6 @@ Sie benötigen ein Konto, um [SECOND_LIFE] betreten zu können. Möchten Sie jet
 	<notification name="InvalidCredentialFormat">
 		Sie müssen entweder den Benutzernamen oder den Vor- und Nachnamen Ihres Avatars in das Feld „Benutzername“ eingeben und die Anmeldung dann erneut versuchen.
 	</notification>
-	<notification name="AddClassified">
-		Anzeigen werden im Suchverzeichnis im Abschnitt „Anzeigen&quot; und auf [http://secondlife.com/community/classifieds secondlife.com] für eine Woche angezeigt.
-Füllen Sie Ihre Anzeige aus und klicken Sie auf &apos;Veröffentlichen...&apos;, um sie zum Verzeichnis hinzuzufügen.
-Sie werden gebeten für die Anzeige zu bezahlen, wenn Sie auf &apos;Veröffentlichen&apos; klicken.
-Wenn Sie mehr bezahlen, erscheint Ihre Anzeige weiter oben in der Liste, ebenso wenn ein Benutzer nach Ihren Suchbegriffen sucht.
-		<usetemplate ignoretext="So wird eine neue Anzeige erstellt" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
-	</notification>
 	<notification name="DeleteClassified">
 		Anzeige „[NAME]“ löschen?
 Gebühren werden nicht rückerstattet.
@@ -2768,11 +2761,11 @@ Die Schaltfläche wird angezeigt, wenn genügend Platz vorhanden ist.
 		Wählen Sie Einwohner aus, für die Sie das Objekt freigeben möchten.
 	</notification>
 	<notification name="ShareItemsConfirmation">
-		Möchten Sie diese Objekte wirklich für andere freigeben:
+		Möchten Sie wirklich die folgenden Objekte:
 
 &lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
 
-Für folgende Einwohner:
+für folgende Einwohner freigeben:
 
 [RESIDENTS]
 		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
@@ -2863,9 +2856,6 @@ Alle stummschalten?
 	<notification label="Welt erkunden" name="HintDestinationGuide">
 		Im Reiseführer finden Sie Tausende von interessanten Orten. Wählen Sie einfach einen Ort aus und klicken Sie auf „Teleportieren“.
 	</notification>
-	<notification label="Aussehen ändern" name="HintAvatarPicker">
-		Möchten Sie einen neuen Look ausprobieren? Klicken Sie auf die Schaltfläche unten, um mehr Avatare zu sehen.
-	</notification>
 	<notification label="Seitenleiste" name="HintSidePanel">
 		In der Seitenleiste können Sie schnell auf Ihr Inventar, Ihre Outfits, Ihre Profile u. ä. zugreifen.
 	</notification>
@@ -2903,6 +2893,38 @@ Alle stummschalten?
 			<button name="cancel" text="Abbrechen"/>
 		</form>
 	</notification>
+	<notification label="" name="ModeChange">
+		Zum Wechsel des Modus müssen Sie das Programm beenden und neu starten.
+		<usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+	</notification>
+	<notification label="" name="NoClassifieds">
+		Die Erstellung und Bearbeitung von Anzeigen ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden.
+		<usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+	</notification>
+	<notification label="" name="NoGroupInfo">
+		Die Erstellung und Bearbeitung von Gruppen ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden.
+		<usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+	</notification>
+	<notification label="" name="NoPicks">
+		Die Erstellung und Bearbeitung von Auswahlen ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden.
+		<usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+	</notification>
+	<notification label="" name="NoWorldMap">
+		Die Anzeige der Weltkarte ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden.
+		<usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+	</notification>
+	<notification label="" name="NoVoiceCall">
+		Voice-Anrufe sind nur im Modus „Erweitert“ möglich. Möchten Sie sich abmelden und den Modus wechseln?
+		<usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+	</notification>
+	<notification label="" name="NoAvatarShare">
+		Die Freigabe ist nur im Modus „Erweitert“ möglich. Möchten Sie sich abmelden und den Modus wechseln?
+		<usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+	</notification>
+	<notification label="" name="NoAvatarPay">
+		Die Bezahlung anderer Einwohner ist nur im Modus „Erweitert“ möglich. Möchten Sie sich abmelden und den Modus wechseln?
+		<usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+	</notification>
 	<global name="UnsupportedCPU">
 		- Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen.
 	</global>
diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml
index 1bee6b1ead257819e50dd818d3249d460d1ce014..553bd3e2ff74740f89327e53ab934b94ee90280d 100644
--- a/indra/newview/skins/default/xui/de/panel_login.xml
+++ b/indra/newview/skins/default/xui/de/panel_login.xml
@@ -17,6 +17,13 @@
 			</text>
 			<check_box label="Kennwort merken" name="remember_check"/>
 			<button label="Anmelden" name="connect_btn"/>
+			<text name="mode_selection_text">
+				Modus:
+			</text>
+			<combo_box name="mode_combo" tool_tip="Wählen Sie den gewünschten Modus aus. Basis: Second Life schnell und einfach erkunden und chatten. Erweitert: Zugriff auf zusätzliche Funktionen.">
+				<combo_box.item label="Basis" name="Basic"/>
+				<combo_box.item label="Erweitert" name="Advanced"/>
+			</combo_box>
 			<text name="start_location_text">
 				Hier anfangen:
 			</text>
diff --git a/indra/newview/skins/default/xui/de/panel_nearby_media.xml b/indra/newview/skins/default/xui/de/panel_nearby_media.xml
index ef66148902abecb34582c0f61a152709e09f3f59..90885c71924e1e7c0bfd011a5627d41b1819be3e 100644
--- a/indra/newview/skins/default/xui/de/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/de/panel_nearby_media.xml
@@ -19,7 +19,7 @@
 		<button label="Stoppen" name="all_nearby_media_disable_btn" tool_tip="Alle Medien in der Nähe ausschalten"/>
 		<button label="Starten" name="all_nearby_media_enable_btn" tool_tip="Alle Medien in der Nähe einschalten"/>
 		<button name="open_prefs_btn" tool_tip="Medien-Einstellungen öffnen"/>
-		<button label="Mehr &gt;&gt;" label_selected="Weniger &lt;&lt;" name="more_btn" tool_tip="Erweiterte Steuerung"/>
+		<button label="Mehr &gt;&gt;" label_selected="&lt;&lt; Weniger" name="more_btn" tool_tip="Erweiterte Steuerung"/>
 		<button label="Mehr &gt;&gt;" label_selected="Weniger &lt;&lt;" name="less_btn" tool_tip="Erweiterte Steuerung"/>
 	</panel>
 	<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/de/panel_people.xml b/indra/newview/skins/default/xui/de/panel_people.xml
index 99e0b933b8648dbbbc9197979c56dfa7aaec3ccc..004792bbf531446352523b2c8e936925f1311cba 100644
--- a/indra/newview/skins/default/xui/de/panel_people.xml
+++ b/indra/newview/skins/default/xui/de/panel_people.xml
@@ -18,6 +18,8 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte].
 	<string name="groups_filter_label" value="Nach Gruppen filtern"/>
 	<string name="no_filtered_groups_msg" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/groups/[SEARCH_TERM] Suche]."/>
 	<string name="no_groups_msg" value="Suchen Sie nach Gruppen? Versuchen Sie es mit der [secondlife:///app/search/groups Suche]."/>
+	<string name="MiniMapToolTipMsg" value="[REGION](Doppelklicken, um Karte zu öffnen; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/>
+	<string name="AltMiniMapToolTipMsg" value="[REGION](Doppelklicken, um zu teleportieren; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/>
 	<filter_editor label="Filter" name="filter_input"/>
 	<tab_container name="tabs">
 		<panel label="IN DER NÄHE" name="nearby_panel">
diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml
index 938631f65d398e115556259551a709010b66f3a9..b4c6e67108564f801305b05281f83bd2f40dae58 100644
--- a/indra/newview/skins/default/xui/de/panel_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_profile.xml
@@ -16,6 +16,12 @@
 	<string name="RegisterDateFormat">
 		[REG_DATE] ([AGE])
 	</string>
+	<string name="name_text_args">
+		[NAME]
+	</string>
+	<string name="display_name_text_args">
+		[DISPLAY_NAME]
+	</string>
 	<layout_stack name="layout">
 		<layout_panel name="profile_stack">
 			<scroll_container name="profile_scroll">
@@ -34,7 +40,7 @@
 					</text_editor>
 					<text name="title_partner_text" value="Partner:"/>
 					<panel name="partner_data_panel">
-						<name_box initial_value="(wird in Datenbank gesucht)" name="partner_text"/>
+						<text initial_value="(wird in Datenbank gesucht)" name="partner_text"/>
 					</panel>
 					<text name="title_groups_text" value="Gruppen:"/>
 				</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_script_ed.xml b/indra/newview/skins/default/xui/de/panel_script_ed.xml
index 73789f06d808fd186967dd5cff3ad7cf712ba9bd..adfe2a342b77a694e6130fecafef47d633099c1e 100644
--- a/indra/newview/skins/default/xui/de/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/de/panel_script_ed.xml
@@ -15,6 +15,9 @@
 	<panel.string name="Title">
 		Skript: [NAME]
 	</panel.string>
+	<panel.string name="external_editor_not_set">
+		Wählen Sie über die Umgebungsvariable „LL_SCRIPT_EDITOR“ oder die Einstellung „ExternalEditor“ einen Editor aus.
+	</panel.string>
 	<menu_bar name="script_menu">
 		<menu label="Datei" name="File">
 			<menu_item_call label="Speichern" name="Save"/>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 7284e40be26cb87bbce31dc2ea5d27833c76ff81..0c621db6b0d448a8cf7178717c7fdaf17e4ced30 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -1067,7 +1067,7 @@
 	<string name="PermNo">
 		Nein
 	</string>
-	<string name="Chat" value=" Chat:"/>
+	<string name="Chat Message" value="Chat:"/>
 	<string name="Sound" value=" Sound:"/>
 	<string name="Wait" value=" --- Warten:"/>
 	<string name="AnimFlagStop" value=" Animation stoppen:"/>
@@ -1864,12 +1864,6 @@ Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh
 	<string name="accel-win-shift">
 		Umschalt+
 	</string>
-	<string name="Esc">
-		Esc
-	</string>
-	<string name="Home">
-		Zuhause
-	</string>
 	<string name="FileSaved">
 		Datei wurde gespeichert
 	</string>
@@ -1898,7 +1892,7 @@ Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh
 		Rechts
 	</string>
 	<string name="Direction_Back">
-		Hinten
+		Zurück
 	</string>
 	<string name="Direction_North">
 		Norden
@@ -1987,6 +1981,9 @@ Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh
 	<string name="Other">
 		Sonstige
 	</string>
+	<string name="Rental">
+		Vermietung
+	</string>
 	<string name="Any">
 		Alle
 	</string>
@@ -3966,7 +3963,7 @@ Missbrauchsbericht
 	<string name="Notices">
 		Mitteilungen
 	</string>
-	<string name="Chat">
+	<string name="Chat" value=" Chat:">
 		Chat
 	</string>
 	<string name="DeleteItems">
@@ -3978,4 +3975,348 @@ Missbrauchsbericht
 	<string name="EmptyOutfitText">
 		Keine Objekte in diesem Outfit
 	</string>
+	<string name="ExternalEditorNotSet">
+		Wählen Sie über die Einstellung „ExternalEditor“ einen Editor aus
+	</string>
+	<string name="ExternalEditorNotFound">
+		Angegebener externer Editor nicht gefunden.
+Setzen Sie den Editorpfad in Anführungszeichen
+(z. B. &quot;/pfad/editor&quot; &quot;%s&quot;).
+	</string>
+	<string name="ExternalEditorCommandParseError">
+		Fehler beim Parsen des externen Editorbefehls.
+	</string>
+	<string name="ExternalEditorFailedToRun">
+		Externer Editor konnte nicht ausgeführt werden.
+	</string>
+	<string name="Esc">
+		Esc
+	</string>
+	<string name="Space">
+		Space
+	</string>
+	<string name="Enter">
+		Enter
+	</string>
+	<string name="Tab">
+		Tab
+	</string>
+	<string name="Ins">
+		Ins
+	</string>
+	<string name="Del">
+		Del
+	</string>
+	<string name="Backsp">
+		Backsp
+	</string>
+	<string name="Shift">
+		Shift
+	</string>
+	<string name="Ctrl">
+		Ctrl
+	</string>
+	<string name="Alt">
+		Alt
+	</string>
+	<string name="CapsLock">
+		CapsLock
+	</string>
+	<string name="Home">
+		Zuhause
+	</string>
+	<string name="End">
+		End
+	</string>
+	<string name="PgUp">
+		PgUp
+	</string>
+	<string name="PgDn">
+		PgDn
+	</string>
+	<string name="F1">
+		F1
+	</string>
+	<string name="F2">
+		F2
+	</string>
+	<string name="F3">
+		F3
+	</string>
+	<string name="F4">
+		F4
+	</string>
+	<string name="F5">
+		F5
+	</string>
+	<string name="F6">
+		F6
+	</string>
+	<string name="F7">
+		F7
+	</string>
+	<string name="F8">
+		F8
+	</string>
+	<string name="F9">
+		F9
+	</string>
+	<string name="F10">
+		F10
+	</string>
+	<string name="F11">
+		F11
+	</string>
+	<string name="F12">
+		F12
+	</string>
+	<string name="Add">
+		Addieren
+	</string>
+	<string name="Subtract">
+		Subtrahieren
+	</string>
+	<string name="Multiply">
+		Multiplizieren
+	</string>
+	<string name="Divide">
+		Dividieren
+	</string>
+	<string name="PAD_DIVIDE">
+		PAD_DIVIDE
+	</string>
+	<string name="PAD_LEFT">
+		PAD_LEFT
+	</string>
+	<string name="PAD_RIGHT">
+		PAD_RIGHT
+	</string>
+	<string name="PAD_DOWN">
+		PAD_DOWN
+	</string>
+	<string name="PAD_UP">
+		PAD_UP
+	</string>
+	<string name="PAD_HOME">
+		PAD_HOME
+	</string>
+	<string name="PAD_END">
+		PAD_END
+	</string>
+	<string name="PAD_PGUP">
+		PAD_PGUP
+	</string>
+	<string name="PAD_PGDN">
+		PAD_PGDN
+	</string>
+	<string name="PAD_CENTER">
+		PAD_CENTER
+	</string>
+	<string name="PAD_INS">
+		PAD_INS
+	</string>
+	<string name="PAD_DEL">
+		PAD_DEL
+	</string>
+	<string name="PAD_Enter">
+		PAD_Enter
+	</string>
+	<string name="PAD_BUTTON0">
+		PAD_BUTTON0
+	</string>
+	<string name="PAD_BUTTON1">
+		PAD_BUTTON1
+	</string>
+	<string name="PAD_BUTTON2">
+		PAD_BUTTON2
+	</string>
+	<string name="PAD_BUTTON3">
+		PAD_BUTTON3
+	</string>
+	<string name="PAD_BUTTON4">
+		PAD_BUTTON4
+	</string>
+	<string name="PAD_BUTTON5">
+		PAD_BUTTON5
+	</string>
+	<string name="PAD_BUTTON6">
+		PAD_BUTTON6
+	</string>
+	<string name="PAD_BUTTON7">
+		PAD_BUTTON7
+	</string>
+	<string name="PAD_BUTTON8">
+		PAD_BUTTON8
+	</string>
+	<string name="PAD_BUTTON9">
+		PAD_BUTTON9
+	</string>
+	<string name="PAD_BUTTON10">
+		PAD_BUTTON10
+	</string>
+	<string name="PAD_BUTTON11">
+		PAD_BUTTON11
+	</string>
+	<string name="PAD_BUTTON12">
+		PAD_BUTTON12
+	</string>
+	<string name="PAD_BUTTON13">
+		PAD_BUTTON13
+	</string>
+	<string name="PAD_BUTTON14">
+		PAD_BUTTON14
+	</string>
+	<string name="PAD_BUTTON15">
+		PAD_BUTTON15
+	</string>
+	<string name="-">
+		-
+	</string>
+	<string name="=">
+		=
+	</string>
+	<string name="`">
+		`
+	</string>
+	<string name=";">
+		;
+	</string>
+	<string name="[">
+		[
+	</string>
+	<string name="]">
+		]
+	</string>
+	<string name="\">
+		\
+	</string>
+	<string name="0">
+		0
+	</string>
+	<string name="1">
+		1
+	</string>
+	<string name="2">
+		2
+	</string>
+	<string name="3">
+		3
+	</string>
+	<string name="4">
+		4
+	</string>
+	<string name="5">
+		5
+	</string>
+	<string name="6">
+		6
+	</string>
+	<string name="7">
+		7
+	</string>
+	<string name="8">
+		8
+	</string>
+	<string name="9">
+		9
+	</string>
+	<string name="A">
+		A
+	</string>
+	<string name="B">
+		B
+	</string>
+	<string name="C">
+		C
+	</string>
+	<string name="D">
+		D
+	</string>
+	<string name="E">
+		E
+	</string>
+	<string name="F">
+		F
+	</string>
+	<string name="G">
+		G
+	</string>
+	<string name="H">
+		H
+	</string>
+	<string name="I">
+		I
+	</string>
+	<string name="J">
+		J
+	</string>
+	<string name="K">
+		K
+	</string>
+	<string name="L">
+		L
+	</string>
+	<string name="M">
+		M
+	</string>
+	<string name="N">
+		N
+	</string>
+	<string name="O">
+		O
+	</string>
+	<string name="P">
+		P
+	</string>
+	<string name="Q">
+		Q
+	</string>
+	<string name="R">
+		R
+	</string>
+	<string name="S">
+		S
+	</string>
+	<string name="T">
+		T
+	</string>
+	<string name="U">
+		U
+	</string>
+	<string name="V">
+		V
+	</string>
+	<string name="W">
+		W
+	</string>
+	<string name="X">
+		X
+	</string>
+	<string name="Y">
+		Y
+	</string>
+	<string name="Z">
+		Z
+	</string>
+	<string name="BeaconParticle">
+		Partikel-Beacons werden angezeigt (blau)
+	</string>
+	<string name="BeaconPhysical">
+		Beacons für physische Objekte werden angezeigt (grün)
+	</string>
+	<string name="BeaconScripted">
+		Beacons für Skriptobjekte werden angezeigt (rot)
+	</string>
+	<string name="BeaconScriptedTouch">
+		Beacons für Skriptobjekte mit Berührungsfunktion werden angezeigt (rot)
+	</string>
+	<string name="BeaconSound">
+		Sound-Beacons werden angezeigt (gelb)
+	</string>
+	<string name="BeaconMedia">
+		Medien-Beacons werden angezeigt (weiß)
+	</string>
+	<string name="ParticleHiding">
+		Partikel werden ausgeblendet
+	</string>
 </strings>
diff --git a/indra/newview/skins/default/xui/en/floater_beacons.xml b/indra/newview/skins/default/xui/en/floater_beacons.xml
index 4fc2b698d80a5d004b92eeeb6e4205322f43ac16..3d29356b2256a4de0d43e2a3e4406c00c375d1c1 100644
--- a/indra/newview/skins/default/xui/en/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/en/floater_beacons.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
  legacy_header_height="18"
- height="225"
+ height="245"
  layout="topleft"
  name="beacons"
  help_topic="beacons"
@@ -12,7 +12,7 @@
  width="240">
     <panel
      follows="left|top|right|bottom"
-     height="200"
+     height="240"
      layout="topleft"
      left="10"
      name="beacons_panel"
@@ -133,6 +133,16 @@
           <check_box.commit_callback
            function="Beacons.UICheck" />
         </check_box>
+         <check_box
+         control_name="moapbeacon"
+         height="16"
+         left="0"
+         label="Media sources"
+         layout="topleft"
+         name="moapbeacon" >
+          <check_box.commit_callback
+           function="Beacons.UICheck" />
+        </check_box>
 
     </panel>
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index e79dfcbc7d3cc82969d5e87ea93e004b35d9cb87..d08c3e7078a97e110e813566795457da6b49306e 100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -6,6 +6,7 @@
   <string name="status_idle">Idle</string>
   <string name="status_reading_file">Loading...</string>
   <string name="status_generating_meshes">Generating Meshes...</string>
+  <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string>
   <string name="high">High</string>
   <string name="medium">Medium</string>
   <string name="low">Low</string>
@@ -85,6 +86,8 @@
   <text left="10" bottom="540" width="290" height="15" follows="bottom|left|right" name="status">[STATUS]</text>
 
   
+  <button bottom="540" left="300"  follows="bottom|right" height="20" label="Defaults"
+	     width="80" name="reset_btn" tool_tip="Reset to defaults"/>
   <button bottom="540" left="430"  follows="bottom|right" height="20" label="Upload"
 	     width="80" name="ok_btn" tool_tip="Upload to simulator"/>
   <button left_pad="10" follows="right|bottom" height="20" width="80" label="Cancel" name="cancel_btn"/>
@@ -390,10 +393,10 @@
       <check_box top_pad="5" left="20" name="upload_joints" height="15" follows="top|left" label="Joint positions"/>
 
       <text left="10" top_pad="4" width="90" bottom="30" follows="top|left" height="15">
-        Pelvis Offset:
+        Pelvis Z Offset:
       </text>
 
-      <spinner left="10" top_pad="4" height="20" follows="top|left" width="80" value="0.0" min_val="0.00" max_val="32.0" name="pelvis_offset"/>
+      <spinner left="10" top_pad="4" height="20" follows="top|left" width="80" value="0.0" min_val="-3.00" max_val="3.0" name="pelvis_offset"/>
 
     </panel>
   </tab_container>
diff --git a/indra/newview/skins/default/xui/en/floater_model_wizard.xml b/indra/newview/skins/default/xui/en/floater_model_wizard.xml
index f133d75eeee7e2090ca575a2e1e24989ddf178fb..03af348a8d73e8cfedee346ae17786e00a56dd2c 100644
--- a/indra/newview/skins/default/xui/en/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_wizard.xml
@@ -5,10 +5,10 @@
  name="Model Wizard"
  help_topic="model_wizard"
  bg_opaque_image_overlay="0.5 0.5 0.5 1"
- height="475"
+ height="480"
  save_rect="true"
  title="UPLOAD MODEL WIZARD"
- width="530">
+ width="535">
 	<button
 	 top="32"
 	 tab_stop="false"
@@ -45,6 +45,24 @@
 		<button.commit_callback
 		function="Wizard.Review"/>
 	</button>
+	<button
+	 top="32"
+	 left="210"
+	 height="32"
+	 name="physics2_btn"
+	 label="3. Physics"
+	 tab_stop="false"
+	 enabled="false"
+	 border="false"
+	 image_unselected="BreadCrumbBtn_Middle_Off"
+	 image_selected="BreadCrumbBtn_Middle_Press"
+	 image_hover_unselected="BreadCrumbBtn_Middle_Over"
+	 image_disabled="BreadCrumbBtn_Middle_Disabled"
+	 image_disabled_selected="BreadCrumbBtn_Middle_Disabled"
+	 width="110">
+		<button.commit_callback
+		function="Wizard.Physics2"/>
+	</button>
 	<button
 	 top="32"
 	 left="210"
@@ -101,23 +119,24 @@
 		 height="388"
 		 top_pad="0"
 		 name="choose_file_panel"
-		 visible="true"
-		 width="530"
+		 visible="false"
+		 width="535"
 		 left="0">
 		<panel
-		 height="20"
-		 top_pad="20"
-		 width="500"
+		 height="22"
+		 top_pad="15"
+		 width="505"
 		 name="header_panel"
 		 bg_opaque_color="DkGray2"
 		 background_visible="true"
 		 background_opaque="true"
-		 left="20">
+		 left="15">
 			<text
 			 width="200"
 			 left="10"
-			 top="2"
+			 top="3"
 			 name="header_text"
+			 text_color="White"
 			 height="10"
 			 font="SansSerifBig"
 			 layout="topleft">
@@ -132,14 +151,14 @@
 		 font="SansSerifSmall"
 		 layout="topleft"
 		 word_wrap="true"
-		 left_delta="0">
+		 left_delta="5">
 			This wizard will help you import mesh models to Second Life.  First specify a file containing the model you wish to import.  Second Life supports COLLADA (.dae) files.
 		</text>
 		<panel
 		 top_delta="40"
 		 left="15"
-		 height="245"
-		 width="500"
+		 height="270"
+		 width="505"
 		 name="content"
 		 bg_opaque_color="DkGray2"
 		 background_visible="true"
@@ -273,22 +292,23 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
 		 top_delta="0"
 		 name="optimize_panel"
 		 visible="false"
-		 width="530"
+		 width="535"
 		 left="0">
 		<panel
-		 height="20"
-		 top_pad="20"
+		 height="22"
+		 top_pad="15"
 		 name="header_panel"
-		 width="500"
+		 width="505"
 		 bg_opaque_color="DkGray2"
 		 background_visible="true"
 		 background_opaque="true"
-		 left="20">
+		 left="15">
 			<text
 			 width="200"
 			 left="10"
 			 name="header_text"
-			 top="2"
+			 top="3"
+			 text_color="White"
 			 height="10"
 			 font="SansSerifBig"
 			 layout="topleft">
@@ -303,15 +323,15 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
 		 layout="topleft"
 		 name="description"
 		 word_wrap="true"
-		 left_delta="0">
-			This wizard is optimizing your model. This may take several minutes. To stop the process click the back button
+		 left_delta="5">
+			This wizard has optimized your model to improve performance. You may adjust the results of the optimization process bellow or click Next to continue.
 		</text>
 		<panel
 		 top_delta="40"
 		 visible="false"
 		 left="15"
-		 height="245"
-		 width="500"
+		 height="270"
+		 width="505"
 		 name="content"
 		 bg_opaque_color="DkGray2"
 		 background_visible="true"
@@ -385,8 +405,8 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
 		<panel
 				 top_delta="0"
 				 left_delta="0"
-				 height="245"
-				 width="500"
+				 height="270"
+				 width="505"
 				 name="content2"
 				 bg_opaque_color="DkGray2"
 				 background_visible="true"
@@ -394,7 +414,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
 			<text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
 				Model Preview:
 			</text>
-			<combo_box left_pad="5" top_delta="-2"  follows="left|top" list_position="below" height="18"
+			<combo_box left_pad="5" top_delta="-5"  follows="left|top" list_position="below" height="22"
 	     name="preview_lod_combo2" width="90" tool_tip="LOD to view in preview render">
 				<combo_item name="high">
 					High
@@ -402,12 +422,12 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
 				<combo_item name="medium">
 					Medium
 				</combo_item>
-				<combo_item name="lowest">
-					Lowest
-				</combo_item>
 				<combo_item name="low">
 					Low
 				</combo_item>
+				<combo_item name="lowest">
+					Lowest
+				</combo_item>
 			</combo_box>
 			<panel
 				 left="10"
@@ -417,27 +437,27 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
 				 highlight_light_color="0.09 0.09 0.09 1"
 				 border_style="line"
 				 border="true"
-				 height="175"
+				 height="185"
 				 follows="all"
-				 width="175">
+				 width="185">
 			</panel>
-			<text top="35" left="220" text_color="White" font="SansSerifSmallBold" width="300" height="4">Performance</text>
-			<text top="55" left="200" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text>
-			<text top="35" left="380" text_color="White" font="SansSerifSmallBold" width="300" height="4">Accuracy</text>
-			<text top="55" left="360" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text>
+			<text top="45" left="214" text_color="White" font="SansSerifSmallBold" halign="center" width="110" height="30" wrap="true">Higher Performance</text>
+			<text top="75" left="204" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text>
+			<text top="45" left="378" text_color="White" font="SansSerifSmallBold" halign="center" width="90" height="30" wrap="true">Higher Accuracy</text>
+			<text top="75" left="364" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text>
 
 			<slider
 		   follows="left|top"
 		   height="20"
-		   increment="1"
+		   increment="0.5"
 		   layout="topleft"
-		   left="200"
-		   max_val="2"
-		   initial_value="1"
-		   min_val="0"
+		   left="204"
+		   max_val="4"
+		   initial_value="3"
+		   min_val="2"
 		   name="accuracy_slider"
 		   show_text="false"
-		   top="105"
+		   top="130"
 		   width="290" />
 			<text 
 			font="SansSerifSmall" 
@@ -448,16 +468,15 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
 
 
 			<icon
-				 top_pad="10"
+				 top_pad="14"
 				 left_delta="0"
 				 width="280"
 				 height="2"
 				 image_name="model_wizard\divider_line.png"/>
 	
-			<text top_delta="25" width="200" text_color="White" left_delta="50" name="streaming cost"  height="20">Resource Cost:    [COST]</text>
-			<text top_delta="25" width="100" text_color="White" left_delta="0"  height="20">Upload Fee:</text>
+			<text top_delta="20" width="200" text_color="White" left_delta="50" name="streaming cost"  height="20">Resource Cost:    [COST]</text>
 			<text
-						 top_pad="5"
+						 top_pad="15"
 						 width="130"
 						 height="14"
 						 left="10"
@@ -504,59 +523,58 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
 		</panel>
 	</panel>
 
-
-
 	<panel
 		 height="388"
 		 top_delta="0"
 		 name="physics_panel"
 		 visible="false"
-		 width="530"
+		 width="535"
 		 left="0">
 		<panel
-		 height="20"
-		 top_pad="20"
+		 height="22"
+		 top_pad="15"
 		 name="header_panel"
-		 width="500"
+		 width="505"
 		 bg_opaque_color="DkGray2"
 		 background_visible="true"
 		 background_opaque="true"
-		 left="20">
+		 left="15">
 			<text
 			 width="200"
 			 left="10"
 			 name="header_text"
-			 top="2"
+			 top="3"
 			 height="10"
 			 font="SansSerifBig"
+			 text_color="White" 
 			 layout="topleft">
 				Physics
 			</text>
 		</panel>
 		<text
-		 top_pad="14"
-		 width="460"
+		 top_pad="10"
+		 width="474"
 		 height="50"
 		 font="SansSerifSmall"
 		 layout="topleft"
 		 name="description"
 		 word_wrap="true"
-		 left_delta="0">
+		 left_delta="5">
 			The wizard will create a physical shape, which determines how the object interacts with other objects and avatars. Set the slider to the detail level most appropriate for how your object will be used:
 		</text>
     <panel
-		 top_delta="40"
+		 top_delta="44"
 		 left="15"
-		 height="265"
-		 width="500"
+		 height="270"
+		 width="505"
 		 name="content"
 		 bg_opaque_color="DkGray2"
 		 background_visible="true"
 		 background_opaque="true">
-      <text top="15" left="30" text_color="White" font="SansSerifSmallBold" width="300" height="4">Performance</text>
-      <text top="35" left="10" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text>
-      <text top="15" left="390" text_color="White" font="SansSerifSmallBold" width="300" height="4">Accuracy</text>
-      <text top="35" left="360" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text>
+      <text top="25" left="30" text_color="White" font="SansSerifSmallBold" width="300" height="4">Performance</text>
+      <text top="45" left="10" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text>
+      <text top="25" left="390" text_color="White" font="SansSerifSmallBold" width="300" height="4">Accuracy</text>
+      <text top="45" left="360" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text>
 
       <slider
 		   follows="left|top"
@@ -569,7 +587,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
 		   min_val="0"
 		   name="physics_slider"
 		   show_text="false"
-		   top="80"
+		   top="90"
 		   width="440" />
       <text
 			font="SansSerifSmall"
@@ -589,30 +607,154 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
 			 height="2"
 			 image_name="model_wizard\divider_line.png"/>
 		
-	<text top_delta="20" width="180" text_color="White" left="160" name="streaming cost"  height="20">Resource Cost:       [COST]</text>
-      <text top_delta="26" width="180" text_color="White" left_delta="0" name="physics cost"  height="20">Physics Cost:           [COST]</text>
-      <text top_delta="26" width="180" text_color="White" left_delta="0"  height="20">Upload Fee:</text>
+	<text top_delta="30" width="180" text_color="White" left="160" name="streaming cost"  height="20">Resource Cost:       [COST]</text>
  
     </panel>
 	</panel>
 
+	<panel
+		 height="388"
+		 top_delta="0"
+		 name="physics2_panel"
+		 visible="true"
+		 width="535"
+		 left="0">
+		<panel
+		 height="22"
+		 top_pad="15"
+		 name="header_panel"
+		 width="505"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true"
+		 left="15">
+			<text
+			 width="200"
+			 left="10"
+			 name="header_text"
+			 text_color="White"
+			 top="3"
+			 height="10"
+			 font="SansSerifBig"
+			 layout="topleft">
+				Physics
+			</text>
+		</panel>
+		<text
+		 top_pad="14"
+		 width="475"
+		 height="50"
+		 font="SansSerifSmall"
+		 layout="topleft"
+		 name="description"
+		 word_wrap="true"
+		 left_delta="5">
+			Preview the physics shape below then click Next to continue.  To modify the physics shape, click the Back button.
+		</text>
+		<panel
+			 top_delta="40"
+			 left="15"
+			 height="270"
+			 width="505"
+			 name="content"
+			 bg_opaque_color="DkGray2"
+			 background_visible="true"
+			 background_opaque="true">
+			<text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
+				Model Preview:
+			</text>
+			<combo_box left_pad="5" top_delta="-5"  follows="left|top" list_position="below" height="22"
+			   name="preview_lod_combo3" width="90" tool_tip="LOD to view in preview render">
+				<combo_item name="high">
+					High
+				</combo_item>
+				<combo_item name="medium">
+					Medium
+				</combo_item>
+				<combo_item name="low">
+					Low
+				</combo_item>
+				<combo_item name="lowest">
+					Lowest
+				</combo_item>
+			</combo_box>
+			<panel
+					   left="10"
+					   top_pad="10"
+					   name="preview_panel"
+					   bevel_style="none"
+					   highlight_light_color="0.09 0.09 0.09 1"
+					   border_style="line"
+					   border="true"
+					   height="190"
+					   follows="all"
+					   width="190">
+			</panel>
+			<text
+						 top_pad="8"
+						 width="130"
+						 height="14"
+						 left="10"
+						 text_color="White"
+						 word_wrap="true">
+				Dimensions (meters):
+			</text>
+			<text
+			 top_pad="0"
+			 width="160"
+			 height="15"
+			 font="SansSerifSmallBold"
+			 text_color="White"
+			 name="dimensions"
+			 left_delta="0">
+				X:         Y:         Z:
+			</text>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_dividers"
+			 left_delta="41">
+				|               |
+			</text>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_x"
+			 left_delta="-25"/>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_y"
+			 left_delta="46"/>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_z"
+			 left_delta="46"/>
+			<text top="60" width="180" text_color="White" left="225" name="streaming cost"  height="20">Resource Cost:       [COST]</text>
+		</panel>
+	</panel>
 
 	<panel
 		 height="388"
 		 top_delta="0"
 		 name="review_panel"
 		 visible="false"
-		 width="530"
+		 width="535"
 		 left="0">
 		<panel
 		 height="22"
-		 top_pad="16"
+		 top_pad="15"
 		 name="header_panel"
-		 width="500"
+		 width="505"
 		 bg_opaque_color="DkGray2"
 		 background_visible="true"
 		 background_opaque="true"
-		 left="20">
+		 left="15">
 			<text
 			 width="200"
 			 left="10"
@@ -627,13 +769,13 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
 		</panel>
 		<text
 		 top_pad="14"
-		 width="460"
+		 width="470"
 		 height="24"
 		 font="SansSerifSmall"
 		 layout="topleft"
 		 name="description"
 		 word_wrap="true"
-		 left_delta="10">
+		 left_delta="5">
 			Review the details below then click. Upload to upload your model. Your L$ balance will be charged when you click Upload.
 		</text>
 		<icon
@@ -645,8 +787,8 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
     <panel
 		 top_pad="5"
 		 left="15"
-		 height="245"
-		 width="500"
+		 height="270"
+		 width="505"
 		 name="content">
       <text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
         Model Preview:
@@ -659,12 +801,12 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
         <combo_item name="medium">
           Medium
         </combo_item>
-        <combo_item name="lowest">
-          Lowest
-        </combo_item>
         <combo_item name="low">
           Low
         </combo_item>
+        <combo_item name="lowest">
+          Lowest
+        </combo_item>
       </combo_box>
       <panel
 				 left="10"
@@ -791,22 +933,22 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
 		 top_delta="0"
 		 name="upload_panel"
 		 visible="false"
-		 width="530"
+		 width="535"
 		 left="0">
 		<panel
-		 height="20"
-		 top_pad="20"
+		 height="22"
+		 top_pad="15"
 		 name="header_panel"
-		 width="500"
+		 width="505"
 		 bg_opaque_color="DkGray2"
 		 background_visible="true"
 		 background_opaque="true"
-		 left="20">
+		 left="15">
 			<text
 			 width="200"
 			 left="10"
 			 name="header_text"
-			 top="2"
+			 top="3"
 			 text_color="White" 
 			 height="10"
 			 font="SansSerifBig"
@@ -816,13 +958,13 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
 		</panel>
 		<text
 		 top_pad="14"
-		 width="460"
+		 width="474"
 		 height="20"
 		 font="SansSerifSmall"
 		 layout="topleft"
 		 name="description"
 		 word_wrap="true"
-		 left_delta="0">
+		 left_delta="5">
 			Congratulations! Your model has been sucessfully uploaded.  You will find the model in the Objects folder in your inventory.
 		</text>
 		<icon
@@ -878,6 +1020,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se
 	<string name="status_idle">Idle</string>
 	<string name="status_reading_file">Loading...</string>
 	<string name="status_generating_meshes">Generating Meshes...</string>
+  <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string>
 	<string name="high">High</string>
 	<string name="medium">Medium</string>
 	<string name="low">Low</string>
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index a0a370dc120fc7f78557dea74e087137cdf7a317..380eeae403b176712f4e8ce4f5619d918af4dd61 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -2,7 +2,7 @@
 <floater
  legacy_header_height="18"
  follows="left|top|right"
- height="780"
+ height="580"
  layout="topleft"
  bg_opaque_image="Window_NoTitle_Foreground"
  bg_alpha_image="Window_NoTitle_Background"
@@ -860,7 +860,7 @@
     <!-- </text> -->
     <tab_container
      follows="left|top"
-     height="610"
+     height="410"
      halign="center"
      left="0"
      name="Object Info Tabs"
@@ -1350,9 +1350,6 @@ even though the user gets a free copy.
          name="Object"
          top="16"
          width="295">
-	<panel.string name="None">None</panel.string>
-	<panel.string name="Prim">Prim</panel.string>
-	<panel.string name="Convex Hull">Convex Hull</panel.string>
             <check_box
              height="19"
              label="Locked"
@@ -1559,100 +1556,6 @@ even though the user gets a free copy.
              text_enabled_color="1 1 1 1"
              top_pad="3"
              width="87" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left_delta="0"
-             name="label physicsshapetype"
-             top_pad="50"
-             width="121">
-                Physics Shape Type:
-            </text>
-			<combo_box
-			   height="23"
-			   top_delta="-5" 
-			   layout="topleft"
-			   follows="left|top"
-			   name="Physics Shape Type Combo Ctrl"
-			   tool_tip="Choose the physics shape type"
-			   left_pad="5"
-			   width="108"/>
-
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="1"
-             initial_value="1"
-             label="Gravity"
-             label_width="70"
-             layout="topleft"
-             left="10"
-             min_val="-1"
-             max_val="28"
-             name="Physics Gravity"
-             top_pad="10"
-             width="132" />
-
-            <check_box
-             height="19"
-             label="Override material"
-             layout="topleft"
-             left_delta="0"
-             name="Physics Material Override"
-             tool_tip="Override Material"
-             top_pad="10"
-             width="132" />
-
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.1"
-             initial_value="0"
-             label="Friction"
-             label_width="70"
-             layout="topleft"
-             left_delta="0"
-             max_val="255"
-             min_val="0"
-             name="Physics Friction"
-             top_pad="4"
-             width="132" />
-
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.1"
-             initial_value="0"
-             label="Density"
-             label_width="70"
-             layout="topleft"
-             left_delta="0"
-             max_val="22587"
-             min_val="1"
-             name="Physics Density"
-             top_pad="4"
-             width="132" />
-
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.01"
-             initial_value="0"
-             label="Restitution"
-             label_width="70"
-             layout="topleft"
-             left_delta="0"
-             max_val="1"
-             min_val="0"
-             name="Physics Restitution"
-             top_pad="4"
-             width="132" />
-
-
-
  <!--           <text
              type="string"
              length="1"
@@ -2248,6 +2151,9 @@ even though the user gets a free copy.
          name="Features"
          top_delta="0"
          width="295">
+	<panel.string name="None">None</panel.string>
+	<panel.string name="Prim">Prim</panel.string>
+	<panel.string name="Convex Hull">Convex Hull</panel.string>
             <text
              type="string"
              length="1"
@@ -2390,6 +2296,7 @@ even though the user gets a free copy.
              name="FlexForceZ"
              top_pad="4"
              width="128" />
+
             <check_box
              height="16"
              label="Light"
@@ -2500,6 +2407,94 @@ even though the user gets a free copy.
                    mouse_opaque="true"
                    name="Light Ambiance"
                    width="120" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             name="label physicsshapetype"
+             top="38"
+             width="121">
+                Physics Shape Type:
+            </text>
+			<combo_box
+			   height="19"
+			   top_delta="15" 
+			   layout="topleft"
+			   follows="left|top"
+			   name="Physics Shape Type Combo Ctrl"
+			   tool_tip="Choose the physics shape type"
+			   width="108"/>
+
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="1"
+             initial_value="1"
+             label="Gravity"
+             label_width="70"
+             layout="topleft"
+             min_val="-1"
+             max_val="28"
+             name="Physics Gravity"
+             top_pad="10"
+             width="132" />
+
+            <check_box
+             height="19"
+             label="Override material"
+             layout="topleft"
+             left_delta="0"
+             name="Physics Material Override"
+             tool_tip="Override Material"
+             top_pad="10"
+             width="132" />
+
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.1"
+             initial_value="0"
+             label="Friction"
+             label_width="70"
+             layout="topleft"
+             left_delta="0"
+             max_val="255"
+             min_val="0"
+             name="Physics Friction"
+             top_pad="4"
+             width="132" />
+
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.1"
+             initial_value="0"
+             label="Density"
+             label_width="70"
+             layout="topleft"
+             left_delta="0"
+             max_val="22587"
+             min_val="1"
+             name="Physics Density"
+             top_pad="4"
+             width="132" />
+
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.01"
+             initial_value="0"
+             label="Restitution"
+             label_width="70"
+             layout="topleft"
+             left_delta="0"
+             max_val="1"
+             min_val="0"
+             name="Physics Restitution"
+             top_pad="4"
+             width="132" />
         </panel>
          <panel
          border="false"
diff --git a/indra/newview/skins/default/xui/en/floater_ui_preview.xml b/indra/newview/skins/default/xui/en/floater_ui_preview.xml
index 12c45617530885b9677f4c40f7920e35f816b5db..3921cfcd2c92ffff9e226d134457e9a36840df25 100644
--- a/indra/newview/skins/default/xui/en/floater_ui_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_ui_preview.xml
@@ -12,6 +12,10 @@
  title="XUI PREVIEW TOOL"
  translate="false"
  width="750">
+    <string name="ExternalEditorNotSet">
+Select an editor by setting the environment variable LL_XUI_EDITOR
+or the ExternalEditor setting
+or specifying its path in the "Editor Path" field.</string>
     <panel
      bottom="640"
      follows="left|top|right|bottom"
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
index 84e81397beb465b0df1b180f7cd845ab60decc93..b8128da358631e2885fae37b4ebd0d72ba49eb66 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -68,7 +68,7 @@ name="Stand Up">
      function="Self.EnableStandUp" />
   </menu_item_call>
   <menu_item_call
-  label="Change Outfit"
+  label="My Appearance"
   name="Change Outfit">
     <menu_item_call.on_click
      function="CustomizeAvatar" />
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
index 2afa29ec100e4fcc500d3500feef858c2d16ac17..d727294cc8ebf23ff96af095c4d55c65d982936e 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -193,7 +193,7 @@
         </menu_item_call>
     </context_menu>
      <menu_item_call
-     label="Change Outfit"
+     label="My Appearance"
      layout="topleft"
      name="Chenge Outfit">
         <menu_item_call.on_click
diff --git a/indra/newview/skins/default/xui/en/menu_bottomtray.xml b/indra/newview/skins/default/xui/en/menu_bottomtray.xml
index 1b55fa4fd3c8aa1430b4552dfd09e2a35fd06ee6..07dabe1909e0618954fe2d56aebe7b685c88d75d 100644
--- a/indra/newview/skins/default/xui/en/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/menu_bottomtray.xml
@@ -9,7 +9,7 @@
  visible="false"
  width="128">
     <menu_item_check
-         label="Voice Enabled"
+         label="Speak Button"
          layout="topleft"
          name="EnableVoiceChat">
            <menu_item_check.on_click
@@ -19,7 +19,6 @@
              function="CheckControl"
              parameter="EnableVoiceChat" />
     </menu_item_check>
-    <menu_item_separator/>
     <menu_item_check
          label="Gesture button"
          layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 8655a6bf97489edcab54281c7ef5c93af3778900..3e7c09f636a87ef8fb5030ba425b68acac3c7084 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -41,7 +41,7 @@
              parameter="agent" />
         </menu_item_call>
         <menu_item_call
-         label="Change Outfit"
+         label="My Appearance"
          name="ChangeOutfit">
             <menu_item_call.on_click
              function="CustomizeAvatar" />
@@ -261,6 +261,17 @@
              function="Floater.Toggle"
              parameter="world_map" />
         </menu_item_check>
+        <menu_item_check
+        label="Search"
+        name="Search"
+        shortcut="control|F">
+            <menu_item_check.on_check
+             function="Floater.Visible"
+             parameter="search" />
+            <menu_item_check.on_click
+             function="Floater.Toggle"
+             parameter="search" />
+            </menu_item_check>
         <menu_item_call
          label="Snapshot"
          name="Take Snapshot"
@@ -1890,6 +1901,16 @@
                  function="Advanced.ToggleConsole"
                  parameter="memory view" />
             </menu_item_check>
+            <menu_item_check
+               label="Scene Statistics"
+               name="Scene Statistics">
+              <menu_item_check.on_check
+               function="Advanced.CheckConsole"
+               parameter="scene view" />
+              <menu_item_check.on_click
+               function="Advanced.ToggleConsole"
+               parameter="scene view" />
+            </menu_item_check>
 
             <menu_item_separator/>
 
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index f703acaa66dd8477454199b8b402aef1240b8578..5b144cafdf3aab9bc9ff2c1959813825380564b7 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -819,22 +819,6 @@ You need to enter either the Username or both the First and Last name of your av
   </notification>
   
 
-  <notification
-   icon="alertmodal.tga"
-   name="AddClassified"
-   type="alertmodal">
-Classified ads appear in the &apos;Classified&apos; section of the Search directory and on [http://secondlife.com/community/classifieds secondlife.com] for one week.
-Fill out your ad, then click &apos;Publish...&apos; to add it to the directory.
-You&apos;ll be asked for a price to pay when clicking Publish.
-Paying more makes your ad appear higher in the list, and also appear higher when people search for keywords.
-    <tag>confirm</tag>
-    <usetemplate
-     ignoretext="How to create a new Classified ad"
-     name="okcancelignore"
-     notext="Cancel"
-     yestext="OK"/>
-  </notification>
-
   <notification
    icon="alertmodal.tga"
    name="DeleteClassified"
@@ -7019,6 +7003,18 @@ Mute everyone?
     To stand up and exit the sitting position, click the Stand button.
   </notification>
 
+  <notification
+  name="HintSpeak"
+  label="Speak"
+  type="hint"
+  unique="true">
+Click the Speak button to turn your microphone on and off.
+
+Click on the up arrow to see the voice control panel.
+
+Hiding the Speak button will disable the voice feature.
+  </notification>
+
   <notification
   name="HintDestinationGuide"
   label="Explore the World"
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 43431ea7c1c255a3151a3faf27a9e14f86b4de7c..1a00416b2a487a0e903f9058f8435c5c8b1fb4ca 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -76,7 +76,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
      follows="all"
      height="383"
      layout="topleft"
-     left="5"
+     left="3"
      name="tabs"
      tab_group="1"
      tab_min_width="70"
@@ -84,7 +84,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
      tab_position="top"
      top_pad="10"
      halign="center"
-     width="317">
+     width="319">
      	<panel
          background_opaque="true"
        background_visible="true"
@@ -106,20 +106,20 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
 			 left="3"
 			 mouse_opaque="false"
 			 name="Net Map"
-			 width="307"
+			 width="305"
 			 height="140"
-			 top="0"/>
+			 top="5"/>
 			<avatar_list
              allow_select="true"
              follows="top|left|bottom|right"
-             height="216"
+             height="211"
              ignore_online_status="true"
              layout="topleft"
              left="3"
              multi_select="true"
              name="avatar_list"
              top="145"
-             width="307" />
+             width="306" />
             <panel
              background_visible="true"
              follows="left|right|bottom"
@@ -165,7 +165,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
              layout="topleft"
              left_pad="1"
              name="dummy_icon"
-             width="241"
+             width="243"
              />
             </panel>
         </panel>
@@ -251,7 +251,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
 				   top_pad="1"
 				   left="0"
 				   name="bottom_panel"
-				   width="305">
+				   width="308">
 				      <layout_panel
 				       auto_resize="false"
 				       height="25"
@@ -300,7 +300,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
 				       layout="topleft"
 				       name="dummy_panel"
 				       user_resize="false"
-				       width="212">
+				       width="210">
 				          <icon
 				           follows="bottom|left|right"
 				           height="25"
@@ -309,7 +309,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
 				           left="0"
 				           top="0"
 				           name="dummy_icon"
-				           width="211" />
+				           width="210" />
 				      </layout_panel>
 				      <layout_panel
 				       auto_resize="false"
@@ -471,7 +471,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
              	 layout="topleft"
              	 left_pad="1"
              	 name="dummy_icon"
-             	 width="209"
+             	 width="212"
              />
             </panel>
         </panel>
@@ -506,7 +506,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
              height="27"
              label="bottom_panel"
              layout="topleft"
-             left="0"
+             left="3"
              name="bottom_panel"
              top_pad="0"
              width="313">
@@ -544,7 +544,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
              	 layout="topleft"
              	 left_pad="1"
              	 name="dummy_icon"
-             	 width="241"
+             	 width="244"
              />
             </panel>
         </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index 70db3c65924b328b72a904811f7a0d931f55fcf5..2e1f41fd7421960153df6b70c296bf35ef72bf73 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -258,6 +258,19 @@
          	<check_box.commit_callback
 			 function="Pref.VertexShaderEnable" />
     	</check_box>
+      <check_box
+		 control_name="RenderDepthOfField"
+		 height="16"
+		 initial_value="true"
+		 label="Depth of Field"
+		 layout="topleft"
+		 left_delta="0"
+		 name="UseDoF"
+		 top_pad="1"
+		 width="256">
+        <check_box.commit_callback
+     function="Pref.VertexShaderEnable" />
+      </check_box>
 
         <text
          type="string"
diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml
index ca9579284b8e0dc0db16f8be742ad7b06937f433..e0d9f3f71456a996806dedfa1d3345de074d3ba0 100644
--- a/indra/newview/skins/default/xui/en/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general.xml
@@ -114,7 +114,7 @@
      layout="topleft"
      left="10"
      name="allow_land_resell_check"
-     top="160"
+     top="150"
      width="80" />
     <check_box
      height="20"
@@ -122,7 +122,7 @@
      layout="topleft"
      left="10"
      name="allow_parcel_changes_check"
-     top="180"
+     top="170"
      width="80" />
     <check_box
      height="20"
@@ -131,7 +131,16 @@
      left="10"
      name="block_parcel_search_check"
      tool_tip="Let people see this region and its parcels in search results"
-     top="200"
+     top="190"
+     width="80" />
+	<check_box
+     height="20"
+     label="Allow Mesh Objects"
+     layout="topleft"
+     left="10"
+     name="mesh_rez_enabled_check"
+     tool_tip="Let people rez mesh objects on this region"
+     top="210"
      width="80" />
     <spinner
      decimal_digits="0"
diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml
index 627b12cfe17a71f088ff2293474425d03207f7ca..8d420243864c56e4cda3fa1d0f53e2b7ad2e00d1 100644
--- a/indra/newview/skins/default/xui/en/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml
@@ -28,6 +28,10 @@
      name="Title">
         Script: [NAME]
     </panel.string>
+    <panel.string
+     name="external_editor_not_set">
+        Select an editor by setting the environment variable LL_SCRIPT_EDITOR or the ExternalEditor setting.
+    </panel.string>
     <menu_bar
      bg_visible="false"
      follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index b7bf2526ab31ef408ee60bb32867387f265827be..a39832bbc54d6b77f9ef054017c0f181731a8746 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -3312,6 +3312,14 @@ Abuse Report</string>
   <string name="DeleteItem">Delete selected item?</string>
 
   <string name="EmptyOutfitText">There are no items in this outfit</string>
+ 
+ <!-- External editor status codes -->
+ <string name="ExternalEditorNotSet">Select an editor using the ExternalEditor setting.</string>
+ <string name="ExternalEditorNotFound">Cannot find the external editor you specified.
+Try enclosing path to the editor with double quotes.
+(e.g. "/path to my/editor" "%s")</string>
+ <string name="ExternalEditorCommandParseError">Error parsing the external editor command.</string>
+ <string name="ExternalEditorFailedToRun">External editor failed to run.</string>
 
   <!-- Key names begin -->
   <string name="Esc">Esc</string>
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 3f50437c133cf8b87c2c38b6e876bf057662243b..3df0f9284208143903fae2a0af77df71889cbaa4 100644
--- a/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -215,7 +215,7 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
 			<text name="Simulator primitive usage:">
 				Uso de primitivas:
 			</text>
-			<text  name="objects_available">
+			<text name="objects_available">
 				[COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
 			</text>
 			<text name="Primitives parcel supports:">
@@ -347,6 +347,7 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
 				<combo_box.item label="Parques y Naturaleza" name="item9"/>
 				<combo_box.item label="Residencial" name="item10"/>
 				<combo_box.item label="Compras" name="item11"/>
+				<combo_box.item label="Terreno en alquiler" name="item13"/>
 				<combo_box.item label="Otra" name="item12"/>
 			</combo_box>
 			<combo_box name="land category">
@@ -361,6 +362,7 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
 				<combo_box.item label="Parques y Naturaleza" name="item9"/>
 				<combo_box.item label="Residencial" name="item10"/>
 				<combo_box.item label="Compras" name="item11"/>
+				<combo_box.item label="Terreno en alquiler" name="item13"/>
 				<combo_box.item label="Otra" name="item12"/>
 			</combo_box>
 			<check_box label="Contenido &apos;Mature&apos;" name="MatureCheck" tool_tip=""/>
@@ -439,7 +441,7 @@ los media:
 				(Definido por el Estado)
 			</panel.string>
 			<panel.string name="allow_public_access">
-				Permitir el acceso público ([MATURITY])
+				Permitir el acceso público ([MATURITY]) (Nota: Si no seleccionas esta opción, se crearán líneas de prohibición)
 			</panel.string>
 			<panel.string name="estate_override">
 				Una o más de esta opciones está configurada a nivel del estado
diff --git a/indra/newview/skins/default/xui/es/floater_map.xml b/indra/newview/skins/default/xui/es/floater_map.xml
index fa01a4a63552bf454577233a6b514a83aee30925..370b7f5053df72f5fe96d40bbe1dbeb938e2e02f 100644
--- a/indra/newview/skins/default/xui/es/floater_map.xml
+++ b/indra/newview/skins/default/xui/es/floater_map.xml
@@ -3,6 +3,9 @@
 	<floater.string name="ToolTipMsg">
 		[REGIÓN](Haz doble clic para abrir el mapa y pulsa la tecla Mayús y arrastra para obtener una vista panorámica)
 	</floater.string>
+	<floater.string name="AltToolTipMsg">
+		[REGION](Pulsa dos veces para teleportarte, pulsa mayús y arrastra para obtener una panorámica)
+	</floater.string>
 	<floater.string name="mini_map_caption">
 		MINIMAPA
 	</floater.string>
diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml
index e2ff4a25ce0753f5a44d2575f2c3fa27385f578d..fba969f2671b5b9cfd02eaeb2f5c5458f7ca96b9 100644
--- a/indra/newview/skins/default/xui/es/floater_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_tools.xml
@@ -64,6 +64,8 @@
 		<radio_item label="Elegir la cara" name="radio select face"/>
 	</radio_group>
 	<check_box label="Editar las partes enlazadas" name="checkbox edit linked parts"/>
+	<button label="Enlazar" name="link_btn"/>
+	<button label="Desenlazar" name="unlink_btn"/>
 	<text name="RenderingCost" tool_tip="Muestra cuánto se calcula que cuesta renderizar este objeto">
 		þ: [COUNT]
 	</text>
diff --git a/indra/newview/skins/default/xui/es/menu_attachment_self.xml b/indra/newview/skins/default/xui/es/menu_attachment_self.xml
index ab76c92d656eec08e0666a414a2fd497d0f8744a..0ba39378bb9e3317792c2b46b833b451377ef55e 100644
--- a/indra/newview/skins/default/xui/es/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/es/menu_attachment_self.xml
@@ -5,7 +5,7 @@
 	<menu_item_call label="Quitar" name="Detach"/>
 	<menu_item_call label="Sentarte" name="Sit Down Here"/>
 	<menu_item_call label="Levantarme" name="Stand Up"/>
-	<menu_item_call label="Cambiar vestuario" name="Change Outfit"/>
+	<menu_item_call label="Mi apariencia" name="Change Outfit"/>
 	<menu_item_call label="Editar mi vestuario" name="Edit Outfit"/>
 	<menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
 	<menu_item_call label="Mis amigos" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/es/menu_avatar_self.xml b/indra/newview/skins/default/xui/es/menu_avatar_self.xml
index 50f8384b0f265fb8da1d141000b72cb375e14380..a2d86d78c13bb6b465492aa166b186d18808df2b 100644
--- a/indra/newview/skins/default/xui/es/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/es/menu_avatar_self.xml
@@ -21,7 +21,7 @@
 		<context_menu label="Quitar" name="Object Detach"/>
 		<menu_item_call label="Quitarse todo" name="Detach All"/>
 	</context_menu>
-	<menu_item_call label="Cambiar vestuario" name="Chenge Outfit"/>
+	<menu_item_call label="Mi apariencia" name="Chenge Outfit"/>
 	<menu_item_call label="Editar mi vestuario" name="Edit Outfit"/>
 	<menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
 	<menu_item_call label="Mis amigos" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/es/menu_bottomtray.xml b/indra/newview/skins/default/xui/es/menu_bottomtray.xml
index 62683f3076b2b596e4dfc48842119618d4b26955..a16da5ae9e2555243a57d8f74c9128fbfc9a753c 100644
--- a/indra/newview/skins/default/xui/es/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/es/menu_bottomtray.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu name="hide_camera_move_controls_menu">
+	<menu_item_check label="Voz activada" name="EnableVoiceChat"/>
 	<menu_item_check label="Botón Gestos" name="ShowGestureButton"/>
 	<menu_item_check label="Botón Moverse" name="ShowMoveButton"/>
 	<menu_item_check label="Botón Vista" name="ShowCameraButton"/>
 	<menu_item_check label="Botón Foto" name="ShowSnapshotButton"/>
-	<menu_item_check label="Botón Barra lateral" name="ShowSidebarButton"/>
 	<menu_item_check label="Botón Construir" name="ShowBuildButton"/>
 	<menu_item_check label="Botón Buscar" name="ShowSearchButton"/>
 	<menu_item_check label="Botón Mapa" name="ShowWorldMapButton"/>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
index 236289f82a0ccd25e3448143fa53d3c51b80e767..bee4c61da2402bb64fd672783ca65194fccfdfac 100644
--- a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
 	<menu_item_call label="Ver el perfil" name="view_profile"/>
 	<menu_item_call label="Añadir como amigo" name="add_friend"/>
 	<menu_item_call label="MI" name="im"/>
@@ -11,9 +11,11 @@
 	<menu_item_call label="Denunciar" name="report"/>
 	<menu_item_call label="Congelar" name="freeze"/>
 	<menu_item_call label="Expulsar" name="eject"/>
+	<menu_item_call label="Expulsar" name="kick"/>
+	<menu_item_call label="CSR" name="csr"/>
 	<menu_item_call label="Depurar las texturas" name="debug"/>
 	<menu_item_call label="Encontrar en el mapa" name="find_on_map"/>
 	<menu_item_call label="Acercar el zoom" name="zoom_in"/>
 	<menu_item_call label="Pagar" name="pay"/>
 	<menu_item_call label="Compartir" name="share"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml
index c8a1e9d9da82bda2da74bcba2e93cf7b7faf3fac..29ad718fdd3199b710ce16d28dbf0965f67b85ba 100644
--- a/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
-	<menu_item_call label="Sentarte" name="sit_down_here"/>
-	<menu_item_call label="Levantarme" name="stand_up"/>
-	<menu_item_call label="Cambiar vestuario" name="change_outfit"/>
-	<menu_item_call label="Mi perfil" name="my_profile"/>
-	<menu_item_call label="Mis amigos" name="my_friends"/>
-	<menu_item_call label="Mis grupos" name="my_groups"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Menu">
+	<menu_item_call label="Sentarme" name="Sit Down Here"/>
+	<menu_item_call label="Levantarme" name="Stand Up"/>
+	<context_menu label="Quitarme" name="Take Off &gt;">
+		<context_menu label="Ropas" name="Clothes &gt;">
+			<menu_item_call label="Camisa" name="Shirt"/>
+			<menu_item_call label="Pantalones" name="Pants"/>
+			<menu_item_call label="Falda" name="Skirt"/>
+			<menu_item_call label="Zapatos" name="Shoes"/>
+			<menu_item_call label="Calcetines" name="Socks"/>
+			<menu_item_call label="Chaqueta" name="Jacket"/>
+			<menu_item_call label="Guantes" name="Gloves"/>
+			<menu_item_call label="Camiseta" name="Self Undershirt"/>
+			<menu_item_call label="Ropa interior" name="Self Underpants"/>
+			<menu_item_call label="Tatuaje" name="Self Tattoo"/>
+			<menu_item_call label="Alfa" name="Self Alpha"/>
+			<menu_item_call label="Toda la ropa" name="All Clothes"/>
+		</context_menu>
+		<context_menu label="HUD" name="Object Detach HUD"/>
+		<context_menu label="Quitar" name="Object Detach"/>
+		<menu_item_call label="Quitarse todo" name="Detach All"/>
+	</context_menu>
+	<menu_item_call label="Cambiar vestuario" name="Chenge Outfit"/>
+	<menu_item_call label="Editar mi vestuario" name="Edit Outfit"/>
+	<menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
+	<menu_item_call label="Mis amigos" name="Friends..."/>
+	<menu_item_call label="Mis grupos" name="Groups..."/>
+	<menu_item_call label="Mi perfil" name="Profile..."/>
 	<menu_item_call label="Depurar las texturas" name="Debug..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml
index 8e498fefba1434807b3cf337a30e2b8326994d4c..0e9644629e5b38471e125da3d2a3468dc486e253 100644
--- a/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml
@@ -3,6 +3,7 @@
 	<menu_item_call label="Nueva ventana del inventario" name="new_window"/>
 	<menu_item_check label="Ordenar alfabéticamente" name="sort_by_name"/>
 	<menu_item_check label="Ordenar por los más recientes" name="sort_by_recent"/>
+	<menu_item_check label="Ordenar las carpetas siempre alfabéticamente" name="sort_folders_by_name"/>
 	<menu_item_check label="Las carpetas del sistema, arriba" name="sort_system_folders_to_top"/>
 	<menu_item_call label="Ver los filtros" name="show_filters"/>
 	<menu_item_call label="Restablecer los filtros" name="reset_filters"/>
diff --git a/indra/newview/skins/default/xui/es/menu_object.xml b/indra/newview/skins/default/xui/es/menu_object.xml
index 06121e0c09a143e0d05e4a8b6c783bbae9caf7d3..d8c75eaf471e9fd0371596ed4b50e8d0a4e04332 100644
--- a/indra/newview/skins/default/xui/es/menu_object.xml
+++ b/indra/newview/skins/default/xui/es/menu_object.xml
@@ -16,14 +16,14 @@
 		<context_menu label="Anexar" name="Object Attach"/>
 		<context_menu label="Anexar el HUD" name="Object Attach HUD"/>
 	</context_menu>
-	<context_menu label="Quitar" name="Remove">
+	<context_menu label="Gestionar" name="Remove">
 		<menu_item_call label="Denunciar una infracción" name="Report Abuse..."/>
 		<menu_item_call label="Ignorar" name="Object Mute"/>
 		<menu_item_call label="Devolver" name="Return..."/>
-		<menu_item_call label="Eliminar" name="Delete"/>
 	</context_menu>
 	<menu_item_call label="Tomar" name="Pie Object Take"/>
 	<menu_item_call label="Coger una copia" name="Take Copy"/>
 	<menu_item_call label="Pagar" name="Pay..."/>
 	<menu_item_call label="Comprar" name="Buy..."/>
+	<menu_item_call label="Borrar" name="Delete"/>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml
index bf46eb58e3cc4edaf90186f3c28a961ccceaca88..4051ff407522d3b2e8db597654fb08271d81edf0 100644
--- a/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<toggleable_menu name="menu_folder_gear">
 	<menu_item_call label="Añadir este hito" name="add_landmark"/>
 	<menu_item_call label="Añadir una carpeta" name="add_folder"/>
+	<menu_item_call label="Restaurar ítem" name="restore_item"/>
 	<menu_item_call label="Cortar" name="cut"/>
 	<menu_item_call label="Copiar" name="copy_folder"/>
 	<menu_item_call label="Pegar" name="paste"/>
@@ -12,4 +13,4 @@
 	<menu_item_call label="Abrir todas las carpetas" name="expand_all"/>
 	<menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/>
 	<menu_item_check label="Ordenar por fecha" name="sort_by_date"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml
index eac85de846c5f965472b792033e2fa4cd6cccc66..c92bd19787f9d0a83a94ed61f67950710db05ba8 100644
--- a/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml
@@ -1,10 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<toggleable_menu name="menu_ladmark_gear">
 	<menu_item_call label="Teleportar" name="teleport"/>
 	<menu_item_call label="Más información" name="more_info"/>
 	<menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
 	<menu_item_call label="Añadir un hito" name="add_landmark"/>
 	<menu_item_call label="Añadir una carpeta" name="add_folder"/>
+	<menu_item_call label="Restaurar ítem" name="restore_item"/>
 	<menu_item_call label="Cortar" name="cut"/>
 	<menu_item_call label="Copiar el hito" name="copy_landmark"/>
 	<menu_item_call label="Copiar la SLurl" name="copy_slurl"/>
@@ -15,4 +16,4 @@
 	<menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/>
 	<menu_item_check label="Ordenar por fecha" name="sort_by_date"/>
 	<menu_item_call label="Crear un Destacado" name="create_pick"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 2fe7db10418ca00d0eb3c0ab5f0ab8b514239f34..c48203f95c93b9a40ba2ca162feffed569fa6633 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -7,7 +7,7 @@
 		</menu_item_call>
 		<menu_item_call label="Comprar L$" name="Buy and Sell L$"/>
 		<menu_item_call label="Mi perfil" name="Profile"/>
-		<menu_item_call label="Cambiar vestuario" name="ChangeOutfit"/>
+		<menu_item_call label="Mi apariencia" name="ChangeOutfit"/>
 		<menu_item_check label="Mi Inventario" name="Inventory"/>
 		<menu_item_check label="Mi Inventario" name="ShowSidetrayInventory"/>
 		<menu_item_check label="Mis gestos" name="Gestures"/>
@@ -35,6 +35,7 @@
 	<menu label="Mundo" name="World">
 		<menu_item_check label="Minimapa" name="Mini-Map"/>
 		<menu_item_check label="Mapa del mundo" name="World Map"/>
+		<menu_item_check label="Buscar" name="Search"/>
 		<menu_item_call label="Foto" name="Take Snapshot"/>
 		<menu_item_call label="Crear un hito de este sitio" name="Create Landmark Here"/>
 		<menu label="Perfil del lugar" name="Land">
@@ -224,7 +225,9 @@
 		<menu label="Show Info" name="Display Info">
 			<menu_item_check label="Show Time" name="Show Time"/>
 			<menu_item_check label="Show Render Info" name="Show Render Info"/>
+			<menu_item_check label="Mostrar información de textura" name="Show Texture Info"/>
 			<menu_item_check label="Show Color Under Cursor" name="Show Color Under Cursor"/>
+			<menu_item_check label="Mostrar la memoria" name="Show Memory"/>
 			<menu_item_check label="Show Updates to Objects" name="Show Updates"/>
 		</menu>
 		<menu label="Force an Error" name="Force Errors">
@@ -242,6 +245,9 @@
 			<menu_item_check label="Randomize Framerate" name="Randomize Framerate"/>
 			<menu_item_check label="Frame Test" name="Frame Test"/>
 		</menu>
+		<menu label="Render Metadata" name="Render Metadata">
+			<menu_item_check label="Actualizar el tipo" name="Update Type"/>
+		</menu>
 		<menu label="Rendering" name="Rendering">
 			<menu_item_check label="Axes" name="Axes"/>
 			<menu_item_check label="Wireframe" name="Wireframe"/>
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 2bf36bb763fc00afdab6a8cc890bd4cc1d6a5142..1379f710c31fac20d37d369fca82784fc88b823b 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -73,7 +73,7 @@ Detalles del error: la notificación de nombre &apos;[_NAME]&apos; no se ha enco
 	</notification>
 	<notification name="LoginFailedNoNetwork">
 		No se puede conectar con [SECOND_LIFE_GRID].
-&apos;[DIAGNOSTIC]&apos;
+    &apos;[DIAGNOSTIC]&apos;
 Asegúrate de que tu conexión a Internet está funcionando adecuadamente.
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
@@ -330,13 +330,6 @@ Necesitas una cuenta para acceder a [SECOND_LIFE]. ¿Te gustaría crear una ahor
 	<notification name="InvalidCredentialFormat">
 		Escribe el nombre de usuario o el nombre y el apellido de tu avatar en el campo Nombre de usuario e inicia sesión otra vez.
 	</notification>
-	<notification name="AddClassified">
-		Los anuncios clasificados aparecen durante una semana en la sección &apos;Clasificados&apos; de la búsqueda y en [http://secondlife.com/community/classifieds secondlife.com].
-Rellena tu anuncio y pulsa &apos;Publicar...&apos; para añadirlo al directorio.
-Cuando pulses Publicar, se te preguntará por un precio a pagar.
-El pagar más hará que tu anuncio aparezca más arriba en la lista, y que también aparezca más arriba en la lista cuando la gente busque por palabras clave.
-		<usetemplate ignoretext="Cómo crear un anuncio clasificado nuevo." name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
 	<notification name="DeleteClassified">
 		¿Borrar el clasificado &apos;[NAME]&apos;?
 No se reembolsan las cuotas pagadas.
@@ -2851,9 +2844,6 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambi
 	<notification label="Explora el mundo" name="HintDestinationGuide">
 		La Guía de destinos contiene miles de nuevos lugares por descubrir. Selecciona una ubicación y elige Teleportarme para iniciar la exploración.
 	</notification>
-	<notification label="Cambiar de apariencia" name="HintAvatarPicker">
-		¿Te gustaría cambiar de apariencia? Haz clic en el botón que aparece a continuación para ver más avatares.
-	</notification>
 	<notification label="Panel lateral" name="HintSidePanel">
 		Accede de manera rápida a tu inventario, así como a tu ropa, los perfiles y el resto de la información disponible en el panel lateral.
 	</notification>
@@ -2891,6 +2881,38 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambi
 			<button name="cancel" text="Cancelar"/>
 		</form>
 	</notification>
+	<notification label="" name="ModeChange">
+		Para cambiar de modo tienes que salir y reiniciar.
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
+	<notification label="" name="NoClassifieds">
+		La creación y edición de clasificados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
+	<notification label="" name="NoGroupInfo">
+		La creación y edición de grupos sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
+	<notification label="" name="NoPicks">
+		La creación y edición de Destacados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
+	<notification label="" name="NoWorldMap">
+		La visualización del mapa del mundo sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
+	<notification label="" name="NoVoiceCall">
+		Las llamadas de voz sólo están disponibles en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
+	<notification label="" name="NoAvatarShare">
+		Compartir sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
+	<notification label="" name="NoAvatarPay">
+		El pago a otros residentes sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
 	<global name="UnsupportedCPU">
 		- La velocidad de tu CPU no cumple los requerimientos mínimos.
 	</global>
diff --git a/indra/newview/skins/default/xui/es/panel_landmark_info.xml b/indra/newview/skins/default/xui/es/panel_landmark_info.xml
index 49a9f84cfe7cde9aa680d83353c7a58b872dd2ab..1a0ac3ba79c7d68c154105b63cde73a866a3f9af 100644
--- a/indra/newview/skins/default/xui/es/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/es/panel_landmark_info.xml
@@ -19,7 +19,7 @@
 		[wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
 	</string>
 	<button name="back_btn" tool_tip="Atrás"/>
-	<text name="title" value="Añadir el perfil"/>
+	<text name="title" value="Perfil del lugar"/>
 	<scroll_container name="place_scroll">
 		<panel name="scrolling_panel">
 			<text name="maturity_value" value="desconocido"/>
diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml
index ada964f33efc2f1432957824f9ba82b48180ac04..eee1844c46cde3ccb10509a4703feb724cc686ca 100644
--- a/indra/newview/skins/default/xui/es/panel_login.xml
+++ b/indra/newview/skins/default/xui/es/panel_login.xml
@@ -17,6 +17,13 @@
 			</text>
 			<check_box label="Recordar la contraseña" name="remember_check"/>
 			<button label="Iniciar sesión" name="connect_btn"/>
+			<text name="mode_selection_text">
+				Modo:
+			</text>
+			<combo_box name="mode_combo" tool_tip="Selecciona el modo. Elige Básico para una exploración rápida y fácil y para chatear. Elige Avanzado para tener acceso a más funciones.">
+				<combo_box.item label="Básico" name="Basic"/>
+				<combo_box.item label="Avanzado" name="Advanced"/>
+			</combo_box>
 			<text name="start_location_text">
 				Empezar en:
 			</text>
diff --git a/indra/newview/skins/default/xui/es/panel_nearby_media.xml b/indra/newview/skins/default/xui/es/panel_nearby_media.xml
index f65cae6e2065dc77bce148727ddc2e2b0b5a9457..8d4f9eda187507c25855d21ed6dacebb7c2df900 100644
--- a/indra/newview/skins/default/xui/es/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/es/panel_nearby_media.xml
@@ -19,7 +19,7 @@
 		<button label="Parar todo" name="all_nearby_media_disable_btn" tool_tip="Apagar todos los media cercanos"/>
 		<button label="Iniciar todo" name="all_nearby_media_enable_btn" tool_tip="Encender todos los media cercanos"/>
 		<button name="open_prefs_btn" tool_tip="Abrir las preferencias de los media"/>
-		<button label="Más &gt;&gt;" label_selected="Menos &lt;&lt;" name="more_btn" tool_tip="Controles avanzados"/>
+		<button label="Más &gt;&gt;" label_selected="&lt;&lt; Menos" name="more_btn" tool_tip="Controles avanzados"/>
 		<button label="Más &gt;&gt;" label_selected="Menos &lt;&lt;" name="less_btn" tool_tip="Controles avanzados"/>
 	</panel>
 	<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml
index d0c80ebae531a9b56a4f283883b4ccbfca3d7cf2..01149e412ddcb63ea32684d84ea5152f4fb89abf 100644
--- a/indra/newview/skins/default/xui/es/panel_people.xml
+++ b/indra/newview/skins/default/xui/es/panel_people.xml
@@ -18,6 +18,8 @@
 	<string name="groups_filter_label" value="Filtrar a los grupos"/>
 	<string name="no_filtered_groups_msg" value="¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/groups/[SEARCH_TERM] Buscar]."/>
 	<string name="no_groups_msg" value="¿Buscas grupos en que participar? Prueba la [secondlife:///app/search/groups Búsqueda]."/>
+	<string name="MiniMapToolTipMsg" value="[REGION](Pulsa dos veces para abrir el mapa, pulsa mayús y arrastra para obtener una panorámica)"/>
+	<string name="AltMiniMapToolTipMsg" value="[REGION](Pulsa dos veces para teleportarte, pulsa mayús y arrastra para obtener una panorámica)"/>
 	<filter_editor label="Filtrar" name="filter_input"/>
 	<tab_container name="tabs">
 		<panel label="CERCANA" name="nearby_panel">
diff --git a/indra/newview/skins/default/xui/es/panel_place_profile.xml b/indra/newview/skins/default/xui/es/panel_place_profile.xml
index 524ba2253b6fddec01442812752e196178177498..3c363859a40754b7f5ca4b0d723963fc4616e417 100644
--- a/indra/newview/skins/default/xui/es/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/es/panel_place_profile.xml
@@ -5,7 +5,7 @@
 	<string name="anyone" value="Cualquiera"/>
 	<string name="available" value="disponible"/>
 	<string name="allocated" value="asignados"/>
-	<string name="title_place" value="Añadir el perfil"/>
+	<string name="title_place" value="Perfil del lugar"/>
 	<string name="title_teleport_history" value="Historial de teleportes"/>
 	<string name="not_available" value="(No disp.)"/>
 	<string name="unknown" value="(desconocido)"/>
@@ -42,7 +42,7 @@
 		[wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
 	</string>
 	<button name="back_btn" tool_tip="Atrás"/>
-	<text name="title" value="Añadir el perfil"/>
+	<text name="title" value="Perfil del lugar"/>
 	<scroll_container name="place_scroll">
 		<panel name="scrolling_panel">
 			<text name="owner_label" value="Propietario:"/>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
index 67f9a929f68c2b58076977788ed8511386d86fb5..0b304fe2872f99ccd126f43c1ad7eb081a2a70dd 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
@@ -27,9 +27,9 @@
 	</text>
 	<check_box label="Chats de grupo" name="EnableGroupChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje de un grupo de chat"/>
 	<check_box label="Chats de MI" name="EnableIMChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje instantáneo"/>
-	<spinner label="Duración de los interlocutores favoritos en los chats:" name="nearby_toasts_lifetime"/>
-	<spinner label="Tiempo restante de los interlocutores favoritos en los chats:" name="nearby_toasts_fadingtime"/>
-	<check_box label="Utiliza la herramienta de traducción automática mientras utilizas el chat (mediante Google)" name="translate_chat_checkbox"/>
+	<spinner label="Duración de los interlocutores favoritos:" name="nearby_toasts_lifetime"/>
+	<spinner label="Tiempo de los otros interlocutores:" name="nearby_toasts_fadingtime"/>
+	<check_box label="Usar la traducción automática (con Google) en el chat" name="translate_chat_checkbox"/>
 	<text name="translate_language_text">
 		Traducir el chat al:
 	</text>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
index 91cf9524a3639b459044c78c5090320aa8fbd545..790c7be5819ca4eef20dd1a9eef09ddf4710855b 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
@@ -55,7 +55,7 @@
 	</text>
 	<radio_group name="inworld_typing_preference">
 		<radio_item label="Inicia el chat local" name="radio_start_chat" value="1"/>
-		<radio_item label="Se verá afectado el movimiento (por ejemplo, mediante las teclas WASD)" name="radio_move" value="0"/>
+		<radio_item label="Afecta al movimiento (por ejemplo, en las teclas WASD)" name="radio_move" value="0"/>
 	</radio_group>
 	<text name="title_afk_text">
 		Ausente tras:
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
index 5eaa345c988e2e1df63878b5895486f8ae3803ad..adc0862cf1dfbd3edd148a9db585bf6677678615 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
@@ -11,7 +11,7 @@
 	<check_box label="Sólo saben si estoy conectado mis amigos y grupos" name="online_visibility"/>
 	<check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/>
 	<check_box label="Desconectar el micrófono cuando finalicen las llamadas" name="auto_disengage_mic_check"/>
-	<check_box label="Mostrar mis Hitos favoritos en Inicio de sesión (mediante el menú desplegable &quot;Empezar en&quot;)" name="favorites_on_login_check"/>
+	<check_box label="Mostrar mis Hitos favoritos al Inicio de sesión (menú desplegable &quot;Empezar en&quot;)" name="favorites_on_login_check"/>
 	<text name="Logs:">
 		Registros de chat:
 	</text>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
index 68484645b7ed917043b7f9e09bde7dde8f2042b8..9b453fd807f98ace9c4c151b1767c8fa7422bbe4 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
@@ -32,7 +32,7 @@
 	<check_box initial_value="true" label="Activar plugins" name="browser_plugins_enabled"/>
 	<check_box initial_value="true" label="Aceptar las &apos;cookies&apos;" name="cookies_enabled"/>
 	<check_box initial_value="true" label="Activar Javascript" name="browser_javascript_enabled"/>
-	<check_box initial_value="falso" label="Permitir ventanas emergentes de navegadores de medios" name="media_popup_enabled"/>
+	<check_box initial_value="falso" label="Permitir las ventanas emergentes en el navegador" name="media_popup_enabled"/>
 	<check_box initial_value="false" label="Activar web proxy" name="web_proxy_enabled"/>
 	<text name="Proxy location">
 		Localización del proxy:
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
index 6c4ab0f14f41ec81c1659cfcd58517d4f069ea61..db3659abcde6914d91e67889b1a52bcb9ff4d2b7 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
@@ -9,7 +9,7 @@
 	<slider label="Ambiental" name="Wind Volume"/>
 	<slider label="Efectos de sonido" name="SFX Volume"/>
 	<slider label="Música en streaming" name="Music Volume"/>
-	<check_box label="Activada" name="enable_music"/>
+	<check_box label="Activados" name="enable_music"/>
 	<slider label="Multimedia" name="Media Volume"/>
 	<check_box label="Activada" name="enable_media"/>
 	<slider label="Chat de voz" name="Voice Volume"/>
diff --git a/indra/newview/skins/default/xui/es/panel_profile.xml b/indra/newview/skins/default/xui/es/panel_profile.xml
index 339a1f236bab167d78a4697812926f14dcd8ccae..334c0541af9bc7d65128a5d0f8bd1440d9597f0b 100644
--- a/indra/newview/skins/default/xui/es/panel_profile.xml
+++ b/indra/newview/skins/default/xui/es/panel_profile.xml
@@ -16,6 +16,12 @@
 	<string name="RegisterDateFormat">
 		[REG_DATE] ([AGE])
 	</string>
+	<string name="name_text_args">
+		[NAME]
+	</string>
+	<string name="display_name_text_args">
+		[DISPLAY_NAME]
+	</string>
 	<layout_stack name="layout">
 		<layout_panel name="profile_stack">
 			<scroll_container name="profile_scroll">
@@ -30,7 +36,7 @@
 					<text name="title_acc_status_text" value="Estado de la cuenta:"/>
 					<text name="title_partner_text" value="Compañero/a:"/>
 					<panel name="partner_data_panel">
-						<name_box initial_value="(obteniendo)" name="partner_text"/>
+						<text initial_value="(obteniendo)" name="partner_text"/>
 					</panel>
 					<text name="title_groups_text" value="Grupos:"/>
 				</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_script_ed.xml b/indra/newview/skins/default/xui/es/panel_script_ed.xml
index 5be25a286da070675bce79ead284e3773f5ce1ff..46952c6974ff27ae8ef164e52ab031506ff49219 100644
--- a/indra/newview/skins/default/xui/es/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/es/panel_script_ed.xml
@@ -15,6 +15,9 @@
 	<panel.string name="Title">
 		Script: [NAME]
 	</panel.string>
+	<panel.string name="external_editor_not_set">
+		Puedes seleccionar un editor configurando la variable de entorno LL_SCRIPT_EDITOR o mediante la configuración de ExternalEditor.
+	</panel.string>
 	<menu_bar name="script_menu">
 		<menu label="Archivo" name="File">
 			<menu_item_call label="Guardar" name="Save"/>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index df40a2b6b4374ef5b08377fb967af733ed64e5e0..cd1fb767c860adcf05f895d4cb58d0a3a60b6829 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -1040,7 +1040,7 @@
 	</string>
 	<string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/>
 	<string name="ActiveGesture" value="[GESLABEL] (activo)"/>
-	<string name="Chat" value="Chat :"/>
+	<string name="Chat Message" value="Chat:"/>
 	<string name="Sound" value="Sonido :"/>
 	<string name="Wait" value="--- Espera :"/>
 	<string name="AnimFlagStop" value="Parar la animación:"/>
@@ -1822,12 +1822,6 @@ Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
 	<string name="accel-win-shift">
 		Mayús+
 	</string>
-	<string name="Esc">
-		Esc
-	</string>
-	<string name="Home">
-		Base
-	</string>
 	<string name="FileSaved">
 		Archivo guardado
 	</string>
@@ -1945,6 +1939,9 @@ Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
 	<string name="Other">
 		Otra
 	</string>
+	<string name="Rental">
+		Terreno en alquiler
+	</string>
 	<string name="Any">
 		Cualquiera
 	</string>
@@ -3864,7 +3861,7 @@ Denuncia de infracción
 	<string name="Notices">
 		Avisos
 	</string>
-	<string name="Chat">
+	<string name="Chat" value="Chat :">
 		Chat
 	</string>
 	<string name="DeleteItems">
@@ -3876,4 +3873,348 @@ Denuncia de infracción
 	<string name="EmptyOutfitText">
 		No hay elementos en este vestuario
 	</string>
+	<string name="ExternalEditorNotSet">
+		Selecciona un editor mediante la configuración de ExternalEditor.
+	</string>
+	<string name="ExternalEditorNotFound">
+		No se encuentra el editor externo especificado.
+Inténtalo incluyendo la ruta de acceso al editor entre comillas
+(por ejemplo, &quot;/ruta a mi/editor&quot; &quot;%s&quot;).
+	</string>
+	<string name="ExternalEditorCommandParseError">
+		Error al analizar el comando de editor externo.
+	</string>
+	<string name="ExternalEditorFailedToRun">
+		Error al ejecutar el editor externo.
+	</string>
+	<string name="Esc">
+		Esc
+	</string>
+	<string name="Space">
+		Space
+	</string>
+	<string name="Enter">
+		Enter
+	</string>
+	<string name="Tab">
+		Tab
+	</string>
+	<string name="Ins">
+		Ins
+	</string>
+	<string name="Del">
+		Del
+	</string>
+	<string name="Backsp">
+		Backsp
+	</string>
+	<string name="Shift">
+		Shift
+	</string>
+	<string name="Ctrl">
+		Ctrl
+	</string>
+	<string name="Alt">
+		Alt
+	</string>
+	<string name="CapsLock">
+		CapsLock
+	</string>
+	<string name="Home">
+		Base
+	</string>
+	<string name="End">
+		End
+	</string>
+	<string name="PgUp">
+		PgUp
+	</string>
+	<string name="PgDn">
+		PgDn
+	</string>
+	<string name="F1">
+		F1
+	</string>
+	<string name="F2">
+		F2
+	</string>
+	<string name="F3">
+		F3
+	</string>
+	<string name="F4">
+		F4
+	</string>
+	<string name="F5">
+		F5
+	</string>
+	<string name="F6">
+		F6
+	</string>
+	<string name="F7">
+		F7
+	</string>
+	<string name="F8">
+		F8
+	</string>
+	<string name="F9">
+		F9
+	</string>
+	<string name="F10">
+		F10
+	</string>
+	<string name="F11">
+		F11
+	</string>
+	<string name="F12">
+		F12
+	</string>
+	<string name="Add">
+		Añadir
+	</string>
+	<string name="Subtract">
+		Restar
+	</string>
+	<string name="Multiply">
+		Multiplicar
+	</string>
+	<string name="Divide">
+		Dividir
+	</string>
+	<string name="PAD_DIVIDE">
+		PAD_DIVIDE
+	</string>
+	<string name="PAD_LEFT">
+		PAD_LEFT
+	</string>
+	<string name="PAD_RIGHT">
+		PAD_RIGHT
+	</string>
+	<string name="PAD_DOWN">
+		PAD_DOWN
+	</string>
+	<string name="PAD_UP">
+		PAD_UP
+	</string>
+	<string name="PAD_HOME">
+		PAD_HOME
+	</string>
+	<string name="PAD_END">
+		PAD_END
+	</string>
+	<string name="PAD_PGUP">
+		PAD_PGUP
+	</string>
+	<string name="PAD_PGDN">
+		PAD_PGDN
+	</string>
+	<string name="PAD_CENTER">
+		PAD_CENTER
+	</string>
+	<string name="PAD_INS">
+		PAD_INS
+	</string>
+	<string name="PAD_DEL">
+		PAD_DEL
+	</string>
+	<string name="PAD_Enter">
+		PAD_Enter
+	</string>
+	<string name="PAD_BUTTON0">
+		PAD_BUTTON0
+	</string>
+	<string name="PAD_BUTTON1">
+		PAD_BUTTON1
+	</string>
+	<string name="PAD_BUTTON2">
+		PAD_BUTTON2
+	</string>
+	<string name="PAD_BUTTON3">
+		PAD_BUTTON3
+	</string>
+	<string name="PAD_BUTTON4">
+		PAD_BUTTON4
+	</string>
+	<string name="PAD_BUTTON5">
+		PAD_BUTTON5
+	</string>
+	<string name="PAD_BUTTON6">
+		PAD_BUTTON6
+	</string>
+	<string name="PAD_BUTTON7">
+		PAD_BUTTON7
+	</string>
+	<string name="PAD_BUTTON8">
+		PAD_BUTTON8
+	</string>
+	<string name="PAD_BUTTON9">
+		PAD_BUTTON9
+	</string>
+	<string name="PAD_BUTTON10">
+		PAD_BUTTON10
+	</string>
+	<string name="PAD_BUTTON11">
+		PAD_BUTTON11
+	</string>
+	<string name="PAD_BUTTON12">
+		PAD_BUTTON12
+	</string>
+	<string name="PAD_BUTTON13">
+		PAD_BUTTON13
+	</string>
+	<string name="PAD_BUTTON14">
+		PAD_BUTTON14
+	</string>
+	<string name="PAD_BUTTON15">
+		PAD_BUTTON15
+	</string>
+	<string name="-">
+		-
+	</string>
+	<string name="=">
+		=
+	</string>
+	<string name="`">
+		`
+	</string>
+	<string name=";">
+		;
+	</string>
+	<string name="[">
+		[
+	</string>
+	<string name="]">
+		]
+	</string>
+	<string name="\">
+		\
+	</string>
+	<string name="0">
+		0
+	</string>
+	<string name="1">
+		1
+	</string>
+	<string name="2">
+		2
+	</string>
+	<string name="3">
+		3
+	</string>
+	<string name="4">
+		4
+	</string>
+	<string name="5">
+		5
+	</string>
+	<string name="6">
+		6
+	</string>
+	<string name="7">
+		7
+	</string>
+	<string name="8">
+		8
+	</string>
+	<string name="9">
+		9
+	</string>
+	<string name="A">
+		A
+	</string>
+	<string name="B">
+		B
+	</string>
+	<string name="C">
+		C
+	</string>
+	<string name="D">
+		D
+	</string>
+	<string name="E">
+		E
+	</string>
+	<string name="F">
+		F
+	</string>
+	<string name="G">
+		G
+	</string>
+	<string name="H">
+		H
+	</string>
+	<string name="I">
+		I
+	</string>
+	<string name="J">
+		J
+	</string>
+	<string name="K">
+		K
+	</string>
+	<string name="L">
+		L
+	</string>
+	<string name="M">
+		M
+	</string>
+	<string name="N">
+		N
+	</string>
+	<string name="O">
+		O
+	</string>
+	<string name="P">
+		P
+	</string>
+	<string name="Q">
+		Q
+	</string>
+	<string name="R">
+		R
+	</string>
+	<string name="S">
+		S
+	</string>
+	<string name="T">
+		T
+	</string>
+	<string name="U">
+		U
+	</string>
+	<string name="V">
+		V
+	</string>
+	<string name="W">
+		W
+	</string>
+	<string name="X">
+		X
+	</string>
+	<string name="Y">
+		Y
+	</string>
+	<string name="Z">
+		Z
+	</string>
+	<string name="BeaconParticle">
+		Viendo balizas de partículas (azules)
+	</string>
+	<string name="BeaconPhysical">
+		Viendo balizas de objetos materiales (verdes)
+	</string>
+	<string name="BeaconScripted">
+		Viendo balizas de objetos con script (rojas)
+	</string>
+	<string name="BeaconScriptedTouch">
+		Viendo el objeto con script con balizas de función táctil (rojas)
+	</string>
+	<string name="BeaconSound">
+		Viendo balizas de sonido (amarillas)
+	</string>
+	<string name="BeaconMedia">
+		Viendo balizas de medios (blancas)
+	</string>
+	<string name="ParticleHiding">
+		Ocultando las partículas
+	</string>
 </strings>
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 6e6409725fd97a2e0711325363a8f99af250bab2..a33c0344f73b546123a70504915c218eade294da 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -248,7 +248,7 @@ ou divisé.
 			<text name="group_objects_text">
 				[COUNT]
 			</text>
-			<button label="Afficher" label_selected="Afficher" name="ShowGroup" />
+			<button label="Afficher" label_selected="Afficher" name="ShowGroup"/>
 			<button label="Retour" label_selected="Renvoyer..." name="ReturnGroup..." tool_tip="Renvoyer les objets à leurs propriétaires."/>
 			<text name="Owned by others:">
 				Appartenant à d&apos;autres :
@@ -336,7 +336,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
 				Options du terrain :
 			</text>
 			<check_box label="Sécurisé (pas de dégâts)" name="check safe" tool_tip="Si cette option est cochée, le terrain est sécurisé et il n&apos;y pas de risques de dommages causés par des combats. Si elle est décochée, des dommages causés par les combats peuvent avoir lieu."/>
-			<check_box  label="Pas de bousculades" name="PushRestrictCheck" tool_tip="Empêche l&apos;utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/>
+			<check_box label="Pas de bousculades" name="PushRestrictCheck" tool_tip="Empêche l&apos;utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/>
 			<check_box label="Afficher le lieu dans la recherche (30 L$/semaine)" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/>
 			<combo_box name="land category with adult">
 				<combo_box.item label="Toutes catégories" name="item0"/>
@@ -351,6 +351,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
 				<combo_box.item label="Parcs et Nature" name="item9"/>
 				<combo_box.item label="Résidentiel" name="item10"/>
 				<combo_box.item label="Shopping" name="item11"/>
+				<combo_box.item label="Location" name="item13"/>
 				<combo_box.item label="Autre" name="item12"/>
 			</combo_box>
 			<combo_box name="land category">
@@ -365,6 +366,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
 				<combo_box.item label="Parcs et Nature" name="item9"/>
 				<combo_box.item label="Résidentiel" name="item10"/>
 				<combo_box.item label="Shopping" name="item11"/>
+				<combo_box.item label="Location" name="item13"/>
 				<combo_box.item label="Autre" name="item12"/>
 			</combo_box>
 			<check_box label="Contenu Modéré" name="MatureCheck" tool_tip=""/>
@@ -444,7 +446,7 @@ musique :
 				(défini par le domaine
 			</panel.string>
 			<panel.string name="allow_public_access">
-				Autoriser l&apos;accès public ([MATURITY])
+				Autoriser l&apos;accès public ([MATURITY]) (Remarque : des lignes d&apos;interdiction seront créées si cette case n&apos;est pas cochée)
 			</panel.string>
 			<panel.string name="estate_override">
 				Au moins une de ces options est définie au niveau du domaine.
diff --git a/indra/newview/skins/default/xui/fr/floater_map.xml b/indra/newview/skins/default/xui/fr/floater_map.xml
index 04afe89c7b4f3ceae0df5ca2552b6b23a9e17942..8675fb8ef9a155a08191ba720b59c2c7e8236acf 100644
--- a/indra/newview/skins/default/xui/fr/floater_map.xml
+++ b/indra/newview/skins/default/xui/fr/floater_map.xml
@@ -1,32 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="Map" title="">
-	<floater.string name="mini_map_north">
-		N
-	</floater.string>
-	<floater.string name="mini_map_east">
-		E
-	</floater.string>
-	<floater.string name="mini_map_west">
-		O
-	</floater.string>
-	<floater.string name="mini_map_south">
-		S
-	</floater.string>
-	<floater.string name="mini_map_southeast">
-		SE
-	</floater.string>
-	<floater.string name="mini_map_northeast">
-		NE
-	</floater.string>
-	<floater.string name="mini_map_southwest">
-		SO
-	</floater.string>
-	<floater.string name="mini_map_northwest">
-		NO
-	</floater.string>
 	<floater.string name="ToolTipMsg">
 		[REGION](Carte : double-clic ; Panoramique : Maj + faire glisser)
 	</floater.string>
+	<floater.string name="AltToolTipMsg">
+		[REGION](Téléportation : double-clic ; Panoramique : Maj + faire glisser)
+	</floater.string>
 	<floater.string name="mini_map_caption">
 		MINI-CARTE
 	</floater.string>
diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml
index 01274b4cbcc590ab4992c73b4a630f9fd0c1e8e9..fd72e6ac1531c137063257fb68f0df3f1cec53ef 100644
--- a/indra/newview/skins/default/xui/fr/floater_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tools.xml
@@ -64,6 +64,8 @@
 		<radio_item label="Choisir une face" name="radio select face"/>
 	</radio_group>
 	<check_box label="Modification liée" name="checkbox edit linked parts"/>
+	<button label="Lien" name="link_btn"/>
+	<button label="Annuler le lien" name="unlink_btn"/>
 	<text name="RenderingCost" tool_tip="Affiche le coût du rendu calculé pour cet objet">
 		þ : [COUNT]
 	</text>
diff --git a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
index 78198fb5a8f6e2a8c2cec399b0aba8abcc50aebc..6af2064e440d0d397986dad0de776b590a285531 100644
--- a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
@@ -5,7 +5,7 @@
 	<menu_item_call label="Détacher" name="Detach"/>
 	<menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
 	<menu_item_call label="Me lever" name="Stand Up"/>
-	<menu_item_call label="Changer de tenue" name="Change Outfit"/>
+	<menu_item_call label="Mon apparence" name="Change Outfit"/>
 	<menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
 	<menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
 	<menu_item_call label="Mes amis" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
index c7ee2e9f883428c773c5553e1b7bcb53e165297d..21528cd43b5cce2e6fad10f45ce1d38a632d1864 100644
--- a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
@@ -21,7 +21,7 @@
 		<context_menu label="Détacher" name="Object Detach"/>
 		<menu_item_call label="Tout détacher" name="Detach All"/>
 	</context_menu>
-	<menu_item_call label="Changer de tenue" name="Chenge Outfit"/>
+	<menu_item_call label="Mon apparence" name="Chenge Outfit"/>
 	<menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
 	<menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
 	<menu_item_call label="Mes amis" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml
index bfdc89c5bbcf85b5ab9d0dffefd2fec7dcacfbca..ddaea517fce639e6c34e88b510afb61829e1b5cf 100644
--- a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu name="hide_camera_move_controls_menu">
+	<menu_item_check label="Voix activée" name="EnableVoiceChat"/>
 	<menu_item_check label="Bouton Geste" name="ShowGestureButton"/>
 	<menu_item_check label="Bouton Bouger" name="ShowMoveButton"/>
 	<menu_item_check label="Bouton Affichage" name="ShowCameraButton"/>
 	<menu_item_check label="Bouton Photo" name="ShowSnapshotButton"/>
-	<menu_item_check label="Bouton Panneau latéral" name="ShowSidebarButton"/>
 	<menu_item_check label="Bouton Construire" name="ShowBuildButton"/>
 	<menu_item_check label="Bouton Rechercher" name="ShowSearchButton"/>
 	<menu_item_check label="Bouton Carte" name="ShowWorldMapButton"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml
index 17254ff325f1802100a79d37524276917b93acb5..53f22bb44a43420cf8e64ba7edba45506adc72fe 100644
--- a/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
 	<menu_item_call label="Voir le profil" name="view_profile"/>
 	<menu_item_call label="Devenir amis" name="add_friend"/>
 	<menu_item_call label="IM" name="im"/>
@@ -11,9 +11,11 @@
 	<menu_item_call label="Signaler" name="report"/>
 	<menu_item_call label="Figer" name="freeze"/>
 	<menu_item_call label="Expulser" name="eject"/>
+	<menu_item_call label="Éjecter" name="kick"/>
+	<menu_item_call label="Représentant de l&apos;Assistance client" name="csr"/>
 	<menu_item_call label="Déboguer les textures" name="debug"/>
 	<menu_item_call label="Situer sur la carte" name="find_on_map"/>
 	<menu_item_call label="Zoomer en avant" name="zoom_in"/>
 	<menu_item_call label="Payer" name="pay"/>
 	<menu_item_call label="Partager" name="share"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml
index 3bc164788a6e193b8189ea20eada2aabafa93701..ac70df472df969c40c35d2b307b1eeddf52119e8 100644
--- a/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
-	<menu_item_call label="M&apos;asseoir" name="sit_down_here"/>
-	<menu_item_call label="Me lever" name="stand_up"/>
-	<menu_item_call label="Changer de tenue" name="change_outfit"/>
-	<menu_item_call label="Mon profil" name="my_profile"/>
-	<menu_item_call label="Mes amis" name="my_friends"/>
-	<menu_item_call label="Mes groupes" name="my_groups"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Menu">
+	<menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
+	<menu_item_call label="Me lever" name="Stand Up"/>
+	<context_menu label="Enlever" name="Take Off &gt;">
+		<context_menu label="Habits" name="Clothes &gt;">
+			<menu_item_call label="Chemise" name="Shirt"/>
+			<menu_item_call label="Pantalon" name="Pants"/>
+			<menu_item_call label="Jupe" name="Skirt"/>
+			<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="Débardeur" name="Self Undershirt"/>
+			<menu_item_call label="Caleçon" name="Self Underpants"/>
+			<menu_item_call label="Tatouage" name="Self Tattoo"/>
+			<menu_item_call label="Alpha" name="Self Alpha"/>
+			<menu_item_call label="Tous les habits" name="All Clothes"/>
+		</context_menu>
+		<context_menu label="HUD" name="Object Detach HUD"/>
+		<context_menu label="Détacher" name="Object Detach"/>
+		<menu_item_call label="Tout détacher" name="Detach All"/>
+	</context_menu>
+	<menu_item_call label="Changer de tenue" name="Chenge Outfit"/>
+	<menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
+	<menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
+	<menu_item_call label="Mes amis" name="Friends..."/>
+	<menu_item_call label="Mes groupes" name="Groups..."/>
+	<menu_item_call label="Mon profil" name="Profile..."/>
 	<menu_item_call label="Déboguer les textures" name="Debug..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
index f28918ae1421eebbac64771c05266973a8ed74f3..364872c875d2ec89e04f3e06031767d0474292b2 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
@@ -3,6 +3,7 @@
 	<menu_item_call label="Nouvelle fenêtre d&apos;inventaire" name="new_window"/>
 	<menu_item_check label="Trier par nom" name="sort_by_name"/>
 	<menu_item_check label="Trier en commençant par le plus récent" name="sort_by_recent"/>
+	<menu_item_check label="Toujours trier les dossiers par nom" name="sort_folders_by_name"/>
 	<menu_item_check label="Dossiers système en premier" name="sort_system_folders_to_top"/>
 	<menu_item_call label="Afficher les filtres" name="show_filters"/>
 	<menu_item_call label="Réinitialiser les filtres" name="reset_filters"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_object.xml b/indra/newview/skins/default/xui/fr/menu_object.xml
index a50a9df4b10dd5b88847aaa2fbac7204b603e53c..c6db48a31cfa1ad66c5f0152d0c278bcecce590b 100644
--- a/indra/newview/skins/default/xui/fr/menu_object.xml
+++ b/indra/newview/skins/default/xui/fr/menu_object.xml
@@ -16,14 +16,14 @@
 		<context_menu label="Attacher" name="Object Attach"/>
 		<context_menu label="Attacher HUD" name="Object Attach HUD"/>
 	</context_menu>
-	<context_menu label="Supprimer" name="Remove">
+	<context_menu label="Gérer" name="Remove">
 		<menu_item_call label="Signaler une infraction" name="Report Abuse..."/>
 		<menu_item_call label="Ignorer" name="Object Mute"/>
 		<menu_item_call label="Retour" name="Return..."/>
-		<menu_item_call label="Supprimer" name="Delete"/>
 	</context_menu>
 	<menu_item_call label="Prendre" name="Pie Object Take"/>
 	<menu_item_call label="Prendre une copie" name="Take Copy"/>
 	<menu_item_call label="Payer" name="Pay..."/>
 	<menu_item_call label="Acheter" name="Buy..."/>
+	<menu_item_call label="Supprimer" name="Delete"/>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml
index 3570bdec7f4b355fb4baceccfc4ed4a3f7921eeb..3fdf3bf3c495f31ba2ddc2b47f6a23de6180674e 100644
--- a/indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<toggleable_menu name="menu_folder_gear">
 	<menu_item_call label="Ajouter un repère" name="add_landmark"/>
 	<menu_item_call label="Ajouter un dossier" name="add_folder"/>
+	<menu_item_call label="Restaurer l&apos;article" name="restore_item"/>
 	<menu_item_call label="Couper" name="cut"/>
 	<menu_item_call label="Copier" name="copy_folder"/>
 	<menu_item_call label="Coller" name="paste"/>
@@ -12,4 +13,4 @@
 	<menu_item_call label="Développer tous les dossiers" name="expand_all"/>
 	<menu_item_call label="Réduire tous les dossiers" name="collapse_all"/>
 	<menu_item_check label="Trier par date" name="sort_by_date"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml
index 5491c1b3fcf7803e1073d1dd90eb68b5d039a7c9..b48f6ea693a81f7dc4ded91ba27b7954e66b58d6 100644
--- a/indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml
@@ -1,10 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<toggleable_menu name="menu_ladmark_gear">
 	<menu_item_call label="Téléporter" name="teleport"/>
 	<menu_item_call label="Plus d&apos;informations" name="more_info"/>
 	<menu_item_call label="Voir sur la carte" name="show_on_map"/>
 	<menu_item_call label="Ajouter un repère" name="add_landmark"/>
 	<menu_item_call label="Ajouter un dossier" name="add_folder"/>
+	<menu_item_call label="Restaurer l&apos;article" name="restore_item"/>
 	<menu_item_call label="Couper" name="cut"/>
 	<menu_item_call label="Copier le repère" name="copy_landmark"/>
 	<menu_item_call label="Copier la SLurl" name="copy_slurl"/>
@@ -15,4 +16,4 @@
 	<menu_item_call label="Réduire tous les dossiers" name="collapse_all"/>
 	<menu_item_check label="Trier par date" name="sort_by_date"/>
 	<menu_item_call label="Créer un favori" name="create_pick"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 65a00c2e6c61d56e38ccc0176562d88dd8aabed1..ee1ab8c60181afd649de7f21dfd6570fd816cd0b 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -7,7 +7,7 @@
 		</menu_item_call>
 		<menu_item_call label="Acheter des L$" name="Buy and Sell L$"/>
 		<menu_item_call label="Mon profil" name="Profile"/>
-		<menu_item_call label="Changer de tenue" name="ChangeOutfit"/>
+		<menu_item_call label="Mon apparence" name="ChangeOutfit"/>
 		<menu_item_check label="Mon inventaire" name="Inventory"/>
 		<menu_item_check label="Mon inventaire" name="ShowSidetrayInventory"/>
 		<menu_item_check label="Mes gestes" name="Gestures"/>
@@ -35,6 +35,7 @@
 	<menu label="Monde" name="World">
 		<menu_item_check label="Mini-carte" name="Mini-Map"/>
 		<menu_item_check label="Carte du monde" name="World Map"/>
+		<menu_item_check label="Rechercher" name="Search"/>
 		<menu_item_call label="Photo" name="Take Snapshot"/>
 		<menu_item_call label="Créer un repère pour ce lieu" name="Create Landmark Here"/>
 		<menu label="Profil du lieu" name="Land">
@@ -227,8 +228,10 @@
 		<menu label="Afficher les infos" name="Display Info">
 			<menu_item_check label="Afficher l&apos;heure" name="Show Time"/>
 			<menu_item_check label="Afficher les infos de rendu" name="Show Render Info"/>
+			<menu_item_check label="Afficher les infos de texture" name="Show Texture Info"/>
 			<menu_item_check label="Afficher les matrices" name="Show Matrices"/>
 			<menu_item_check label="Afficher la couleur sous le curseur" name="Show Color Under Cursor"/>
+			<menu_item_check label="Afficher la mémoire" name="Show Memory"/>
 			<menu_item_check label="Afficher les mises à jour des objets" name="Show Updates"/>
 		</menu>
 		<menu label="Forcer une erreur" name="Force Errors">
@@ -253,6 +256,7 @@
 			<menu_item_check label="Shadow Frusta" name="Shadow Frusta"/>
 			<menu_item_check label="Occlusion" name="Occlusion"/>
 			<menu_item_check label="Lots de rendu" name="Render Batches"/>
+			<menu_item_check label="Type de mise à jour" name="Update Type"/>
 			<menu_item_check label="Texture Anim" name="Texture Anim"/>
 			<menu_item_check label="Priorité de la texture" name="Texture Priority"/>
 			<menu_item_check label="Zone de texture" name="Texture Area"/>
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 603b8f0edcd3ba16d839480d95b114626abb609c..e984ea66ed2070ba90791d8addec90ce4fb98355 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -73,7 +73,7 @@ Détails de l&apos;erreur : La notification, appelée &apos;[_NAME]&apos;, est i
 	</notification>
 	<notification name="LoginFailedNoNetwork">
 		Connexion à [SECOND_LIFE_GRID] impossible.
-&apos;[DIAGNOSTIC]&apos;
+    &apos;[DIAGNOSTIC]&apos;
 Veuillez vérifier votre connexion Internet.
 		<usetemplate name="okbutton" yestext="OK"/>
 	</notification>
@@ -332,13 +332,6 @@ Pour entrer dans [SECOND_LIFE], vous devez disposer d&apos;un compte. Voulez-vou
 	<notification name="InvalidCredentialFormat">
 		Saisissez soit le nom d&apos;utilisateur soit à la fois le prénom et le nom de votre avatar dans le champ Nom d&apos;utilisateur, puis connectez-vous.
 	</notification>
-	<notification name="AddClassified">
-		Les petites annonces sont publiées à l&apos;onglet Petites annonces de la section Recherche et sur [http://secondlife.com/community/classifieds secondlife.com] pendant 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.
-		<usetemplate ignoretext="Comment ajouter une nouvelle petite annonce" name="okcancelignore" notext="Annuler" yestext="OK"/>
-	</notification>
 	<notification name="DeleteClassified">
 		Supprimer l&apos;annonce [NAME] ?
 Une fois payés, les frais ne sont pas remboursables.
@@ -2848,9 +2841,6 @@ Ignorer les autres ?
 	<notification label="Explorer le monde" name="HintDestinationGuide">
 		Le Guide des destinations comprend des milliers d&apos;endroits nouveaux à découvrir. Sélectionnez-en un, puis cliquez sur Téléporter pour commencer à l&apos;explorer.
 	</notification>
-	<notification label="Changer d&apos;apparence" name="HintAvatarPicker">
-		Vous souhaitez changer de look ? Cliquez sur le bouton ci-dessous pour voir plus d&apos;avatars.
-	</notification>
 	<notification label="Panneau latéral" name="HintSidePanel">
 		Obtenir un accès rapide à votre inventaire, à vos habits, à vos profils et bien plus encore dans le panneau latéral.
 	</notification>
@@ -2888,6 +2878,38 @@ Ignorer les autres ?
 			<button name="cancel" text="Annuler"/>
 		</form>
 	</notification>
+	<notification label="" name="ModeChange">
+		Vous devez quitter et redémarrer l&apos;application afin de changer de mode.
+		<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+	</notification>
+	<notification label="" name="NoClassifieds">
+		Pour créer et modifier des petites annonces, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ? Le sélecteur de mode se trouve sur l&apos;écran de connexion.
+		<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+	</notification>
+	<notification label="" name="NoGroupInfo">
+		Pour créer et modifier des groupes, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ? Le sélecteur de mode se trouve sur l&apos;écran de connexion.
+		<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+	</notification>
+	<notification label="" name="NoPicks">
+		Pour créer et modifier des favoris, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ? Le sélecteur de mode se trouve sur l&apos;écran de connexion.
+		<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+	</notification>
+	<notification label="" name="NoWorldMap">
+		Pour afficher la carte du monde, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ? Le sélecteur de mode se trouve sur l&apos;écran de connexion.
+		<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+	</notification>
+	<notification label="" name="NoVoiceCall">
+		Les appels vocaux sont uniquement disponibles en mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ?
+		<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+	</notification>
+	<notification label="" name="NoAvatarShare">
+		Le partage est uniquement disponible en mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ?
+		<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+	</notification>
+	<notification label="" name="NoAvatarPay">
+		Pour pouvoir payer d&apos;autres résidents, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ?
+		<usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+	</notification>
 	<global name="UnsupportedCPU">
 		- Votre processeur ne remplit pas les conditions minimum requises.
 	</global>
diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index ef55ba7991da384d73fd7ed1cc010dc755fcbadd..e54b36644c207e57509b33d0cded081414d4948e 100644
--- a/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -17,6 +17,13 @@
 			</text>
 			<check_box label="Enregistrer" name="remember_check"/>
 			<button label="Connexion" name="connect_btn"/>
+			<text name="mode_selection_text">
+				Mode :
+			</text>
+			<combo_box name="mode_combo" tool_tip="Sélectionnez un mode. Pour une exploration facile et rapide avec chat, choisissez Basique. Pour accéder à plus de fonctionnalités, choisissez Avancé.">
+				<combo_box.item label="Basique" name="Basic"/>
+				<combo_box.item label="Avancé" name="Advanced"/>
+			</combo_box>
 			<text name="start_location_text">
 				Lieu de départ :
 			</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_media.xml b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml
index 66bfd01a2aa5fc6064e954caa459de2c097aa59f..7b7b67041a4343fac9967dee1e5f927d43ee2283 100644
--- a/indra/newview/skins/default/xui/fr/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml
@@ -19,7 +19,7 @@
 		<button label="Arrêter" name="all_nearby_media_disable_btn" tool_tip="Désactiver tous les médias près de vous"/>
 		<button label="Lire" name="all_nearby_media_enable_btn" tool_tip="Activer tous les médias près de vous"/>
 		<button name="open_prefs_btn" tool_tip="Ouvrir les préférences de média"/>
-		<button label="Plus &gt;&gt;" label_selected="Moins &lt;&lt;" name="more_btn" tool_tip="Options avancées"/>
+		<button label="Plus &gt;&gt;" label_selected="&lt;&lt; Moins" name="more_btn" tool_tip="Options avancées"/>
 		<button label="Plus &gt;&gt;" label_selected="Moins &lt;&lt;" name="less_btn" tool_tip="Options avancées"/>
 	</panel>
 	<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml
index eecbabae2b3071eb3ca32cc230bc72ee9d57a63b..166f04b3e47ce7437342c57b6b7d4c910b6c663c 100644
--- a/indra/newview/skins/default/xui/fr/panel_people.xml
+++ b/indra/newview/skins/default/xui/fr/panel_people.xml
@@ -18,6 +18,8 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife://
 	<string name="groups_filter_label" value="Filtrer les groupes"/>
 	<string name="no_filtered_groups_msg" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/groups/[SEARCH_TERM] Rechercher]."/>
 	<string name="no_groups_msg" value="Vous souhaitez trouver des groupes à rejoindre ? Utilisez [secondlife:///app/search/groups Rechercher]."/>
+	<string name="MiniMapToolTipMsg" value="[REGION](Carte : double-clic ; Panoramique : Maj + faire glisser)"/>
+	<string name="AltMiniMapToolTipMsg" value="[REGION](Téléportation : double-clic ; Panoramique : Maj + faire glisser)"/>
 	<filter_editor label="Filtre" name="filter_input"/>
 	<tab_container name="tabs">
 		<panel label="PRÈS DE VOUS" name="nearby_panel">
diff --git a/indra/newview/skins/default/xui/fr/panel_profile.xml b/indra/newview/skins/default/xui/fr/panel_profile.xml
index 6b611923af1f7d9f6d1aa81bd72a1689a422e054..9aa6fe97a1e7b1c4c09edb5345467682b0781337 100644
--- a/indra/newview/skins/default/xui/fr/panel_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_profile.xml
@@ -16,6 +16,12 @@
 	<string name="RegisterDateFormat">
 		[REG_DATE] ([AGE])
 	</string>
+	<string name="name_text_args">
+		[NAME]
+	</string>
+	<string name="display_name_text_args">
+		[DISPLAY_NAME]
+	</string>
 	<layout_stack name="layout">
 		<layout_panel name="profile_stack">
 			<scroll_container name="profile_scroll">
@@ -34,7 +40,7 @@
 					</text_editor>
 					<text name="title_partner_text" value="Partenaire :"/>
 					<panel name="partner_data_panel">
-						<name_box initial_value="(récupération en cours)" name="partner_text"/>
+						<text initial_value="(récupération en cours)" name="partner_text"/>
 					</panel>
 					<text name="title_groups_text" value="Groupes :"/>
 				</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_script_ed.xml b/indra/newview/skins/default/xui/fr/panel_script_ed.xml
index 2c86dd72b65cc049f79df8950f7685fd471c0df3..2b08ae56c55885d15656e1782d986ccfa8c46b9e 100644
--- a/indra/newview/skins/default/xui/fr/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/fr/panel_script_ed.xml
@@ -15,6 +15,9 @@
 	<panel.string name="Title">
 		Script : [NAME]
 	</panel.string>
+	<panel.string name="external_editor_not_set">
+		Sélectionnez un éditeur en définissant la variable d&apos;environnement LL_SCRIPT_EDITOR ou le paramètre ExternalEditor.
+	</panel.string>
 	<menu_bar name="script_menu">
 		<menu label="Fichier" name="File">
 			<menu_item_call label="Enregistrer" name="Save"/>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 74c1fd8622d46e296945cabb29825341dd761220..a7c71dc0f0b00df328133549ba4dc7b63e15957c 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -1067,7 +1067,7 @@
 	<string name="PermNo">
 		Non
 	</string>
-	<string name="Chat" value=" Chat :"/>
+	<string name="Chat Message" value="Chat :"/>
 	<string name="Sound" value=" Son :"/>
 	<string name="Wait" value=" --- Attendre :"/>
 	<string name="AnimFlagStop" value=" Arrêter l&apos;animation :"/>
@@ -1864,12 +1864,6 @@
 	<string name="accel-win-shift">
 		Maj+
 	</string>
-	<string name="Esc">
-		Échap
-	</string>
-	<string name="Home">
-		Début
-	</string>
 	<string name="FileSaved">
 		Fichier enregistré
 	</string>
@@ -1889,7 +1883,7 @@
 		PDT
 	</string>
 	<string name="Direction_Forward">
-		Vers l&apos;avant
+		Avant
 	</string>
 	<string name="Direction_Left">
 		Gauche
@@ -1987,6 +1981,9 @@
 	<string name="Other">
 		Autre
 	</string>
+	<string name="Rental">
+		Location
+	</string>
 	<string name="Any">
 		Aucun
 	</string>
@@ -3966,7 +3963,7 @@ de l&apos;infraction signalée
 	<string name="Notices">
 		Notices
 	</string>
-	<string name="Chat">
+	<string name="Chat" value=" Chat :">
 		Chat
 	</string>
 	<string name="DeleteItems">
@@ -3978,4 +3975,348 @@ de l&apos;infraction signalée
 	<string name="EmptyOutfitText">
 		Cette tenue ne contient aucun article.
 	</string>
+	<string name="ExternalEditorNotSet">
+		Sélectionnez un éditeur à l&apos;aide du paramètre ExternalEditor.
+	</string>
+	<string name="ExternalEditorNotFound">
+		Éditeur externe spécifié introuvable.
+Essayez avec le chemin d&apos;accès à l&apos;éditeur entre guillemets doubles
+(par ex. : &quot;/chemin_accès/editor&quot; &quot;%s&quot;).
+	</string>
+	<string name="ExternalEditorCommandParseError">
+		Erreur lors de l&apos;analyse de la commande d&apos;éditeur externe.
+	</string>
+	<string name="ExternalEditorFailedToRun">
+		Échec d&apos;exécution de l&apos;éditeur externe.
+	</string>
+	<string name="Esc">
+		Échap
+	</string>
+	<string name="Space">
+		Space
+	</string>
+	<string name="Enter">
+		Enter
+	</string>
+	<string name="Tab">
+		Tab
+	</string>
+	<string name="Ins">
+		Ins
+	</string>
+	<string name="Del">
+		Del
+	</string>
+	<string name="Backsp">
+		Backsp
+	</string>
+	<string name="Shift">
+		Shift
+	</string>
+	<string name="Ctrl">
+		Ctrl
+	</string>
+	<string name="Alt">
+		Alt
+	</string>
+	<string name="CapsLock">
+		CapsLock
+	</string>
+	<string name="Home">
+		Début
+	</string>
+	<string name="End">
+		End
+	</string>
+	<string name="PgUp">
+		PgUp
+	</string>
+	<string name="PgDn">
+		PgDn
+	</string>
+	<string name="F1">
+		F1
+	</string>
+	<string name="F2">
+		F2
+	</string>
+	<string name="F3">
+		F3
+	</string>
+	<string name="F4">
+		F4
+	</string>
+	<string name="F5">
+		F5
+	</string>
+	<string name="F6">
+		F6
+	</string>
+	<string name="F7">
+		F7
+	</string>
+	<string name="F8">
+		F8
+	</string>
+	<string name="F9">
+		F9
+	</string>
+	<string name="F10">
+		F10
+	</string>
+	<string name="F11">
+		F11
+	</string>
+	<string name="F12">
+		F12
+	</string>
+	<string name="Add">
+		Ajouter
+	</string>
+	<string name="Subtract">
+		Soustraire
+	</string>
+	<string name="Multiply">
+		Multiplier
+	</string>
+	<string name="Divide">
+		Diviser
+	</string>
+	<string name="PAD_DIVIDE">
+		PAD_DIVIDE
+	</string>
+	<string name="PAD_LEFT">
+		PAD_LEFT
+	</string>
+	<string name="PAD_RIGHT">
+		PAD_RIGHT
+	</string>
+	<string name="PAD_DOWN">
+		PAD_DOWN
+	</string>
+	<string name="PAD_UP">
+		PAD_UP
+	</string>
+	<string name="PAD_HOME">
+		PAD_HOME
+	</string>
+	<string name="PAD_END">
+		PAD_END
+	</string>
+	<string name="PAD_PGUP">
+		PAD_PGUP
+	</string>
+	<string name="PAD_PGDN">
+		PAD_PGDN
+	</string>
+	<string name="PAD_CENTER">
+		PAD_CENTER
+	</string>
+	<string name="PAD_INS">
+		PAD_INS
+	</string>
+	<string name="PAD_DEL">
+		PAD_DEL
+	</string>
+	<string name="PAD_Enter">
+		PAD_Enter
+	</string>
+	<string name="PAD_BUTTON0">
+		PAD_BUTTON0
+	</string>
+	<string name="PAD_BUTTON1">
+		PAD_BUTTON1
+	</string>
+	<string name="PAD_BUTTON2">
+		PAD_BUTTON2
+	</string>
+	<string name="PAD_BUTTON3">
+		PAD_BUTTON3
+	</string>
+	<string name="PAD_BUTTON4">
+		PAD_BUTTON4
+	</string>
+	<string name="PAD_BUTTON5">
+		PAD_BUTTON5
+	</string>
+	<string name="PAD_BUTTON6">
+		PAD_BUTTON6
+	</string>
+	<string name="PAD_BUTTON7">
+		PAD_BUTTON7
+	</string>
+	<string name="PAD_BUTTON8">
+		PAD_BUTTON8
+	</string>
+	<string name="PAD_BUTTON9">
+		PAD_BUTTON9
+	</string>
+	<string name="PAD_BUTTON10">
+		PAD_BUTTON10
+	</string>
+	<string name="PAD_BUTTON11">
+		PAD_BUTTON11
+	</string>
+	<string name="PAD_BUTTON12">
+		PAD_BUTTON12
+	</string>
+	<string name="PAD_BUTTON13">
+		PAD_BUTTON13
+	</string>
+	<string name="PAD_BUTTON14">
+		PAD_BUTTON14
+	</string>
+	<string name="PAD_BUTTON15">
+		PAD_BUTTON15
+	</string>
+	<string name="-">
+		-
+	</string>
+	<string name="=">
+		=
+	</string>
+	<string name="`">
+		`
+	</string>
+	<string name=";">
+		;
+	</string>
+	<string name="[">
+		[
+	</string>
+	<string name="]">
+		]
+	</string>
+	<string name="\">
+		\
+	</string>
+	<string name="0">
+		0
+	</string>
+	<string name="1">
+		1
+	</string>
+	<string name="2">
+		2
+	</string>
+	<string name="3">
+		3
+	</string>
+	<string name="4">
+		4
+	</string>
+	<string name="5">
+		5
+	</string>
+	<string name="6">
+		6
+	</string>
+	<string name="7">
+		7
+	</string>
+	<string name="8">
+		8
+	</string>
+	<string name="9">
+		9
+	</string>
+	<string name="A">
+		A
+	</string>
+	<string name="B">
+		B
+	</string>
+	<string name="C">
+		C
+	</string>
+	<string name="D">
+		D
+	</string>
+	<string name="E">
+		E
+	</string>
+	<string name="F">
+		F
+	</string>
+	<string name="G">
+		G
+	</string>
+	<string name="H">
+		H
+	</string>
+	<string name="I">
+		I
+	</string>
+	<string name="J">
+		J
+	</string>
+	<string name="K">
+		K
+	</string>
+	<string name="L">
+		L
+	</string>
+	<string name="M">
+		M
+	</string>
+	<string name="N">
+		N
+	</string>
+	<string name="O">
+		O
+	</string>
+	<string name="P">
+		P
+	</string>
+	<string name="Q">
+		Q
+	</string>
+	<string name="R">
+		R
+	</string>
+	<string name="S">
+		S
+	</string>
+	<string name="T">
+		T
+	</string>
+	<string name="U">
+		U
+	</string>
+	<string name="V">
+		V
+	</string>
+	<string name="W">
+		W
+	</string>
+	<string name="X">
+		X
+	</string>
+	<string name="Y">
+		Y
+	</string>
+	<string name="Z">
+		Z
+	</string>
+	<string name="BeaconParticle">
+		Affichage des balises de particule (bleu)
+	</string>
+	<string name="BeaconPhysical">
+		Affichage des balises d&apos;objet physique (vert)
+	</string>
+	<string name="BeaconScripted">
+		Affichage des balises d&apos;objet scripté (rouge)
+	</string>
+	<string name="BeaconScriptedTouch">
+		Affichage des balises d&apos;objet scripté avec fonction de toucher (rouge)
+	</string>
+	<string name="BeaconSound">
+		Affichage des balises de son (jaune)
+	</string>
+	<string name="BeaconMedia">
+		Affichage des balises de média (blanc)
+	</string>
+	<string name="ParticleHiding">
+		Masquage des particules
+	</string>
 </strings>
diff --git a/indra/newview/skins/minimal/xui/de/floater_media_browser.xml b/indra/newview/skins/minimal/xui/de/floater_media_browser.xml
new file mode 100644
index 0000000000000000000000000000000000000000..63cf4a6cba3ea65b1e9d3dbca26ed33ff7034c7f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/floater_media_browser.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="MEDIEN-BROWSER">
+	<floater.string name="home_page_url">
+		http://www.secondlife.com
+	</floater.string>
+	<floater.string name="support_page_url">
+		http://support.secondlife.com
+	</floater.string>
+	<layout_stack name="stack1">
+		<layout_panel name="nav_controls">
+			<button label="Zurück" name="back"/>
+			<button label="Vorwärts" name="forward"/>
+			<button label="Neu laden" name="reload"/>
+			<button label="Los" name="go"/>
+		</layout_panel>
+		<layout_panel name="time_controls">
+			<button label="zurück" name="rewind"/>
+			<button label="anhalten" name="stop"/>
+			<button label="vorwärts" name="seek"/>
+		</layout_panel>
+		<layout_panel name="parcel_owner_controls">
+			<button label="Aktuelle Seite an Parzelle senden" name="assign"/>
+		</layout_panel>
+		<layout_panel name="external_controls">
+			<button label="In meinem Browser öffnen" name="open_browser"/>
+			<check_box label="Immer in meinem Browser öffnen" name="open_always"/>
+			<button label="Schließen" name="close"/>
+		</layout_panel>
+	</layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/de/floater_web_content.xml b/indra/newview/skins/minimal/xui/de/floater_web_content.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6ab119eeab2b9a54049181e2b9af2a198e87019d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+	<layout_stack name="stack1">
+		<layout_panel name="nav_controls">
+			<button name="back" tool_tip="Rückwärts"/>
+			<button name="forward" tool_tip="Vorwärts"/>
+			<button name="stop" tool_tip="Navigation stoppen"/>
+			<button name="reload" tool_tip="Seite neu laden"/>
+			<combo_box name="address" tool_tip="URL hier eingeben"/>
+			<icon name="media_secure_lock_flag" tool_tip="Sicheres Browsen"/>
+			<button name="popexternal" tool_tip="Aktuelle URL im Desktop-Browser öffnen"/>
+		</layout_panel>
+	</layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml
index 851a96cc0997e4407964b42670548c61bdfac843..443092319b5049a5ea9d7a905d202c58c4d95d31 100644
--- a/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/minimal/xui/de/menu_inspect_self_gear.xml
@@ -1,10 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
-	<menu_item_call label="Hinsetzen" name="sit_down_here"/>
-	<menu_item_call label="Aufstehen" name="stand_up"/>
-	<menu_item_call label="Outfit ändern" name="change_outfit"/>
-	<menu_item_call label="Mein Profil" name="my_profile"/>
-	<menu_item_call label="Meine Freunde" name="my_friends"/>
-	<menu_item_call label="Meine Gruppen" name="my_groups"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Self Pie">
+	<menu_item_call label="Hinsetzen" name="Sit Down Here"/>
+	<menu_item_call label="Aufstehen" name="Stand Up"/>
+	<menu_item_call label="Meine Freunde" name="Friends..."/>
+	<menu_item_call label="Mein Profil" name="Profile..."/>
 	<menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/de/notifications.xml b/indra/newview/skins/minimal/xui/de/notifications.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1eee1d1c9b867b93e19c6d9ef6b139706fdf3a93
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/notifications.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+	<notification name="UserGiveItem">
+		[NAME_SLURL] bietet Ihnen [ITEM_SLURL] an. Zur Verwendung dieses Artikels müssen Sie in den erweiterten Modus umschalten, wo Sie den Artikel in Ihrem Inventar finden werden. Um in den erweiterten Modus umzuschalten, beenden Sie die Anwendung, starten Sie sie neu und ändern Sie die Moduseinstellung auf dem Anmeldebildschirm.
+		<form name="form">
+			<button name="Show" text="Artikel behalten"/>
+			<button name="Discard" text="Artikel ablehnen"/>
+			<button name="Mute" text="Benutzer blockieren"/>
+		</form>
+	</notification>
+	<notification name="ObjectGiveItem">
+		Ein Objekt namens &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, das [NAME_SLURL] gehört, bietet Ihnen [ITEM_SLURL] an. Zur Verwendung dieses Artikels müssen Sie in den erweiterten Modus umschalten, wo Sie den Artikel in Ihrem Inventar finden werden. Um in den erweiterten Modus umzuschalten, beenden Sie die Anwendung, starten Sie sie neu und ändern Sie die Moduseinstellung auf dem Anmeldebildschirm.
+		<form name="form">
+			<button name="Keep" text="Artikel behalten"/>
+			<button name="Discard" text="Artikel ablehnen"/>
+			<button name="Mute" text="Objekt blockieren"/>
+		</form>
+	</notification>
+</notifications>
diff --git a/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml
index ea7cccbdf8957fa0355a03cea7f3a6e2b92b676f..a4d80921ece5d14f326bb65fa99b6e2f7cf9ffd2 100644
--- a/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml
+++ b/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml
@@ -11,10 +11,10 @@
 			<bottomtray_button label="Ansicht" name="camera_btn" tool_tip="Kamerasteuerung anzeigen/ausblenden"/>
 		</layout_panel>
 		<layout_panel name="avatar_and_destinations_panel">
-			<radio_group name="avatar_and_destination_btns">
-				<radio_item name="destination_btn" value="0"/>
-				<radio_item name="avatar_btn" value="1"/>
-			</radio_group>
+			<bottomtray_button label="Ziele" name="destination_btn" tool_tip="Zeigt Leutefenster an"/>
+		</layout_panel>
+		<layout_panel name="avatar_and_destinations_panel">
+			<bottomtray_button label="Mein Avatar" name="avatar_btn"/>
 		</layout_panel>
 		<layout_panel name="people_panel">
 			<bottomtray_button label="Leute" name="show_people_button" tool_tip="Zeigt Leutefenster an"/>
diff --git a/indra/newview/skins/minimal/xui/de/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/de/panel_group_control_panel.xml
new file mode 100644
index 0000000000000000000000000000000000000000..81e6040f84174461f81c8aae0850f990e816e851
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/de/panel_group_control_panel.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+	<layout_stack name="vertical_stack">
+		<layout_panel name="end_call_btn_panel">
+			<button label="Anruf beenden" name="end_call_btn"/>
+		</layout_panel>
+		<layout_panel name="voice_ctrls_btn_panel">
+			<button label="Voice-Steuerung öffnen" name="voice_ctrls_btn"/>
+		</layout_panel>
+	</layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/de/panel_login.xml b/indra/newview/skins/minimal/xui/de/panel_login.xml
index dff70d6994f2ca626c443bfba2efa3fe18dbfdfe..2e82453aab1efee11edeaddecf0b18fa23e09c66 100644
--- a/indra/newview/skins/minimal/xui/de/panel_login.xml
+++ b/indra/newview/skins/minimal/xui/de/panel_login.xml
@@ -20,8 +20,8 @@
 			<text name="mode_selection_text">
 				Modus:
 			</text>
-			<combo_box name="mode_combo">
-				<combo_box.item label="Einfach (Standard)" name="Basic"/>
+			<combo_box name="mode_combo" tool_tip="Wählen Sie den gewünschten Modus aus. Basis: schnelles, einfaches Erkunden und Chatten. Erweitert: Zugriff auf zusätzliche Funktionen.">
+				<combo_box.item label="Basis" name="Basic"/>
 				<combo_box.item label="Erweitert" name="Advanced"/>
 			</combo_box>
 		</layout_panel>
diff --git a/indra/newview/skins/minimal/xui/en/floater_help_browser.xml b/indra/newview/skins/minimal/xui/en/floater_help_browser.xml
index eddfe41c25627ff94e3e1431731e5fd13dfb6398..cc551f7d58448b75f4a0ce56a6d5604a9c273628 100644
--- a/indra/newview/skins/minimal/xui/en/floater_help_browser.xml
+++ b/indra/newview/skins/minimal/xui/en/floater_help_browser.xml
@@ -8,12 +8,12 @@
  min_height="360"
  left="645"
  top="10" 
- min_width="300"
+ min_width="345"
  name="floater_help_browser"
  save_rect="true"
  single_instance="true"
  title="HOW TO"
- width="300">
+ width="335">
     <floater.string
      name="loading_text">
         Loading...
@@ -29,14 +29,14 @@
      orientation="vertical" 
      name="stack1"
      top="20"
-     width="290">
+     width="325">
         <layout_panel
          layout="topleft"
          left_delta="0"
          top_delta="0"
          name="external_controls"
          user_resize="false"
-         width="280">
+         width="325">
             <web_browser
               trusted_content="true" 
              bottom="-5"
@@ -46,7 +46,7 @@
              name="browser"
              top="0"
              height="300"
-             width="280" />
+             width="325" />
         </layout_panel>
     </layout_stack>
 </floater>
diff --git a/indra/newview/skins/minimal/xui/es/floater_media_browser.xml b/indra/newview/skins/minimal/xui/es/floater_media_browser.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a7086c2d6d25108179bf931a724b7fc79749cb01
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/floater_media_browser.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="EXPLORADOR DE MEDIA">
+	<floater.string name="home_page_url">
+		http://www.secondlife.com
+	</floater.string>
+	<floater.string name="support_page_url">
+		http://support.secondlife.com
+	</floater.string>
+	<layout_stack name="stack1">
+		<layout_panel name="nav_controls">
+			<button label="Atrás" name="back"/>
+			<button label="Adelante" name="forward"/>
+			<button label="Recargar" name="reload"/>
+			<button label="Ir" name="go"/>
+		</layout_panel>
+		<layout_panel name="time_controls">
+			<button label="rebobinar" name="rewind"/>
+			<button label="parar" name="stop"/>
+			<button label="avanzar" name="seek"/>
+		</layout_panel>
+		<layout_panel name="parcel_owner_controls">
+			<button label="Enviar a la parcela la página actual" name="assign"/>
+		</layout_panel>
+		<layout_panel name="external_controls">
+			<button label="Abrir en mi propio navegador" name="open_browser"/>
+			<check_box label="Abrir siempre en mi propio navegador" name="open_always"/>
+			<button label="Cerrar" name="close"/>
+		</layout_panel>
+	</layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/es/floater_web_content.xml b/indra/newview/skins/minimal/xui/es/floater_web_content.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b0128096794af5d9ac9b8621066770b746bfee09
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+	<layout_stack name="stack1">
+		<layout_panel name="nav_controls">
+			<button name="back" tool_tip="Navegar hacia atrás"/>
+			<button name="forward" tool_tip="Navegar hacia adelante"/>
+			<button name="stop" tool_tip="Parar navegación"/>
+			<button name="reload" tool_tip="Recargar página"/>
+			<combo_box name="address" tool_tip="Escribe la URL aquí"/>
+			<icon name="media_secure_lock_flag" tool_tip="Navegación segura"/>
+			<button name="popexternal" tool_tip="Abrir la URL actual en tu explorador de escritorio"/>
+		</layout_panel>
+	</layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml
index c8a1e9d9da82bda2da74bcba2e93cf7b7faf3fac..1a49efb9d027903c07257b43dbd75b89f5a3838a 100644
--- a/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/minimal/xui/es/menu_inspect_self_gear.xml
@@ -1,10 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
-	<menu_item_call label="Sentarte" name="sit_down_here"/>
-	<menu_item_call label="Levantarme" name="stand_up"/>
-	<menu_item_call label="Cambiar vestuario" name="change_outfit"/>
-	<menu_item_call label="Mi perfil" name="my_profile"/>
-	<menu_item_call label="Mis amigos" name="my_friends"/>
-	<menu_item_call label="Mis grupos" name="my_groups"/>
-	<menu_item_call label="Depurar las texturas" name="Debug..."/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Self Pie">
+	<menu_item_call label="Sentarme" name="Sit Down Here"/>
+	<menu_item_call label="Levantarme" name="Stand Up"/>
+	<menu_item_call label="Mis amigos" name="Friends..."/>
+	<menu_item_call label="Mi perfil" name="Profile..."/>
+	<menu_item_call label="Depurar texturas" name="Debug..."/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/es/notifications.xml b/indra/newview/skins/minimal/xui/es/notifications.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b08ebb5f767be8ab80d59c2b86c36404b0b42435
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/notifications.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+	<notification name="UserGiveItem">
+		[NAME_SLURL] te ofrece un/a [ITEM_SLURL]. Para utilizar este ítem, cambia al modo Avanzado y búscalo en el inventario. Para cambiar al modo Avanzado, sal de la aplicación, reiníciala y cambia el ajuste de modo en la pantalla de inicio de sesión.
+		<form name="form">
+			<button name="Show" text="Conservar ítem"/>
+			<button name="Discard" text="Rechazar ítem"/>
+			<button name="Mute" text="Bloquear usuario"/>
+		</form>
+	</notification>
+	<notification name="ObjectGiveItem">
+		Un objeto de nombre &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, propiedad de [NAME_SLURL], te ofrece un/a [ITEM_SLURL]. Para utilizar este ítem, cambia al modo Avanzado y búscalo en el inventario. Para cambiar al modo Avanzado, sal de la aplicación, reiníciala y cambia el ajuste de modo en la pantalla de inicio de sesión.
+		<form name="form">
+			<button name="Keep" text="Conservar ítem"/>
+			<button name="Discard" text="Rechazar ítem"/>
+			<button name="Mute" text="Bloquear objeto"/>
+		</form>
+	</notification>
+</notifications>
diff --git a/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml
index 9ab30b5613d6636e96f083c78ed03b89edfe1f82..f782d66ae79609ed747d7ca92b6f7214c9592c48 100644
--- a/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml
+++ b/indra/newview/skins/minimal/xui/es/panel_bottomtray.xml
@@ -11,10 +11,10 @@
 			<bottomtray_button label="Visión" name="camera_btn" tool_tip="Muestra/Oculta los controles de la cámara"/>
 		</layout_panel>
 		<layout_panel name="avatar_and_destinations_panel">
-			<radio_group name="avatar_and_destination_btns">
-				<radio_item name="destination_btn" value="0"/>
-				<radio_item name="avatar_btn" value="1"/>
-			</radio_group>
+			<bottomtray_button label="Destinos" name="destination_btn" tool_tip="Muestra la ventana de gente"/>
+		</layout_panel>
+		<layout_panel name="avatar_and_destinations_panel">
+			<bottomtray_button label="Mi avatar" name="avatar_btn"/>
 		</layout_panel>
 		<layout_panel name="people_panel">
 			<bottomtray_button label="Gente" name="show_people_button" tool_tip="Muestra la ventana de gente"/>
diff --git a/indra/newview/skins/minimal/xui/es/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/es/panel_group_control_panel.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e77156b0d415248d7c2dfe3a99ca668cb0945814
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/es/panel_group_control_panel.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+	<layout_stack name="vertical_stack">
+		<layout_panel name="end_call_btn_panel">
+			<button label="Colgar" name="end_call_btn"/>
+		</layout_panel>
+		<layout_panel name="voice_ctrls_btn_panel">
+			<button label="Abrir los controles de la voz" name="voice_ctrls_btn"/>
+		</layout_panel>
+	</layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/es/panel_login.xml b/indra/newview/skins/minimal/xui/es/panel_login.xml
index 161ea19b0e99db38f1c3e813fadcd6d63f7412cb..689a71e277899738bba12b0adb353b9e1f420da1 100644
--- a/indra/newview/skins/minimal/xui/es/panel_login.xml
+++ b/indra/newview/skins/minimal/xui/es/panel_login.xml
@@ -20,8 +20,8 @@
 			<text name="mode_selection_text">
 				Modo:
 			</text>
-			<combo_box name="mode_combo">
-				<combo_box.item label="Básico (Predeterminado)" name="Basic"/>
+			<combo_box name="mode_combo" tool_tip="Selecciona el modo. Elige Básico para una exploración rápida y fácil y para chatear. Elige Avanzado para tener acceso a más funciones.">
+				<combo_box.item label="Básico" name="Basic"/>
 				<combo_box.item label="Avanzado" name="Advanced"/>
 			</combo_box>
 		</layout_panel>
diff --git a/indra/newview/skins/minimal/xui/fr/floater_media_browser.xml b/indra/newview/skins/minimal/xui/fr/floater_media_browser.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ba171c6363feb3d2c569fea2a9ef96268223c28b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/floater_media_browser.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="NAVIGATEUR DE MÉDIAS">
+	<floater.string name="home_page_url">
+		http://www.secondlife.com
+	</floater.string>
+	<floater.string name="support_page_url">
+		http://support.secondlife.com
+	</floater.string>
+	<layout_stack name="stack1">
+		<layout_panel name="nav_controls">
+			<button label="Préc." name="back"/>
+			<button label="Suiv." name="forward"/>
+			<button label="Recharger" name="reload"/>
+			<button label="OK" name="go"/>
+		</layout_panel>
+		<layout_panel name="time_controls">
+			<button label="retour" name="rewind"/>
+			<button label="stop" name="stop"/>
+			<button label="avance" name="seek"/>
+		</layout_panel>
+		<layout_panel name="parcel_owner_controls">
+			<button label="Envoyer la page actuelle à la parcelle" name="assign"/>
+		</layout_panel>
+		<layout_panel name="external_controls">
+			<button label="Ouvrir dans mon navigateur Web" name="open_browser"/>
+			<check_box label="Toujours ouvrir dans mon navigateur Web" name="open_always"/>
+			<button label="Fermer" name="close"/>
+		</layout_panel>
+	</layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/fr/floater_web_content.xml b/indra/newview/skins/minimal/xui/fr/floater_web_content.xml
new file mode 100644
index 0000000000000000000000000000000000000000..71f44b6ec3686cbcfb440b45887179c092b081ef
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+	<layout_stack name="stack1">
+		<layout_panel name="nav_controls">
+			<button name="back" tool_tip="Précédente"/>
+			<button name="forward" tool_tip="Suivante"/>
+			<button name="stop" tool_tip="Arrêter"/>
+			<button name="reload" tool_tip="Recharger la page"/>
+			<combo_box name="address" tool_tip="Saisir une URL ici"/>
+			<icon name="media_secure_lock_flag" tool_tip="Navigation sécurisée"/>
+			<button name="popexternal" tool_tip="Ouvrir l&apos;URL actuelle dans votre navigateur de bureau"/>
+		</layout_panel>
+	</layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml
index 3bc164788a6e193b8189ea20eada2aabafa93701..fd48aa4f7d7bb76329cd11c989bff4ceab786e62 100644
--- a/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/minimal/xui/fr/menu_inspect_self_gear.xml
@@ -1,10 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
-	<menu_item_call label="M&apos;asseoir" name="sit_down_here"/>
-	<menu_item_call label="Me lever" name="stand_up"/>
-	<menu_item_call label="Changer de tenue" name="change_outfit"/>
-	<menu_item_call label="Mon profil" name="my_profile"/>
-	<menu_item_call label="Mes amis" name="my_friends"/>
-	<menu_item_call label="Mes groupes" name="my_groups"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Self Pie">
+	<menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
+	<menu_item_call label="Me lever" name="Stand Up"/>
+	<menu_item_call label="Mes amis" name="Friends..."/>
+	<menu_item_call label="Mon profil" name="Profile..."/>
 	<menu_item_call label="Déboguer les textures" name="Debug..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml
index 26bd3978a9bd08581bade90e0ada568019f19a48..f153ed15ae7610a6535ec3ddb0cc54ae7861923e 100644
--- a/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml
+++ b/indra/newview/skins/minimal/xui/fr/menu_people_nearby.xml
@@ -9,5 +9,5 @@
 	<menu_item_call label="Partager" name="Share"/>
 	<menu_item_call label="Payer" name="Pay"/>
 	<menu_item_check label="Ignorer/Ne plus ignorer" name="Block/Unblock"/>
-	<menu_item_call label="Proposer une téléportation" name="teleport"/>
+	<menu_item_call label="Téléporter" name="teleport"/>
 </context_menu>
diff --git a/indra/newview/skins/minimal/xui/fr/notifications.xml b/indra/newview/skins/minimal/xui/fr/notifications.xml
new file mode 100644
index 0000000000000000000000000000000000000000..41dd42c39fbba205be5a4ebcb4da46afc755dc42
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/notifications.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+	<notification name="UserGiveItem">
+		[NAME_SLURL] vous offre [ITEM_SLURL]. Pour utiliser cet article, vous devez passer en mode Avancé. L&apos;article se trouve dans votre inventaire. Pour changer de mode, quittez l&apos;application, redémarrez-la, puis sélectionnez un autre mode sur l&apos;écran de connexion.
+		<form name="form">
+			<button name="Show" text="Garder l&apos;article"/>
+			<button name="Discard" text="Refuser l&apos;article"/>
+			<button name="Mute" text="Ignorer l&apos;utilisateur"/>
+		</form>
+	</notification>
+	<notification name="ObjectGiveItem">
+		Un objet nommé &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; appartenant à [NAME_SLURL] vous offre [ITEM_SLURL]. Pour utiliser cet article, vous devez passer en mode Avancé. L&apos;article se trouve dans votre inventaire. Pour changer de mode, quittez l&apos;application, redémarrez-la, puis sélectionnez un autre mode sur l&apos;écran de connexion.
+		<form name="form">
+			<button name="Keep" text="Garder l&apos;article"/>
+			<button name="Discard" text="Refuser l&apos;article"/>
+			<button name="Mute" text="Ignorer l&apos;objet"/>
+		</form>
+	</notification>
+</notifications>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml
index 3a01571f54c93a832b28c7235a28771887ba84d2..ef62901e9912a590960bac6c846472280a90d5cd 100644
--- a/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml
+++ b/indra/newview/skins/minimal/xui/fr/panel_bottomtray.xml
@@ -11,10 +11,10 @@
 			<bottomtray_button label="Affichage" name="camera_btn" tool_tip="Affiche/Masque le contrôle de la caméra"/>
 		</layout_panel>
 		<layout_panel name="avatar_and_destinations_panel">
-			<radio_group name="avatar_and_destination_btns">
-				<radio_item name="destination_btn" value="0"/>
-				<radio_item name="avatar_btn" value="1"/>
-			</radio_group>
+			<bottomtray_button label="Destinations" name="destination_btn" tool_tip="Afficher la fenêtre des personnes."/>
+		</layout_panel>
+		<layout_panel name="avatar_and_destinations_panel">
+			<bottomtray_button label="Mon avatar" name="avatar_btn"/>
 		</layout_panel>
 		<layout_panel name="people_panel">
 			<bottomtray_button label="Personnes" name="show_people_button" tool_tip="Afficher la fenêtre des personnes."/>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/fr/panel_group_control_panel.xml
new file mode 100644
index 0000000000000000000000000000000000000000..676fa1d2229c358bf76f0804e064ef90e4d277c0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/fr/panel_group_control_panel.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+	<layout_stack name="vertical_stack">
+		<layout_panel name="end_call_btn_panel">
+			<button label="Quitter l&apos;appel" name="end_call_btn"/>
+		</layout_panel>
+		<layout_panel name="voice_ctrls_btn_panel">
+			<button label="Ouvrir contrôles vocaux" name="voice_ctrls_btn"/>
+		</layout_panel>
+	</layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/fr/panel_login.xml b/indra/newview/skins/minimal/xui/fr/panel_login.xml
index cb4822e96bb9a88baeb1af647e6d08f435baa157..0869778a547b7dfcb8929663678adf19159071a4 100644
--- a/indra/newview/skins/minimal/xui/fr/panel_login.xml
+++ b/indra/newview/skins/minimal/xui/fr/panel_login.xml
@@ -20,8 +20,8 @@
 			<text name="mode_selection_text">
 				Mode :
 			</text>
-			<combo_box name="mode_combo">
-				<combo_box.item label="Basique (par défaut)" name="Basic"/>
+			<combo_box name="mode_combo" tool_tip="Sélectionnez un mode. Pour une exploration facile et rapide avec chat, choisissez Basique. Pour accéder à plus de fonctionnalités, choisissez Avancé.">
+				<combo_box.item label="Basique" name="Basic"/>
 				<combo_box.item label="Avancé" name="Advanced"/>
 			</combo_box>
 		</layout_panel>
diff --git a/indra/newview/skins/minimal/xui/pt/floater_media_browser.xml b/indra/newview/skins/minimal/xui/pt/floater_media_browser.xml
new file mode 100644
index 0000000000000000000000000000000000000000..da7428007e5b1e27f41e8b040940bb910d796662
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/floater_media_browser.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="NAVEGADOR DE MÍDIA">
+	<floater.string name="home_page_url">
+		http://www.secondlife.com
+	</floater.string>
+	<floater.string name="support_page_url">
+		http://support.secondlife.com
+	</floater.string>
+	<layout_stack name="stack1">
+		<layout_panel name="nav_controls">
+			<button label="Atrás" name="back"/>
+			<button label="Frente" name="forward"/>
+			<button label="Recarregar" name="reload"/>
+			<button label="OK" name="go"/>
+		</layout_panel>
+		<layout_panel name="time_controls">
+			<button label="p/ trás" name="rewind"/>
+			<button label="parar" name="stop"/>
+			<button label="p/ frente" name="seek"/>
+		</layout_panel>
+		<layout_panel name="parcel_owner_controls">
+			<button label="Enviar esta página para lote" name="assign"/>
+		</layout_panel>
+		<layout_panel name="external_controls">
+			<button label="Abrir no meu navegador" name="open_browser"/>
+			<check_box label="Abrir sempre no meu navegador" name="open_always"/>
+			<button label="Fechar" name="close"/>
+		</layout_panel>
+	</layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/pt/floater_web_content.xml b/indra/newview/skins/minimal/xui/pt/floater_web_content.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5101579c6f21e8fde127f7e08487b5f6c50a29b4
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+	<layout_stack name="stack1">
+		<layout_panel name="nav_controls">
+			<button name="back" tool_tip="Navegar para trás"/>
+			<button name="forward" tool_tip="Navegar para frente"/>
+			<button name="stop" tool_tip="Parar a navegação"/>
+			<button name="reload" tool_tip="Recarregar página"/>
+			<combo_box name="address" tool_tip="Digite a URL aqui"/>
+			<icon name="media_secure_lock_flag" tool_tip="Navegação segura"/>
+			<button name="popexternal" tool_tip="Abrir a URL atual no navegador do seu computador"/>
+		</layout_panel>
+	</layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml
index 7e67f4cfd41556b197405452f418563a8970882c..c1f27e765d797fe223fc1042ae3940570ee0f400 100644
--- a/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/minimal/xui/pt/menu_inspect_self_gear.xml
@@ -1,10 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
-	<menu_item_call label="Sentar" name="sit_down_here"/>
-	<menu_item_call label="Ficar de pé" name="stand_up"/>
-	<menu_item_call label="Trocar de look" name="change_outfit"/>
-	<menu_item_call label="Meu perfil" name="my_profile"/>
-	<menu_item_call label="Meus amigos" name="my_friends"/>
-	<menu_item_call label="Meus grupos" name="my_groups"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Self Pie">
+	<menu_item_call label="Sentar" name="Sit Down Here"/>
+	<menu_item_call label="Ficar de pé" name="Stand Up"/>
+	<menu_item_call label="Meus amigos" name="Friends..."/>
+	<menu_item_call label="Meu perfil" name="Profile..."/>
 	<menu_item_call label="Depurar texturas" name="Debug..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml
index 7c720f262bae51f07ac232916877ba5fa0bc3d09..b446a2fe81af14d3715688e821387716cb052f9a 100644
--- a/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml
+++ b/indra/newview/skins/minimal/xui/pt/menu_people_nearby.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <context_menu name="Avatar Context Menu">
 	<menu_item_call label="Ver perfil" name="View Profile"/>
-	<menu_item_call label="Adicionar amigo..." name="Add Friend"/>
-	<menu_item_call label="Remover amigo..." name="Remove Friend"/>
-	<menu_item_call label="MI" name="IM"/>
+	<menu_item_call label="Adicionar amigo" name="Add Friend"/>
+	<menu_item_call label="Remover amigo" name="Remove Friend"/>
+	<menu_item_call label="IM" name="IM"/>
 	<menu_item_call label="Ligar" name="Call"/>
 	<menu_item_call label="Mapa" name="Map"/>
 	<menu_item_call label="Compartilhar" name="Share"/>
diff --git a/indra/newview/skins/minimal/xui/pt/notifications.xml b/indra/newview/skins/minimal/xui/pt/notifications.xml
new file mode 100644
index 0000000000000000000000000000000000000000..30ba6f68bf2fcff2508ccd7072ccbd8c1d2bf727
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/notifications.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+	<notification name="UserGiveItem">
+		[NAME_SLURL] quer lhe dar [ITEM_SLURL].  Esta ação requer o modo Avançado. Passe para o modo avançado e você verá o item em seu inventário. Para passar para o modo avançado, feche e reinicialize esse aplicativo e mude o modo (indicado na tela de login).
+		<form name="form">
+			<button name="Show" text="Guardar item"/>
+			<button name="Discard" text="Recusar item"/>
+			<button name="Mute" text="Bloquear usuário"/>
+		</form>
+	</notification>
+	<notification name="ObjectGiveItem">
+		Um objeto chamado &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, de [NAME_SLURL], está lhe oferecendo [ITEM_SLURL].  Esta ação requer o modo Avançado. Passe para o modo Avançado e você verá o item em seu Inventário. Para passar para o modo Avançado, feche e reinicialize esse aplicativo e mude o modo (indicado na tela de login).
+		<form name="form">
+			<button name="Keep" text="Guardar item"/>
+			<button name="Discard" text="Recusar item"/>
+			<button name="Mute" text="Bloquear objeto"/>
+		</form>
+	</notification>
+</notifications>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml
index 243f323f093cb970ed15912a2f978ba2c1c5d76b..f67823dbd80dfc140b0f20d31f84b7c0eea3a940 100644
--- a/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml
+++ b/indra/newview/skins/minimal/xui/pt/panel_bottomtray.xml
@@ -11,10 +11,10 @@
 			<bottomtray_button label="Exibir" name="camera_btn" tool_tip="Mostra/oculta os controles da câmera"/>
 		</layout_panel>
 		<layout_panel name="avatar_and_destinations_panel">
-			<radio_group name="avatar_and_destination_btns">
-				<radio_item name="destination_btn" value="0"/>
-				<radio_item name="avatar_btn" value="1"/>
-			</radio_group>
+			<bottomtray_button label="Destinos" name="destination_btn" tool_tip="Exibe janela de pessoas"/>
+		</layout_panel>
+		<layout_panel name="avatar_and_destinations_panel">
+			<bottomtray_button label="Meu avatar" name="avatar_btn"/>
 		</layout_panel>
 		<layout_panel name="people_panel">
 			<bottomtray_button label="Pessoas" name="show_people_button" tool_tip="Exibe as pessoas"/>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/pt/panel_group_control_panel.xml
new file mode 100644
index 0000000000000000000000000000000000000000..177cee28a648d10fb6e28890de05b1eceb365923
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/pt/panel_group_control_panel.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+	<layout_stack name="vertical_stack">
+		<layout_panel name="end_call_btn_panel">
+			<button label="Desligar" name="end_call_btn"/>
+		</layout_panel>
+		<layout_panel name="voice_ctrls_btn_panel">
+			<button label="Abrir controles de voz" name="voice_ctrls_btn"/>
+		</layout_panel>
+	</layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/pt/panel_login.xml b/indra/newview/skins/minimal/xui/pt/panel_login.xml
index cd529b0b066b595e1aeb8f96b76b88ff503016a6..de9717874f375926e4d46f25a17c74aec5c593f9 100644
--- a/indra/newview/skins/minimal/xui/pt/panel_login.xml
+++ b/indra/newview/skins/minimal/xui/pt/panel_login.xml
@@ -20,8 +20,8 @@
 			<text name="mode_selection_text">
 				Modo:
 			</text>
-			<combo_box name="mode_combo">
-				<combo_box.item label="Básico (padrão)" name="Basic"/>
+			<combo_box name="mode_combo" tool_tip="Selecione o modo. O modo Básico é mais rápido e ideal para explorar e conversar. Use o modo Avançado para acessar mais recursos.">
+				<combo_box.item label="Básico" name="Basic"/>
 				<combo_box.item label="Avançado" name="Advanced"/>
 			</combo_box>
 		</layout_panel>
diff --git a/install.xml b/install.xml
index 1bc67462239fc45707e395268629f1c575cda2b5..67de9c9cbc54624256c9eaccec8c59ed74581086 100755
--- a/install.xml
+++ b/install.xml
@@ -70,9 +70,9 @@
           <key>windows</key>
           <map>
             <key>md5sum</key>
-            <string>5f993f8092ddf4424ec3133dae9424dd</string>
+            <string>e40e1eac81dc57d8724f96fd977a3d58</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glod-1.0pre4-windows-20100908a.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glod-1.0pre4-windows-20110330.tar.bz2</uri>
           </map>
         </map>
       </map>